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"