static void dock_build_children (GladeXML *xml, GtkWidget *w, GladeWidgetInfo *info) { int i; GtkWidget *child; GladeChildInfo *childinfo; for (i = 0; i < info->n_children; i++) { childinfo = &info->children[i]; if (!strcmp (childinfo->child->classname, "BonoboDockItem")) { add_dock_item (xml, w, info, childinfo); continue; } if (bonobo_dock_get_client_area (BONOBO_DOCK (w))) g_warning ("Multiple client areas for BonoboDock found."); child = glade_xml_build_widget (xml, childinfo->child); bonobo_dock_set_client_area (BONOBO_DOCK (w), child); } }
/* This gets the placement, band number, position and offset of dock items which are not floating. It returns TRUE if the dock item is found. */ static gboolean gb_bonobo_dock_item_find_position (BonoboDockItem * dock_item, BonoboDockPlacement *placement, gint *band_num, gint *position, gint *offset) { BonoboDock *dock; BonoboDockBand *dock_band; BonoboDockBandChild *dock_band_child; gint pos; GList *elem; g_return_val_if_fail (BONOBO_IS_DOCK_BAND (GTK_WIDGET (dock_item)->parent), FALSE); dock_band = BONOBO_DOCK_BAND (GTK_WIDGET (dock_item)->parent); g_return_val_if_fail (BONOBO_IS_DOCK (GTK_WIDGET (dock_band)->parent), FALSE); dock = BONOBO_DOCK (GTK_WIDGET (dock_band)->parent); /* First we find out which band the existing dock item is. */ if ((*band_num = g_list_index (dock->top_bands, dock_band)) != -1) *placement = BONOBO_DOCK_TOP; else if ((*band_num = g_list_index (dock->bottom_bands, dock_band)) != -1) *placement = BONOBO_DOCK_BOTTOM; else if ((*band_num = g_list_index (dock->left_bands, dock_band)) != -1) *placement = BONOBO_DOCK_LEFT; else if ((*band_num = g_list_index (dock->right_bands, dock_band)) != -1) *placement = BONOBO_DOCK_RIGHT; else return FALSE; /* Now find the position of the existing dock item within the band. */ for (elem = dock_band->children, pos = 0; elem != NULL; elem = elem->next, pos++) { dock_band_child = (BonoboDockBandChild*) elem->data; if (dock_band_child->widget == GTK_WIDGET (dock_item)) { *position = pos; *offset = dock_band_child->offset; return TRUE; } } return FALSE; }
static void add_dock_item (GladeXML *xml, GtkWidget *parent, GladeWidgetInfo *info, GladeChildInfo *childinfo) { BonoboDockPlacement placement; guint band, offset; int position; int i; GtkWidget *child; band = offset = position = 0; placement = BONOBO_DOCK_TOP; for (i = 0; i < childinfo->n_properties; i++) { const char *name = childinfo->properties[i].name; const char *value = childinfo->properties[i].value; if (!strcmp (name, "placement")) placement = glade_enum_from_string ( BONOBO_TYPE_DOCK_PLACEMENT, value); else if (!strcmp (name, "band")) band = UINT (value); else if (!strcmp (name, "position")) position = INT (value); else if (!strcmp (name, "offset")) offset = UINT (value); } child = glade_xml_build_widget (xml, childinfo->child); bonobo_dock_add_item (BONOBO_DOCK (parent), BONOBO_DOCK_ITEM (child), placement, band, position, offset, FALSE); }
static void gb_bonobo_dock_item_add_item (BonoboDockItem * existing_dock_item, gboolean after) { BonoboDock *dock; BonoboDockBand *dock_band; GtkWidget *dock_item, *placeholder; BonoboDockPlacement placement; gint band_num, position, offset; if (!gb_bonobo_dock_item_find_position (BONOBO_DOCK_ITEM (existing_dock_item), &placement, &band_num, &position, &offset)) { g_warning ("Dock band not found"); return; } dock_band = BONOBO_DOCK_BAND (GTK_WIDGET (existing_dock_item)->parent); dock = BONOBO_DOCK (GTK_WIDGET (dock_band)->parent); /* Create the new dock item. */ dock_item = gb_widget_new ("BonoboDockItem", NULL); placeholder = editor_new_placeholder (); gtk_container_add (GTK_CONTAINER (dock_item), placeholder); /* Now add it at the required position. */ if (after) position++; bonobo_dock_add_item (dock, BONOBO_DOCK_ITEM (dock_item), placement, band_num, position, 0, FALSE); gtk_widget_show (dock_item); /* Show the properties of the new dock item. */ gb_widget_show_properties (dock_item); }
static void dock_allow_floating (GladeXML *xml, GtkWidget *widget, const char *name, const char *value) { bonobo_dock_allow_floating_items (BONOBO_DOCK (widget), BOOL (value)); }