diff --git a/moo.kdevelop b/moo.kdevelop index d4dc2bc9..2349ded5 100644 --- a/moo.kdevelop +++ b/moo.kdevelop @@ -24,7 +24,7 @@ . false - + C @@ -36,17 +36,17 @@ debug - tests/testfileview + tests/testpaned executable / - + --sync false false - --enable-debug=full --enable-all-gcc-warnings=fatal --enable-developer-mode --disable-moo-module --without-python --without-mooapp --without-mooterm + --enable-debug=full --enable-all-gcc-warnings=fatal --enable-developer-mode --disable-moo-module build/debug kdevgccoptions kdevgppoptions @@ -166,10 +166,10 @@ libtool --g-fatal-warnings --sync - - - - + + + + true false true @@ -270,7 +270,7 @@ - + set m_,_ theValue diff --git a/moo/mooedit/Makefile.am b/moo/mooedit/Makefile.am index 5420cdd5..78c31481 100644 --- a/moo/mooedit/Makefile.am +++ b/moo/mooedit/Makefile.am @@ -31,6 +31,8 @@ libmooedit_la_LIBADD = \ $(xdgmime_lib) libmooedit_la_SOURCES = \ + moobigpaned.c \ + moobigpaned.h \ mooedit.c \ mooedit.h \ mooedit-private.h \ @@ -58,6 +60,8 @@ libmooedit_la_SOURCES = \ mooeditsearch.c \ mooeditsearch.h \ mooeditwindow.c \ + moopaned.c \ + moopaned.h \ mootextiter.h if MOO_USE_XML diff --git a/moo/mooedit/moobigpaned.c b/moo/mooedit/moobigpaned.c new file mode 100644 index 00000000..a6458aa6 --- /dev/null +++ b/moo/mooedit/moobigpaned.c @@ -0,0 +1,342 @@ +/* + * moobigpaned.c + * + * Copyright (C) 2004-2005 by Yevgen Muntyan + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * See COPYING file that comes with this distribution. + */ + +#include "mooedit/moobigpaned.h" +#include "mooutils/moostock.h" +#include "mooutils/moomarshals.h" + + +static void moo_big_paned_finalize (GObject *object); +static void moo_big_paned_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void moo_big_paned_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); + +static void child_open_pane (MooPaned *child, + guint index, + MooBigPaned *paned); +static void child_hide_pane (MooPaned *child, + MooBigPaned *paned); +static gboolean check_children_order (MooBigPaned *paned); + + +/* MOO_TYPE_BIG_PANED */ +G_DEFINE_TYPE (MooBigPaned, moo_big_paned, GTK_TYPE_FRAME) + +enum { + PROP_0, + PROP_PANE_ORDER +}; + +enum { + OPEN_PANE, + HIDE_PANE, + NUM_SIGNALS +}; + +static guint signals[NUM_SIGNALS]; + +static void moo_big_paned_class_init (MooBigPanedClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = moo_big_paned_finalize; + gobject_class->set_property = moo_big_paned_set_property; + gobject_class->get_property = moo_big_paned_get_property; + + g_object_class_install_property (gobject_class, + PROP_PANE_ORDER, + g_param_spec_pointer ("pane-order", + "pane-order", + "pane-order", + G_PARAM_READWRITE)); + + signals[OPEN_PANE] = + g_signal_new ("open-pane", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (MooBigPanedClass, open_pane), + NULL, NULL, + _moo_marshal_VOID__ENUM_UINT, + G_TYPE_NONE, 2, + MOO_TYPE_PANE_POSITION, G_TYPE_UINT); + + signals[HIDE_PANE] = + g_signal_new ("hide-pane", + G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (MooBigPanedClass, hide_pane), + NULL, NULL, + _moo_marshal_VOID__ENUM, + G_TYPE_NONE, 1, + MOO_TYPE_PANE_POSITION); + +} + + +#define NTH_CHILD(paned,n) paned->paned[paned->order[n]] + +static void moo_big_paned_init (MooBigPaned *paned) +{ + int i; + + /* XXX destroy */ + /* XXX order */ + for (i = 0; i < 4; ++i) + { + MooPaned *child; + + paned->paned[i] = child = MOO_PANED (moo_paned_new (i)); + + g_object_ref (child); + gtk_object_sink (GTK_OBJECT (child)); + gtk_widget_show (GTK_WIDGET (child)); + + g_signal_connect (child, "hide-pane", + G_CALLBACK (child_hide_pane), + paned); + g_signal_connect (child, "open-pane", + G_CALLBACK (child_open_pane), + paned); + } + + paned->order[0] = MOO_PANE_POS_LEFT; + paned->order[1] = MOO_PANE_POS_RIGHT; + paned->order[2] = MOO_PANE_POS_TOP; + paned->order[3] = MOO_PANE_POS_BOTTOM; + + paned->inner = NTH_CHILD (paned, 3); + + gtk_container_add (GTK_CONTAINER (paned), + GTK_WIDGET (NTH_CHILD (paned, 0))); + + for (i = 0; i < 3; ++i) + gtk_container_add (GTK_CONTAINER (NTH_CHILD (paned, i)), + GTK_WIDGET (NTH_CHILD (paned, i+1))); + + g_assert (check_children_order (paned)); +} + + +static gboolean check_children_order (MooBigPaned *paned) +{ + int i; + + if (GTK_BIN(paned)->child != GTK_WIDGET (NTH_CHILD (paned, 0))) + return FALSE; + + for (i = 0; i < 3; ++i) + if (GTK_BIN (NTH_CHILD (paned, i))->child != + GTK_WIDGET (NTH_CHILD (paned, i+1))) + return FALSE; + + return TRUE; +} + + +void moo_big_paned_set_pane_order (MooBigPaned *paned, + int *order) +{ + MooPanePosition new_order[4] = {8, 8, 8, 8}; + int i; + GtkWidget *child; + + g_return_if_fail (MOO_IS_BIG_PANED (paned)); + g_return_if_fail (order != NULL); + + for (i = 0; i < 4; ++i) + { + g_return_if_fail (new_order[i] >= 4); + g_return_if_fail (0 <= order[i] && order[i] < 4); + new_order[i] = order[i]; + } + + g_return_if_fail (check_children_order (paned)); + + for (i = 0; i < 4; ++i) + { + if (new_order[i] != paned->order[i]) + break; + } + + if (i == 4) + return; + + child = moo_big_paned_get_child (paned); + + if (child) + g_object_ref (child); + + gtk_container_remove (GTK_CONTAINER (paned), GTK_WIDGET (NTH_CHILD (paned, 0))); + for (i = 0; i < 3; ++i) + gtk_container_remove (GTK_CONTAINER (NTH_CHILD (paned, i)), + GTK_WIDGET (NTH_CHILD (paned, i+1))); + if (child) + gtk_container_remove (GTK_CONTAINER (NTH_CHILD (paned, 3)), child); + + for (i = 0; i < 4; ++i) + paned->order[i] = new_order[i]; + + gtk_container_add (GTK_CONTAINER (paned), GTK_WIDGET (NTH_CHILD (paned, 0))); + + for (i = 0; i < 3; ++i) + gtk_container_add (GTK_CONTAINER (NTH_CHILD (paned, i)), GTK_WIDGET (NTH_CHILD (paned, i+1))); + + paned->inner = NTH_CHILD (paned, 3); + + if (child) + { + gtk_container_add (GTK_CONTAINER (paned->inner), child); + g_object_unref (child); + } + + g_assert (check_children_order (paned)); + g_object_notify (G_OBJECT (paned), "pane-order"); +} + + +static void moo_big_paned_finalize (GObject *object) +{ + MooBigPaned *paned = MOO_BIG_PANED (object); + int i; + + for (i = 0; i < 4; ++i) + g_object_unref (paned->paned[i]); + + G_OBJECT_CLASS (moo_big_paned_parent_class)->finalize (object); +} + + +GtkWidget *moo_big_paned_new (void) +{ + return GTK_WIDGET (g_object_new (MOO_TYPE_BIG_PANED, NULL)); +} + + +static void child_open_pane (MooPaned *child, + guint index, + MooBigPaned *paned) +{ + MooPanePosition pos; + + g_object_get (child, "pane-position", &pos, NULL); + g_return_if_fail (paned->paned[pos] == child); + + g_signal_emit (paned, signals[OPEN_PANE], 0, pos, index); +} + + +static void child_hide_pane (MooPaned *child, + MooBigPaned *paned) +{ + MooPanePosition pos; + + g_object_get (child, "pane-position", &pos, NULL); + g_return_if_fail (paned->paned[pos] == child); + + g_signal_emit (paned, signals[HIDE_PANE], 0, pos); +} + + +void moo_big_paned_add_pane (MooBigPaned *paned, + GtkWidget *pane_widget, + MooPanePosition position, + const char *button_label, + const char *button_stock_id) +{ + g_return_if_fail (MOO_IS_BIG_PANED (paned)); + g_return_if_fail (GTK_IS_WIDGET (pane_widget)); + g_return_if_fail (position < 4); + + moo_paned_add_pane (paned->paned[position], pane_widget, + button_label, button_stock_id); +} + + +void moo_big_paned_insert_pane (MooBigPaned *paned, + GtkWidget *pane_widget, + GtkWidget *button_widget, + MooPanePosition position, + int index_) +{ + g_return_if_fail (MOO_IS_BIG_PANED (paned)); + g_return_if_fail (GTK_IS_WIDGET (pane_widget)); + g_return_if_fail (position < 4); + + moo_paned_insert_pane (paned->paned[position], pane_widget, + button_widget, index_); +} + + +void moo_big_paned_add_child (MooBigPaned *paned, + GtkWidget *child) +{ + g_return_if_fail (MOO_IS_BIG_PANED (paned)); + gtk_container_add (GTK_CONTAINER (paned->inner), child); +} + + +void moo_big_paned_remove_child (MooBigPaned *paned) +{ + g_return_if_fail (MOO_IS_BIG_PANED (paned)); + gtk_container_remove (GTK_CONTAINER (paned->inner), GTK_BIN(paned->inner)->child); +} + + +GtkWidget *moo_big_paned_get_child (MooBigPaned *paned) +{ + g_return_val_if_fail (MOO_IS_BIG_PANED (paned), NULL); + return GTK_BIN(paned->inner)->child; +} + + +static void moo_big_paned_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + MooBigPaned *paned = MOO_BIG_PANED (object); + + switch (prop_id) + { + case PROP_PANE_ORDER: + moo_big_paned_set_pane_order (paned, g_value_get_pointer (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + + +static void moo_big_paned_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + MooBigPaned *paned = MOO_BIG_PANED (object); + + switch (prop_id) + { + case PROP_PANE_ORDER: + g_value_set_pointer (value, paned->order); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} diff --git a/moo/mooedit/moobigpaned.h b/moo/mooedit/moobigpaned.h new file mode 100644 index 00000000..6d2196ff --- /dev/null +++ b/moo/mooedit/moobigpaned.h @@ -0,0 +1,80 @@ +/* + * moobigpaned.h + * + * Copyright (C) 2004-2005 by Yevgen Muntyan + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * See COPYING file that comes with this distribution. + */ + +#ifndef __MOO_BIG_PANED_H__ +#define __MOO_BIG_PANED_H__ + +#include "moopaned.h" + +G_BEGIN_DECLS + + +#define MOO_TYPE_BIG_PANED (moo_big_paned_get_type ()) +#define MOO_BIG_PANED(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_BIG_PANED, MooBigPaned)) +#define MOO_BIG_PANED_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_BIG_PANED, MooBigPanedClass)) +#define MOO_IS_BIG_PANED(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_BIG_PANED)) +#define MOO_IS_BIG_PANED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_BIG_PANED)) +#define MOO_BIG_PANED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_BIG_PANED, MooBigPanedClass)) + + +typedef struct _MooBigPaned MooBigPaned; +typedef struct _MooBigPanedPrivate MooBigPanedPrivate; +typedef struct _MooBigPanedClass MooBigPanedClass; + +struct _MooBigPaned +{ + GtkFrame parent; + MooPaned *paned[4]; + MooPanePosition order[4]; /* inner is paned[order[3]]*/ + MooPaned *inner; +}; + +struct _MooBigPanedClass +{ + GtkFrameClass parent_class; + + void (*open_pane) (MooBigPaned *paned, + MooPanePosition position, + guint index); + void (*hide_pane) (MooBigPaned *paned, + MooPanePosition position); +}; + + +GType moo_big_paned_get_type (void) G_GNUC_CONST; + +GtkWidget *moo_big_paned_new (void); + +void moo_big_paned_set_pane_order (MooBigPaned *paned, + int *order); + +void moo_big_paned_add_child (MooBigPaned *paned, + GtkWidget *widget); +void moo_big_paned_remove_child (MooBigPaned *paned); +GtkWidget *moo_big_paned_get_child (MooBigPaned *paned); + +void moo_big_paned_add_pane (MooBigPaned *paned, + GtkWidget *pane_widget, + MooPanePosition position, + const char *button_label, + const char *button_stock_id); +void moo_big_paned_insert_pane (MooBigPaned *paned, + GtkWidget *pane_widget, + GtkWidget *button_widget, + MooPanePosition position, + int index_); + + +G_END_DECLS + +#endif /* __MOO_BIG_PANED_H__ */ diff --git a/moo/mooedit/mooeditwindow.c b/moo/mooedit/mooeditwindow.c index 24d606ff..3020b9b7 100644 --- a/moo/mooedit/mooeditwindow.c +++ b/moo/mooedit/mooeditwindow.c @@ -14,6 +14,7 @@ #define MOOEDIT_COMPILATION #include "mooedit/mooedit-private.h" #include "mooedit/mooeditdialogs.h" +#include "mooedit/moobigpaned.h" #include "moofileview/moofileview.h" #include "mooui/moouiobject-impl.h" #include "mooui/moomenuaction.h" @@ -22,7 +23,6 @@ #include "mooutils/moostock.h" #include "mooutils/moomarshals.h" #include "mooutils/moosignal.h" -#include "mooutils/moopaned.h" #include @@ -30,7 +30,7 @@ struct _MooEditWindowPrivate { - MooPaned *paned; + MooBigPaned *paned; GtkNotebook *notebook; MooFileView *fileview; gboolean use_fullname; @@ -107,10 +107,12 @@ static void moo_edit_window_previous_tab (MooEditWindow *window); static void moo_edit_window_next_tab (MooEditWindow *window); static void show_file_selector_toggled_cb (MooEditWindow *window, gboolean show); -static void pane_opened (MooPaned *paned, +static void pane_opened (MooBigPaned *paned, + MooPanePosition position, guint index, MooEditWindow *window); -static void pane_hidden (MooPaned *paned, +static void pane_hidden (MooBigPaned *paned, + MooPanePosition position, MooEditWindow *window); @@ -469,10 +471,10 @@ GObject *moo_edit_window_constructor (GType type, gtk_widget_show (MOO_WINDOW(window)->vbox); - paned = moo_paned_new (GTK_POS_RIGHT); + paned = moo_big_paned_new (); gtk_widget_show (paned); gtk_box_pack_start (GTK_BOX (MOO_WINDOW(window)->vbox), paned, TRUE, TRUE, 0); - window->priv->paned = MOO_PANED (paned); + window->priv->paned = MOO_BIG_PANED (paned); g_signal_connect (window->priv->paned, "open-pane", G_CALLBACK (pane_opened), window); g_signal_connect (window->priv->paned, "hide-pane", @@ -482,7 +484,7 @@ GObject *moo_edit_window_constructor (GType type, mgr = moo_editor_get_file_mgr (window->priv->editor); fileview = GTK_WIDGET (g_object_new (MOO_TYPE_FILE_VIEW, - "file-mgr", mgr, +// "file-mgr", mgr, NULL)); g_signal_connect_swapped (fileview, "activate", G_CALLBACK (fileview_activate), @@ -506,14 +508,14 @@ GObject *moo_edit_window_constructor (GType type, G_CALLBACK (current_doc_dir_clicked), window); - moo_paned_add_pane (MOO_PANED (paned), - fileview, "File Selector", - GTK_STOCK_OPEN); + moo_big_paned_add_pane (MOO_BIG_PANED (paned), + fileview, MOO_PANE_POS_LEFT, + "File Selector", GTK_STOCK_OPEN); notebook = gtk_notebook_new (); gtk_notebook_set_scrollable (GTK_NOTEBOOK (notebook), TRUE); gtk_widget_show (notebook); - gtk_container_add (GTK_CONTAINER (paned), notebook); + moo_big_paned_add_child (window->priv->paned, notebook); window->priv->notebook = GTK_NOTEBOOK (notebook); g_signal_connect_after (window->priv->notebook, "switch-page", @@ -566,8 +568,8 @@ static void add_tab (MooEditWindow *window, gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow), - GTK_SHADOW_ETCHED_IN); +// gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow), +// GTK_SHADOW_ETCHED_IN); gtk_container_add (GTK_CONTAINER (scrolledwindow), GTK_WIDGET (edit)); gtk_widget_show_all (scrolledwindow); g_object_set_qdata (G_OBJECT (edit), SCROLLED_WINDOW_QUARK, scrolledwindow); @@ -1243,7 +1245,7 @@ static void current_doc_dir_clicked (MooEditWindow *window) static void show_file_selector_toggled_cb (MooEditWindow *window, gboolean show) { - gboolean open = moo_paned_is_open (window->priv->paned); +/* gboolean open = moo_paned_is_open (window->priv->paned); if (BOOL_EQUAL (show, open)) return; @@ -1259,11 +1261,12 @@ static void show_file_selector_toggled_cb (MooEditWindow *window, MooEdit *edit = ACTIVE_DOC (window); moo_paned_hide_pane (window->priv->paned); if (edit) gtk_widget_grab_focus (GTK_WIDGET (edit)); - } + }*/ } -static void pane_opened (G_GNUC_UNUSED MooPaned *paned, +static void pane_opened (G_GNUC_UNUSED MooBigPaned *paned, + G_GNUC_UNUSED MooPanePosition position, G_GNUC_UNUSED guint index, MooEditWindow *window) { @@ -1278,7 +1281,8 @@ static void pane_opened (G_GNUC_UNUSED MooPaned *paned, } -static void pane_hidden (G_GNUC_UNUSED MooPaned *paned, +static void pane_hidden (G_GNUC_UNUSED MooBigPaned *paned, + G_GNUC_UNUSED MooPanePosition position, MooEditWindow *window) { MooActionGroup *actions; diff --git a/moo/mooedit/moofileview/moofile.c b/moo/mooedit/moofileview/moofile.c index 4d72d412..8896898d 100644 --- a/moo/mooedit/moofileview/moofile.c +++ b/moo/mooedit/moofileview/moofile.c @@ -1565,6 +1565,8 @@ static gchar *g_utf8_collate_key_for_filename (const gchar *str, /***************************************************************************/ +/* XXX check out IconTheme changes */ + typedef enum { MOO_ICON_LINK = 1 << 0, MOO_ICON_LOCK = 1 << 1, diff --git a/moo/mooedit/moofileview/moofileview.c b/moo/mooedit/moofileview/moofileview.c index 1b890f78..909b5464 100644 --- a/moo/mooedit/moofileview/moofileview.c +++ b/moo/mooedit/moofileview/moofileview.c @@ -662,6 +662,9 @@ static void moo_file_view_set_current_dir (MooFileView *fileview, if (gtk_tree_model_get_iter_first (fileview->priv->filter_model, &filter_iter)) file_view_move_selection (fileview, &filter_iter); + if (gtk_widget_is_focus (GTK_WIDGET (fileview->priv->entry))) + focus_to_file_view (fileview); + path = g_filename_display_name (moo_folder_get_path (folder)); path_entry_set_text (fileview, path); g_free (path); diff --git a/moo/mooutils/moopaned.c b/moo/mooedit/moopaned.c similarity index 86% rename from moo/mooutils/moopaned.c rename to moo/mooedit/moopaned.c index 212f8230..fe76f679 100644 --- a/moo/mooutils/moopaned.c +++ b/moo/mooedit/moopaned.c @@ -11,7 +11,7 @@ * See COPYING file that comes with this distribution. */ -#include "mooutils/moopaned.h" +#include "mooedit/moopaned.h" #include "mooutils/moostock.h" #include "mooutils/moomarshals.h" @@ -30,7 +30,7 @@ typedef struct { struct _MooPanedPrivate { - GtkPositionType pane_position; + MooPanePosition pane_position; GdkWindow *handle_window; GdkWindow *pane_window; @@ -105,6 +105,8 @@ static void moo_paned_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); +static void moo_paned_add (GtkContainer *container, + GtkWidget *widget); static void moo_paned_remove (GtkContainer *container, GtkWidget *widget); static void moo_paned_remove_pane (MooPaned *paned, @@ -167,6 +169,7 @@ static void moo_paned_class_init (MooPanedClass *klass) container_class->forall = moo_paned_forall; container_class->set_focus_child = moo_paned_set_focus_child; container_class->remove = moo_paned_remove; + container_class->add = moo_paned_add; klass->open_pane = moo_paned_open_pane_real; klass->hide_pane = moo_paned_hide_pane_real; @@ -176,8 +179,8 @@ static void moo_paned_class_init (MooPanedClass *klass) g_param_spec_enum ("pane-position", "pane-position", "pane-position", - GTK_TYPE_POSITION_TYPE, - GTK_POS_LEFT, + MOO_TYPE_PANE_POSITION, + MOO_PANE_POS_LEFT, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); @@ -258,6 +261,8 @@ static void moo_paned_init (MooPaned *paned) paned->priv->handle_prelit = FALSE; paned->priv->in_drag = FALSE; paned->priv->drag_start = -1; + + gtk_widget_set_redraw_on_allocate (GTK_WIDGET (paned), FALSE); } @@ -278,19 +283,19 @@ static GObject *moo_paned_constructor (GType type, switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: paned->button_box = gtk_vbox_new (FALSE, button_spacing); break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: paned->button_box = gtk_hbox_new (FALSE, button_spacing); break; default: g_warning ("%s: invalid 'pane-position' property value '%d'," - "falling back to GTK_POS_LEFT", G_STRLOC, + "falling back to MOO_PANE_POS_LEFT", G_STRLOC, paned->priv->pane_position); - paned->priv->pane_position = GTK_POS_LEFT; + paned->priv->pane_position = MOO_PANE_POS_LEFT; paned->button_box = gtk_vbox_new (FALSE, button_spacing); break; } @@ -373,7 +378,7 @@ static void moo_paned_finalize (GObject *object) } -GtkWidget *moo_paned_new (GtkPositionType pane_position) +GtkWidget *moo_paned_new (MooPanePosition pane_position) { return GTK_WIDGET (g_object_new (MOO_TYPE_PANED, "pane-position", pane_position, @@ -424,14 +429,14 @@ static void realize_handle (MooPaned *paned) switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: attributes.y = 0; attributes.width = paned->priv->handle_size; attributes.height = widget->allocation.height; break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: attributes.x = 0; attributes.width = widget->allocation.width; attributes.height = paned->priv->handle_size; @@ -440,16 +445,16 @@ static void realize_handle (MooPaned *paned) switch (paned->priv->pane_position) { - case GTK_POS_LEFT: + case MOO_PANE_POS_LEFT: attributes.x = paned->priv->pane_widget_size; break; - case GTK_POS_RIGHT: + case MOO_PANE_POS_RIGHT: attributes.x = 0; break; - case GTK_POS_TOP: + case MOO_PANE_POS_TOP: attributes.y = paned->priv->pane_widget_size; break; - case GTK_POS_BOTTOM: + case MOO_PANE_POS_BOTTOM: attributes.y = 0; break; } @@ -470,12 +475,12 @@ static void realize_handle (MooPaned *paned) switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: attributes.cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW); break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: attributes.cursor = gdk_cursor_new (GDK_SB_V_DOUBLE_ARROW); break; } @@ -503,13 +508,13 @@ static void realize_pane (MooPaned *paned) switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: attributes.y = 0; attributes.height = widget->allocation.height; break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: attributes.x = 0; attributes.width = widget->allocation.width; break; @@ -517,24 +522,24 @@ static void realize_pane (MooPaned *paned) switch (paned->priv->pane_position) { - case GTK_POS_LEFT: + case MOO_PANE_POS_LEFT: attributes.x = paned->priv->button_box_size; attributes.width = paned->priv->pane_widget_size + paned->priv->handle_size; break; - case GTK_POS_RIGHT: + case MOO_PANE_POS_RIGHT: attributes.width = paned->priv->pane_widget_size + paned->priv->handle_size; attributes.x = widget->allocation.width - paned->priv->button_box_size - attributes.width; break; - case GTK_POS_TOP: + case MOO_PANE_POS_TOP: attributes.y = paned->priv->button_box_size; attributes.height = paned->priv->pane_widget_size + paned->priv->handle_size; break; - case GTK_POS_BOTTOM: + case MOO_PANE_POS_BOTTOM: attributes.height = paned->priv->pane_widget_size + paned->priv->handle_size; attributes.y = widget->allocation.height - @@ -600,14 +605,14 @@ static void add_button_box_requisition (MooPaned *paned, { switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: requisition->width += child_requisition->width; requisition->height = MAX (child_requisition->height, requisition->height); paned->priv->button_box_size = child_requisition->width; break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: requisition->height += child_requisition->height; requisition->width = MAX (child_requisition->width, requisition->width); paned->priv->button_box_size = child_requisition->height; @@ -625,12 +630,12 @@ static void add_handle_requisition (MooPaned *paned, switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: requisition->width += paned->priv->handle_size; break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: requisition->height += paned->priv->handle_size; break; } @@ -643,8 +648,8 @@ static void add_pane_widget_requisition (MooPaned *paned, { switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: requisition->height = MAX (child_requisition->height, requisition->height); if (paned->priv->sticky) @@ -660,8 +665,8 @@ static void add_pane_widget_requisition (MooPaned *paned, break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: requisition->width = MAX (child_requisition->width, requisition->width); if (paned->priv->sticky) @@ -680,14 +685,14 @@ static void add_pane_widget_requisition (MooPaned *paned, switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: paned->priv->pane_widget_size = MAX (paned->priv->position, child_requisition->width); paned->priv->position = paned->priv->pane_widget_size; break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: paned->priv->pane_widget_size = MAX (paned->priv->position, child_requisition->height); paned->priv->position = paned->priv->pane_widget_size; @@ -745,25 +750,25 @@ static void get_pane_widget_allocation (MooPaned *paned, { switch (paned->priv->pane_position) { - case GTK_POS_LEFT: + case MOO_PANE_POS_LEFT: allocation->x = 0; allocation->y = 0; allocation->width = paned->priv->pane_widget_size; allocation->height = GTK_WIDGET(paned)->allocation.height; break; - case GTK_POS_RIGHT: + case MOO_PANE_POS_RIGHT: allocation->x = paned->priv->handle_size; allocation->y = 0; allocation->width = paned->priv->pane_widget_size; allocation->height = GTK_WIDGET(paned)->allocation.height; break; - case GTK_POS_TOP: + case MOO_PANE_POS_TOP: allocation->x = 0; allocation->y = 0; allocation->width = GTK_WIDGET(paned)->allocation.width; allocation->height = paned->priv->pane_widget_size; break; - case GTK_POS_BOTTOM: + case MOO_PANE_POS_BOTTOM: allocation->x = 0; allocation->y = paned->priv->handle_size; allocation->width = GTK_WIDGET(paned)->allocation.width; @@ -778,14 +783,14 @@ static void get_button_box_allocation (MooPaned *paned, { switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: allocation->y = 0; allocation->height = GTK_WIDGET(paned)->allocation.height; allocation->width = paned->priv->button_box_size; break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: allocation->x = 0; allocation->width = GTK_WIDGET(paned)->allocation.width; allocation->height = paned->priv->button_box_size; @@ -794,17 +799,17 @@ static void get_button_box_allocation (MooPaned *paned, switch (paned->priv->pane_position) { - case GTK_POS_LEFT: + case MOO_PANE_POS_LEFT: allocation->x = 0; break; - case GTK_POS_RIGHT: + case MOO_PANE_POS_RIGHT: allocation->x = GTK_WIDGET(paned)->allocation.width - allocation->width; break; - case GTK_POS_TOP: + case MOO_PANE_POS_TOP: allocation->y = 0; break; - case GTK_POS_BOTTOM: + case MOO_PANE_POS_BOTTOM: allocation->y = GTK_WIDGET(paned)->allocation.height - allocation->height; break; @@ -817,59 +822,57 @@ static void get_bin_child_allocation (MooPaned *paned, { switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: allocation->y = 0; allocation->height = GTK_WIDGET(paned)->allocation.height; allocation->width = GTK_WIDGET(paned)->allocation.width - - paned->priv->button_box_size - - paned->priv->handle_size; + paned->priv->button_box_size; break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: allocation->x = 0; allocation->width = GTK_WIDGET(paned)->allocation.width; allocation->height = GTK_WIDGET(paned)->allocation.height - - paned->priv->button_box_size - - paned->priv->handle_size; + paned->priv->button_box_size; break; } switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - allocation->x = paned->priv->button_box_size + - paned->priv->handle_size; + case MOO_PANE_POS_LEFT: + allocation->x = paned->priv->button_box_size; break; - case GTK_POS_RIGHT: + case MOO_PANE_POS_RIGHT: allocation->x = 0; break; - case GTK_POS_TOP: - allocation->y = paned->priv->button_box_size + - paned->priv->handle_size; + case MOO_PANE_POS_TOP: + allocation->y = paned->priv->button_box_size; break; - case GTK_POS_BOTTOM: + case MOO_PANE_POS_BOTTOM: allocation->y = 0; break; } if (paned->priv->sticky) { + int add = paned->priv->handle_size + paned->priv->pane_widget_size; + switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - allocation->x += paned->priv->pane_widget_size; - allocation->width -= paned->priv->pane_widget_size; + case MOO_PANE_POS_LEFT: + allocation->x += add; + allocation->width -= add; break; - case GTK_POS_RIGHT: - allocation->width -= paned->priv->pane_widget_size; + case MOO_PANE_POS_RIGHT: + allocation->width -= add; break; - case GTK_POS_TOP: - allocation->y += paned->priv->pane_widget_size; - allocation->height -= paned->priv->pane_widget_size; + case MOO_PANE_POS_TOP: + allocation->y += add; + allocation->height -= add; break; - case GTK_POS_BOTTOM: - allocation->height -= paned->priv->pane_widget_size; + case MOO_PANE_POS_BOTTOM: + allocation->height -= add; break; } } @@ -880,13 +883,13 @@ static void clamp_handle_size (MooPaned *paned) { switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: paned->priv->handle_size = CLAMP (paned->priv->handle_size, 0, GTK_WIDGET(paned)->allocation.width); break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: paned->priv->handle_size = CLAMP (paned->priv->handle_size, 0, GTK_WIDGET(paned)->allocation.height); break; @@ -898,14 +901,14 @@ static void clamp_button_box_size (MooPaned *paned) { switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: paned->priv->button_box_size = CLAMP (paned->priv->button_box_size, 0, GTK_WIDGET(paned)->allocation.width - paned->priv->handle_size); break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: paned->priv->button_box_size = CLAMP (paned->priv->button_box_size, 0, GTK_WIDGET(paned)->allocation.height - paned->priv->handle_size); @@ -919,15 +922,15 @@ static void clamp_child_requisition (MooPaned *paned, { switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: requisition->width = CLAMP (requisition->width, 0, GTK_WIDGET(paned)->allocation.width - paned->priv->handle_size - paned->priv->button_box_size); break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: requisition->height = CLAMP (requisition->height, 0, GTK_WIDGET(paned)->allocation.height - paned->priv->handle_size - @@ -945,16 +948,16 @@ static void clamp_pane_widget_size (MooPaned *paned, switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: max_size = GTK_WIDGET(paned)->allocation.width - paned->priv->handle_size - paned->priv->button_box_size; if (paned->priv->sticky) max_size -= child_requisition->width; break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: max_size = GTK_WIDGET(paned)->allocation.height - paned->priv->handle_size - paned->priv->button_box_size; @@ -975,14 +978,14 @@ static void get_pane_window_rect (MooPaned *paned, { switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: rect->width = paned->priv->pane_widget_size + paned->priv->handle_size; rect->height = GTK_WIDGET(paned)->allocation.height; rect->y = 0; break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: rect->height = paned->priv->pane_widget_size + paned->priv->handle_size; rect->width = GTK_WIDGET(paned)->allocation.width; rect->x = 0; @@ -991,18 +994,18 @@ static void get_pane_window_rect (MooPaned *paned, switch (paned->priv->pane_position) { - case GTK_POS_LEFT: + case MOO_PANE_POS_LEFT: rect->x = paned->priv->button_box_size; break; - case GTK_POS_RIGHT: + case MOO_PANE_POS_RIGHT: rect->x = GTK_WIDGET(paned)->allocation.width - rect->width - paned->priv->button_box_size; break; - case GTK_POS_TOP: + case MOO_PANE_POS_TOP: rect->y = paned->priv->button_box_size; break; - case GTK_POS_BOTTOM: + case MOO_PANE_POS_BOTTOM: rect->y = GTK_WIDGET(paned)->allocation.height - rect->height - paned->priv->button_box_size; @@ -1016,14 +1019,14 @@ static void get_handle_window_rect (MooPaned *paned, { switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: rect->y = 0; rect->width = paned->priv->handle_size; rect->height = GTK_WIDGET(paned)->allocation.height; break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: rect->x = 0; rect->height = paned->priv->handle_size; rect->width = GTK_WIDGET(paned)->allocation.width; @@ -1032,16 +1035,16 @@ static void get_handle_window_rect (MooPaned *paned, switch (paned->priv->pane_position) { - case GTK_POS_LEFT: + case MOO_PANE_POS_LEFT: rect->x = paned->priv->pane_widget_size; break; - case GTK_POS_RIGHT: + case MOO_PANE_POS_RIGHT: rect->x = 0; break; - case GTK_POS_TOP: + case MOO_PANE_POS_TOP: rect->y = paned->priv->pane_widget_size; break; - case GTK_POS_BOTTOM: + case MOO_PANE_POS_BOTTOM: rect->y = 0; break; } @@ -1060,6 +1063,13 @@ static void moo_paned_size_allocate (GtkWidget *widget, bin = GTK_BIN (widget); paned = MOO_PANED (widget); + if (!paned->priv->handle_visible) + paned->priv->handle_size = 0; + if (!paned->priv->button_box_visible) + paned->priv->button_box_size = 0; + if (!paned->priv->pane_widget_visible) + paned->priv->pane_widget_size = 0; + if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) gtk_widget_get_child_requisition (bin->child, &child_requisition); @@ -1087,11 +1097,11 @@ static void moo_paned_size_allocate (GtkWidget *widget, allocation->width, allocation->height); - if (paned->priv->pane_window) + /* XXX */ + if (paned->priv->pane_widget_visible) { get_pane_window_rect (paned, &rect); gdk_window_show (paned->priv->pane_window); - gdk_window_raise (paned->priv->pane_window); gdk_window_move_resize (paned->priv->pane_window, rect.x, rect.y, rect.width, rect.height); @@ -1139,7 +1149,6 @@ static void moo_paned_map (GtkWidget *widget) { gdk_window_show (paned->priv->pane_window); gdk_window_show (paned->priv->handle_window); - gdk_window_raise (paned->priv->pane_window); } } @@ -1176,8 +1185,11 @@ static gboolean moo_paned_expose (GtkWidget *widget, paned->button_box, event); if (GTK_WIDGET_DRAWABLE (GTK_BIN(paned)->child)) + { gtk_container_propagate_expose (GTK_CONTAINER (paned), - GTK_BIN(paned)->child, event); + GTK_BIN(paned)->child, + event); + } if (paned->priv->pane_widget_visible) gtk_container_propagate_expose (GTK_CONTAINER (paned), @@ -1191,6 +1203,94 @@ static gboolean moo_paned_expose (GtkWidget *widget, } +static GdkEventExpose *clip_bin_child_event (MooPaned *paned, + GdkEventExpose *event) +{ + GtkAllocation child_alloc; + GdkRegion *child_rect; + GdkEventExpose *child_event; + + get_bin_child_allocation (paned, &child_alloc); + child_rect = gdk_region_rectangle ((GdkRectangle*) &child_alloc); + + child_event = (GdkEventExpose*) gdk_event_copy ((GdkEvent*) event); + gdk_region_intersect (child_event->region, child_rect); + gdk_region_get_clipbox (child_event->region, &child_event->area); + + gdk_region_destroy (child_rect); + return child_event; +} + + +static gboolean child_expose (GtkWidget *child, + GdkEventExpose *event, + MooPaned *paned) +{ + GdkEvent *child_event; + + g_return_val_if_fail (GTK_BIN(paned)->child == child, FALSE); + + /* this is bullshit. widgets with window get expose directly from gdk */ + /* XXX */ + return FALSE; + + child_event = (GdkEvent*) clip_bin_child_event (paned, event); + + g_signal_handlers_block_by_func (child, (gpointer) child_expose, paned); + gtk_widget_event (child, child_event); + g_signal_handlers_unblock_by_func (child, (gpointer) child_expose, paned); + + gdk_event_free (child_event); + return TRUE; +} + + +static void moo_paned_add (GtkContainer *container, + GtkWidget *child) +{ + GtkBin *bin = GTK_BIN (container); + + g_return_if_fail (GTK_IS_WIDGET (child)); + + if (bin->child != NULL) + { + g_warning ("Attempting to add a widget with type %s to a %s, " + "but as a GtkBin subclass a %s can only contain one widget at a time; " + "it already contains a widget of type %s", + g_type_name (G_OBJECT_TYPE (child)), + g_type_name (G_OBJECT_TYPE (bin)), + g_type_name (G_OBJECT_TYPE (bin)), + g_type_name (G_OBJECT_TYPE (bin->child))); + return; + } + + gtk_widget_set_parent (child, GTK_WIDGET (bin)); + bin->child = child; + + g_signal_connect (child, "expose-event", + G_CALLBACK (child_expose), bin); +} + + +static void moo_paned_remove (GtkContainer *container, + GtkWidget *widget) +{ + MooPaned *paned = MOO_PANED (container); + + if (widget == GTK_BIN(paned)->child) + { + g_signal_handlers_disconnect_by_func (widget, + (gpointer) child_expose, + container); + GTK_CONTAINER_CLASS(moo_paned_parent_class)->remove (container, widget); + } + else + { + moo_paned_remove_pane (paned, widget); + } +} + + static void draw_handle (MooPaned *paned) { GtkWidget *widget = GTK_WIDGET (paned); @@ -1206,16 +1306,16 @@ static void draw_handle (MooPaned *paned) switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: area.width = paned->priv->handle_size; area.height = widget->allocation.height; if (area.width <= 2) shadow_size = 0; orientation = GTK_ORIENTATION_VERTICAL; break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: area.width = widget->allocation.width; area.height = paned->priv->handle_size; if (area.height <= 2) @@ -1342,31 +1442,26 @@ static gboolean moo_paned_motion (GtkWidget *widget, switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - gtk_widget_get_pointer (widget, &size, NULL); + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: + gdk_window_get_pointer (widget->window, &size, NULL, NULL); + + if (paned->priv->pane_position == MOO_PANE_POS_RIGHT) + size = widget->allocation.width - size; + size -= (paned->priv->drag_start + paned->priv->button_box_size); size = CLAMP (size, requisition.width, widget->allocation.width - paned->priv->button_box_size - paned->priv->handle_size); break; - case GTK_POS_RIGHT: - gtk_widget_get_pointer (widget, &size, NULL); - size = widget->allocation.width - size; - size -= (paned->priv->drag_start + paned->priv->button_box_size); - size = CLAMP (size, requisition.width, - widget->allocation.width - paned->priv->button_box_size - - paned->priv->handle_size); - break; - case GTK_POS_TOP: - gtk_widget_get_pointer (widget, NULL, &size); - size -= (paned->priv->drag_start + paned->priv->button_box_size); - size = CLAMP (size, requisition.height, - widget->allocation.height - paned->priv->button_box_size - - paned->priv->handle_size); - break; - case GTK_POS_BOTTOM: - gtk_widget_get_pointer (widget, NULL, &size); - size = widget->allocation.height - size; + + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: + gdk_window_get_pointer (widget->window, NULL, &size, NULL); + + if (paned->priv->pane_position == MOO_PANE_POS_BOTTOM) + size = widget->allocation.height - size; + size -= (paned->priv->drag_start + paned->priv->button_box_size); size = CLAMP (size, requisition.height, widget->allocation.height - paned->priv->button_box_size - @@ -1389,13 +1484,13 @@ static void get_handle_rect (MooPaned *paned, switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: rect->width = paned->priv->handle_size; rect->height = GTK_WIDGET(paned)->allocation.height; break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: rect->height = paned->priv->handle_size; rect->width = GTK_WIDGET(paned)->allocation.width; break; @@ -1467,12 +1562,12 @@ static gboolean moo_paned_button_press (GtkWidget *widget, switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: paned->priv->drag_start = event->x; break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: paned->priv->drag_start = event->y; break; } @@ -1513,14 +1608,14 @@ void moo_paned_set_pane_size (MooPaned *paned, switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: size = CLAMP (size, 0, widget->allocation.width - paned->priv->button_box_size - paned->priv->handle_size); break; - case GTK_POS_TOP: - case GTK_POS_BOTTOM: + case MOO_PANE_POS_TOP: + case MOO_PANE_POS_BOTTOM: size = CLAMP (size, 0, widget->allocation.height - paned->priv->button_box_size - paned->priv->handle_size); @@ -1571,8 +1666,8 @@ void moo_paned_add_pane (MooPaned *paned, switch (paned->priv->pane_position) { - case GTK_POS_LEFT: - case GTK_POS_RIGHT: + case MOO_PANE_POS_LEFT: + case MOO_PANE_POS_RIGHT: box = gtk_vbox_new (FALSE, SPACING_IN_BUTTON); break; default: @@ -1589,10 +1684,10 @@ void moo_paned_add_pane (MooPaned *paned, switch (paned->priv->pane_position) { - case GTK_POS_LEFT: + case MOO_PANE_POS_LEFT: gtk_label_set_angle (GTK_LABEL (label), 90); break; - case GTK_POS_RIGHT: + case MOO_PANE_POS_RIGHT: gtk_label_set_angle (GTK_LABEL (label), 270); break; default: @@ -1609,7 +1704,7 @@ void moo_paned_add_pane (MooPaned *paned, switch (paned->priv->pane_position) { - case GTK_POS_LEFT: + case MOO_PANE_POS_LEFT: if (label) gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); if (icon) @@ -1742,18 +1837,6 @@ void moo_paned_insert_pane (MooPaned *paned, } -static void moo_paned_remove (GtkContainer *container, - GtkWidget *widget) -{ - MooPaned *paned = MOO_PANED (container); - - if (widget == GTK_BIN(paned)->child) - GTK_CONTAINER_CLASS(moo_paned_parent_class)->remove (container, widget); - else - moo_paned_remove_pane (paned, widget); -} - - static void moo_paned_remove_pane (MooPaned *paned, GtkWidget *pane_widget) { @@ -1962,3 +2045,40 @@ gboolean moo_paned_is_open (MooPaned *paned) { return moo_paned_get_open_pane (paned) != -1; } + + +GType moo_pane_position_get_type (void) +{ + static GType type = 0; + + if (!type) + { + static const GEnumValue values[] = { + { MOO_PANE_POS_LEFT, (char*) "MOO_PANE_POS_LEFT", (char*) "left" }, + { MOO_PANE_POS_RIGHT, (char*) "MOO_PANE_POS_RIGHT", (char*) "right" }, + { MOO_PANE_POS_TOP, (char*) "MOO_PANE_POS_TOP", (char*) "top" }, + { MOO_PANE_POS_BOTTOM, (char*) "MOO_PANE_POS_BOTTOM", (char*) "bottom" }, + { 0, NULL, NULL } + }; + type = g_enum_register_static ("MooPanePosition", values); + } + + return type; +} + + +GSList *moo_paned_get_panes (MooPaned *paned) +{ + GSList *list = NULL, *l; + Pane *pane; + + g_return_val_if_fail (MOO_IS_PANED (paned), NULL); + + for (l = paned->priv->panes; l != NULL; l = l->next) + { + pane = l->data; + list = g_slist_prepend (list, pane->child); + } + + return g_slist_reverse (list); +} diff --git a/moo/mooutils/moopaned.h b/moo/mooedit/moopaned.h similarity index 88% rename from moo/mooutils/moopaned.h rename to moo/mooedit/moopaned.h index 091606f9..b887cb87 100644 --- a/moo/mooutils/moopaned.h +++ b/moo/mooedit/moopaned.h @@ -26,11 +26,19 @@ G_BEGIN_DECLS #define MOO_IS_PANED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_PANED)) #define MOO_PANED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_PANED, MooPanedClass)) +#define MOO_TYPE_PANE_POSITION (moo_pane_position_get_type ()) typedef struct _MooPaned MooPaned; typedef struct _MooPanedPrivate MooPanedPrivate; typedef struct _MooPanedClass MooPanedClass; +typedef enum { + MOO_PANE_POS_LEFT = 0, + MOO_PANE_POS_RIGHT, + MOO_PANE_POS_TOP, + MOO_PANE_POS_BOTTOM +} MooPanePosition; + struct _MooPaned { GtkBin bin; @@ -49,8 +57,9 @@ struct _MooPanedClass GType moo_paned_get_type (void) G_GNUC_CONST; +GType moo_pane_position_get_type (void) G_GNUC_CONST; -GtkWidget *moo_paned_new (GtkPositionType pane_position); +GtkWidget *moo_paned_new (MooPanePosition pane_position); void moo_paned_add_pane (MooPaned *paned, GtkWidget *pane_widget, @@ -62,7 +71,7 @@ void moo_paned_insert_pane (MooPaned *paned, int position); guint moo_paned_n_panes (MooPaned *paned); - +GSList *moo_paned_get_panes (MooPaned *paned); GtkWidget *moo_paned_get_nth_pane (MooPaned *paned, guint n); diff --git a/moo/mooterm/mooterm-text.c b/moo/mooterm/mooterm-text.c index 94ac7d24..fbfc95d6 100644 --- a/moo/mooterm/mooterm-text.c +++ b/moo/mooterm/mooterm-text.c @@ -744,6 +744,7 @@ static gboolean extend_selection (MooText *obj, } +/* TODO */ static int char_class (MooTerm *term, const GtkTextIter *iter) { diff --git a/moo/mooutils/Makefile.am b/moo/mooutils/Makefile.am index 798fd4d3..d78cf245 100644 --- a/moo/mooutils/Makefile.am +++ b/moo/mooutils/Makefile.am @@ -55,8 +55,6 @@ libmooutils_la_SOURCES = \ moomarkup.h \ mooobjectfactory.c \ mooobjectfactory.h \ - moopaned.c \ - moopaned.h \ mooparam.c \ mooparam.h \ mooprefs.c \ diff --git a/moo/mooutils/moomarshals.list b/moo/mooutils/moomarshals.list index f9987361..ebf7247b 100644 --- a/moo/mooutils/moomarshals.list +++ b/moo/mooutils/moomarshals.list @@ -12,6 +12,8 @@ STRING:VOID VOID:BOOL VOID:BOXED VOID:BOXED,POINTER,OBJECT +VOID:ENUM +VOID:ENUM,UINT VOID:INT VOID:STRING VOID:UINT diff --git a/tests/Makefile.am b/tests/Makefile.am index abe96dfe..61f17aa5 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -21,13 +21,13 @@ if BUILD_MOOAPP bin_PROGRAMS += editor endif if BUILD_MOOEDIT -noinst_PROGRAMS += medit testfileview testpanedfileview +noinst_PROGRAMS += medit testfileview testpanedfileview testpaned endif if BUILD_MOOTERM noinst_PROGRAMS += mterm termbuffer endif if BUILD_MOOUTILS -noinst_PROGRAMS += markup testpaned +noinst_PROGRAMS += markup endif diff --git a/tests/editor.c b/tests/editor.c index bad94aab..be330dd9 100644 --- a/tests/editor.c +++ b/tests/editor.c @@ -26,6 +26,7 @@ int main (int argc, char *argv[]) MooEditWindow *win; gtk_init (&argc, &argv); +// gdk_window_set_debug_updates (TRUE); init_terminal (); init_editor (); diff --git a/tests/mterm.c b/tests/mterm.c index b23899fe..187ebea9 100644 --- a/tests/mterm.c +++ b/tests/mterm.c @@ -141,4 +141,5 @@ int main (int argc, char *argv[]) g_signal_connect (term, "bell", G_CALLBACK (gdk_beep), NULL); gtk_main (); + return 0; } diff --git a/tests/termbuffer.c b/tests/termbuffer.c index df7a7bae..60118dde 100644 --- a/tests/termbuffer.c +++ b/tests/termbuffer.c @@ -129,4 +129,5 @@ int main (int argc, char *argv[]) g_signal_connect (win, "destroy", gtk_main_quit, NULL); gtk_main (); + return 0; } diff --git a/tests/testpaned.c b/tests/testpaned.c index 275b0c72..2c4d523d 100644 --- a/tests/testpaned.c +++ b/tests/testpaned.c @@ -1,34 +1,39 @@ -#include "mooutils/moopaned.h" +#include "mooedit/moobigpaned.h" -static int WINDOWS = 0; - -static void window_destroyed (void) +static void add_panes (GtkWidget *paned, MooPanePosition pane_position) { - if (!--WINDOWS) gtk_main_quit (); -} - - -static void sticky_button_toggled (GtkToggleButton *button, - MooPaned *paned) -{ - gboolean active = gtk_toggle_button_get_active (button); - moo_paned_set_sticky_pane (paned, active); -} - - -static void create_window_with_paned (GtkPositionType pane_position) -{ - GtkWidget *window, *paned, *textview, *button, *label, *swin; + GtkWidget *textview; GtkTextBuffer *buffer; - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); - g_signal_connect (window, "destroy", - G_CALLBACK (window_destroyed), NULL); - WINDOWS++; + textview = gtk_text_view_new (); + gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (textview), GTK_WRAP_WORD); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview)); + gtk_text_buffer_insert_at_cursor (buffer, "Hi there. Hi there. " + "Hi there. Hi there. Hi there. Hi there. Hi there. ", -1); + moo_big_paned_add_pane (MOO_BIG_PANED (paned), + textview, pane_position, + "TextView", GTK_STOCK_OK); + moo_big_paned_add_pane (MOO_BIG_PANED (paned), + gtk_label_new ("This is a label"), + pane_position, "Label", GTK_STOCK_CANCEL); +} - paned = moo_paned_new (pane_position); + +int main (int argc, char *argv[]) +{ + GtkWidget *window, *paned, *textview, *swin; + GtkTextBuffer *buffer; + + gtk_init (&argc, &argv); +// gdk_window_set_debug_updates (TRUE); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size (GTK_WINDOW (window), 800, 600); + g_signal_connect (window, "destroy", + G_CALLBACK (gtk_main_quit), NULL); + + paned = moo_big_paned_new (); gtk_widget_show (paned); gtk_container_add (GTK_CONTAINER (window), paned); @@ -39,78 +44,33 @@ static void create_window_with_paned (GtkPositionType pane_position) GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_show (swin); - gtk_container_add (GTK_CONTAINER (paned), swin); + moo_big_paned_add_child (MOO_BIG_PANED (paned), swin); gtk_container_add (GTK_CONTAINER (swin), textview); gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (textview), GTK_WRAP_WORD); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview)); gtk_text_buffer_insert_at_cursor (buffer, "Click a button. Click a button. " "Click a button. Click a button. Click a button. Click a button. " - "Click a button. Click a button. Click a button. Click a button. " - "Click a button. Click a button. Click a button. Click a button. " - "Click a button. Click a button. Click a button. Click a button. " - "Click a button. Click a button. Click a button. Click a button. " - "Click a button. Click a button. Click a button. Click a button. " - "Click a button. Click a button. Click a button. Click a button. " - "Click a button. Click a button. Click a button. Click a button. " - "Click a button. Click a button. Click a button. Click a button. " - "Click a button. Click a button. Click a button. Click a button. " - "Click a button. Click a button. Click a button. Click a button. ", - -1); + "Click a button. Click a button. Click a button. Click a button. " + "Click a button. Click a button. Click a button. Click a button. " + "Click a button. Click a button. Click a button. Click a button. " + "Click a button. Click a button. Click a button. Click a button. " + "Click a button. Click a button. Click a button. Click a button. " + "Click a button. Click a button. Click a button. Click a button. " + "Click a button. Click a button. Click a button. Click a button. " + "Click a button. Click a button. Click a button. Click a button. " + "Click a button. Click a button. Click a button. Click a button. " + "Click a button. Click a button. Click a button. Click a button. ", + -1); - textview = gtk_text_view_new (); - gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (textview), GTK_WRAP_WORD); - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview)); - gtk_text_buffer_insert_at_cursor (buffer, "Hi there. Hi there. " - "Hi there. Hi there. Hi there. Hi there. Hi there. ", -1); - moo_paned_add_pane (MOO_PANED (paned), - textview, - "TextView", - GTK_STOCK_OK); - moo_paned_add_pane (MOO_PANED (paned), - gtk_label_new ("This is a label"), - "Label", - GTK_STOCK_CANCEL); - - button = gtk_toggle_button_new (); - gtk_widget_show (button); - g_signal_connect (button, "toggled", - G_CALLBACK (sticky_button_toggled), - paned); - gtk_box_pack_end (GTK_BOX (MOO_PANED(paned)->button_box), - button, FALSE, FALSE, 0); - - label = gtk_label_new ("Sticky"); - switch (pane_position) - { - case GTK_POS_LEFT: - gtk_label_set_angle (GTK_LABEL (label), 90); - break; - case GTK_POS_RIGHT: - gtk_label_set_angle (GTK_LABEL (label), 270); - break; - default: - break; - } - - gtk_widget_show (label); - gtk_container_add (GTK_CONTAINER (button), label); + add_panes (paned, MOO_PANE_POS_RIGHT); + add_panes (paned, MOO_PANE_POS_LEFT); + add_panes (paned, MOO_PANE_POS_TOP); + add_panes (paned, MOO_PANE_POS_BOTTOM); gtk_widget_show_all (window); -} - - -int main (int argc, char *argv[]) -{ - gtk_init (&argc, &argv); - -// gdk_window_set_debug_updates (TRUE); - - create_window_with_paned (GTK_POS_RIGHT); - create_window_with_paned (GTK_POS_LEFT); - create_window_with_paned (GTK_POS_TOP); - create_window_with_paned (GTK_POS_BOTTOM); gtk_main (); + return 0; } diff --git a/tests/testpanedfileview.c b/tests/testpanedfileview.c index ffa1d562..30c2cbfb 100644 --- a/tests/testpanedfileview.c +++ b/tests/testpanedfileview.c @@ -1,4 +1,4 @@ -#include "mooutils/moopaned.h" +#include "mooedit/moopaned.h" #include "moofileview/moofileview.h"