[network-manager-netbook] Rework the object hierarchy.



commit 1ee91f25e2c914c6de7929c8fe80bc6b96275be7
Author: Tambet Ingo <tambet gmail com>
Date:   Fri Sep 4 16:10:48 2009 +0300

    Rework the object hierarchy.
    
    NmnItem is now an interface, NmnNetworkItem is the base class to implement it.
    No more NmnItemAdvanced, it's NmnNetworkItem specific.
    Allows us to have other items in the lists as well, such as labels with text
    like "No items found.".

 src/Makefile.am              |    2 -
 src/nmn-connection-details.c |   43 +++--
 src/nmn-connection-details.h |   17 +-
 src/nmn-device-handler.c     |   19 +-
 src/nmn-device-handler.h     |   10 +-
 src/nmn-ethernet-handler.c   |    8 +-
 src/nmn-ethernet-item.c      |   24 +-
 src/nmn-item-advanced.c      |   97 ---------
 src/nmn-item-advanced.h      |   47 -----
 src/nmn-item.c               |  467 +++++++-----------------------------------
 src/nmn-item.h               |   84 +++------
 src/nmn-list.c               |   22 ++-
 src/nmn-network-item.c       |  434 +++++++++++++++++++++++++++++++++++----
 src/nmn-network-item.h       |   44 ++++-
 src/nmn-serial-handler.c     |    2 +-
 src/nmn-serial-item.c        |   12 +-
 src/nmn-wifi-handler.c       |    6 +-
 src/nmn-wifi-item.c          |   50 ++---
 18 files changed, 648 insertions(+), 740 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 9091083..fd59c11 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -34,8 +34,6 @@ network_manager_netbook_SOURCES = \
 	nmn-icon-cache.h \
 	nmn-item.c \
 	nmn-item.h \
-	nmn-item-advanced.c \
-	nmn-item-advanced.h \
 	nmn-list.c \
 	nmn-list.h \
 	nmn-mobile-providers.c \
diff --git a/src/nmn-connection-details.c b/src/nmn-connection-details.c
index 7c924fb..4948aaa 100644
--- a/src/nmn-connection-details.c
+++ b/src/nmn-connection-details.c
@@ -24,13 +24,16 @@
 #include <errno.h>
 #include <nm-utils.h>
 #include "nmn-connection-details.h"
-#include "nmn-item-advanced.h"
 
-static void item_advanced_init (NmnItemAdvanced *item_advanced_class);
-static gboolean verify (NmnItemAdvanced *item_advanced);
+G_DEFINE_TYPE (NmnConnectionDetails, nmn_connection_details, GTK_TYPE_TABLE)
 
-G_DEFINE_TYPE_EXTENDED (NmnConnectionDetails, nmn_connection_details, GTK_TYPE_TABLE, 0,
-                        G_IMPLEMENT_INTERFACE (NMN_TYPE_ITEM_ADVANCED, item_advanced_init))
+enum {
+    CHANGED,
+
+    LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
 
 #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), NMN_TYPE_CONNECTION_DETAILS, NmnConnectionDetailsPrivate))
 
@@ -50,10 +53,10 @@ typedef struct {
     gboolean disposed;
 } NmnConnectionDetailsPrivate;
 
-NmnItemAdvanced *
+NmnConnectionDetails *
 nmn_connection_details_new (void)
 {
-    return NMN_ITEM_ADVANCED (g_object_new (NMN_TYPE_CONNECTION_DETAILS, NULL));
+    return NMN_CONNECTION_DETAILS (g_object_new (NMN_TYPE_CONNECTION_DETAILS, NULL));
 }
 
 static void
@@ -353,17 +356,12 @@ nmn_connection_details_get_data (NmnConnectionDetails *self)
     return setting;
 }
 
-static gboolean
-verify (NmnItemAdvanced *item_advanced)
+gboolean
+nmn_connection_details_verify (NmnConnectionDetails *self)
 {
-    return GET_PRIVATE (item_advanced)->last_check_result;
-}
+    g_return_val_if_fail (NMN_IS_CONNECTION_DETAILS (self), FALSE);
 
-static void
-item_advanced_init (NmnItemAdvanced *item_advanced_class)
-{
-    /* interface implementation */
-    item_advanced_class->verify = verify;
+    return GET_PRIVATE (self)->last_check_result;
 }
 
 static void
@@ -440,7 +438,7 @@ stuff_changed (NmnConnectionDetails *self)
 
     if (verified != priv->last_check_result) {
         priv->last_check_result = verified;
-        g_signal_emit_by_name (self, "changed", verified);
+        g_signal_emit (self, signals[CHANGED], 0, verified);
     }
 }
 
@@ -542,4 +540,15 @@ nmn_connection_details_class_init (NmnConnectionDetailsClass *class)
     GObjectClass *object_class = G_OBJECT_CLASS (class);
 
     g_type_class_add_private (object_class, sizeof (NmnConnectionDetailsPrivate));
+
+    /* Signals */
+    signals[CHANGED] =
+        g_signal_new ("changed",
+                      G_OBJECT_CLASS_TYPE (class),
+                      G_SIGNAL_RUN_FIRST,
+                      G_STRUCT_OFFSET (NmnConnectionDetailsClass, changed),
+                      NULL, NULL,
+                      g_cclosure_marshal_VOID__BOOLEAN,
+                      G_TYPE_NONE, 1,
+                      G_TYPE_BOOLEAN);
 }
diff --git a/src/nmn-connection-details.h b/src/nmn-connection-details.h
index 878ca27..dd41779 100644
--- a/src/nmn-connection-details.h
+++ b/src/nmn-connection-details.h
@@ -23,7 +23,6 @@
 #include <gtk/gtk.h>
 #include <nm-setting-ip4-config.h>
 #include <nm-ip4-config.h>
-#include "nmn-item-advanced.h"
 
 #define NMN_TYPE_CONNECTION_DETAILS            (nmn_connection_details_get_type ())
 #define NMN_CONNECTION_DETAILS(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMN_TYPE_CONNECTION_DETAILS, NmnConnectionDetails))
@@ -38,15 +37,21 @@ typedef struct {
 
 typedef struct {
     GtkTableClass parent;
+
+    /* Signals */
+    void (*changed) (NmnConnectionDetails *self,
+                     gboolean complete);
 } NmnConnectionDetailsClass;
 
 GType nmn_connection_details_get_type (void);
 
-NmnItemAdvanced    *nmn_connection_details_new      (void);
-void                nmn_connection_details_set_data (NmnConnectionDetails *self,
-                                                     NMSettingIP4Config *setting,
-                                                     NMIP4Config *config);
+NmnConnectionDetails *nmn_connection_details_new      (void);
+void                  nmn_connection_details_set_data (NmnConnectionDetails *self,
+                                                       NMSettingIP4Config *setting,
+                                                       NMIP4Config *config);
+
+NMSettingIP4Config   *nmn_connection_details_get_data (NmnConnectionDetails *self);
+gboolean              nmn_connection_details_verify   (NmnConnectionDetails *self);
 
-NMSettingIP4Config *nmn_connection_details_get_data (NmnConnectionDetails *self);
 
 #endif /* NMN_CONNECTION_DETAILS_H */
diff --git a/src/nmn-device-handler.c b/src/nmn-device-handler.c
index d602cde..2bc7946 100644
--- a/src/nmn-device-handler.c
+++ b/src/nmn-device-handler.c
@@ -18,7 +18,6 @@
  */
 
 #include "nmn-device-handler.h"
-#include "nmn-network-item.h"
 
 G_DEFINE_TYPE (NmnDeviceHandler, nmn_device_handler, G_TYPE_OBJECT)
 
@@ -155,12 +154,12 @@ item_removed (NmnItem *item, gpointer user_data)
 
 void
 nmn_device_handler_add_item (NmnDeviceHandler *self,
-                             NmnItem *item)
+                             NmnNetworkItem *item)
 {
     NmnDeviceHandlerPrivate *priv;
 
     g_return_if_fail (NMN_IS_DEVICE_HANDLER (self));
-    g_return_if_fail (NMN_IS_ITEM (item));
+    g_return_if_fail (NMN_IS_NETWORK_ITEM (item));
 
     g_signal_connect (item, "remove-requested", G_CALLBACK (item_removed), self);
 
@@ -199,7 +198,7 @@ nmn_device_handler_get_connections (NmnDeviceHandler *self)
     return list;
 }
 
-NmnItem *
+NmnNetworkItem *
 nmn_device_handler_get_item_for_connection (NmnDeviceHandler *self,
                                             NMExportedConnection *connection)
 {
@@ -212,7 +211,7 @@ nmn_device_handler_get_item_for_connection (NmnDeviceHandler *self,
     list = GET_PRIVATE (self)->items;
     for (iter = list; iter; iter = iter->next) {
         if (nmn_network_item_get_connection (NMN_NETWORK_ITEM (iter->data)) == connection)
-            return NMN_ITEM (iter->data);
+            return NMN_NETWORK_ITEM (iter->data);
     }
 
     return NULL;
@@ -228,12 +227,12 @@ nmn_device_handler_remove_items (NmnDeviceHandler *self)
 
     list = nmn_device_handler_get_items (self);
     for (iter = list; iter; iter = iter->next) {
-        NmnItem *item = NMN_ITEM (iter->data);
+        NmnNetworkItem *item = NMN_NETWORK_ITEM (iter->data);
 
-        if (nmn_item_get_status (item) != NMN_ITEM_STATUS_DISCONNECTED)
-            nmn_item_disconnect_request (item);
+        if (nmn_network_item_get_status (item) != NMN_NETWORK_ITEM_STATUS_DISCONNECTED)
+            nmn_network_item_disconnect_request (item);
 
-        nmn_item_remove_request (item);
+        nmn_item_remove_requested (NMN_ITEM (item));
     }
 }
 
@@ -372,5 +371,5 @@ nmn_device_handler_class_init (NmnDeviceHandlerClass *class)
          NULL, NULL,
          g_cclosure_marshal_VOID__OBJECT,
          G_TYPE_NONE, 1,
-         NMN_TYPE_ITEM);
+         NMN_TYPE_NETWORK_ITEM);
 }
diff --git a/src/nmn-device-handler.h b/src/nmn-device-handler.h
index ab40a7e..7ffa0f5 100644
--- a/src/nmn-device-handler.h
+++ b/src/nmn-device-handler.h
@@ -24,7 +24,7 @@
 #include <nm-device.h>
 #include <nm-settings.h>
 #include "nmn-nm-data.h"
-#include "nmn-item.h"
+#include "nmn-network-item.h"
 
 #define NMN_TYPE_DEVICE_HANDLER            (nmn_device_handler_get_type ())
 #define NMN_DEVICE_HANDLER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMN_TYPE_DEVICE_HANDLER, NmnDeviceHandler))
@@ -49,7 +49,7 @@ typedef struct {
 
     /* signals */
     void (*item_added) (NmnDeviceHandler *self,
-                        NmnItem *item);
+                        NmnNetworkItem *item);
 } NmnDeviceHandlerClass;
 
 GType nmn_device_handler_get_type (void);
@@ -60,13 +60,13 @@ NmnNMData *nmn_device_handler_get_nm_data (NmnDeviceHandler *self);
 NMDevice *nmn_device_handler_get_device (NmnDeviceHandler *self);
 
 void nmn_device_handler_add_item (NmnDeviceHandler *self,
-                                  NmnItem *item);
+                                  NmnNetworkItem *item);
 
 GSList *nmn_device_handler_get_items (NmnDeviceHandler *self);
 GSList *nmn_device_handler_get_connections (NmnDeviceHandler *self);
 
-NmnItem *nmn_device_handler_get_item_for_connection (NmnDeviceHandler *self,
-                                                     NMExportedConnection *connection);
+NmnNetworkItem *nmn_device_handler_get_item_for_connection (NmnDeviceHandler *self,
+                                                            NMExportedConnection *connection);
 
 void nmn_device_handler_remove_items (NmnDeviceHandler *self);
 
diff --git a/src/nmn-ethernet-handler.c b/src/nmn-ethernet-handler.c
index e6269e5..6e98115 100644
--- a/src/nmn-ethernet-handler.c
+++ b/src/nmn-ethernet-handler.c
@@ -63,7 +63,7 @@ connection_added (NmnDeviceHandler *handler,
     if (utils_connection_valid_for_device (wrapped, NM_DEVICE (device), NULL)) {
         item = nmn_ethernet_item_new (nmn_device_handler_get_nm_data (handler), device);
         g_object_set (item, NMN_NETWORK_ITEM_CONNECTION, exported, NULL);
-        nmn_device_handler_add_item (handler, NMN_ITEM (item));
+        nmn_device_handler_add_item (handler, NMN_NETWORK_ITEM (item));
     }
 }
 
@@ -100,10 +100,10 @@ ethernet_toggled (NmnNMData *nm_data,
 
         list = nmn_device_handler_get_items (handler);
         for (iter = list; iter; iter = iter->next) {
-            NmnItem *item = NMN_ITEM (iter->data);
+            NmnNetworkItem *item = NMN_NETWORK_ITEM (iter->data);
 
-            if (nmn_item_get_status (item) == NMN_ITEM_STATUS_DISCONNECTED)
-                nmn_item_connect_request (item);
+            if (nmn_network_item_get_status (item) == NMN_NETWORK_ITEM_STATUS_DISCONNECTED)
+                nmn_network_item_connect_request (item);
         }
     }
 }
diff --git a/src/nmn-ethernet-item.c b/src/nmn-ethernet-item.c
index 404a03f..692ac11 100644
--- a/src/nmn-ethernet-item.c
+++ b/src/nmn-ethernet-item.c
@@ -49,7 +49,7 @@ state_changed (NMDevice *device,
         break;
     }
 
-    nmn_item_set_icon (NMN_ITEM (user_data), icon);
+    nmn_network_item_set_icon (NMN_NETWORK_ITEM (user_data), icon);
 }
 
 GtkWidget *
@@ -98,24 +98,24 @@ update_autoconnect (NmnNetworkItem *item, gboolean connect_automatically)
 }
 
 static void
-connect (NmnItem *item)
+connect (NmnNetworkItem *item)
 {
     update_autoconnect (NMN_NETWORK_ITEM (item), TRUE);
-    NMN_ITEM_CLASS (nmn_ethernet_item_parent_class)->connect (item);
+    NMN_NETWORK_ITEM_CLASS (nmn_ethernet_item_parent_class)->connect (item);
 }
 
 static void
-disconnect (NmnItem *item)
+disconnect (NmnNetworkItem *item)
 {
     /* Turn off autoconnect, otherwise it would reconnect right back. */
-    update_autoconnect (NMN_NETWORK_ITEM (item), FALSE);
-    NMN_ITEM_CLASS (nmn_ethernet_item_parent_class)->disconnect (item);
+    update_autoconnect (item, FALSE);
+    NMN_NETWORK_ITEM_CLASS (nmn_ethernet_item_parent_class)->disconnect (item);
 }
 
 static guint
-get_priority (NmnItem *item)
+get_priority (NmnNetworkItem *item)
 {
-    return NMN_ITEM_CLASS (nmn_ethernet_item_parent_class)->get_priority (item) + 50;
+    return NMN_NETWORK_ITEM_CLASS (nmn_ethernet_item_parent_class)->get_priority (item) + 50;
 }
 
 static void
@@ -169,14 +169,14 @@ static void
 nmn_ethernet_item_class_init (NmnEthernetItemClass *class)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (class);
-    NmnItemClass *item_class = NMN_ITEM_CLASS (class);
+    NmnNetworkItemClass *network_item_class = NMN_NETWORK_ITEM_CLASS (class);
 
     g_type_class_add_private (object_class, sizeof (NmnEthernetItemPrivate));
 
     object_class->constructor = constructor;
     object_class->dispose = dispose;
 
-    item_class->connect = connect;
-    item_class->disconnect = disconnect;
-    item_class->get_priority = get_priority;
+    network_item_class->connect = connect;
+    network_item_class->disconnect = disconnect;
+    network_item_class->get_priority = get_priority;
 }
diff --git a/src/nmn-item.c b/src/nmn-item.c
index 7b9c0bc..f3d8673 100644
--- a/src/nmn-item.c
+++ b/src/nmn-item.c
@@ -17,452 +17,135 @@
  * (C) Copyright 2009 Novell, Inc.
  */
 
-#include <glib/gi18n.h>
+#include <gtk/gtk.h>
 #include "nmn-item.h"
-#include "nmn-icon-cache.h"
-
-G_DEFINE_TYPE (NmnItem, nmn_item, GTK_TYPE_EVENT_BOX)
 
 enum {
-    CONNECT_REQUESTED,
-    DISCONNECT_REQUESTED,
-    REMOVE_REQUESTED,
-    DELETE,
     PRIORITY_CHANGED,
+    REMOVE_REQUESTED,
+
     LAST_SIGNAL
 };
 
-static guint signals[LAST_SIGNAL];
-
-#define NMN_ITEM_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), NMN_TYPE_ITEM, NmnItemPrivate))
-
-typedef struct {
-    GtkBox *vbox; /* child of self */
-    GtkBox *hbox; /* child of vbox */
-
-    GtkWidget *icon;
-    GtkLabel *name;
-    GtkWidget *status_separator;
-    GtkLabel *status_label;
-    GtkLabel *security;
-    GtkWidget *expander;
-    NmnItemAdvanced *advanced;
-    GtkButton *connect;
-    GtkWidget *remove;
-    NmnItemStatus status;
-} NmnItemPrivate;
-
-GtkWidget *
-nmn_item_new (void)
-{
-    return GTK_WIDGET (g_object_new (NMN_TYPE_ITEM, NULL));
-}
+static guint signals[LAST_SIGNAL] = { 0 };
 
 void
 nmn_item_set_name (NmnItem *item,
                    const char *name)
 {
-    NmnItemPrivate *priv;
-    char *s;
-
     g_return_if_fail (NMN_IS_ITEM (item));
-    g_return_if_fail (name != NULL);
-
-    priv = NMN_ITEM_GET_PRIVATE (item);
 
-    s = g_strdup_printf ("<big><b>%s</b></big>", name);
-    gtk_label_set_markup (GTK_LABEL (priv->name), s);
-    g_free (s);
+    g_object_set (item, NMN_ITEM_NAME, name, NULL);
 }
 
-const char *
+char *
 nmn_item_get_name (NmnItem *item)
 {
-    g_return_val_if_fail (NMN_IS_ITEM (item), NULL);
-
-    return gtk_label_get_text (GTK_LABEL (NMN_ITEM_GET_PRIVATE (item)->name));
-}
+    char *name;
 
-void
-nmn_item_set_status_visible (NmnItem *item,
-                             gboolean visible)
-{
-    NmnItemPrivate *priv;
+    g_return_val_if_fail (NMN_IS_ITEM (item), NULL);
 
-    g_return_if_fail (NMN_IS_ITEM (item));
+    name = NULL;
+    g_object_get (item, NMN_ITEM_NAME, &name, NULL);
 
-    priv = NMN_ITEM_GET_PRIVATE (item);
-    if (visible) {
-        gtk_widget_show (priv->status_separator);
-        gtk_widget_show (GTK_WIDGET (priv->status_label));
-    } else {
-        gtk_widget_hide (priv->status_separator);
-        gtk_widget_hide (GTK_WIDGET (priv->status_label));
-    }
+    return name;
 }
 
 void
-nmn_item_set_status (NmnItem *item,
-                     NmnItemStatus status)
+nmn_item_set_priority (NmnItem *item,
+                       guint priority)
 {
-    NmnItemPrivate *priv;
-
     g_return_if_fail (NMN_IS_ITEM (item));
 
-    priv = NMN_ITEM_GET_PRIVATE (item);
-    if (priv->status != status) {
-        const char *status_msg;
-        char *str;
-
-        priv->status = status;
-
-        switch (status) {
-        case NMN_ITEM_STATUS_DISCONNECTED:
-            status_msg = _("Disconnected");
-            gtk_button_set_label (priv->connect, _("Connect"));
-            break;
-        case NMN_ITEM_STATUS_CONNECTING:
-            status_msg = _("Connecting...");
-            gtk_button_set_label (priv->connect, _("Disconnect"));
-            break;
-        case NMN_ITEM_STATUS_CONNECTED:
-            status_msg = _("Connected");
-            gtk_button_set_label (priv->connect, _("Disconnect"));
-            break;
-        default:
-            g_assert_not_reached ();
-        }
-
-        str = g_strconcat ("<big><b>", status_msg, "</b></big>", NULL);
-        gtk_label_set_markup (priv->status_label, str);
-        g_free (str);
-
-        nmn_item_set_status_visible (item, TRUE);
-    }
-}
-
-NmnItemStatus
-nmn_item_get_status (NmnItem *item)
-{
-    g_return_val_if_fail (NMN_IS_ITEM (item), NMN_ITEM_STATUS_DISCONNECTED);
-
-    return NMN_ITEM_GET_PRIVATE (item)->status;
+    g_object_set (item, NMN_ITEM_PRIORITY, priority, NULL);
 }
 
-void
-nmn_item_set_icon (NmnItem *item,
-                   const char *icon_name)
+guint
+nmn_item_get_priority (NmnItem *item)
 {
-    GtkImage *image;
-    GdkPixbuf *pixbuf;
-
-    g_return_if_fail (NMN_IS_ITEM (item));
-    g_return_if_fail (icon_name != NULL);
-
-    pixbuf = nmn_icon_cache_get (icon_name);
-    if (!pixbuf)
-        return;
-
-    image = GTK_IMAGE (NMN_ITEM_GET_PRIVATE (item)->icon);
-
-    if (gtk_image_get_storage_type (image) == GTK_IMAGE_PIXBUF && gtk_image_get_pixbuf (image) == pixbuf)
-        return;
-
-    gtk_image_set_from_pixbuf (image, pixbuf);
-}
+    guint priority;
 
-void
-nmn_item_set_security (NmnItem *item,
-                       const char *security_string)
-{
-    g_return_if_fail (NMN_IS_ITEM (item));
+    g_return_val_if_fail (NMN_IS_ITEM (item), G_MAXUINT);
 
-    gtk_label_set_text (GTK_LABEL (NMN_ITEM_GET_PRIVATE (item)->security),
-                        security_string ? security_string : "");
-}
+    priority = 0;
+    g_object_get (item, NMN_ITEM_PRIORITY, &priority, NULL);
 
-static void
-nmn_item_delete (NmnItem *self)
-{
-    g_signal_emit (self, signals[DELETE], 0);
+    return priority;
 }
 
 void
-nmn_item_set_delete_visible (NmnItem *item,
-                             gboolean visible)
+nmn_item_remove_requested (NmnItem *item)
 {
-    NmnItemPrivate *priv = NMN_ITEM_GET_PRIVATE (item);
-
     g_return_if_fail (NMN_IS_ITEM (item));
 
-    if (visible && !priv->remove) {
-        GtkWidget *button;
-
-        priv->remove = gtk_vbox_new (FALSE, 0);
-        gtk_box_pack_end (priv->hbox, priv->remove, FALSE, FALSE, 0);
-
-        button = gtk_button_new ();
-        gtk_button_set_image (GTK_BUTTON (button),
-                              gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_BUTTON));
-
-        gtk_button_set_image_position (GTK_BUTTON (button), GTK_POS_RIGHT);
-        gtk_widget_set_tooltip_text (button, "Remove connection");
-        gtk_box_pack_start (GTK_BOX (priv->remove), button, TRUE, FALSE, 0);
-
-        gtk_widget_show_all (priv->remove);
-        g_signal_connect_swapped (button, "clicked",
-                                  G_CALLBACK (nmn_item_delete),
-                                  item);
-    } else if (!visible && priv->remove) {
-        gtk_container_remove (GTK_CONTAINER (priv->hbox), priv->remove);
-        priv->remove = NULL;
-    }
-}
-
-void
-nmn_item_connect_request (NmnItem *self)
-{
-    g_return_if_fail (NMN_IS_ITEM (self));
-
-    NMN_ITEM_GET_CLASS (self)->connect (self);
-    g_signal_emit (self, signals[CONNECT_REQUESTED], 0);
-}
-
-void
-nmn_item_disconnect_request (NmnItem *self)
-{
-    g_return_if_fail (NMN_IS_ITEM (self));
-
-    NMN_ITEM_GET_CLASS (self)->disconnect (self);
-    g_signal_emit (self, signals[DISCONNECT_REQUESTED], 0);
-}
-
-void
-nmn_item_remove_request (NmnItem *self)
-{
-    g_return_if_fail (NMN_IS_ITEM (self));
-
-    g_signal_emit (self, signals[REMOVE_REQUESTED], 0);
-}
-
-guint
-nmn_item_get_priority (NmnItem *self)
-{
-    g_return_val_if_fail (NMN_IS_ITEM (self), 0);
-
-    if (NMN_ITEM_GET_CLASS (self)->get_priority)
-        return NMN_ITEM_GET_CLASS (self)->get_priority (self);
-
-    return 0;
-}
-
-void
-nmn_item_priority_changed (NmnItem *self)
-{
-    g_return_if_fail (NMN_IS_ITEM (self));
-
-    g_signal_emit (self, signals[PRIORITY_CHANGED], 0);
-}
-
-static void
-advanced_changed (NmnItemAdvanced *advanced,
-                  gboolean complete,
-                  gpointer user_data)
-{
-    NmnItemPrivate *priv = NMN_ITEM_GET_PRIVATE (user_data);
-
-    gtk_widget_set_sensitive (GTK_WIDGET (priv->connect), complete);
-}
-
-gboolean
-nmn_item_has_advanced (NmnItem *item)
-{
-    g_return_val_if_fail (NMN_IS_ITEM (item), FALSE);
-
-    return NMN_ITEM_GET_PRIVATE (item)->advanced != NULL;
-}
-
-NmnItemAdvanced *
-nmn_item_get_advanced (NmnItem *item)
-{
-    NmnItemPrivate *priv;
-    GtkWidget *alignment;
-
-    g_return_val_if_fail (NMN_IS_ITEM (item), NULL);
-
-    priv = NMN_ITEM_GET_PRIVATE (item);
-    if (priv->advanced)
-        return priv->advanced;
-
-    if (NMN_ITEM_GET_CLASS (item)->create_advanced_information)
-        priv->advanced = NMN_ITEM_GET_CLASS (item)->create_advanced_information (item);
-
-    if (!priv->advanced)
-        return NULL;
-
-    alignment = gtk_alignment_new (0, 0, 0, 0);
-    gtk_container_add (GTK_CONTAINER (alignment), GTK_WIDGET (priv->advanced));
-    gtk_widget_show (alignment);
-    gtk_box_pack_end (priv->vbox, alignment, FALSE, FALSE, 0);
-
-    g_signal_connect (priv->advanced, "changed", G_CALLBACK (advanced_changed), item);
-    advanced_changed (priv->advanced, nmn_item_advanced_verify (priv->advanced), item);
-
-    return priv->advanced;
-}
-
-static void
-advanced_expanded (GtkExpander *expander,
-                   GParamSpec *param_spec,
-                   gpointer user_data)
-{
-    NmnItemAdvanced *advanced;
-
-    advanced = nmn_item_get_advanced (NMN_ITEM (user_data));
-    if (advanced)
-        g_object_set (advanced, "visible", gtk_expander_get_expanded (expander), NULL);
-}
-
-static void
-nmn_item_connect (NmnItem *item)
-{
-    g_warning ("Connect not overriden");
-}
-
-static void
-nmn_item_disconnect (NmnItem *item)
-{
-    g_warning ("Disconnect not overriden");
-}
-
-static void
-connect_clicked (GtkButton *button, gpointer user_data)
-{
-    NmnItem *item = NMN_ITEM (user_data);
-    NmnItemPrivate *priv = NMN_ITEM_GET_PRIVATE (item);
-
-    if (priv->status == NMN_ITEM_STATUS_DISCONNECTED)
-        nmn_item_connect_request (item);
-    else
-        nmn_item_disconnect_request (item);
+    g_signal_emit (item, signals[REMOVE_REQUESTED], 0);
 }
 
-static void
-nmn_item_init (NmnItem *item)
-{
-    NmnItemPrivate *priv = NMN_ITEM_GET_PRIVATE (item);
-    GtkWidget *vbox;
-    GtkWidget *hbox;
-    GtkWidget *w;
-
-    priv->vbox = GTK_BOX (gtk_vbox_new (FALSE, 6));
-    gtk_container_set_border_width (GTK_CONTAINER (priv->vbox), 6);
-    gtk_container_add (GTK_CONTAINER (item), GTK_WIDGET (priv->vbox));
-
-    priv->hbox = GTK_BOX (gtk_hbox_new (FALSE, 6));
-    gtk_container_set_border_width (GTK_CONTAINER (priv->hbox), 6);
-    gtk_box_pack_start (priv->vbox, GTK_WIDGET (priv->hbox), FALSE, FALSE, 0);
-
-    priv->icon = gtk_image_new ();
-    gtk_box_pack_start (priv->hbox, priv->icon, FALSE, FALSE, 0);
-
-    vbox = gtk_vbox_new (FALSE, 0);
-    gtk_box_pack_start (priv->hbox, vbox, FALSE, FALSE, 0);
-
-    hbox = gtk_hbox_new (FALSE, 12);
-    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
-
-    w = gtk_label_new ("");
-    gtk_label_set_use_markup (GTK_LABEL (w), TRUE);
-    gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5);
-    gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
-    priv->name = GTK_LABEL (w);
-
-    w = gtk_label_new (" - ");
-    gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
-    priv->status_separator = w;
-
-    w = gtk_label_new ("");
-    gtk_label_set_use_markup (GTK_LABEL (w), TRUE);
-    gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5);
-    gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
-    priv->status_label = GTK_LABEL (w);
-
-    hbox = gtk_hbox_new (FALSE, 12);
-    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
-
-    w = gtk_label_new ("");
-    gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
-    priv->security = GTK_LABEL (w);
-
-    w = gtk_expander_new (_("Advanced"));
-    gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
-    priv->expander = w;
-    g_signal_connect (w, "notify::expanded", G_CALLBACK (advanced_expanded), item);
-
-    w = gtk_button_new_with_label (_("Connect"));
-    gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
-    priv->connect = GTK_BUTTON (w);
-    g_signal_connect (w, "clicked", G_CALLBACK (connect_clicked), item);
-
-    priv->remove = NULL;
-
-    gtk_widget_show_all (GTK_WIDGET (priv->vbox));
-}
+/*****************************************************************************/
 
 static void
-nmn_item_class_init (NmnItemClass *class)
+nmn_item_init (gpointer g_iface)
 {
-    GObjectClass *object_class = G_OBJECT_CLASS (class);
+    GType iface_type = G_TYPE_FROM_INTERFACE (g_iface);
+    static gboolean initialized = FALSE;
 
-    g_type_class_add_private (object_class, sizeof (NmnItemPrivate));
+    if (initialized)
+        return;
 
-    class->connect = nmn_item_connect;
-    class->disconnect = nmn_item_disconnect;
+    /* Properties */
+    g_object_interface_install_property
+        (g_iface,
+         g_param_spec_string (NMN_ITEM_NAME,
+                              "Name",
+                              "Name",
+                              NULL,
+                              G_PARAM_READWRITE));
+
+    g_object_interface_install_property
+        (g_iface,
+         g_param_spec_uint (NMN_ITEM_PRIORITY,
+                            "Priority",
+                            "Item priority",
+                            0, G_MAXUINT, 0,
+                            G_PARAM_READABLE));
 
     /* Signals */
-    signals[CONNECT_REQUESTED] = g_signal_new 
-        ("connect-requested",
-         G_OBJECT_CLASS_TYPE (class),
-         G_SIGNAL_RUN_LAST,
-         G_STRUCT_OFFSET (NmnItemClass, connect_requested),
-         NULL, NULL,
-         g_cclosure_marshal_VOID__VOID,
-         G_TYPE_NONE, 0);
-
-    signals[DISCONNECT_REQUESTED] = g_signal_new 
-        ("disconnect-requested",
-         G_OBJECT_CLASS_TYPE (class),
-         G_SIGNAL_RUN_LAST,
-         G_STRUCT_OFFSET (NmnItemClass, disconnect_requested),
-         NULL, NULL,
-         g_cclosure_marshal_VOID__VOID,
-         G_TYPE_NONE, 0);
-
     signals[REMOVE_REQUESTED] = g_signal_new 
         ("remove-requested",
-         G_OBJECT_CLASS_TYPE (class),
+         iface_type,
          G_SIGNAL_RUN_LAST,
-         G_STRUCT_OFFSET (NmnItemClass, remove_requested),
+         G_STRUCT_OFFSET (NmnItem, remove_requested),
          NULL, NULL,
          g_cclosure_marshal_VOID__VOID,
          G_TYPE_NONE, 0);
 
-    signals[DELETE] = g_signal_new 
-        ("delete",
-         G_OBJECT_CLASS_TYPE (class),
-         G_SIGNAL_RUN_LAST,
-         G_STRUCT_OFFSET (NmnItemClass, delete),
-         NULL, NULL,
-         g_cclosure_marshal_VOID__VOID,
-         G_TYPE_NONE, 0);
+    initialized = TRUE;
+}
 
-    signals[PRIORITY_CHANGED] = g_signal_new 
-        ("priority-changed",
-         G_OBJECT_CLASS_TYPE (class),
-         G_SIGNAL_RUN_LAST,
-         G_STRUCT_OFFSET (NmnItemClass, priority_changed),
-         NULL, NULL,
-         g_cclosure_marshal_VOID__VOID,
-         G_TYPE_NONE, 0);
+GType
+nmn_item_get_type (void)
+{
+    static GType type = 0;
+
+    if (!G_UNLIKELY (type)) {
+        const GTypeInfo info = {
+            sizeof (NmnItem), /* class_size */
+            nmn_item_init,   /* base_init */
+            NULL,       /* base_finalize */
+            NULL,
+            NULL,       /* class_finalize */
+            NULL,       /* class_data */
+            0,
+            0,              /* n_preallocs */
+            NULL
+        };
+
+        type = g_type_register_static (G_TYPE_INTERFACE,
+                                       "NmnItem",
+                                       &info, 0);
+
+        g_type_interface_add_prerequisite (type, GTK_TYPE_WIDGET);
+    }
+
+    return type;
 }
diff --git a/src/nmn-item.h b/src/nmn-item.h
index 31e6931..a0f11e5 100644
--- a/src/nmn-item.h
+++ b/src/nmn-item.h
@@ -20,77 +20,43 @@
 #ifndef NMN_ITEM_H
 #define NMN_ITEM_H
 
-#include <gtk/gtk.h>
-#include "nmn-item-advanced.h"
+#include <glib-object.h>
 
-#define NMN_TYPE_ITEM            (nmn_item_get_type ())
-#define NMN_ITEM(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMN_TYPE_ITEM, NmnItem))
-#define NMN_ITEM_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), NMN_TYPE_ITEM, NmnItemClass))
-#define NMN_IS_ITEM(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMN_TYPE_ITEM))
-#define NMN_IS_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NMN_TYPE_ITEM))
-#define NMN_ITEM_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), NMN_TYPE_ITEM, NmnItemClass))
+#define NMN_TYPE_ITEM      (nmn_item_get_type ())
+#define NMN_ITEM(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMN_TYPE_ITEM, NmnItem))
+#define NMN_IS_ITEM(obj)   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMN_TYPE_ITEM))
+#define NMN_ITEM_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), NMN_TYPE_ITEM, NmnItem))
 
-typedef struct {
-    GtkEventBox parent;
-} NmnItem;
-
-typedef struct {
-    GtkEventBoxClass parent;
-
-    /* Methods */
-    void (*connect) (NmnItem *self);
-    void (*disconnect) (NmnItem *self);
-    guint (*get_priority) (NmnItem *self);
-    NmnItemAdvanced *(*create_advanced_information) (NmnItem *self);
-
-    /* Signals */
-    void (*connect_requested) (NmnItem *self);
-    void (*disconnect_requested) (NmnItem *self);
-    void (*remove_requested) (NmnItem *self);
-    void (*delete) (NmnItem *self);
-    void (*priority_changed) (NmnItem *self);
-} NmnItemClass;
+#define NMN_ITEM_NAME     "name"
+#define NMN_ITEM_PRIORITY "priority"
 
 typedef enum {
-    NMN_ITEM_STATUS_DISCONNECTED,
-    NMN_ITEM_STATUS_CONNECTING,
-    NMN_ITEM_STATUS_CONNECTED
-} NmnItemStatus;
-
-GType nmn_item_get_type (void);
+    NMN_ITEM_PROP_FIRST = 0x1000,
 
-GtkWidget *nmn_item_new (void);
+    NMN_ITEM_PROP_NAME = NMN_ITEM_PROP_FIRST,
+    NMN_ITEM_PROP_PRIORITY,
+} NmnItemProp;
 
-void       nmn_item_set_name (NmnItem *item,
-                              const char *name);
+typedef struct _NmnItem NmnItem;
 
-const char *nmn_item_get_name (NmnItem *item);
+struct _NmnItem {
+    GTypeInterface g_iface;
 
-void       nmn_item_set_status_visible (NmnItem *item,
-                                        gboolean visible);
-
-void       nmn_item_set_status (NmnItem *item,
-                                NmnItemStatus status);
-
-NmnItemStatus nmn_item_get_status (NmnItem *item);
-
-void       nmn_item_set_icon (NmnItem *item,
-                              const char *icon_name);
+    /* Signals */
+    void (*remove_requested) (NmnItem *item);
+};
 
-void       nmn_item_set_security (NmnItem *item,
-                                  const char *security_string);
+GType nmn_item_get_type (void);
 
-void       nmn_item_set_delete_visible (NmnItem *item,
-                                        gboolean visible);
+void        nmn_item_set_name         (NmnItem *item,
+                                       const char *name);
 
-void       nmn_item_connect_request (NmnItem *self);
-void       nmn_item_disconnect_request (NmnItem *self);
-void       nmn_item_remove_request (NmnItem *self);
+char       *nmn_item_get_name         (NmnItem *item);
 
-guint      nmn_item_get_priority (NmnItem *self);
-void       nmn_item_priority_changed (NmnItem *self);
+void        nmn_item_set_priority     (NmnItem *item,
+                                       guint priority);
 
-gboolean         nmn_item_has_advanced (NmnItem *item);
-NmnItemAdvanced *nmn_item_get_advanced (NmnItem *item);
+guint       nmn_item_get_priority     (NmnItem *item);
+void        nmn_item_remove_requested (NmnItem *item);
 
 #endif /* NMN_ITEM_H */
diff --git a/src/nmn-list.c b/src/nmn-list.c
index c619112..b712981 100644
--- a/src/nmn-list.c
+++ b/src/nmn-list.c
@@ -144,10 +144,11 @@ compare_items (gconstpointer a,
 {
     NmnItem *a_item = NMN_ITEM (a);
     NmnItem *b_item = NMN_ITEM (b);
-    const char *a_label;
-    const char *b_label;
+    char *a_label;
+    char *b_label;
     guint a_priority;
     guint b_priority;
+    gint result;
 
     a_priority = nmn_item_get_priority (a_item);
     b_priority = nmn_item_get_priority (b_item);
@@ -161,13 +162,18 @@ compare_items (gconstpointer a,
     a_label = nmn_item_get_name (a_item);
     b_label = nmn_item_get_name (b_item);
 
-    if (a_label && b_label)
-        return strcmp (a_label, b_label);
+    if (a_label) {
+        if (b_label)
+            result = strcmp (a_label, b_label);
+        else
+            result = 1;
+    } else
+        result = -1;
 
-    if (a_label)
-        return 1;
+    g_free (a_label);
+    g_free (b_label);
 
-    return -1;
+    return result;
 }
 
 static void
@@ -216,7 +222,7 @@ nmn_list_add_item (NmnList *list,
                       G_CALLBACK (drag_end),
                       list);
 
-    g_signal_connect_swapped (item, "priority-changed",
+    g_signal_connect_swapped (item, "notify",
                               G_CALLBACK (nmn_list_sort),
                               list);
 
diff --git a/src/nmn-network-item.c b/src/nmn-network-item.c
index e07babf..a4f867b 100644
--- a/src/nmn-network-item.c
+++ b/src/nmn-network-item.c
@@ -17,19 +17,23 @@
  * (C) Copyright 2009 Novell, Inc.
  */
 
+#include <glib/gi18n.h>
 #include <NetworkManager.h>
 #include <nm-device.h>
 #include <nm-connection.h>
 #include <nm-setting-connection.h>
 #include <nm-setting-ip4-config.h>
 #include "nmn-network-item.h"
-#include "nmn-connection-details.h"
+#include "nmn-icon-cache.h"
 #include "nma-gconf-connection.h"
 
 #define DBUS_TYPE_G_MAP_OF_VARIANT (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE))
 #define DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, DBUS_TYPE_G_MAP_OF_VARIANT))
 
-G_DEFINE_TYPE (NmnNetworkItem, nmn_network_item, NMN_TYPE_ITEM)
+static void item_init (NmnItem *item_class);
+
+G_DEFINE_TYPE_EXTENDED (NmnNetworkItem, nmn_network_item, GTK_TYPE_EVENT_BOX, 0,
+                        G_IMPLEMENT_INTERFACE (NMN_TYPE_ITEM, item_init))
 
 enum {
     PROP_0,
@@ -41,13 +45,36 @@ enum {
     LAST_PROP
 };
 
+enum {
+    CONNECT_REQUESTED,
+    DISCONNECT_REQUESTED,
+    DELETE,
+    LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
+
 #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), NMN_TYPE_NETWORK_ITEM, NmnNetworkItemPrivate))
 
 typedef struct {
+    GtkBox *vbox; /* child of self */
+    GtkBox *hbox; /* child of vbox */
+
+    GtkWidget *icon;
+    GtkLabel *name;
+    GtkWidget *status_separator;
+    GtkLabel *status_label;
+    GtkLabel *security;
+    GtkWidget *expander;
+    NmnConnectionDetails *details;
+    GtkButton *connect;
+    GtkWidget *remove;
+    NmnNetworkItemStatus status;
+
     NmnNMData *nm_data;
     NMDevice *device;
     NMExportedConnection *connection;
-    NMActiveConnection *ac;
+NMActiveConnection *ac;
 
     gulong connection_updated_id;
     gulong connection_removed_id;
@@ -82,15 +109,14 @@ nmn_network_item_get_active_connection (NmnNetworkItem *self)
 }
 
 static void
-update_details (NmnNetworkItem *self,
-                NmnConnectionDetails *details)
+update_details (NmnNetworkItem *self)
 {
     NmnNetworkItemPrivate *priv = GET_PRIVATE (self);
     NMConnection *connection;
     NMSettingIP4Config *setting;
     NMIP4Config *config;
 
-    if (!priv->connection)
+    if (!priv->details || !priv->connection)
         return;
 
     connection = nm_exported_connection_get_connection (priv->connection);
@@ -101,7 +127,7 @@ update_details (NmnNetworkItem *self,
     else
         config = NULL;
 
-    nmn_connection_details_set_data (details, setting, config);
+    nmn_connection_details_set_data (priv->details, setting, config);
 }
 
 static void
@@ -109,29 +135,27 @@ ac_state_changed (NMActiveConnection *ac,
                   GParamSpec *pspec,
                   gpointer user_data)
 {
-    NmnItem *item = NMN_ITEM (user_data);
-    NmnItemStatus status;
+    NmnNetworkItem *item = NMN_NETWORK_ITEM (user_data);
+    NmnNetworkItemStatus status;
 
     if (ac) {
         switch (nm_active_connection_get_state (ac)) {
         case NM_ACTIVE_CONNECTION_STATE_ACTIVATED:
-            status = NMN_ITEM_STATUS_CONNECTED;
+            status = NMN_NETWORK_ITEM_STATUS_CONNECTED;
             break;
         case NM_ACTIVE_CONNECTION_STATE_ACTIVATING:
-            status = NMN_ITEM_STATUS_CONNECTING;
+            status = NMN_NETWORK_ITEM_STATUS_CONNECTING;
             break;
         default:
-            status = NMN_ITEM_STATUS_DISCONNECTED;
+            status = NMN_NETWORK_ITEM_STATUS_DISCONNECTED;
             break;
         }
     } else
-        status = NMN_ITEM_STATUS_DISCONNECTED;
-
-    nmn_item_set_status (item, status);
-    nmn_item_priority_changed (item);
+        status = NMN_NETWORK_ITEM_STATUS_DISCONNECTED;
 
-    if (nmn_item_has_advanced (item))
-        update_details (NMN_NETWORK_ITEM (item), NMN_CONNECTION_DETAILS (nmn_item_get_advanced (item)));
+    nmn_network_item_set_status (item, status);
+    g_object_notify (G_OBJECT (item), NMN_ITEM_PRIORITY);
+    update_details (item);
 }
 
 void
@@ -188,7 +212,96 @@ updated (NMExportedConnection *connection,
 static void
 removed (NMExportedConnection *connection, gpointer user_data)
 {
-    nmn_item_remove_request (NMN_ITEM (user_data));
+    nmn_item_remove_requested (NMN_ITEM (user_data));
+}
+
+
+void
+nmn_network_item_set_status_visible (NmnNetworkItem *self,
+                                     gboolean visible)
+{
+    NmnNetworkItemPrivate *priv;
+
+    g_return_if_fail (NMN_IS_NETWORK_ITEM (self));
+
+    priv = GET_PRIVATE (self);
+    if (visible) {
+        gtk_widget_show (priv->status_separator);
+        gtk_widget_show (GTK_WIDGET (priv->status_label));
+    } else {
+        gtk_widget_hide (priv->status_separator);
+        gtk_widget_hide (GTK_WIDGET (priv->status_label));
+    }
+}
+
+void
+nmn_network_item_set_status (NmnNetworkItem *self,
+                             NmnNetworkItemStatus status)
+{
+    NmnNetworkItemPrivate *priv;
+
+    g_return_if_fail (NMN_IS_NETWORK_ITEM (self));
+
+    priv = GET_PRIVATE (self);
+    if (priv->status != status) {
+        const char *status_msg;
+        char *str;
+
+        priv->status = status;
+
+        switch (status) {
+        case NMN_NETWORK_ITEM_STATUS_DISCONNECTED:
+            status_msg = _("Disconnected");
+            gtk_button_set_label (priv->connect, _("Connect"));
+            break;
+        case NMN_NETWORK_ITEM_STATUS_CONNECTING:
+            status_msg = _("Connecting...");
+            gtk_button_set_label (priv->connect, _("Disconnect"));
+            break;
+        case NMN_NETWORK_ITEM_STATUS_CONNECTED:
+            status_msg = _("Connected");
+            gtk_button_set_label (priv->connect, _("Disconnect"));
+            break;
+        default:
+            g_assert_not_reached ();
+        }
+
+        str = g_strconcat ("<big><b>", status_msg, "</b></big>", NULL);
+        gtk_label_set_markup (priv->status_label, str);
+        g_free (str);
+
+        nmn_network_item_set_status_visible (self, TRUE);
+    }
+}
+
+NmnNetworkItemStatus
+nmn_network_item_get_status (NmnNetworkItem *self)
+{
+    g_return_val_if_fail (NMN_IS_NETWORK_ITEM (self), NMN_NETWORK_ITEM_STATUS_DISCONNECTED);
+
+    return GET_PRIVATE (self)->status;
+}
+
+void
+nmn_network_item_set_icon (NmnNetworkItem *self,
+                           const char *icon_name)
+{
+    GtkImage *image;
+    GdkPixbuf *pixbuf;
+
+    g_return_if_fail (NMN_IS_NETWORK_ITEM (self));
+    g_return_if_fail (icon_name != NULL);
+
+    pixbuf = nmn_icon_cache_get (icon_name);
+    if (!pixbuf)
+        return;
+
+    image = GTK_IMAGE (GET_PRIVATE (self)->icon);
+
+    if (gtk_image_get_storage_type (image) == GTK_IMAGE_PIXBUF && gtk_image_get_pixbuf (image) == pixbuf)
+        return;
+
+    gtk_image_set_from_pixbuf (image, pixbuf);
 }
 
 static void
@@ -258,7 +371,7 @@ delayed_connect (gpointer data)
 }
 
 static void
-connect (NmnItem *item)
+connect (NmnNetworkItem *item)
 {
     NmnNetworkItemPrivate *priv = GET_PRIVATE (item);
 
@@ -267,15 +380,15 @@ connect (NmnItem *item)
         return;
     }
 
-    if (nmn_item_has_advanced (item)) {
-        NmnItemAdvanced *advanced = nmn_item_get_advanced (item);
+    if (nmn_network_item_has_details (item)) {
+        NmnConnectionDetails *details = nmn_network_item_get_details (item);
         NMConnection *wrapped;
         NMSetting *current_config;
         NMSetting *new_config;
 
         wrapped = nm_exported_connection_get_connection (priv->connection);
         current_config = nm_connection_get_setting (wrapped, NM_TYPE_SETTING_IP4_CONFIG);
-        new_config = NM_SETTING (nmn_connection_details_get_data (NMN_CONNECTION_DETAILS (advanced)));
+        new_config = NM_SETTING (nmn_connection_details_get_data (NMN_CONNECTION_DETAILS (details)));
         g_assert (new_config);
 
         if (current_config == NULL || nm_setting_compare (current_config, new_config, 0) == FALSE) {
@@ -296,7 +409,7 @@ connect (NmnItem *item)
 }
 
 static void
-disconnect (NmnItem *item)
+disconnect (NmnNetworkItem *item)
 {
     NmnNetworkItemPrivate *priv = GET_PRIVATE (item);
 
@@ -308,6 +421,72 @@ disconnect (NmnItem *item)
     nm_client_deactivate_connection (NM_CLIENT (priv->nm_data), priv->ac);
 }
 
+void
+nmn_network_item_connect_request (NmnNetworkItem *self)
+{
+    g_return_if_fail (NMN_IS_NETWORK_ITEM (self));
+
+    NMN_NETWORK_ITEM_GET_CLASS (self)->connect (self);
+    g_signal_emit (self, signals[CONNECT_REQUESTED], 0);
+}
+
+void
+nmn_network_item_disconnect_request (NmnNetworkItem *self)
+{
+    g_return_if_fail (NMN_IS_NETWORK_ITEM (self));
+
+    NMN_NETWORK_ITEM_GET_CLASS (self)->disconnect (self);
+    g_signal_emit (self, signals[DISCONNECT_REQUESTED], 0);
+}
+
+void
+nmn_network_item_set_security (NmnNetworkItem *self,
+                               const char *security_string)
+{
+    g_return_if_fail (NMN_IS_NETWORK_ITEM (self));
+
+    gtk_label_set_text (GTK_LABEL (GET_PRIVATE (self)->security),
+                        security_string ? security_string : "");
+}
+
+static void
+nmn_network_item_delete (NmnNetworkItem *self)
+{
+    g_signal_emit (self, signals[DELETE], 0);
+}
+
+void
+nmn_network_item_set_delete_visible (NmnNetworkItem *item,
+                                     gboolean visible)
+{
+    NmnNetworkItemPrivate *priv = GET_PRIVATE (item);
+
+    g_return_if_fail (NMN_IS_NETWORK_ITEM (item));
+
+    if (visible && !priv->remove) {
+        GtkWidget *button;
+
+        priv->remove = gtk_vbox_new (FALSE, 0);
+        gtk_box_pack_end (priv->hbox, priv->remove, FALSE, FALSE, 0);
+
+        button = gtk_button_new ();
+        gtk_button_set_image (GTK_BUTTON (button),
+                              gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_BUTTON));
+
+        gtk_button_set_image_position (GTK_BUTTON (button), GTK_POS_RIGHT);
+        gtk_widget_set_tooltip_text (button, "Remove connection");
+        gtk_box_pack_start (GTK_BOX (priv->remove), button, TRUE, FALSE, 0);
+
+        gtk_widget_show_all (priv->remove);
+        g_signal_connect_swapped (button, "clicked",
+                                  G_CALLBACK (nmn_network_item_delete),
+                                  item);
+    } else if (!visible && priv->remove) {
+        gtk_container_remove (GTK_CONTAINER (priv->hbox), priv->remove);
+        priv->remove = NULL;
+    }
+}
+
 NMExportedConnection *
 nmn_network_item_get_connection (NmnNetworkItem *self)
 {
@@ -355,21 +534,21 @@ nmn_network_item_set_connection (NmnNetworkItem *self,
 }
 
 static void
-item_delete (NmnItem *item)
+item_delete (NmnNetworkItem *item)
 {
-    NMExportedConnection *exported = nmn_network_item_get_connection (NMN_NETWORK_ITEM (item));
+    NMExportedConnection *exported = nmn_network_item_get_connection (item);
 
     if (exported)
         nm_exported_connection_delete (exported, NULL);
 }
 
 static guint
-get_priority (NmnItem *item)
+get_priority (NmnNetworkItem *item)
 {
     NMActiveConnection *ac;
     guint priority = 0;
 
-    ac = nmn_network_item_get_active_connection (NMN_NETWORK_ITEM (item));
+    ac = nmn_network_item_get_active_connection (item);
     if (ac) {
         priority = 90;
 
@@ -380,20 +559,147 @@ get_priority (NmnItem *item)
     return priority;
 }
 
-static NmnItemAdvanced *
-create_advanced_information (NmnItem *item)
+
+static void
+details_changed (NmnConnectionDetails *details,
+                 gboolean complete,
+                 gpointer user_data)
 {
-    NmnItemAdvanced *details;
+    NmnNetworkItemPrivate *priv = GET_PRIVATE (user_data);
 
-    details = nmn_connection_details_new ();
-    update_details (NMN_NETWORK_ITEM (item), NMN_CONNECTION_DETAILS (details));
+    gtk_widget_set_sensitive (GTK_WIDGET (priv->connect), complete);
+}
 
-    return details;
+gboolean
+nmn_network_item_has_details (NmnNetworkItem *item)
+{
+    g_return_val_if_fail (NMN_IS_NETWORK_ITEM (item), FALSE);
+
+    return GET_PRIVATE (item)->details != NULL;
+}
+
+NmnConnectionDetails *
+nmn_network_item_get_details (NmnNetworkItem *item)
+{
+    NmnNetworkItemPrivate *priv;
+    GtkWidget *alignment;
+
+    g_return_val_if_fail (NMN_IS_NETWORK_ITEM (item), NULL);
+
+    priv = GET_PRIVATE (item);
+    if (priv->details)
+        return priv->details;
+
+    priv->details = nmn_connection_details_new ();
+    update_details (item);
+
+    alignment = gtk_alignment_new (0, 0, 0, 0);
+    gtk_container_add (GTK_CONTAINER (alignment), GTK_WIDGET (priv->details));
+    gtk_widget_show (alignment);
+    gtk_box_pack_end (priv->vbox, alignment, FALSE, FALSE, 0);
+
+    g_signal_connect (priv->details, "changed", G_CALLBACK (details_changed), item);
+    details_changed (priv->details, nmn_connection_details_verify (priv->details), item);
+
+    return priv->details;
+}
+
+static void
+advanced_expanded (GtkExpander *expander,
+                   GParamSpec *param_spec,
+                   gpointer user_data)
+{
+    NmnConnectionDetails *details;
+
+    details = nmn_network_item_get_details (NMN_NETWORK_ITEM (user_data));
+    if (details)
+        g_object_set (details, "visible", gtk_expander_get_expanded (expander), NULL);
+}
+
+static void
+connect_clicked (GtkButton *button, gpointer user_data)
+{
+    NmnNetworkItem *item = NMN_NETWORK_ITEM (user_data);
+    NmnNetworkItemPrivate *priv = GET_PRIVATE (item);
+
+    if (priv->status == NMN_NETWORK_ITEM_STATUS_DISCONNECTED)
+        nmn_network_item_connect_request (item);
+    else
+        nmn_network_item_disconnect_request (item);
+}
+
+static guint
+nmn_network_item_get_priority (NmnNetworkItem *self)
+{
+    return NMN_NETWORK_ITEM_GET_CLASS (self)->get_priority (self);
+}
+
+static void
+item_init (NmnItem *item_class)
+{
 }
 
 static void
 nmn_network_item_init (NmnNetworkItem *item)
 {
+    NmnNetworkItemPrivate *priv = GET_PRIVATE (item);
+    GtkWidget *vbox;
+    GtkWidget *hbox;
+    GtkWidget *w;
+
+    priv->vbox = GTK_BOX (gtk_vbox_new (FALSE, 6));
+    gtk_container_set_border_width (GTK_CONTAINER (priv->vbox), 6);
+    gtk_container_add (GTK_CONTAINER (item), GTK_WIDGET (priv->vbox));
+
+    priv->hbox = GTK_BOX (gtk_hbox_new (FALSE, 6));
+    gtk_container_set_border_width (GTK_CONTAINER (priv->hbox), 6);
+    gtk_box_pack_start (priv->vbox, GTK_WIDGET (priv->hbox), FALSE, FALSE, 0);
+
+    priv->icon = gtk_image_new ();
+    gtk_box_pack_start (priv->hbox, priv->icon, FALSE, FALSE, 0);
+
+    vbox = gtk_vbox_new (FALSE, 0);
+    gtk_box_pack_start (priv->hbox, vbox, FALSE, FALSE, 0);
+
+    hbox = gtk_hbox_new (FALSE, 12);
+    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+
+    w = gtk_label_new ("");
+    gtk_label_set_use_markup (GTK_LABEL (w), TRUE);
+    gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5);
+    gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
+    priv->name = GTK_LABEL (w);
+
+    w = gtk_label_new (" - ");
+    gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
+    priv->status_separator = w;
+
+    w = gtk_label_new ("");
+    gtk_label_set_use_markup (GTK_LABEL (w), TRUE);
+    gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5);
+    gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
+    priv->status_label = GTK_LABEL (w);
+
+    hbox = gtk_hbox_new (FALSE, 12);
+    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+
+    w = gtk_label_new ("");
+    gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
+    priv->security = GTK_LABEL (w);
+
+    w = gtk_expander_new (_("Advanced"));
+    gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
+    priv->expander = w;
+    g_signal_connect (w, "notify::expanded", G_CALLBACK (advanced_expanded), item);
+
+    w = gtk_button_new_with_label (_("Connect"));
+    gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
+    priv->connect = GTK_BUTTON (w);
+    g_signal_connect (w, "clicked", G_CALLBACK (connect_clicked), item);
+
+    priv->remove = NULL;
+
+    gtk_widget_show_all (GTK_WIDGET (priv->vbox));
 }
 
 static GObject*
@@ -426,8 +732,15 @@ set_property (GObject *object, guint prop_id,
               const GValue *value, GParamSpec *pspec)
 {
     NmnNetworkItemPrivate *priv = GET_PRIVATE (object);
+    char *s;
 
     switch (prop_id) {
+    case NMN_ITEM_PROP_NAME:
+        s = g_strdup_printf ("<big><b>%s</b></big>", g_value_get_string (value));
+        gtk_label_set_markup (GTK_LABEL (priv->name), s);
+        g_free (s);
+        g_object_notify (object, NMN_ITEM_NAME);
+        break;
     case PROP_NM_DATA:
         /* Construct only */
         priv->nm_data = g_value_dup_object (value);
@@ -457,6 +770,12 @@ get_property (GObject *object, guint prop_id,
     NmnNetworkItemPrivate *priv = GET_PRIVATE (object);
 
     switch (prop_id) {
+    case NMN_ITEM_PROP_NAME:
+        g_value_set_string (value, gtk_label_get_text (GTK_LABEL (priv->name)));
+        break;
+    case NMN_ITEM_PROP_PRIORITY:
+        g_value_set_uint (value, nmn_network_item_get_priority (NMN_NETWORK_ITEM (object)));
+        break;
     case PROP_NM_DATA:
         g_value_set_object (value, priv->nm_data);
         break;
@@ -503,7 +822,6 @@ static void
 nmn_network_item_class_init (NmnNetworkItemClass *class)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (class);
-    NmnItemClass *item_class = NMN_ITEM_CLASS (class);
 
     g_type_class_add_private (object_class, sizeof (NmnNetworkItemPrivate));
 
@@ -512,13 +830,20 @@ nmn_network_item_class_init (NmnNetworkItemClass *class)
     object_class->get_property = get_property;
     object_class->dispose = dispose;
 
-    item_class->connect = connect;
-    item_class->disconnect = disconnect;
-    item_class->delete = item_delete;
-    item_class->get_priority = get_priority;
-    item_class->create_advanced_information = create_advanced_information;
+    class->connect = connect;
+    class->disconnect = disconnect;
+    class->delete = item_delete;
+    class->get_priority = get_priority;
 
     /* properties */
+    g_object_class_override_property (object_class,
+                                      NMN_ITEM_PROP_NAME,
+                                      NMN_ITEM_NAME);
+
+    g_object_class_override_property (object_class,
+                                      NMN_ITEM_PROP_PRIORITY,
+                                      NMN_ITEM_PRIORITY);
+
     g_object_class_install_property
         (object_class, PROP_NM_DATA,
          g_param_spec_object (NMN_NETWORK_ITEM_NM_DATA,
@@ -550,4 +875,33 @@ nmn_network_item_class_init (NmnNetworkItemClass *class)
                               "NMActiveConnection",
                               NM_TYPE_ACTIVE_CONNECTION,
                               G_PARAM_READWRITE));
+
+
+    /* Signals */
+    signals[CONNECT_REQUESTED] = g_signal_new 
+        ("connect-requested",
+         G_OBJECT_CLASS_TYPE (class),
+         G_SIGNAL_RUN_LAST,
+         G_STRUCT_OFFSET (NmnNetworkItemClass, connect_requested),
+         NULL, NULL,
+         g_cclosure_marshal_VOID__VOID,
+         G_TYPE_NONE, 0);
+
+    signals[DISCONNECT_REQUESTED] = g_signal_new 
+        ("disconnect-requested",
+         G_OBJECT_CLASS_TYPE (class),
+         G_SIGNAL_RUN_LAST,
+         G_STRUCT_OFFSET (NmnNetworkItemClass, disconnect_requested),
+         NULL, NULL,
+         g_cclosure_marshal_VOID__VOID,
+         G_TYPE_NONE, 0);
+
+    signals[DELETE] = g_signal_new 
+        ("delete",
+         G_OBJECT_CLASS_TYPE (class),
+         G_SIGNAL_RUN_LAST,
+         G_STRUCT_OFFSET (NmnNetworkItemClass, delete),
+         NULL, NULL,
+         g_cclosure_marshal_VOID__VOID,
+         G_TYPE_NONE, 0);
 }
diff --git a/src/nmn-network-item.h b/src/nmn-network-item.h
index 2e58e4d..497376e 100644
--- a/src/nmn-network-item.h
+++ b/src/nmn-network-item.h
@@ -20,9 +20,11 @@
 #ifndef NMN_NETWORK_ITEM_H
 #define NMN_NETWORK_ITEM_H
 
+#include <gtk/gtk.h>
 #include <dbus/dbus-glib.h>
 #include <nm-settings.h>
-#include <nmn-item.h>
+#include "nmn-item.h"
+#include "nmn-connection-details.h"
 #include "nmn-nm-data.h"
 
 #define NMN_TYPE_NETWORK_ITEM            (nmn_network_item_get_type ())
@@ -37,25 +39,59 @@
 #define NMN_NETWORK_ITEM_CONNECTION "connection"
 #define NMN_NETWORK_ITEM_AC         "active-connection"
 
+typedef enum {
+    NMN_NETWORK_ITEM_STATUS_DISCONNECTED,
+    NMN_NETWORK_ITEM_STATUS_CONNECTING,
+    NMN_NETWORK_ITEM_STATUS_CONNECTED
+} NmnNetworkItemStatus;
+
 typedef struct {
-    NmnItem parent;
+    GtkEventBox parent;
 } NmnNetworkItem;
 
 typedef struct {
-    NmnItemClass parent;
+    GtkEventBoxClass parent;
 
     /* Methods */
+    void (*connect) (NmnNetworkItem *self);
+    void (*disconnect) (NmnNetworkItem *self);
+    guint (*get_priority) (NmnNetworkItem *self);
     const char * (*get_specific_object) (NmnNetworkItem *self);
     void (*secrets_requested) (NmnNetworkItem *self,
                                const char *setting_name,
                                const char **hints,
                                gboolean ask_user,
                                DBusGMethodInvocation *context);
+
+    /* Signals */
+    void (*connect_requested) (NmnNetworkItem *self);
+    void (*disconnect_requested) (NmnNetworkItem *self);
+    void (*delete) (NmnNetworkItem *self);
 } NmnNetworkItemClass;
 
 GType nmn_network_item_get_type (void);
 
-NmnNMData        *nmn_network_item_get_nm_data           (NmnNetworkItem *self);
+void                 nmn_network_item_set_status_visible     (NmnNetworkItem *self,
+                                                              gboolean visible);
+
+void                  nmn_network_item_set_status            (NmnNetworkItem *self,
+                                                              NmnNetworkItemStatus status);
+
+NmnNetworkItemStatus  nmn_network_item_get_status            (NmnNetworkItem *self);
+void                  nmn_network_item_set_icon              (NmnNetworkItem *self,
+                                                              const char *icon_name);
+
+void                  nmn_network_item_set_security          (NmnNetworkItem *self,
+                                                              const char *security_string);
+
+void                  nmn_network_item_set_delete_visible    (NmnNetworkItem *self,
+                                                              gboolean visible);
+
+void                  nmn_network_item_connect_request       (NmnNetworkItem *self);
+void                  nmn_network_item_disconnect_request    (NmnNetworkItem *self);
+gboolean              nmn_network_item_has_details           (NmnNetworkItem *self);
+NmnConnectionDetails *nmn_network_item_get_details           (NmnNetworkItem *self);
+NmnNMData            *nmn_network_item_get_nm_data           (NmnNetworkItem *self);
 NMDevice             *nmn_network_item_get_device            (NmnNetworkItem *self);
 NMExportedConnection *nmn_network_item_get_connection        (NmnNetworkItem *self);
 void                  nmn_network_item_set_connection        (NmnNetworkItem *self,
diff --git a/src/nmn-serial-handler.c b/src/nmn-serial-handler.c
index 6d46a90..0fe7fd4 100644
--- a/src/nmn-serial-handler.c
+++ b/src/nmn-serial-handler.c
@@ -61,7 +61,7 @@ connection_added (NmnDeviceHandler *handler,
 
     item = nmn_serial_item_new (nmn_device_handler_get_nm_data (handler), NM_SERIAL_DEVICE (device));
     g_object_set (item, NMN_NETWORK_ITEM_CONNECTION, exported, NULL);
-    nmn_device_handler_add_item (handler, NMN_ITEM (item));
+    nmn_device_handler_add_item (handler, NMN_NETWORK_ITEM (item));
 }
 
 static void
diff --git a/src/nmn-serial-item.c b/src/nmn-serial-item.c
index f7de467..5034559 100644
--- a/src/nmn-serial-item.c
+++ b/src/nmn-serial-item.c
@@ -53,7 +53,7 @@ state_changed (NMDevice *device,
         break;
     }
 
-    nmn_item_set_icon (NMN_ITEM (user_data), icon);
+    nmn_network_item_set_icon (NMN_NETWORK_ITEM (user_data), icon);
 }
 
 GtkWidget *
@@ -70,15 +70,15 @@ nmn_serial_item_new (NmnNMData *nm_data,
 }
 
 static guint
-get_priority (NmnItem *item)
+get_priority (NmnNetworkItem *item)
 {
-    return NMN_ITEM_CLASS (nmn_serial_item_parent_class)->get_priority (item) + 10;
+    return NMN_NETWORK_ITEM_CLASS (nmn_serial_item_parent_class)->get_priority (item) + 10;
 }
 
 static void
 nmn_serial_item_init (NmnSerialItem *item)
 {
-    nmn_item_set_delete_visible (NMN_ITEM (item), TRUE);
+    nmn_network_item_set_delete_visible (NMN_NETWORK_ITEM (item), TRUE);
 }
 
 static GObject*
@@ -127,12 +127,12 @@ static void
 nmn_serial_item_class_init (NmnSerialItemClass *class)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (class);
-    NmnItemClass *item_class = NMN_ITEM_CLASS (class);
+    NmnNetworkItemClass *network_item_class = NMN_NETWORK_ITEM_CLASS (class);
 
     g_type_class_add_private (object_class, sizeof (NmnSerialItemPrivate));
 
     object_class->constructor = constructor;
     object_class->dispose = dispose;
 
-    item_class->get_priority = get_priority;
+    network_item_class->get_priority = get_priority;
 }
diff --git a/src/nmn-wifi-handler.c b/src/nmn-wifi-handler.c
index 568f399..5f49b92 100644
--- a/src/nmn-wifi-handler.c
+++ b/src/nmn-wifi-handler.c
@@ -100,7 +100,7 @@ update_items (NmnWifiHandler *self)
         }
 
         if (!best_ap)
-            nmn_item_remove_request (NMN_ITEM (item));
+            nmn_item_remove_requested (NMN_ITEM (item));
         else if (best_ap != current_ap)
             nmn_wifi_item_set_ap (item, best_ap);
     }
@@ -151,8 +151,8 @@ connection_added (NmnDeviceHandler *handler,
     if (ap) {
         item = nmn_wifi_item_new (nmn_device_handler_get_nm_data (handler), device, ap);
         g_object_set (item, NMN_NETWORK_ITEM_CONNECTION, exported, NULL);
-        nmn_item_set_delete_visible (NMN_ITEM (item), TRUE);
-        nmn_device_handler_add_item (handler, NMN_ITEM (item));
+        nmn_network_item_set_delete_visible (NMN_NETWORK_ITEM (item), TRUE);
+        nmn_device_handler_add_item (handler, NMN_NETWORK_ITEM (item));
     }
 }
 
diff --git a/src/nmn-wifi-item.c b/src/nmn-wifi-item.c
index c8b4f79..139414b 100644
--- a/src/nmn-wifi-item.c
+++ b/src/nmn-wifi-item.c
@@ -48,7 +48,7 @@ typedef struct {
     gboolean disposed;
 } NmnWifiItemPrivate;
 
-static void connect (NmnItem *item);
+static void connect (NmnNetworkItem *item);
 
 GtkWidget *
 nmn_wifi_item_new (NmnNMData *nm_data,
@@ -70,7 +70,7 @@ static void
 update_item (NmnWifiItem *self)
 {
     NmnWifiItemPrivate *priv = GET_PRIVATE (self);
-    NmnItem *item = NMN_ITEM (self);
+    NmnNetworkItem *item = NMN_NETWORK_ITEM (self);
     const char *icon;
     const char *security_string;
     guint strength;
@@ -106,20 +106,20 @@ update_item (NmnWifiItem *self)
     else
         security_string = "";
 
-    nmn_item_set_icon (item, icon);
-    nmn_item_set_security (item, security_string);
+    nmn_network_item_set_icon (item, icon);
+    nmn_network_item_set_security (item, security_string);
 
-    if (nmn_network_item_get_connection (NMN_NETWORK_ITEM (self)) == NULL) {
+    if (nmn_network_item_get_connection (item) == NULL) {
         /* We're an AP list item, set the item's name */
         const GByteArray *ssid;
         char *printable_ssid;
 
         ssid = nm_access_point_get_ssid (priv->ap);
         printable_ssid = nm_utils_ssid_to_utf8 ((char *) ssid->data, ssid->len);
-        nmn_item_set_name (item, printable_ssid);
+        nmn_item_set_name (NMN_ITEM (self), printable_ssid);
         g_free (printable_ssid);
 
-        nmn_item_set_status_visible (item, FALSE);
+        nmn_network_item_set_status_visible (item, FALSE);
     }
 }
 
@@ -411,7 +411,7 @@ wifi_item_created (NmnNetworkItem *item, NMConnection *connection)
     nmn_network_item_set_connection (item, exported);
     g_object_unref (exported);
 
-    connect (NMN_ITEM (item));
+    connect (item);
     nmn_network_item_set_connection (item, NULL);
 }
 
@@ -453,16 +453,14 @@ update_autoconnect (NmnNetworkItem *item, gboolean connect_automatically)
 }
 
 static void
-connect (NmnItem *item)
+connect (NmnNetworkItem *item)
 {
-    NmnNetworkItem *network_item = NMN_NETWORK_ITEM (item);
-
-    if (!nmn_network_item_get_connection (network_item)) {
+    if (!nmn_network_item_get_connection (item)) {
         NMDevice *device;
         NMAccessPoint *ap;
         NMConnection *connection;
 
-        device = nmn_network_item_get_device (network_item);
+        device = nmn_network_item_get_device (item);
         ap = nmn_wifi_item_get_ap (NMN_WIFI_ITEM (item));
         connection = create_new_connection (NM_DEVICE_WIFI (device), ap);
         if (!connection)
@@ -472,32 +470,32 @@ connect (NmnItem *item)
             NmnNMData *nm_data;
             GtkWidget *dialog;
 
-            nm_data = nmn_network_item_get_nm_data (network_item);
+            nm_data = nmn_network_item_get_nm_data (item);
             dialog = nma_wireless_dialog_new (NM_CLIENT (nm_data), connection, device, ap);
             g_signal_connect (dialog, "done", G_CALLBACK (wireless_dialog_response_cb), item);
             nma_wireless_dialog_show (NMA_WIRELESS_DIALOG (dialog));
         } else
-            wifi_item_created (network_item, connection);
+            wifi_item_created (item, connection);
 
         g_object_unref (connection);
     } else {
-        update_autoconnect (network_item, TRUE);
-        NMN_ITEM_CLASS (nmn_wifi_item_parent_class)->connect (item);
+        update_autoconnect (item, TRUE);
+        NMN_NETWORK_ITEM_CLASS (nmn_wifi_item_parent_class)->connect (item);
     }
 }
 
 static void
-disconnect (NmnItem *item)
+disconnect (NmnNetworkItem *item)
 {
     /* Turn off autoconnect, otherwise it would reconnect right back. */
-    update_autoconnect (NMN_NETWORK_ITEM (item), FALSE);
-    NMN_ITEM_CLASS (nmn_wifi_item_parent_class)->disconnect (item);
+    update_autoconnect (item, FALSE);
+    NMN_NETWORK_ITEM_CLASS (nmn_wifi_item_parent_class)->disconnect (item);
 }
 
 static guint
-get_priority (NmnItem *item)
+get_priority (NmnNetworkItem *item)
 {
-    return NMN_ITEM_CLASS (nmn_wifi_item_parent_class)->get_priority (item) + 20;
+    return NMN_NETWORK_ITEM_CLASS (nmn_wifi_item_parent_class)->get_priority (item) + 20;
 }
 
 static const char *
@@ -738,7 +736,6 @@ static void
 nmn_wifi_item_class_init (NmnWifiItemClass *class)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (class);
-    NmnItemClass *item_class = NMN_ITEM_CLASS (class);
 	NmnNetworkItemClass *network_item_class = NMN_NETWORK_ITEM_CLASS (class);
 
     g_type_class_add_private (object_class, sizeof (NmnWifiItemPrivate));
@@ -749,10 +746,9 @@ nmn_wifi_item_class_init (NmnWifiItemClass *class)
     object_class->get_property = get_property;
     object_class->dispose = dispose;
 
-    item_class->connect = connect;
-    item_class->disconnect = disconnect;
-    item_class->get_priority = get_priority;
-
+    network_item_class->connect = connect;
+    network_item_class->disconnect = disconnect;
+    network_item_class->get_priority = get_priority;
     network_item_class->get_specific_object = get_specific_object;
     network_item_class->secrets_requested = secrets_requested;
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]