gdl-dock-bar.c revision b5c42580c384b01263eb1a1e199376e15eef7cd3
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński *
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński * This file is part of the GNOME Devtools Libraries.
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen *
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński * Copyright (C) 2003 Jeroen Zwartepoorte <jeroen@xs4all.nl>
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński *
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen * This library is free software; you can redistribute it and/or
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński * modify it under the terms of the GNU Lesser General Public
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen * License as published by the Free Software Foundation; either
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen * version 2.1 of the License, or (at your option) any later version.
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen *
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen * This library is distributed in the hope that it will be useful,
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen * but WITHOUT ANY WARRANTY; without even the implied warranty of
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen * Lesser General Public License for more details.
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen *
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen * You should have received a copy of the GNU Lesser General Public
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen * License along with this library; if not, write to the Free Software
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen */
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#ifdef HAVE_CONFIG_H
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include <config.h>
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#endif
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "gdl-i18n.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include <stdlib.h>
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include <string.h>
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "gdl-tools.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "gdl-dock.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "gdl-dock-master.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "gdl-dock-bar.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen#include "libgdltypebuiltins.h"
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskienum {
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen PROP_0,
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen PROP_MASTER,
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen PROP_DOCKBAR_STYLE
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński};
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński/* ----- Private prototypes ----- */
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void gdl_dock_bar_class_init (GdlDockBarClass *klass);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void gdl_dock_bar_instance_init (GdlDockBar *dockbar);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void gdl_dock_bar_get_property (GObject *object,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński guint prop_id,
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński GValue *value,
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen GParamSpec *pspec);
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosińskistatic void gdl_dock_bar_set_property (GObject *object,
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen guint prop_id,
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen const GValue *value,
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen GParamSpec *pspec);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelenstatic void gdl_dock_bar_destroy (GtkObject *object);
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosińskistatic void gdl_dock_bar_attach (GdlDockBar *dockbar,
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński GdlDockMaster *master);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelenstatic void gdl_dock_bar_remove_item (GdlDockBar *dockbar,
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński GdlDockItem *item);
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński/* ----- Class variables and definitions ----- */
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosińskistruct _GdlDockBarPrivate {
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen GdlDockMaster *master;
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen GSList *items;
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen GtkOrientation orientation;
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński GdlDockBarStyle dockbar_style;
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen};
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński/* ----- Private functions ----- */
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof KosińskiGDL_CLASS_BOILERPLATE (GdlDockBar, gdl_dock_bar, GtkBox, GTK_TYPE_BOX)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void gdl_dock_bar_size_request (GtkWidget *widget,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GtkRequisition *requisition );
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void gdl_dock_bar_size_allocate (GtkWidget *widget,
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen GtkAllocation *allocation );
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void gdl_dock_bar_size_vrequest (GtkWidget *widget,
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen GtkRequisition *requisition );
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void gdl_dock_bar_size_vallocate (GtkWidget *widget,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GtkAllocation *allocation );
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void gdl_dock_bar_size_hrequest (GtkWidget *widget,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GtkRequisition *requisition );
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void gdl_dock_bar_size_hallocate (GtkWidget *widget,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GtkAllocation *allocation );
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void update_dock_items (GdlDockBar *dockbar, gboolean full_update);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskivoid
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskigdl_dock_bar_class_init (GdlDockBarClass *klass)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński{
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GObjectClass *g_object_class;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GtkObjectClass *gtk_object_class;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GtkWidgetClass *widget_class;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_object_class = G_OBJECT_CLASS (klass);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen gtk_object_class = GTK_OBJECT_CLASS (klass);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_object_class->get_property = gdl_dock_bar_get_property;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_object_class->set_property = gdl_dock_bar_set_property;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński gtk_object_class->destroy = gdl_dock_bar_destroy;
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński g_object_class_install_property (
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński g_object_class, PROP_MASTER,
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński g_param_spec_object ("master", _("Master"),
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński _("GdlDockMaster object which the dockbar widget "
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński "is attached to"),
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GDL_TYPE_DOCK_MASTER,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński G_PARAM_READWRITE));
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_object_class_install_property (
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_object_class, PROP_DOCKBAR_STYLE,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_param_spec_enum ("dockbar-style", _("Dockbar style"),
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński _("Dockbar style to show items on it"),
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GDL_TYPE_DOCK_BAR_STYLE,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GDL_DOCK_BAR_BOTH,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński widget_class = GTK_WIDGET_CLASS (klass);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński widget_class->size_request = gdl_dock_bar_size_request;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński widget_class->size_allocate = gdl_dock_bar_size_allocate;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński}
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskigdl_dock_bar_instance_init (GdlDockBar *dockbar)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński{
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński dockbar->_priv = g_new0 (GdlDockBarPrivate, 1);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński dockbar->_priv->master = NULL;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński dockbar->_priv->items = NULL;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński dockbar->_priv->orientation = GTK_ORIENTATION_VERTICAL;
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński dockbar->_priv->dockbar_style = GDL_DOCK_BAR_BOTH;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński}
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosińskistatic void
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskigdl_dock_bar_get_property (GObject *object,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński guint prop_id,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GValue *value,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GParamSpec *pspec)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński{
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GdlDockBar *dockbar = GDL_DOCK_BAR (object);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński switch (prop_id) {
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński case PROP_MASTER:
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_value_set_object (value, dockbar->_priv->master);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński break;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński case PROP_DOCKBAR_STYLE:
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_value_set_enum (value, dockbar->_priv->dockbar_style);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński break;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński default:
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński };
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński}
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskigdl_dock_bar_set_property (GObject *object,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński guint prop_id,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński const GValue *value,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GParamSpec *pspec)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński{
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GdlDockBar *dockbar = GDL_DOCK_BAR (object);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński switch (prop_id) {
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński case PROP_MASTER:
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński gdl_dock_bar_attach (dockbar, g_value_get_object (value));
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński break;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński case PROP_DOCKBAR_STYLE:
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński dockbar->_priv->dockbar_style = g_value_get_enum (value);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński update_dock_items (dockbar, TRUE);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński break;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński default:
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński };
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński}
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskion_dock_item_foreach_disconnect (GdlDockItem *item, GdlDockBar *dock_bar)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński{
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen g_signal_handlers_disconnect_by_func (item, gdl_dock_bar_remove_item,
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen dock_bar);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński}
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskigdl_dock_bar_destroy (GtkObject *object)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński{
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GdlDockBar *dockbar = GDL_DOCK_BAR (object);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński if (dockbar->_priv) {
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GdlDockBarPrivate *priv = dockbar->_priv;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński if (priv->items) {
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_slist_foreach (priv->items,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński (GFunc) on_dock_item_foreach_disconnect,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński object);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_slist_free (priv->items);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński }
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński if (priv->master) {
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_signal_handlers_disconnect_matched (priv->master,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński G_SIGNAL_MATCH_DATA,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński 0, 0, NULL, NULL, dockbar);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_object_unref (priv->master);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński priv->master = NULL;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński }
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński dockbar->_priv = NULL;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_free (priv);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński }
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GDL_CALL_PARENT (GTK_OBJECT_CLASS, destroy, (object));
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński}
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskigdl_dock_bar_remove_item (GdlDockBar *dockbar,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GdlDockItem *item)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński{
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GdlDockBarPrivate *priv;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GtkWidget *button;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_return_if_fail (GDL_IS_DOCK_BAR (dockbar));
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_return_if_fail (GDL_IS_DOCK_ITEM (item));
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński priv = dockbar->_priv;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński if (g_slist_index (priv->items, item) == -1) {
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_warning ("Item has not been added to the dockbar");
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński return;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński }
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński priv->items = g_slist_remove (priv->items, item);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński button = g_object_get_data (G_OBJECT (item), "GdlDockBarButton");
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_assert (button != NULL);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński gtk_container_remove (GTK_CONTAINER (dockbar), button);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_object_set_data (G_OBJECT (item), "GdlDockBarButton", NULL);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_signal_handlers_disconnect_by_func (item,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński G_CALLBACK (gdl_dock_bar_remove_item),
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński dockbar);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński}
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskigdl_dock_bar_item_clicked (GtkWidget *button,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GdlDockItem *item)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński{
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GdlDockBar *dockbar;
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen GdlDockObject *controller;
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen (void)button;
c8589a6c7367d09fa756755cef0dd448c7328a71Johan B. C. Engelen
c8589a6c7367d09fa756755cef0dd448c7328a71Johan B. C. Engelen g_return_if_fail (item != NULL);
c8589a6c7367d09fa756755cef0dd448c7328a71Johan B. C. Engelen
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen dockbar = g_object_get_data (G_OBJECT (item), "GdlDockBar");
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_assert (dockbar != NULL);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen g_object_set_data (G_OBJECT (item), "GdlDockBar", NULL);
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński controller = gdl_dock_master_get_controller (GDL_DOCK_OBJECT_GET_MASTER (item));
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GDL_DOCK_OBJECT_UNSET_FLAGS (item, GDL_DOCK_ICONIFIED);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński gdl_dock_item_show_item (item);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński gdl_dock_bar_remove_item (dockbar, item);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński gtk_widget_queue_resize (GTK_WIDGET (controller));
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński}
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosińskistatic void
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelengdl_dock_bar_add_item (GdlDockBar *dockbar,
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen GdlDockItem *item)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński{
c8589a6c7367d09fa756755cef0dd448c7328a71Johan B. C. Engelen GdlDockBarPrivate *priv;
18d56400fb8d667bff7c64b550365d94725bfe6eDiederik van Lierop GtkWidget *button;
18d56400fb8d667bff7c64b550365d94725bfe6eDiederik van Lierop gchar *stock_id;
18d56400fb8d667bff7c64b550365d94725bfe6eDiederik van Lierop gchar *name;
18d56400fb8d667bff7c64b550365d94725bfe6eDiederik van Lierop GdkPixbuf *pixbuf_icon;
18d56400fb8d667bff7c64b550365d94725bfe6eDiederik van Lierop GtkWidget *image, *box, *label;
18d56400fb8d667bff7c64b550365d94725bfe6eDiederik van Lierop
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński g_return_if_fail (GDL_IS_DOCK_BAR (dockbar));
18d56400fb8d667bff7c64b550365d94725bfe6eDiederik van Lierop g_return_if_fail (GDL_IS_DOCK_ITEM (item));
c8589a6c7367d09fa756755cef0dd448c7328a71Johan B. C. Engelen
c8589a6c7367d09fa756755cef0dd448c7328a71Johan B. C. Engelen priv = dockbar->_priv;
c8589a6c7367d09fa756755cef0dd448c7328a71Johan B. C. Engelen
c8589a6c7367d09fa756755cef0dd448c7328a71Johan B. C. Engelen if (g_slist_index (priv->items, item) != -1) {
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_warning ("Item has already been added to the dockbar");
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński return;
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński }
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński priv->items = g_slist_append (priv->items, item);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński /* Create a button for the item. */
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński button = gtk_button_new ();
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński if (dockbar->_priv->orientation == GTK_ORIENTATION_HORIZONTAL)
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński box = gtk_hbox_new (FALSE, 0);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński else
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński box = gtk_vbox_new (FALSE, 0);
c8589a6c7367d09fa756755cef0dd448c7328a71Johan B. C. Engelen
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_object_get (item, "stock-id", &stock_id, "pixbuf-icon", &pixbuf_icon,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński "long-name", &name, NULL);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński if (dockbar->_priv->dockbar_style == GDL_DOCK_BAR_TEXT ||
18d56400fb8d667bff7c64b550365d94725bfe6eDiederik van Lierop dockbar->_priv->dockbar_style == GDL_DOCK_BAR_BOTH) {
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński label = gtk_label_new (name);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński if (dockbar->_priv->orientation == GTK_ORIENTATION_VERTICAL)
18d56400fb8d667bff7c64b550365d94725bfe6eDiederik van Lierop gtk_label_set_angle (GTK_LABEL (label), 90);
18d56400fb8d667bff7c64b550365d94725bfe6eDiederik van Lierop gtk_box_pack_start_defaults (GTK_BOX (box), label);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen }
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński /* FIXME: For now AUTO behaves same as BOTH */
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński if (dockbar->_priv->dockbar_style == GDL_DOCK_BAR_ICONS ||
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński dockbar->_priv->dockbar_style == GDL_DOCK_BAR_BOTH ||
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński dockbar->_priv->dockbar_style == GDL_DOCK_BAR_AUTO) {
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński if (stock_id) {
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński image = gtk_image_new_from_stock (stock_id,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GTK_ICON_SIZE_SMALL_TOOLBAR);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński g_free (stock_id);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński } else if (pixbuf_icon) {
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński image = gtk_image_new_from_pixbuf (pixbuf_icon);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen } else {
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński image = gtk_image_new_from_stock (GTK_STOCK_NEW,
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński GTK_ICON_SIZE_SMALL_TOOLBAR);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński }
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński gtk_box_pack_start_defaults (GTK_BOX (box), image);
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński }
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
00f9ca0b3aa57e09f3c3f3632c5427fc03499df5Krzysztof Kosiński gtk_container_add (GTK_CONTAINER (button), box);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen gtk_box_pack_start (GTK_BOX (dockbar), button, FALSE, FALSE, 0);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen gtk_widget_set_tooltip_text (button, name);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen g_free (name);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen g_object_set_data (G_OBJECT (item), "GdlDockBar", dockbar);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen g_object_set_data (G_OBJECT (item), "GdlDockBarButton", button);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen g_signal_connect (G_OBJECT (button), "clicked",
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen G_CALLBACK (gdl_dock_bar_item_clicked), item);
1f37e9d97c3bb8cf02b2cc80af8dcfc9aba7c7b4johanengelen
a4030d5ca449e7e384bc699cd249ee704faaeab0Chris Morgan gtk_widget_show_all (button);
/* Set up destroy notify */
g_signal_connect_swapped (item, "destroy",
G_CALLBACK (gdl_dock_bar_remove_item),
dockbar);
}
static void
build_list (GdlDockObject *object, GList **list)
{
/* add only items, not toplevels */
if (GDL_IS_DOCK_ITEM (object))
*list = g_list_prepend (*list, object);
}
static void
update_dock_items (GdlDockBar *dockbar, gboolean full_update)
{
GdlDockMaster *master;
GList *items, *l;
g_return_if_fail (dockbar != NULL);
if (!dockbar->_priv->master)
return;
master = dockbar->_priv->master;
/* build items list */
items = NULL;
gdl_dock_master_foreach (master, (GFunc) build_list, &items);
if (!full_update) {
for (l = items; l != NULL; l = l->next) {
GdlDockItem *item = GDL_DOCK_ITEM (l->data);
if (g_slist_index (dockbar->_priv->items, item) != -1 &&
!GDL_DOCK_ITEM_ICONIFIED (item))
gdl_dock_bar_remove_item (dockbar, item);
else if (g_slist_index (dockbar->_priv->items, item) == -1 &&
GDL_DOCK_ITEM_ICONIFIED (item))
gdl_dock_bar_add_item (dockbar, item);
}
} else {
for (l = items; l != NULL; l = l->next) {
GdlDockItem *item = GDL_DOCK_ITEM (l->data);
if (g_slist_index (dockbar->_priv->items, item) != -1)
gdl_dock_bar_remove_item (dockbar, item);
if (GDL_DOCK_ITEM_ICONIFIED (item))
gdl_dock_bar_add_item (dockbar, item);
}
}
g_list_free (items);
}
static void
gdl_dock_bar_layout_changed_cb (GdlDockMaster *master,
GdlDockBar *dockbar)
{
(void)master;
update_dock_items (dockbar, FALSE);
}
static void
gdl_dock_bar_attach (GdlDockBar *dockbar,
GdlDockMaster *master)
{
g_return_if_fail (dockbar != NULL);
g_return_if_fail (master == NULL || GDL_IS_DOCK_MASTER (master));
if (dockbar->_priv->master) {
g_signal_handlers_disconnect_matched (dockbar->_priv->master,
G_SIGNAL_MATCH_DATA,
0, 0, NULL, NULL, dockbar);
g_object_unref (dockbar->_priv->master);
}
dockbar->_priv->master = master;
if (dockbar->_priv->master) {
g_object_ref (dockbar->_priv->master);
g_signal_connect (dockbar->_priv->master, "layout-changed",
G_CALLBACK (gdl_dock_bar_layout_changed_cb),
dockbar);
}
update_dock_items (dockbar, FALSE);
}
static void gdl_dock_bar_size_request (GtkWidget *widget,
GtkRequisition *requisition )
{
GdlDockBar *dockbar;
dockbar = GDL_DOCK_BAR (widget);
/* default to vertical for unknown values */
switch (dockbar->_priv->orientation) {
case GTK_ORIENTATION_HORIZONTAL:
gdl_dock_bar_size_hrequest (widget, requisition);
break;
case GTK_ORIENTATION_VERTICAL:
default:
gdl_dock_bar_size_vrequest (widget, requisition);
break;
}
}
static void gdl_dock_bar_size_allocate (GtkWidget *widget,
GtkAllocation *allocation )
{
GdlDockBar *dockbar;
dockbar = GDL_DOCK_BAR (widget);
/* default to vertical for unknown values */
switch (dockbar->_priv->orientation) {
case GTK_ORIENTATION_HORIZONTAL:
gdl_dock_bar_size_hallocate (widget, allocation);
break;
case GTK_ORIENTATION_VERTICAL:
default:
gdl_dock_bar_size_vallocate (widget, allocation);
break;
}
}
static void gdl_dock_bar_size_vrequest (GtkWidget *widget,
GtkRequisition *requisition )
{
GtkBox *box;
GtkBoxChild *child;
GtkRequisition child_requisition;
GList *children;
gint nvis_children;
gint height;
box = GTK_BOX (widget);
requisition->width = 0;
requisition->height = 0;
nvis_children = 0;
children = box->children;
while (children)
{
child = children->data;
children = children->next;
if (gtk_widget_get_visible (child->widget))
{
gtk_widget_size_request (child->widget, &child_requisition);
if (box->homogeneous)
{
height = child_requisition.height + child->padding * 2;
requisition->height = MAX (requisition->height, height);
}
else
{
requisition->height += child_requisition.height + child->padding * 2;
}
requisition->width = MAX (requisition->width, child_requisition.width);
nvis_children += 1;
}
}
if (nvis_children > 0)
{
if (box->homogeneous)
requisition->height *= nvis_children;
requisition->height += (nvis_children - 1) * box->spacing;
}
requisition->width += GTK_CONTAINER (box)->border_width * 2;
requisition->height += GTK_CONTAINER (box)->border_width * 2;
}
static void gdl_dock_bar_size_vallocate (GtkWidget *widget,
GtkAllocation *allocation)
{
GtkBox *box;
GtkBoxChild *child;
GList *children;
GtkAllocation child_allocation;
gint nvis_children;
gint nexpand_children;
gint child_height;
gint height;
gint extra;
gint y;
box = GTK_BOX (widget);
widget->allocation = *allocation;
nvis_children = 0;
nexpand_children = 0;
children = box->children;
while (children)
{
child = children->data;
children = children->next;
if (gtk_widget_get_visible (child->widget))
{
nvis_children += 1;
if (child->expand)
nexpand_children += 1;
}
}
if (nvis_children > 0)
{
if (box->homogeneous)
{
height = (allocation->height -
GTK_CONTAINER (box)->border_width * 2 -
(nvis_children - 1) * box->spacing);
extra = height / nvis_children;
}
else if (nexpand_children > 0)
{
height = (gint) allocation->height - (gint) widget->requisition.height;
extra = height / nexpand_children;
}
else
{
height = 0;
extra = 0;
}
y = allocation->y + GTK_CONTAINER (box)->border_width;
child_allocation.x = allocation->x + GTK_CONTAINER (box)->border_width;
child_allocation.width = MAX (1, (gint) allocation->width - (gint) GTK_CONTAINER (box)->border_width * 2);
children = box->children;
while (children)
{
child = children->data;
children = children->next;
if ((child->pack == GTK_PACK_START) && gtk_widget_get_visible (child->widget))
{
if (box->homogeneous)
{
if (nvis_children == 1)
child_height = height;
else
child_height = extra;
nvis_children -= 1;
height -= extra;
}
else
{
GtkRequisition child_requisition;
gtk_widget_get_child_requisition (child->widget, &child_requisition);
child_height = child_requisition.height + child->padding * 2;
if (child->expand)
{
if (nexpand_children == 1)
child_height += height;
else
child_height += extra;
nexpand_children -= 1;
height -= extra;
}
}
if (child->fill)
{
child_allocation.height = MAX (1, child_height - (gint)child->padding * 2);
child_allocation.y = y + child->padding;
}
else
{
GtkRequisition child_requisition;
gtk_widget_get_child_requisition (child->widget, &child_requisition);
child_allocation.height = child_requisition.height;
child_allocation.y = y + (child_height - child_allocation.height) / 2;
}
gtk_widget_size_allocate (child->widget, &child_allocation);
y += child_height + box->spacing;
}
}
y = allocation->y + allocation->height - GTK_CONTAINER (box)->border_width;
children = box->children;
while (children)
{
child = children->data;
children = children->next;
if ((child->pack == GTK_PACK_END) && gtk_widget_get_visible (child->widget))
{
GtkRequisition child_requisition;
gtk_widget_get_child_requisition (child->widget, &child_requisition);
if (box->homogeneous)
{
if (nvis_children == 1)
child_height = height;
else
child_height = extra;
nvis_children -= 1;
height -= extra;
}
else
{
child_height = child_requisition.height + child->padding * 2;
if (child->expand)
{
if (nexpand_children == 1)
child_height += height;
else
child_height += extra;
nexpand_children -= 1;
height -= extra;
}
}
if (child->fill)
{
child_allocation.height = MAX (1, child_height - (gint)child->padding * 2);
child_allocation.y = y + child->padding - child_height;
}
else
{
child_allocation.height = child_requisition.height;
child_allocation.y = y + (child_height - child_allocation.height) / 2 - child_height;
}
gtk_widget_size_allocate (child->widget, &child_allocation);
y -= (child_height + box->spacing);
}
}
}
}
static void gdl_dock_bar_size_hrequest (GtkWidget *widget,
GtkRequisition *requisition )
{
GtkBox *box;
GtkBoxChild *child;
GList *children;
gint nvis_children;
gint width;
box = GTK_BOX (widget);
requisition->width = 0;
requisition->height = 0;
nvis_children = 0;
children = box->children;
while (children)
{
child = children->data;
children = children->next;
if (gtk_widget_get_visible (child->widget))
{
GtkRequisition child_requisition;
gtk_widget_size_request (child->widget, &child_requisition);
if (box->homogeneous)
{
width = child_requisition.width + child->padding * 2;
requisition->width = MAX (requisition->width, width);
}
else
{
requisition->width += child_requisition.width + child->padding * 2;
}
requisition->height = MAX (requisition->height, child_requisition.height);
nvis_children += 1;
}
}
if (nvis_children > 0)
{
if (box->homogeneous)
requisition->width *= nvis_children;
requisition->width += (nvis_children - 1) * box->spacing;
}
requisition->width += GTK_CONTAINER (box)->border_width * 2;
requisition->height += GTK_CONTAINER (box)->border_width * 2;
}
static void gdl_dock_bar_size_hallocate (GtkWidget *widget,
GtkAllocation *allocation)
{
GtkBox *box;
GtkBoxChild *child;
GList *children;
GtkAllocation child_allocation;
gint nvis_children;
gint nexpand_children;
gint child_width;
gint width;
gint extra;
gint x;
GtkTextDirection direction;
box = GTK_BOX (widget);
widget->allocation = *allocation;
direction = gtk_widget_get_direction (widget);
nvis_children = 0;
nexpand_children = 0;
children = box->children;
while (children)
{
child = children->data;
children = children->next;
if (gtk_widget_get_visible (child->widget))
{
nvis_children += 1;
if (child->expand)
nexpand_children += 1;
}
}
if (nvis_children > 0)
{
if (box->homogeneous)
{
width = (allocation->width -
GTK_CONTAINER (box)->border_width * 2 -
(nvis_children - 1) * box->spacing);
extra = width / nvis_children;
}
else if (nexpand_children > 0)
{
width = (gint) allocation->width - (gint) widget->requisition.width;
extra = width / nexpand_children;
}
else
{
width = 0;
extra = 0;
}
x = allocation->x + GTK_CONTAINER (box)->border_width;
child_allocation.y = allocation->y + GTK_CONTAINER (box)->border_width;
child_allocation.height = MAX (1, (gint) allocation->height - (gint) GTK_CONTAINER (box)->border_width * 2);
children = box->children;
while (children)
{
child = children->data;
children = children->next;
if ((child->pack == GTK_PACK_START) && gtk_widget_get_visible (child->widget))
{
if (box->homogeneous)
{
if (nvis_children == 1)
child_width = width;
else
child_width = extra;
nvis_children -= 1;
width -= extra;
}
else
{
GtkRequisition child_requisition;
gtk_widget_get_child_requisition (child->widget, &child_requisition);
child_width = child_requisition.width + child->padding * 2;
if (child->expand)
{
if (nexpand_children == 1)
child_width += width;
else
child_width += extra;
nexpand_children -= 1;
width -= extra;
}
}
if (child->fill)
{
child_allocation.width = MAX (1, (gint) child_width - (gint) child->padding * 2);
child_allocation.x = x + child->padding;
}
else
{
GtkRequisition child_requisition;
gtk_widget_get_child_requisition (child->widget, &child_requisition);
child_allocation.width = child_requisition.width;
child_allocation.x = x + (child_width - child_allocation.width) / 2;
}
if (direction == GTK_TEXT_DIR_RTL)
child_allocation.x = allocation->x + allocation->width - (child_allocation.x - allocation->x) - child_allocation.width;
gtk_widget_size_allocate (child->widget, &child_allocation);
x += child_width + box->spacing;
}
}
x = allocation->x + allocation->width - GTK_CONTAINER (box)->border_width;
children = box->children;
while (children)
{
child = children->data;
children = children->next;
if ((child->pack == GTK_PACK_END) && gtk_widget_get_visible (child->widget))
{
GtkRequisition child_requisition;
gtk_widget_get_child_requisition (child->widget, &child_requisition);
if (box->homogeneous)
{
if (nvis_children == 1)
child_width = width;
else
child_width = extra;
nvis_children -= 1;
width -= extra;
}
else
{
child_width = child_requisition.width + child->padding * 2;
if (child->expand)
{
if (nexpand_children == 1)
child_width += width;
else
child_width += extra;
nexpand_children -= 1;
width -= extra;
}
}
if (child->fill)
{
child_allocation.width = MAX (1, (gint)child_width - (gint)child->padding * 2);
child_allocation.x = x + child->padding - child_width;
}
else
{
child_allocation.width = child_requisition.width;
child_allocation.x = x + (child_width - child_allocation.width) / 2 - child_width;
}
if (direction == GTK_TEXT_DIR_RTL)
child_allocation.x = allocation->x + allocation->width - (child_allocation.x - allocation->x) - child_allocation.width;
gtk_widget_size_allocate (child->widget, &child_allocation);
x -= (child_width + box->spacing);
}
}
}
}
GtkWidget *
gdl_dock_bar_new (GdlDock *dock)
{
GdlDockMaster *master = NULL;
/* get the master of the given dock */
if (dock)
master = GDL_DOCK_OBJECT_GET_MASTER (dock);
return g_object_new (GDL_TYPE_DOCK_BAR,
"master", master, NULL);
}
GtkOrientation gdl_dock_bar_get_orientation (GdlDockBar *dockbar)
{
g_return_val_if_fail (GDL_IS_DOCK_BAR (dockbar),
GTK_ORIENTATION_VERTICAL);
return dockbar->_priv->orientation;
}
void gdl_dock_bar_set_orientation (GdlDockBar *dockbar,
GtkOrientation orientation)
{
g_return_if_fail (GDL_IS_DOCK_BAR (dockbar));
dockbar->_priv->orientation = orientation;
gtk_widget_queue_resize (GTK_WIDGET (dockbar));
}
void gdl_dock_bar_set_style(GdlDockBar* dockbar,
GdlDockBarStyle style)
{
g_object_set(G_OBJECT(dockbar), "dockbar-style", style, NULL);
}
GdlDockBarStyle gdl_dock_bar_get_style(GdlDockBar* dockbar)
{
GdlDockBarStyle style;
g_object_get(G_OBJECT(dockbar), "dockbar-style", &style, NULL);
return style;
}