From 4d272703e94a8594c38834c5127ff931a1df7429 Mon Sep 17 00:00:00 2001
From: nobody <nobody@localhost>
Date: Fri, 18 Feb 2005 14:48:48 +0000
Subject: This commit was manufactured by cvs2svn to create tag
 'EVOLUTION_2_0_4'.

svn path=/tags/EVOLUTION_2_0_4/; revision=28812
---
 widgets/table/.cvsignore                     |   13 -
 widgets/table/add-col.xpm                    |   22 -
 widgets/table/arrow-down.xpm                 |   21 -
 widgets/table/arrow-up.xpm                   |   21 -
 widgets/table/check-empty.xpm                |   21 -
 widgets/table/check-filled.xpm               |   21 -
 widgets/table/clip.png                       |  Bin 192 -> 0 bytes
 widgets/table/e-cell-checkbox.c              |   67 -
 widgets/table/e-cell-checkbox.h              |   50 -
 widgets/table/e-cell-combo.c                 |  703 -----
 widgets/table/e-cell-combo.h                 |   63 -
 widgets/table/e-cell-date.c                  |  166 --
 widgets/table/e-cell-date.h                  |   49 -
 widgets/table/e-cell-float.c                 |   93 -
 widgets/table/e-cell-float.h                 |   53 -
 widgets/table/e-cell-number.c                |   85 -
 widgets/table/e-cell-number.h                |   49 -
 widgets/table/e-cell-pixbuf.c                |  417 ---
 widgets/table/e-cell-pixbuf.h                |   53 -
 widgets/table/e-cell-popup.c                 |  519 ----
 widgets/table/e-cell-popup.h                 |  101 -
 widgets/table/e-cell-progress.c              |  456 ----
 widgets/table/e-cell-progress.h              |   74 -
 widgets/table/e-cell-size.c                  |  110 -
 widgets/table/e-cell-size.h                  |   49 -
 widgets/table/e-cell-spin-button.c           |  670 -----
 widgets/table/e-cell-spin-button.h           |  103 -
 widgets/table/e-cell-text.c                  | 2854 --------------------
 widgets/table/e-cell-text.h                  |  129 -
 widgets/table/e-cell-toggle.c                |  489 ----
 widgets/table/e-cell-toggle.h                |   62 -
 widgets/table/e-cell-tree.c                  |  911 -------
 widgets/table/e-cell-tree.h                  |   77 -
 widgets/table/e-cell-vbox.c                  |  486 ----
 widgets/table/e-cell-vbox.h                  |   72 -
 widgets/table/e-cell.c                       |  499 ----
 widgets/table/e-cell.h                       |  224 --
 widgets/table/e-table-click-to-add.c         |  601 -----
 widgets/table/e-table-click-to-add.h         |   78 -
 widgets/table/e-table-col-dnd.h              |   39 -
 widgets/table/e-table-col.c                  |  236 --
 widgets/table/e-table-col.h                  |  101 -
 widgets/table/e-table-column-specification.c |  150 --
 widgets/table/e-table-column-specification.h |   73 -
 widgets/table/e-table-column.c               |  291 --
 widgets/table/e-table-config-field.c         |  300 ---
 widgets/table/e-table-config-field.h         |   69 -
 widgets/table/e-table-config-no-group.glade  | 2112 ---------------
 widgets/table/e-table-config.c               | 1225 ---------
 widgets/table/e-table-config.glade           | 2181 ---------------
 widgets/table/e-table-config.h               |  115 -
 widgets/table/e-table-defines.h              |   45 -
 widgets/table/e-table-example-1.c            |  308 ---
 widgets/table/e-table-example-2.c            |  349 ---
 widgets/table/e-table-extras.c               |  292 --
 widgets/table/e-table-extras.h               |   82 -
 widgets/table/e-table-field-chooser-dialog.c |  224 --
 widgets/table/e-table-field-chooser-dialog.h |   79 -
 widgets/table/e-table-field-chooser-item.c   |  711 -----
 widgets/table/e-table-field-chooser-item.h   |   75 -
 widgets/table/e-table-field-chooser.c        |  302 ---
 widgets/table/e-table-field-chooser.glade    |  123 -
 widgets/table/e-table-field-chooser.h        |   79 -
 widgets/table/e-table-group-container.c      | 1503 -----------
 widgets/table/e-table-group-container.h      |  108 -
 widgets/table/e-table-group-leaf.c           |  686 -----
 widgets/table/e-table-group-leaf.h           |   90 -
 widgets/table/e-table-group.c                |  712 -----
 widgets/table/e-table-group.h                |  178 --
 widgets/table/e-table-header-item.c          | 1910 -------------
 widgets/table/e-table-header-item.h          |  119 -
 widgets/table/e-table-header-utils.c         |  480 ----
 widgets/table/e-table-header-utils.h         |   55 -
 widgets/table/e-table-header.c               |  952 -------
 widgets/table/e-table-header.h               |  120 -
 widgets/table/e-table-item.c                 | 3735 --------------------------
 widgets/table/e-table-item.h                 |  231 --
 widgets/table/e-table-memory-callbacks.c     |  208 --
 widgets/table/e-table-memory-callbacks.h     |   91 -
 widgets/table/e-table-memory-store.c         |  583 ----
 widgets/table/e-table-memory-store.h         |  138 -
 widgets/table/e-table-memory.c               |  277 --
 widgets/table/e-table-memory.h               |   76 -
 widgets/table/e-table-model.c                |  616 -----
 widgets/table/e-table-model.h                |  173 --
 widgets/table/e-table-one.c                  |  241 --
 widgets/table/e-table-one.h                  |   57 -
 widgets/table/e-table-scrolled.c             |  229 --
 widgets/table/e-table-scrolled.h             |   76 -
 widgets/table/e-table-search.c               |  223 --
 widgets/table/e-table-search.h               |   71 -
 widgets/table/e-table-selection-model.c      |  347 ---
 widgets/table/e-table-selection-model.h      |   76 -
 widgets/table/e-table-simple.c               |  289 --
 widgets/table/e-table-simple.h               |  122 -
 widgets/table/e-table-size-test.c            |  307 ---
 widgets/table/e-table-sort-info.c            |  481 ----
 widgets/table/e-table-sort-info.h            |  107 -
 widgets/table/e-table-sorted-variable.c      |  230 --
 widgets/table/e-table-sorted-variable.h      |   65 -
 widgets/table/e-table-sorted.c               |  310 ---
 widgets/table/e-table-sorted.h               |   65 -
 widgets/table/e-table-sorter.c               |  462 ----
 widgets/table/e-table-sorter.h               |   74 -
 widgets/table/e-table-sorting-utils.c        |  349 ---
 widgets/table/e-table-sorting-utils.h        |   83 -
 widgets/table/e-table-specification.c        |  432 ---
 widgets/table/e-table-specification.h        |   89 -
 widgets/table/e-table-state.c                |  299 ---
 widgets/table/e-table-state.h                |   74 -
 widgets/table/e-table-subset-variable.c      |  250 --
 widgets/table/e-table-subset-variable.h      |   82 -
 widgets/table/e-table-subset.c               |  482 ----
 widgets/table/e-table-subset.h               |   89 -
 widgets/table/e-table-tooltip.h              |   44 -
 widgets/table/e-table-tree.h                 |   48 -
 widgets/table/e-table-utils.c                |  191 --
 widgets/table/e-table-utils.h                |   49 -
 widgets/table/e-table-without.c              |  392 ---
 widgets/table/e-table-without.h              |   91 -
 widgets/table/e-table.c                      | 3349 -----------------------
 widgets/table/e-table.dia                    |  Bin 4514 -> 0 bytes
 widgets/table/e-table.h                      |  358 ---
 widgets/table/e-tree-memory-callbacks.c      |  275 --
 widgets/table/e-tree-memory-callbacks.h      |  119 -
 widgets/table/e-tree-memory.c                |  717 -----
 widgets/table/e-tree-memory.h                |  101 -
 widgets/table/e-tree-model.c                 | 1098 --------
 widgets/table/e-tree-model.h                 |  227 --
 widgets/table/e-tree-scrolled.c              |  228 --
 widgets/table/e-tree-scrolled.h              |   75 -
 widgets/table/e-tree-selection-model.c       |  816 ------
 widgets/table/e-tree-selection-model.h       |   79 -
 widgets/table/e-tree-simple.c                |  208 --
 widgets/table/e-tree-simple.h                |   85 -
 widgets/table/e-tree-sorted-variable.c       |  477 ----
 widgets/table/e-tree-sorted-variable.h       |   85 -
 widgets/table/e-tree-sorted.c                | 1390 ----------
 widgets/table/e-tree-sorted.h                |   86 -
 widgets/table/e-tree-table-adapter.c         | 1174 --------
 widgets/table/e-tree-table-adapter.h         |   95 -
 widgets/table/e-tree.c                       | 3324 -----------------------
 widgets/table/e-tree.h                       |  312 ---
 widgets/table/image1.png                     |  Bin 1858 -> 0 bytes
 widgets/table/image2.png                     |  Bin 1987 -> 0 bytes
 widgets/table/image3.png                     |  Bin 2051 -> 0 bytes
 widgets/table/remove-col.xpm                 |   22 -
 widgets/table/sample.table                   |   45 -
 widgets/table/spec.xml                       |   21 -
 widgets/table/table-test.c                   |   62 -
 widgets/table/table-test.h                   |   27 -
 widgets/table/test-check.c                   |  221 --
 widgets/table/test-cols.c                    |  265 --
 widgets/table/test-table.c                   |  478 ----
 widgets/table/tree-expanded.xpm              |   23 -
 widgets/table/tree-unexpanded.xpm            |   23 -
 156 files changed, 55874 deletions(-)
 delete mode 100644 widgets/table/.cvsignore
 delete mode 100644 widgets/table/add-col.xpm
 delete mode 100644 widgets/table/arrow-down.xpm
 delete mode 100644 widgets/table/arrow-up.xpm
 delete mode 100644 widgets/table/check-empty.xpm
 delete mode 100644 widgets/table/check-filled.xpm
 delete mode 100644 widgets/table/clip.png
 delete mode 100644 widgets/table/e-cell-checkbox.c
 delete mode 100644 widgets/table/e-cell-checkbox.h
 delete mode 100644 widgets/table/e-cell-combo.c
 delete mode 100644 widgets/table/e-cell-combo.h
 delete mode 100644 widgets/table/e-cell-date.c
 delete mode 100644 widgets/table/e-cell-date.h
 delete mode 100644 widgets/table/e-cell-float.c
 delete mode 100644 widgets/table/e-cell-float.h
 delete mode 100644 widgets/table/e-cell-number.c
 delete mode 100644 widgets/table/e-cell-number.h
 delete mode 100644 widgets/table/e-cell-pixbuf.c
 delete mode 100644 widgets/table/e-cell-pixbuf.h
 delete mode 100644 widgets/table/e-cell-popup.c
 delete mode 100644 widgets/table/e-cell-popup.h
 delete mode 100644 widgets/table/e-cell-progress.c
 delete mode 100644 widgets/table/e-cell-progress.h
 delete mode 100644 widgets/table/e-cell-size.c
 delete mode 100644 widgets/table/e-cell-size.h
 delete mode 100644 widgets/table/e-cell-spin-button.c
 delete mode 100644 widgets/table/e-cell-spin-button.h
 delete mode 100644 widgets/table/e-cell-text.c
 delete mode 100644 widgets/table/e-cell-text.h
 delete mode 100644 widgets/table/e-cell-toggle.c
 delete mode 100644 widgets/table/e-cell-toggle.h
 delete mode 100644 widgets/table/e-cell-tree.c
 delete mode 100644 widgets/table/e-cell-tree.h
 delete mode 100644 widgets/table/e-cell-vbox.c
 delete mode 100644 widgets/table/e-cell-vbox.h
 delete mode 100644 widgets/table/e-cell.c
 delete mode 100644 widgets/table/e-cell.h
 delete mode 100644 widgets/table/e-table-click-to-add.c
 delete mode 100644 widgets/table/e-table-click-to-add.h
 delete mode 100644 widgets/table/e-table-col-dnd.h
 delete mode 100644 widgets/table/e-table-col.c
 delete mode 100644 widgets/table/e-table-col.h
 delete mode 100644 widgets/table/e-table-column-specification.c
 delete mode 100644 widgets/table/e-table-column-specification.h
 delete mode 100644 widgets/table/e-table-column.c
 delete mode 100644 widgets/table/e-table-config-field.c
 delete mode 100644 widgets/table/e-table-config-field.h
 delete mode 100644 widgets/table/e-table-config-no-group.glade
 delete mode 100644 widgets/table/e-table-config.c
 delete mode 100644 widgets/table/e-table-config.glade
 delete mode 100644 widgets/table/e-table-config.h
 delete mode 100644 widgets/table/e-table-defines.h
 delete mode 100644 widgets/table/e-table-example-1.c
 delete mode 100644 widgets/table/e-table-example-2.c
 delete mode 100644 widgets/table/e-table-extras.c
 delete mode 100644 widgets/table/e-table-extras.h
 delete mode 100644 widgets/table/e-table-field-chooser-dialog.c
 delete mode 100644 widgets/table/e-table-field-chooser-dialog.h
 delete mode 100644 widgets/table/e-table-field-chooser-item.c
 delete mode 100644 widgets/table/e-table-field-chooser-item.h
 delete mode 100644 widgets/table/e-table-field-chooser.c
 delete mode 100644 widgets/table/e-table-field-chooser.glade
 delete mode 100644 widgets/table/e-table-field-chooser.h
 delete mode 100644 widgets/table/e-table-group-container.c
 delete mode 100644 widgets/table/e-table-group-container.h
 delete mode 100644 widgets/table/e-table-group-leaf.c
 delete mode 100644 widgets/table/e-table-group-leaf.h
 delete mode 100644 widgets/table/e-table-group.c
 delete mode 100644 widgets/table/e-table-group.h
 delete mode 100644 widgets/table/e-table-header-item.c
 delete mode 100644 widgets/table/e-table-header-item.h
 delete mode 100644 widgets/table/e-table-header-utils.c
 delete mode 100644 widgets/table/e-table-header-utils.h
 delete mode 100644 widgets/table/e-table-header.c
 delete mode 100644 widgets/table/e-table-header.h
 delete mode 100644 widgets/table/e-table-item.c
 delete mode 100644 widgets/table/e-table-item.h
 delete mode 100644 widgets/table/e-table-memory-callbacks.c
 delete mode 100644 widgets/table/e-table-memory-callbacks.h
 delete mode 100644 widgets/table/e-table-memory-store.c
 delete mode 100644 widgets/table/e-table-memory-store.h
 delete mode 100644 widgets/table/e-table-memory.c
 delete mode 100644 widgets/table/e-table-memory.h
 delete mode 100644 widgets/table/e-table-model.c
 delete mode 100644 widgets/table/e-table-model.h
 delete mode 100644 widgets/table/e-table-one.c
 delete mode 100644 widgets/table/e-table-one.h
 delete mode 100644 widgets/table/e-table-scrolled.c
 delete mode 100644 widgets/table/e-table-scrolled.h
 delete mode 100644 widgets/table/e-table-search.c
 delete mode 100644 widgets/table/e-table-search.h
 delete mode 100644 widgets/table/e-table-selection-model.c
 delete mode 100644 widgets/table/e-table-selection-model.h
 delete mode 100644 widgets/table/e-table-simple.c
 delete mode 100644 widgets/table/e-table-simple.h
 delete mode 100644 widgets/table/e-table-size-test.c
 delete mode 100644 widgets/table/e-table-sort-info.c
 delete mode 100644 widgets/table/e-table-sort-info.h
 delete mode 100644 widgets/table/e-table-sorted-variable.c
 delete mode 100644 widgets/table/e-table-sorted-variable.h
 delete mode 100644 widgets/table/e-table-sorted.c
 delete mode 100644 widgets/table/e-table-sorted.h
 delete mode 100644 widgets/table/e-table-sorter.c
 delete mode 100644 widgets/table/e-table-sorter.h
 delete mode 100644 widgets/table/e-table-sorting-utils.c
 delete mode 100644 widgets/table/e-table-sorting-utils.h
 delete mode 100644 widgets/table/e-table-specification.c
 delete mode 100644 widgets/table/e-table-specification.h
 delete mode 100644 widgets/table/e-table-state.c
 delete mode 100644 widgets/table/e-table-state.h
 delete mode 100644 widgets/table/e-table-subset-variable.c
 delete mode 100644 widgets/table/e-table-subset-variable.h
 delete mode 100644 widgets/table/e-table-subset.c
 delete mode 100644 widgets/table/e-table-subset.h
 delete mode 100644 widgets/table/e-table-tooltip.h
 delete mode 100644 widgets/table/e-table-tree.h
 delete mode 100644 widgets/table/e-table-utils.c
 delete mode 100644 widgets/table/e-table-utils.h
 delete mode 100644 widgets/table/e-table-without.c
 delete mode 100644 widgets/table/e-table-without.h
 delete mode 100644 widgets/table/e-table.c
 delete mode 100644 widgets/table/e-table.dia
 delete mode 100644 widgets/table/e-table.h
 delete mode 100644 widgets/table/e-tree-memory-callbacks.c
 delete mode 100644 widgets/table/e-tree-memory-callbacks.h
 delete mode 100644 widgets/table/e-tree-memory.c
 delete mode 100644 widgets/table/e-tree-memory.h
 delete mode 100644 widgets/table/e-tree-model.c
 delete mode 100644 widgets/table/e-tree-model.h
 delete mode 100644 widgets/table/e-tree-scrolled.c
 delete mode 100644 widgets/table/e-tree-scrolled.h
 delete mode 100644 widgets/table/e-tree-selection-model.c
 delete mode 100644 widgets/table/e-tree-selection-model.h
 delete mode 100644 widgets/table/e-tree-simple.c
 delete mode 100644 widgets/table/e-tree-simple.h
 delete mode 100644 widgets/table/e-tree-sorted-variable.c
 delete mode 100644 widgets/table/e-tree-sorted-variable.h
 delete mode 100644 widgets/table/e-tree-sorted.c
 delete mode 100644 widgets/table/e-tree-sorted.h
 delete mode 100644 widgets/table/e-tree-table-adapter.c
 delete mode 100644 widgets/table/e-tree-table-adapter.h
 delete mode 100644 widgets/table/e-tree.c
 delete mode 100644 widgets/table/e-tree.h
 delete mode 100644 widgets/table/image1.png
 delete mode 100644 widgets/table/image2.png
 delete mode 100644 widgets/table/image3.png
 delete mode 100644 widgets/table/remove-col.xpm
 delete mode 100644 widgets/table/sample.table
 delete mode 100644 widgets/table/spec.xml
 delete mode 100644 widgets/table/table-test.c
 delete mode 100644 widgets/table/table-test.h
 delete mode 100644 widgets/table/test-check.c
 delete mode 100644 widgets/table/test-cols.c
 delete mode 100644 widgets/table/test-table.c
 delete mode 100644 widgets/table/tree-expanded.xpm
 delete mode 100644 widgets/table/tree-unexpanded.xpm

(limited to 'widgets/table')

diff --git a/widgets/table/.cvsignore b/widgets/table/.cvsignore
deleted file mode 100644
index b1004fee2c..0000000000
--- a/widgets/table/.cvsignore
+++ /dev/null
@@ -1,13 +0,0 @@
-.deps
-.libs
-.pure
-Makefile
-Makefile.in
-*.lo
-*.la
-table-test
-table-example-1
-table-example-2
-table-size-test
-tree-example-1
-tree-example-2
diff --git a/widgets/table/add-col.xpm b/widgets/table/add-col.xpm
deleted file mode 100644
index 9c5f314c8e..0000000000
--- a/widgets/table/add-col.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * add_col_xpm[] = {
-"16 16 3 1",
-" 	c None",
-".	c #000000",
-"+	c #FFFFFF",
-"                ",
-"                ",
-"                ",
-"                ",
-" .............. ",
-" .++++++++++++. ",
-" .++++++++++++. ",
-" ....+++....... ",
-"     .+.        ",
-"      .         ",
-"                ",
-"                ",
-"                ",
-"                ",
-"                ",
-"                "};
diff --git a/widgets/table/arrow-down.xpm b/widgets/table/arrow-down.xpm
deleted file mode 100644
index f1e6cb4b3c..0000000000
--- a/widgets/table/arrow-down.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static const char * arrow_down_xpm[] = {
-"13 16 2 1",
-" 	c None",
-".	c #FF0000",
-"     ...     ",
-"     ...     ",
-"     ...     ",
-"     ...     ",
-"     ...     ",
-"     ...     ",
-"     ...     ",
-"     ...     ",
-"     ...     ",
-".............",
-" ........... ",
-"  .........  ",
-"   .......   ",
-"    .....    ",
-"     ...     ",
-"      .      "};
diff --git a/widgets/table/arrow-up.xpm b/widgets/table/arrow-up.xpm
deleted file mode 100644
index 0cc5b9a00c..0000000000
--- a/widgets/table/arrow-up.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static const char * arrow_up_xpm[] = {
-"13 16 2 1",
-" 	c None",
-".	c #FF0000",
-"      .      ",
-"     ...     ",
-"    .....    ",
-"   .......   ",
-"  .........  ",
-" ........... ",
-".............",
-"     ...     ",
-"     ...     ",
-"     ...     ",
-"     ...     ",
-"     ...     ",
-"     ...     ",
-"     ...     ",
-"     ...     ",
-"     ...     "};
diff --git a/widgets/table/check-empty.xpm b/widgets/table/check-empty.xpm
deleted file mode 100644
index 746b20234e..0000000000
--- a/widgets/table/check-empty.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static const char * check_empty_xpm[] = {
-"16 16 2 1",
-" 	c None",
-".	c #000000",
-"                ",
-"                ",
-"  ............  ",
-"  .          .  ",
-"  .          .  ",
-"  .          .  ",
-"  .          .  ",
-"  .          .  ",
-"  .          .  ",
-"  .          .  ",
-"  .          .  ",
-"  .          .  ",
-"  .          .  ",
-"  ............  ",
-"                ",
-"                "};
diff --git a/widgets/table/check-filled.xpm b/widgets/table/check-filled.xpm
deleted file mode 100644
index c0468fc25b..0000000000
--- a/widgets/table/check-filled.xpm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XPM */
-static const char * check_filled_xpm[] = {
-"16 16 2 1",
-" 	c None",
-".	c #000000",
-"                ",
-"                ",
-"  ............  ",
-"  .          .  ",
-"  .        . .  ",
-"  .       .. .  ",
-"  .      ... .  ",
-"  . .   ...  .  ",
-"  . .. ...   .  ",
-"  . .....    .  ",
-"  .  ...     .  ",
-"  .   .      .  ",
-"  .          .  ",
-"  ............  ",
-"                ",
-"                "};
diff --git a/widgets/table/clip.png b/widgets/table/clip.png
deleted file mode 100644
index 27aa5f072f..0000000000
Binary files a/widgets/table/clip.png and /dev/null differ
diff --git a/widgets/table/e-cell-checkbox.c b/widgets/table/e-cell-checkbox.c
deleted file mode 100644
index 5ef4b23a96..0000000000
--- a/widgets/table/e-cell-checkbox.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell-checkbox.c: Checkbox cell renderer
- * Copyright 1999, 2000, Ximian, Inc.
- *
- * Authors:
- *   Miguel de Icaza <miguel@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-#include <config.h>
-#include <gtk/gtkenums.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include "e-cell-checkbox.h"
-#include "gal/util/e-util.h"
-#include "e-table-item.h"
-
-#include "check-empty.xpm"
-#include "check-filled.xpm"
-
-#define PARENT_TYPE e_cell_toggle_get_type ()
-
-static GdkPixbuf *checks [2];
-
-static void
-e_cell_checkbox_class_init (GtkObjectClass *object_class)
-{
-	checks [0] = gdk_pixbuf_new_from_xpm_data (check_empty_xpm);
-	checks [1] = gdk_pixbuf_new_from_xpm_data (check_filled_xpm);
-}
-
-E_MAKE_TYPE(e_cell_checkbox, "ECellCheckbox", ECellCheckbox, e_cell_checkbox_class_init, NULL, PARENT_TYPE)
-
-/**
- * e_cell_checkbox_new:
- *
- * Creates a new ECell renderer that can be used to render check
- * boxes.  the data provided from the model is cast to an integer.
- * zero is used for the off display, and non-zero for checked status.
- * 
- * Returns: an ECell object that can be used to render checkboxes.
- */
-ECell *
-e_cell_checkbox_new (void)
-{
-	ECellCheckbox *eccb = g_object_new (E_CELL_CHECKBOX_TYPE, NULL);
-
-	e_cell_toggle_construct (E_CELL_TOGGLE (eccb), 2, 2, checks);
-      
-	return (ECell *) eccb;
-}
diff --git a/widgets/table/e-cell-checkbox.h b/widgets/table/e-cell-checkbox.h
deleted file mode 100644
index ab56af27ab..0000000000
--- a/widgets/table/e-cell-checkbox.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell-checkbox.h: Checkbox cell renderer
- * Copyright 1999, 2000, Ximian, Inc.
- *
- * Authors:
- *   Miguel de Icaza <miguel@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-#ifndef _E_CELL_CHECKBOX_H_
-#define _E_CELL_CHECKBOX_H_
-
-#include <gal/e-table/e-cell-toggle.h>
-
-G_BEGIN_DECLS
-
-#define E_CELL_CHECKBOX_TYPE        (e_cell_checkbox_get_type ())
-#define E_CELL_CHECKBOX(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_CELL_CHECKBOX_TYPE, ECellCheckbox))
-#define E_CELL_CHECKBOX_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_CELL_CHECKBOX_TYPE, ECellCheckboxClass))
-#define E_IS_CELL_CHECKBOX(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_CHECKBOX_TYPE))
-#define E_IS_CELL_CHECKBOX_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_CHECKBOX_TYPE))
-
-typedef struct {
-	ECellToggle parent;
-} ECellCheckbox;
-
-typedef struct {
-	ECellToggleClass parent_class;
-} ECellCheckboxClass;
-
-GType      e_cell_checkbox_get_type (void);
-ECell     *e_cell_checkbox_new      (void);
-
-G_END_DECLS
-
-#endif /* _E_CELL_CHECKBOX_H_ */
-
diff --git a/widgets/table/e-cell-combo.c b/widgets/table/e-cell-combo.c
deleted file mode 100644
index 3ff3488ae5..0000000000
--- a/widgets/table/e-cell-combo.c
+++ /dev/null
@@ -1,703 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell-combo.c: Combo cell renderer
- * Copyright 2001, Ximian, Inc.
- *
- * Authors:
- *   Damon Chaplin <damon@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-/*
- * ECellCombo - a subclass of ECellPopup used to support popup lists like a
- * GtkCombo widget. It only supports a basic popup list of strings at present,
- * with no auto-completion.
- */
-
-/*
- * Notes: (handling pointer grabs and GTK+ grabs is a nightmare!)
- *
- * o We must grab the pointer when we show the popup, so that if any buttons
- *   are pressed outside the application we hide the popup.
- *
- * o We have to be careful when popping up any widgets which also grab the
- *   pointer at some point, since we will lose our own pointer grab.
- *   When we pop up a list it will grab the pointer itself when an item is
- *   selected, and release the grab when the button is released.
- *   Fortunately we hide the popup at this point, so it isn't a problem.
- *   But for other types of widgets in the popup it could cause trouble.
- *   - I think GTK+ should provide help for this (nested pointer grabs?).
- *
- * o We must set the 'owner_events' flag of the pointer grab to TRUE so that
- *   pointer events get reported to all the application windows as normal.
- *   If we don't do this then the widgets in the popup may not work properly.
- *
- * o We must do a gtk_grab_add() so that we only allow events to go to the
- *   widgets within the popup (though some special events still get reported
- *   to the widget owning the window). Doing th gtk_grab_add() on the toplevel
- *   popup window should be fine. We can then check for any events that should
- *   close the popup, like the Escape key, or a button press outside the popup.
- */
-
-#include <config.h>
-#include <string.h> /* strcmp() */
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-#include <glib/gi18n.h>
-#include "gal/util/e-util.h"
-#include "gal/widgets/e-unicode.h"
-#include "e-table-item.h"
-#include "e-cell-combo.h"
-#include "e-cell-text.h"
-
-#define d(x)
-
-
-/* The height to make the popup list if there aren't any items in it. */
-#define	E_CELL_COMBO_LIST_EMPTY_HEIGHT	15
-
-/* The object data key used to store the UTF-8 text of the popup list items. */
-#define E_CELL_COMBO_UTF8_KEY		"UTF-8-TEXT"
-
-
-static void e_cell_combo_class_init	(GObjectClass	*object_class);
-static void e_cell_combo_init		(ECellCombo	*ecc);
-static void e_cell_combo_dispose	(GObject	*object);
-
-static gint e_cell_combo_do_popup	(ECellPopup	*ecp,
-					 GdkEvent	*event,
-					 int             row,
-					 int             view_col);
-static void e_cell_combo_select_matching_item	(ECellCombo	*ecc);
-static void e_cell_combo_show_popup	(ECellCombo	*ecc,
-					 int             row,
-					 int             view_col);
-static void e_cell_combo_get_popup_pos	(ECellCombo	*ecc,
-					 int             row,
-					 int             view_col,
-					 gint		*x,
-					 gint		*y,
-					 gint		*height,
-					 gint		*width);
-
-static void e_cell_combo_selection_changed (GtkWidget *popup_list, ECellCombo *ecc);
-
-static gint e_cell_combo_list_button_press (GtkWidget *popup_list, GdkEvent *event, ECellCombo *ecc);
-
-static gint e_cell_combo_button_press	(GtkWidget	*popup_window,
-					 GdkEvent	*event,
-					 ECellCombo	*ecc);
-static gint e_cell_combo_button_release	(GtkWidget	*popup_window,
-					 GdkEventButton	*event,
-					 ECellCombo	*ecc);
-static int e_cell_combo_key_press	(GtkWidget	*popup_window,
-					 GdkEventKey	*event,
-					 ECellCombo	*ecc);
-
-static void e_cell_combo_update_cell	(ECellCombo	*ecc);
-static void e_cell_combo_restart_edit	(ECellCombo	*ecc);
-
-
-static ECellPopupClass *parent_class;
-
-
-E_MAKE_TYPE (e_cell_combo, "ECellCombo", ECellCombo,
-	     e_cell_combo_class_init, e_cell_combo_init,
-	     e_cell_popup_get_type())
-
-
-static void
-e_cell_combo_class_init			(GObjectClass	*object_class)
-{
-	ECellPopupClass *ecpc = (ECellPopupClass *) object_class;
-
-	object_class->dispose = e_cell_combo_dispose;
-
-	ecpc->popup = e_cell_combo_do_popup;
-
-	parent_class = g_type_class_ref (E_CELL_POPUP_TYPE);
-}
-
-
-static void
-e_cell_combo_init			(ECellCombo	*ecc)
-{
-	GtkWidget *frame;
-	AtkObject *a11y;
-
-	/* We create one popup window for the ECell, since there will only
-	   ever be one popup in use at a time. */
-	ecc->popup_window = gtk_window_new (GTK_WINDOW_POPUP);
-
-	gtk_window_set_policy (GTK_WINDOW (ecc->popup_window),
-			       TRUE, TRUE, FALSE);
-  
-	frame = gtk_frame_new (NULL);
-	gtk_container_add (GTK_CONTAINER (ecc->popup_window), frame);
-	gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
-	gtk_widget_show (frame);
-
-	ecc->popup_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
-	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (ecc->popup_scrolled_window),
-					GTK_POLICY_AUTOMATIC,
-					GTK_POLICY_AUTOMATIC);
-	GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (ecc->popup_scrolled_window)->hscrollbar, GTK_CAN_FOCUS);
-	GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (ecc->popup_scrolled_window)->vscrollbar, GTK_CAN_FOCUS);
-	gtk_container_add (GTK_CONTAINER (frame), ecc->popup_scrolled_window);
-	gtk_widget_show (ecc->popup_scrolled_window);
-
-	ecc->popup_list = gtk_list_new ();
-	gtk_list_set_selection_mode (GTK_LIST (ecc->popup_list),
-				     GTK_SELECTION_BROWSE);
-	gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (ecc->popup_scrolled_window), ecc->popup_list);
-	gtk_container_set_focus_vadjustment (GTK_CONTAINER (ecc->popup_list),
-					     gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (ecc->popup_scrolled_window)));
-	gtk_container_set_focus_hadjustment (GTK_CONTAINER (ecc->popup_list),
-					     gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (ecc->popup_scrolled_window)));
-	gtk_widget_show (ecc->popup_list);
-
-	a11y = gtk_widget_get_accessible (ecc->popup_list);
-	atk_object_set_name (a11y, _("popup list"));
-
-	g_signal_connect (ecc->popup_list,
-			  "selection_changed",
-			  G_CALLBACK (e_cell_combo_selection_changed),
-			  ecc);
-	g_signal_connect (ecc->popup_list,
-			  "button_press_event",
-			  G_CALLBACK (e_cell_combo_list_button_press),
-			  ecc);
-	g_signal_connect (ecc->popup_window,
-			  "button_press_event",
-			  G_CALLBACK (e_cell_combo_button_press),
-			  ecc);
-	/* We use connect_after here so the list updates the selection before
-	   we hide the popup and update the cell. */
-	g_signal_connect (ecc->popup_window,
-			  "button_release_event",
-			  G_CALLBACK (e_cell_combo_button_release),
-			  ecc);
-	g_signal_connect (ecc->popup_window,
-			  "key_press_event",
-			  G_CALLBACK (e_cell_combo_key_press), ecc);
-}
-
-
-/**
- * e_cell_combo_new:
- *
- * Creates a new ECellCombo renderer.
- *
- * Returns: an ECellCombo object.
- */
-ECell *
-e_cell_combo_new			(void)
-{
-	ECellCombo *ecc = g_object_new (E_CELL_COMBO_TYPE, NULL);
-
-	return (ECell*) ecc;
-}
-
-
-/*
- * GObject::dispose method
- */
-static void
-e_cell_combo_dispose			(GObject *object)
-{
-	ECellCombo *ecc = E_CELL_COMBO (object);
-
-	if (ecc->popup_window)
-		gtk_widget_destroy (ecc->popup_window);
-	ecc->popup_window = NULL;
-
-	G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-
-
-void
-e_cell_combo_set_popdown_strings	(ECellCombo	*ecc, 
-					 GList		*strings)
-{
-	GList *elem;
-	GtkWidget *listitem;
-
-	g_return_if_fail (E_IS_CELL_COMBO (ecc));
-	g_return_if_fail (strings != NULL);
-
-	gtk_list_clear_items (GTK_LIST (ecc->popup_list), 0, -1);
-	elem = strings;
-	while (elem) {
-		char *utf8_text = elem->data;
-
-		listitem = gtk_list_item_new_with_label (utf8_text);
-
-		gtk_widget_show (listitem);
-		gtk_container_add (GTK_CONTAINER (ecc->popup_list), listitem);
-
-		g_object_set_data_full (G_OBJECT (listitem),
-					E_CELL_COMBO_UTF8_KEY,
-					g_strdup (utf8_text), g_free);
-
-		elem = elem->next;
-	}
-}
-
-
-static gint
-e_cell_combo_do_popup			(ECellPopup	*ecp,
-					 GdkEvent	*event,
-					 int             row,
-					 int             view_col)
-{
-	ECellCombo *ecc = E_CELL_COMBO (ecp);
-	guint32 time;
-	gint error_code;
-
-	g_signal_handlers_block_by_func(ecc->popup_list, e_cell_combo_selection_changed, ecc);
-	e_cell_combo_show_popup (ecc, row, view_col);
-	e_cell_combo_select_matching_item (ecc);
-	g_signal_handlers_unblock_by_func(ecc->popup_list, e_cell_combo_selection_changed, ecc);
-
-	if (event->type == GDK_BUTTON_PRESS) {
-		GTK_LIST (ecc->popup_list)->drag_selection = TRUE;
-		time = event->button.time;
-	} else {
-		time = event->key.time;
-	}
-
-	error_code = gdk_pointer_grab (ecc->popup_list->window, TRUE,
-				       GDK_ENTER_NOTIFY_MASK |
-				       GDK_BUTTON_PRESS_MASK | 
-				       GDK_BUTTON_RELEASE_MASK |
-				       GDK_POINTER_MOTION_HINT_MASK |
-				       GDK_BUTTON1_MOTION_MASK,
-				       NULL, NULL, time);
-	if (error_code != 0)
-		g_warning ("Failed to get pointer grab (%i)", error_code);
-	gtk_grab_add (ecc->popup_window);
-	gdk_keyboard_grab (ecc->popup_list->window, TRUE, time);
-
-	return TRUE;
-}
-
-
-static void
-e_cell_combo_select_matching_item	(ECellCombo	*ecc)
-{
-	ECellPopup *ecp = E_CELL_POPUP (ecc);
-	ECellView *ecv = (ECellView*) ecp->popup_cell_view;
-	ECellText *ecell_text = E_CELL_TEXT (ecp->child);
-	ETableItem *eti = E_TABLE_ITEM (ecp->popup_cell_view->cell_view.e_table_item_view);
-	ETableCol *ecol;
-	GtkList *list;
-	GtkWidget *listitem;
-	GList *elem;
-	gboolean found = FALSE;
-	char *cell_text, *list_item_text;
-
-	ecol = e_table_header_get_column (eti->header, ecp->popup_view_col);
-	cell_text = e_cell_text_get_text (ecell_text, ecv->e_table_model,
-					  ecol->col_idx, ecp->popup_row);
-
-	list = GTK_LIST (ecc->popup_list);
-	elem = list->children;
-	while (elem) {
-		listitem = GTK_WIDGET (elem->data);
-
-		/* We need to compare against the UTF-8 text. */
-		list_item_text = g_object_get_data (G_OBJECT (listitem),
-						    E_CELL_COMBO_UTF8_KEY);
-
-		if (list_item_text && !strcmp (list_item_text, cell_text)) {
-			found = TRUE;
-			gtk_list_select_child (list, listitem);
-			gtk_widget_grab_focus (listitem);
-			break;
-		}
-
-		elem = elem->next;
-	}
-
-	if (!found) {
-		gtk_list_unselect_all (list);
-		if (list->children)
-			gtk_widget_grab_focus (GTK_WIDGET (list->children->data));
-	}
-
-	e_cell_text_free_text (ecell_text, cell_text);
-}
-
-
-static void
-e_cell_combo_show_popup			(ECellCombo	*ecc, int row, int view_col)
-{
-	gint x, y, width, height, old_width, old_height;
-
-	/* This code is practically copied from GtkCombo. */
-	old_width = ecc->popup_window->allocation.width;
-	old_height  = ecc->popup_window->allocation.height;
-
-	e_cell_combo_get_popup_pos (ecc, row, view_col, &x, &y, &height, &width);
-
-	/* workaround for gtk_scrolled_window_size_allocate bug */
-	if (old_width != width || old_height != height) {
-		gtk_widget_hide (GTK_SCROLLED_WINDOW (ecc->popup_scrolled_window)->hscrollbar);
-		gtk_widget_hide (GTK_SCROLLED_WINDOW (ecc->popup_scrolled_window)->vscrollbar);
-	}
-
-	gtk_widget_set_uposition (ecc->popup_window, x, y);
-	gtk_widget_set_usize (ecc->popup_window, width, height);
-	gtk_widget_realize (ecc->popup_window);
-	gdk_window_resize (ecc->popup_window->window, width, height);
-	gtk_widget_show (ecc->popup_window);
-
-	e_cell_popup_set_shown (E_CELL_POPUP (ecc), TRUE);
-	d(g_print("%s: popup_shown = TRUE\n", __FUNCTION__));
-}
-
-
-/* Calculates the size and position of the popup window (like GtkCombo). */
-static void
-e_cell_combo_get_popup_pos		(ECellCombo	*ecc,
-					 int             row,
-					 int             view_col,
-					 gint		*x,
-					 gint		*y,
-					 gint		*height,
-					 gint		*width)
-{
-	ECellPopup *ecp = E_CELL_POPUP (ecc);
-	ETableItem *eti = E_TABLE_ITEM (ecp->popup_cell_view->cell_view.e_table_item_view);
-	GtkWidget *canvas = GTK_WIDGET (GNOME_CANVAS_ITEM (eti)->canvas);
-	GtkBin *popwin;
-	GtkScrolledWindow *popup;
-	GtkRequisition list_requisition;
-	gboolean show_vscroll = FALSE, show_hscroll = FALSE;
-	gint avail_height, avail_width, min_height, work_height, screen_width;
-	gint column_width, row_height, scrollbar_width;
-	double x1, y1;
-	double wx, wy;
-  
-	/* This code is practically copied from GtkCombo. */
-	popup  = GTK_SCROLLED_WINDOW (ecc->popup_scrolled_window);
-	popwin = GTK_BIN (ecc->popup_window);
-  
-	gdk_window_get_origin (canvas->window, x, y);
-
-	x1 = e_table_header_col_diff (eti->header, 0, view_col + 1);
-	y1 = e_table_item_row_diff (eti, 0, row + 1);
-	column_width = e_table_header_col_diff (eti->header, view_col,
-						view_col + 1);
-	row_height = e_table_item_row_diff (eti, row,
-					    row + 1);
-	gnome_canvas_item_i2w (GNOME_CANVAS_ITEM (eti), &x1, &y1);
-
-	gnome_canvas_world_to_window (GNOME_CANVAS (canvas),
-				      x1,
-				      y1,
-				      &wx,
-				      &wy);
-
-	x1 = wx;
-	y1 = wy;
-
-	*x += x1;
-	/* The ETable positions don't include the grid lines, I think, so we add 1. */
-	*y += y1 + 1
-		- (int)((GnomeCanvas *)canvas)->layout.vadjustment->value
-		+ ((GnomeCanvas *)canvas)->zoom_yofs;
-
-	scrollbar_width = popup->vscrollbar->requisition.width
-		+ GTK_SCROLLED_WINDOW_CLASS (GTK_OBJECT_GET_CLASS (popup))->scrollbar_spacing;
-
-	avail_height = gdk_screen_height () - *y;
-
-	/* We'll use the entire screen width if needed, but we save space for
-	   the vertical scrollbar in case we need to show that. */
-	screen_width = gdk_screen_width ();
-	avail_width = screen_width - scrollbar_width;
-  
-	gtk_widget_size_request (ecc->popup_list, &list_requisition);
-	min_height = MIN (list_requisition.height, 
-			  popup->vscrollbar->requisition.height);
-	if (!GTK_LIST (ecc->popup_list)->children)
-		list_requisition.height += E_CELL_COMBO_LIST_EMPTY_HEIGHT;
-  
-	/* Calculate the desired width. */
-	*width = list_requisition.width
-		+ 2 * popwin->child->style->xthickness
-		+ 2 * GTK_CONTAINER (popwin->child)->border_width
-		+ 2 * GTK_CONTAINER (popup)->border_width
-		+ 2 * GTK_CONTAINER (GTK_BIN (popup)->child)->border_width
-		+ 2 * GTK_BIN (popup)->child->style->xthickness;
-
-	/* Use at least the same width as the column. */
-	if (*width < column_width)
-		*width = column_width;
-
-	/* If it is larger than the available width, use that instead and show
-	   the horizontal scrollbar. */
-	if (*width > avail_width) {
-		*width = avail_width;
-		show_hscroll = TRUE;
-	}
-
-	/* Calculate all the borders etc. that we need to add to the height. */
-	work_height = (2 * popwin->child->style->ythickness
-		       + 2 * GTK_CONTAINER (popwin->child)->border_width
-		       + 2 * GTK_CONTAINER (popup)->border_width
-		       + 2 * GTK_CONTAINER (GTK_BIN (popup)->child)->border_width
-		       + 2 * GTK_BIN (popup)->child->style->xthickness);
-
-	/* Add on the height of the horizontal scrollbar if we need it. */
-	if (show_hscroll)
-		work_height += popup->hscrollbar->requisition.height +
-			GTK_SCROLLED_WINDOW_CLASS (GTK_OBJECT_GET_CLASS (popup))->scrollbar_spacing;
-
-	/* Check if it fits in the available height. */
-	if (work_height + list_requisition.height > avail_height) {
-		/* It doesn't fit, so we see if we have the minimum space
-		   needed. */
-		if (work_height + min_height > avail_height
-		    && *y - row_height > avail_height) {
-			/* We don't, so we show the popup above the cell
-			   instead of below it. */
-			avail_height = *y - row_height;
-			*y -= (work_height + list_requisition.height
-			       + row_height);
-			if (*y < 0)
-				*y = 0;
-		}
-	}
-
-	/* Check if we still need the vertical scrollbar. */
-	if (work_height + list_requisition.height > avail_height) {
-		*width += scrollbar_width;
-		show_vscroll = TRUE;
-	}
-
-	/* We try to line it up with the right edge of the column, but we don't
-	   want it to go off the edges of the screen. */
-	if (*x > screen_width)
-		*x = screen_width;
-	*x -= *width;
-	if (*x < 0)
-		*x = 0;
-
-	if (show_vscroll)
-		*height = avail_height;
-	else
-		*height = work_height + list_requisition.height;
-}
-
-static void
-e_cell_combo_selection_changed(GtkWidget *popup_list, ECellCombo *ecc)
-{
-	if (!GTK_LIST(popup_list)->selection || !GTK_WIDGET_REALIZED(ecc->popup_window))
-		return;
-
-	e_cell_combo_restart_edit (ecc);
-}
-
-static gint
-e_cell_combo_list_button_press(GtkWidget *popup_list, GdkEvent *event, ECellCombo *ecc)
-{
-	g_return_val_if_fail (GTK_IS_LIST(popup_list), FALSE);
-
-	e_cell_combo_update_cell (ecc);
-	gtk_grab_remove (ecc->popup_window);
-	gdk_pointer_ungrab (event->button.time);
-	gdk_keyboard_ungrab (event->button.time);
-	gtk_widget_hide (ecc->popup_window);
-
-	e_cell_popup_set_shown (E_CELL_POPUP (ecc), FALSE);
-	d(g_print("%s: popup_shown = FALSE\n", __FUNCTION__));
-
-	e_cell_combo_restart_edit (ecc);
-
-	return TRUE;
-
-}
-
-/* This handles button press events in the popup window.
-   Note that since we have a pointer grab on this window, we also get button
-   press events for windows outside the application here, so we hide the popup
-   window if that happens. We also get propagated events from child widgets
-   which we ignore. */
-static gint
-e_cell_combo_button_press		(GtkWidget	*popup_window,
-					 GdkEvent	*event,
-					 ECellCombo	*ecc)
-{
-	GtkWidget *event_widget;
-
-	event_widget = gtk_get_event_widget (event);
-
-	/* If the button press was for a widget inside the popup list, but
-	   not the popup window itself, then we ignore the event and return
-	   FALSE. Otherwise we will hide the popup.
-	   Note that since we have a pointer grab on the popup list, button
-	   presses outside the application will be reported to this window,
-	   which is why we hide the popup in this case. */
-	while (event_widget) {
-		event_widget = event_widget->parent;
-		if (event_widget == ecc->popup_list)
-			return FALSE;
-	}
-
-	gtk_grab_remove (ecc->popup_window);
-	gdk_pointer_ungrab (event->button.time);
-	gdk_keyboard_ungrab (event->button.time);
-	gtk_widget_hide (ecc->popup_window);
-
-	e_cell_popup_set_shown (E_CELL_POPUP (ecc), FALSE);
-	d(g_print("%s: popup_shown = FALSE\n", __FUNCTION__));
-
-	/* We don't want to update the cell here. Since the list is in browse
-	   mode there will always be one item selected, so when we popup the
-	   list one item is selected even if it doesn't match the current text
-	   in the cell. So if you click outside the popup (which is what has
-	   happened here) it is better to not update the cell. */
-	/*e_cell_combo_update_cell (ecc);*/
-	e_cell_combo_restart_edit (ecc);
-
-	return TRUE;
-}
-
-
-/* This handles button release events in the popup window. If the button is
-   released inside the list, we want to hide the popup window and update the
-   cell with the new selection. */
-static gint
-e_cell_combo_button_release		(GtkWidget	*popup_window,
-					 GdkEventButton	*event,
-					 ECellCombo	*ecc)
-{
-	GtkWidget *event_widget;
-
-	event_widget = gtk_get_event_widget ((GdkEvent*) event);
-  
-	/* See if the button was released in the list (or its children). */
-	while (event_widget && event_widget != ecc->popup_list)
-		event_widget = event_widget->parent;
-
-	/* If it wasn't, then we just ignore the event. */
-	if (event_widget != ecc->popup_list)
-		return FALSE;
-
-	/* The button was released inside the list, so we hide the popup and
-	   update the cell to reflect the new selection. */
-	gtk_grab_remove (ecc->popup_window);
-	gdk_pointer_ungrab (event->time);
-	gdk_keyboard_ungrab (event->time);
-	gtk_widget_hide (ecc->popup_window);
-
-	e_cell_popup_set_shown (E_CELL_POPUP (ecc), FALSE);
-	d(g_print("%s: popup_shown = FALSE\n", __FUNCTION__));
-
-	e_cell_combo_update_cell (ecc);
-	e_cell_combo_restart_edit (ecc);
-
-	return TRUE;
-}
-
-
-/* This handles key press events in the popup window. If the Escape key is
-   pressed we hide the popup, and do not change the cell contents. */
-static int
-e_cell_combo_key_press			(GtkWidget	*popup_window,
-					 GdkEventKey	*event,
-					 ECellCombo	*ecc)
-{
-	/* If the Escape key is pressed we hide the popup. */
-	if (event->keyval != GDK_Escape
-	    && event->keyval != GDK_Return
-	    && event->keyval != GDK_KP_Enter
-	    && event->keyval != GDK_ISO_Enter
-	    && event->keyval != GDK_3270_Enter)
-		return FALSE;
-
-	gtk_grab_remove (ecc->popup_window);
-	gdk_pointer_ungrab (event->time);
-	gdk_keyboard_ungrab (event->time);
-	gtk_widget_hide (ecc->popup_window);
-
-	e_cell_popup_set_shown (E_CELL_POPUP (ecc), FALSE);
-	d(g_print("%s: popup_shown = FALSE\n", __FUNCTION__));
-
-	if (event->keyval != GDK_Escape)
-		e_cell_combo_update_cell (ecc);
-
-	e_cell_combo_restart_edit (ecc);
-
-	return TRUE;
-}
-
-
-static void
-e_cell_combo_update_cell		(ECellCombo	*ecc)
-{
-	ECellPopup *ecp = E_CELL_POPUP (ecc);
-	ECellView *ecv = (ECellView*) ecp->popup_cell_view;
-	ECellText *ecell_text = E_CELL_TEXT (ecp->child);
-	ETableItem *eti = E_TABLE_ITEM (ecv->e_table_item_view);
-	ETableCol *ecol;
-	GtkList *list = GTK_LIST (ecc->popup_list);
-	GtkListItem *listitem;
-	gchar *text, *old_text;
-
-	/* Return if no item is selected. */
-	if (list->selection == NULL)
-		return;
-
-	/* Get the text of the selected item. */
-	listitem = list->selection->data;
-	text = g_object_get_data (G_OBJECT (listitem),
-				  E_CELL_COMBO_UTF8_KEY);
-	g_return_if_fail (text != NULL);
-
-	/* Compare it with the existing cell contents. */
-	ecol = e_table_header_get_column (eti->header, ecp->popup_view_col);
-
-	old_text = e_cell_text_get_text (ecell_text, ecv->e_table_model,
-					 ecol->col_idx, ecp->popup_row);
-
-	/* If they are different, update the cell contents. */
-	if (old_text && strcmp (old_text, text)) {
-		e_cell_text_set_value (ecell_text, ecv->e_table_model,
-				       ecol->col_idx, ecp->popup_row, text);
-	}
-
-	e_cell_text_free_text (ecell_text, old_text);
-}
-
-
-static void
-e_cell_combo_restart_edit		(ECellCombo	*ecc)
-{
-	/* This doesn't work. ETable stops the edit straight-away again. */
-#if 0
-	ECellView *ecv = (ECellView*) ecc->popup_cell_view;
-	ETableItem *eti = E_TABLE_ITEM (ecv->e_table_item_view);
-
-	e_table_item_enter_edit (eti, ecc->popup_view_col, ecc->popup_row);
-#endif
-}
-
-
-
diff --git a/widgets/table/e-cell-combo.h b/widgets/table/e-cell-combo.h
deleted file mode 100644
index 23d5ac26a4..0000000000
--- a/widgets/table/e-cell-combo.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell-combo.h: Combo cell renderer
- * Copyright 2001, Ximian, Inc.
- *
- * Author :
- *  Damon Chaplin <damon@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-/*
- * ECellCombo - a subclass of ECellPopup used to support popup lists like a
- * GtkCombo widget. It only supports a basic popup list of strings at present,
- * with no auto-completion. The child ECell of the ECellPopup must be an
- * ECellText or subclass.
- */
-
-#ifndef _E_CELL_COMBO_H_
-#define _E_CELL_COMBO_H_
-
-#include <gal/e-table/e-cell-popup.h>
-
-#define E_CELL_COMBO_TYPE        (e_cell_combo_get_type ())
-#define E_CELL_COMBO(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_CELL_COMBO_TYPE, ECellCombo))
-#define E_CELL_COMBO_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_CELL_COMBO_TYPE, ECellComboClass))
-#define E_IS_CELL_COMBO(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_COMBO_TYPE))
-#define E_IS_CELL_COMBO_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_COMBO_TYPE))
-
-
-typedef struct {
-	ECellPopup parent;
-
-	GtkWidget *popup_window;
-	GtkWidget *popup_scrolled_window;
-	GtkWidget *popup_list;
-} ECellCombo;
-
-typedef struct {
-	ECellPopupClass parent_class;
-} ECellComboClass;
-
-
-GType      e_cell_combo_get_type		(void);
-ECell     *e_cell_combo_new			(void);
-
-/* These must be UTF-8. */
-void       e_cell_combo_set_popdown_strings	(ECellCombo	*ecc, 
-						 GList		*strings);
-
-#endif /* _E_CELL_COMBO_H_ */
diff --git a/widgets/table/e-cell-date.c b/widgets/table/e-cell-date.c
deleted file mode 100644
index 64d9b8132b..0000000000
--- a/widgets/table/e-cell-date.c
+++ /dev/null
@@ -1,166 +0,0 @@
-/* 
- * e-cell-date.c - Date item for e-table.
- * Copyright 2001, Ximian, Inc.
- *
- * Author:
- *  Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include "e-cell-date.h"
-
-#include <sys/time.h>
-#include <time.h>
-#include <unistd.h>
-#include <string.h>
-#include <gal/util/e-util.h>
-#include <gal/widgets/e-unicode.h>
-#include <gal/util/e-i18n.h>
-
-#define PARENT_TYPE e_cell_text_get_type ()
-
-static ECellTextClass *parent_class;
-
-static char *
-ecd_get_text(ECellText *cell, ETableModel *model, int col, int row)
-{
-	time_t date = GPOINTER_TO_INT (e_table_model_value_at(model, col, row));
-	time_t nowdate = time(NULL);
-	time_t yesdate;
-	struct tm then, now, yesterday;
-	char buf[100];
-	char *temp;
-	gboolean done = FALSE;
-
-	if (date == 0) {
-		return g_strdup (_("?"));
-	}
-
-	localtime_r (&date, &then);
-	localtime_r (&nowdate, &now);
-
-	if (nowdate - date < 60 * 60 * 8 && nowdate > date) {
-		e_utf8_strftime_fix_am_pm (buf, 100, _("%l:%M %p"), &then);
-		done = TRUE;
-	}
-
-	if (!done) {
-		if (then.tm_mday == now.tm_mday &&
-		    then.tm_mon == now.tm_mon &&
-		    then.tm_year == now.tm_year) {
-			e_utf8_strftime_fix_am_pm (buf, 100, _("Today %l:%M %p"), &then);
-			done = TRUE;
-		}
-	}
-	if (!done) {
-		yesdate = nowdate - 60 * 60 * 24;
-		localtime_r (&yesdate, &yesterday);
-		if (then.tm_mday == yesterday.tm_mday &&
-		    then.tm_mon == yesterday.tm_mon &&
-		    then.tm_year == yesterday.tm_year) {
-			e_utf8_strftime_fix_am_pm (buf, 100, _("Yesterday %l:%M %p"), &then);
-			done = TRUE;
-		}
-	}
-	if (!done) {
-		int i;
-		for (i = 2; i < 7; i++) {
-			yesdate = nowdate - 60 * 60 * 24 * i;
-			localtime_r (&yesdate, &yesterday);
-			if (then.tm_mday == yesterday.tm_mday &&
-			    then.tm_mon == yesterday.tm_mon &&
-			    then.tm_year == yesterday.tm_year) {
-				e_utf8_strftime_fix_am_pm (buf, 100, _("%a %l:%M %p"), &then);
-				done = TRUE;
-				break;
-			}
-		}
-	}
-	if (!done) {
-		if (then.tm_year == now.tm_year) {
-			e_utf8_strftime_fix_am_pm (buf, 100, _("%b %d %l:%M %p"), &then);
-		} else {
-			e_utf8_strftime_fix_am_pm (buf, 100, _("%b %d %Y"), &then);
-		}
-	}
-	temp = buf;
-	while ((temp = strstr (temp, "  "))) {
-		memmove (temp, temp + 1, strlen (temp));
-	}
-	temp = e_strdup_strip (buf);
-	return temp;
-}
-
-static void
-ecd_free_text(ECellText *cell, char *text)
-{
-	g_free(text);
-}
-
-static void
-e_cell_date_class_init (GtkObjectClass *object_class)
-{
-	ECellTextClass *ectc = (ECellTextClass *) object_class;
-
-	parent_class = g_type_class_ref (PARENT_TYPE);
-
-	ectc->get_text  = ecd_get_text;
-	ectc->free_text = ecd_free_text;
-}
-
-static void
-e_cell_date_init (GtkObject *object)
-{
-}
-
-/**
- * e_cell_date_new:
- * @fontname: font to be used to render on the screen
- * @justify: Justification of the string in the cell.
- *
- * Creates a new ECell renderer that can be used to render dates that
- * that come from the model.  The value returned from the model is
- * interpreted as being a time_t.
- *
- * The ECellDate object support a large set of properties that can be
- * configured through the Gtk argument system and allows the user to have
- * a finer control of the way the string is displayed.  The arguments supported
- * allow the control of strikeout, bold, color and a date filter.
- *
- * The arguments "strikeout_column", "underline_column", "bold_column"
- * and "color_column" set and return an integer that points to a
- * column in the model that controls these settings.  So controlling
- * the way things are rendered is achieved by having special columns
- * in the model that will be used to flag whether the date should be
- * rendered with strikeout, underline, or bolded.  In the case of the
- * "color_column" argument, the column in the model is expected to
- * have a string that can be parsed by gdk_color_parse().
- * 
- * Returns: an ECell object that can be used to render dates.
- */
-ECell *
-e_cell_date_new (const char *fontname, GtkJustification justify)
-{
-	ECellDate *ecd = g_object_new (E_CELL_DATE_TYPE, NULL);
-
-	e_cell_text_construct(E_CELL_TEXT(ecd), fontname, justify);
-      
-	return (ECell *) ecd;
-}
-
-E_MAKE_TYPE(e_cell_date, "ECellDate", ECellDate, e_cell_date_class_init, e_cell_date_init, PARENT_TYPE)
diff --git a/widgets/table/e-cell-date.h b/widgets/table/e-cell-date.h
deleted file mode 100644
index 96d5faa5c3..0000000000
--- a/widgets/table/e-cell-date.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* 
- * e-cell-date.h - Date item for e-table.
- * Copyright 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_CELL_DATE_H_
-#define _E_CELL_DATE_H_
-
-#include <gal/e-table/e-cell-text.h>
-
-G_BEGIN_DECLS
-
-#define E_CELL_DATE_TYPE        (e_cell_date_get_type ())
-#define E_CELL_DATE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_CELL_DATE_TYPE, ECellDate))
-#define E_CELL_DATE_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_CELL_DATE_TYPE, ECellDateClass))
-#define E_IS_CELL_DATE(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_DATE_TYPE))
-#define E_IS_CELL_DATE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_DATE_TYPE))
-
-typedef struct {
-	ECellText base;
-} ECellDate;
-
-typedef struct {
-	ECellTextClass parent_class;
-} ECellDateClass;
-
-GType      e_cell_date_get_type (void);
-ECell     *e_cell_date_new      (const char *fontname, GtkJustification justify);
-
-G_END_DECLS
-
-#endif /* _E_CELL_DATE_H_ */
diff --git a/widgets/table/e-cell-float.c b/widgets/table/e-cell-float.c
deleted file mode 100644
index 133be063b3..0000000000
--- a/widgets/table/e-cell-float.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * e-cell-float.c - Float item for e-table.
- * Copyright 2001, CodeFactory AB
- * Copyright 2001, Mikael Hallendal <micke@codefactory.se>
- *
- * Derived from e-cell-number by Chris Lahey <clahey@ximian.com>
- * ECellFloat - Float item for e-table.
- *
- * Author:
- *  Mikael Hallendal <micke@codefactory.se>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <gal/util/e-util.h>
-#include <gal/util/e-i18n.h>
-#include "e-cell-float.h"
-
-#define PARENT_TYPE e_cell_text_get_type ()
-
-static ECellTextClass *parent_class;
-
-static char *
-ecf_get_text(ECellText *cell, ETableModel *model, int col, int row)
-{
-	gfloat   *fvalue;
-	
-	fvalue = e_table_model_value_at (model, col, row);
-	
-	return e_format_number_float (*fvalue);
-}
-
-static void
-ecf_free_text(ECellText *cell, char *text)
-{
-	g_free(text);
-}
-
-static void
-e_cell_float_class_init (GtkObjectClass *object_class)
-{
-	ECellTextClass *ectc = (ECellTextClass *) object_class;
-
-	parent_class = g_type_class_ref (PARENT_TYPE);
-
-	ectc->get_text  = ecf_get_text;
-	ectc->free_text = ecf_free_text;
-}
-
-static void
-e_cell_float_init (GtkObject *object)
-{
-}
-
-/**
- * e_cell_float_new:
- * @fontname: font to be used to render on the screen
- * @justify: Justification of the string in the cell.
- *
- * Creates a new ECell renderer that can be used to render floats that
- * that come from the model.  The value returned from the model is
- * interpreted as being an int.
- *
- * See ECellText for other features.
- * 
- * Returns: an ECell object that can be used to render floats.
- */
-ECell *
-e_cell_float_new (const char *fontname, GtkJustification justify)
-{
-	ECellFloat *ecn = g_object_new (E_CELL_FLOAT_TYPE, NULL);
-
-	e_cell_text_construct(E_CELL_TEXT(ecn), fontname, justify);
-      
-	return (ECell *) ecn;
-}
-
-E_MAKE_TYPE(e_cell_float, "ECellFloat", ECellFloat, e_cell_float_class_init, e_cell_float_init, PARENT_TYPE)
diff --git a/widgets/table/e-cell-float.h b/widgets/table/e-cell-float.h
deleted file mode 100644
index 36874406b2..0000000000
--- a/widgets/table/e-cell-float.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * e-cell-float.h - Float item for e-table.
- * Copyright 2001, CodeFactory AB
- * Copyright 2001, Mikael Hallendal <micke@codefactory.se>
- *
- * Derived from e-cell-number by Chris Lahey <clahey@ximian.com>
- * ECellFloat - Float item for e-table.
- *
- * Author:
- *  Mikael Hallendal <micke@codefactory.se>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_CELL_FLOAT_H_
-#define _E_CELL_FLOAT_H_
-
-#include <gal/e-table/e-cell-text.h>
-
-G_BEGIN_DECLS
-
-#define E_CELL_FLOAT_TYPE        (e_cell_float_get_type ())
-#define E_CELL_FLOAT(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_CELL_FLOAT_TYPE, ECellFloat))
-#define E_CELL_FLOAT_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_CELL_FLOAT_TYPE, ECellFloatClass))
-#define E_IS_CELL_FLOAT(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_FLOAT_TYPE))
-#define E_IS_CELL_FLOAT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_FLOAT_TYPE))
-
-typedef struct {
-	ECellText base;
-} ECellFloat;
-
-typedef struct {
-	ECellTextClass parent_class;
-} ECellFloatClass;
-
-GType      e_cell_float_get_type (void);
-ECell     *e_cell_float_new      (const char *fontname, GtkJustification justify);
-
-G_END_DECLS
-
-#endif /* _E_CELL_FLOAT_H_ */
diff --git a/widgets/table/e-cell-number.c b/widgets/table/e-cell-number.c
deleted file mode 100644
index 8c8887df5a..0000000000
--- a/widgets/table/e-cell-number.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/* 
- * e-cell-number.c - Number item for e-table.
- * Copyright 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <gal/util/e-util.h>
-#include <gal/util/e-i18n.h>
-#include "e-cell-number.h"
-
-#define PARENT_TYPE e_cell_text_get_type ()
-
-static ECellTextClass *parent_class;
-
-static char *
-ecn_get_text(ECellText *cell, ETableModel *model, int col, int row)
-{
-	return e_format_number(GPOINTER_TO_INT (e_table_model_value_at(model, col, row)));
-}
-
-static void
-ecn_free_text(ECellText *cell, char *text)
-{
-	g_free(text);
-}
-
-static void
-e_cell_number_class_init (GtkObjectClass *object_class)
-{
-	ECellTextClass *ectc = (ECellTextClass *) object_class;
-
-	parent_class = g_type_class_ref (PARENT_TYPE);
-
-	ectc->get_text  = ecn_get_text;
-	ectc->free_text = ecn_free_text;
-}
-
-static void
-e_cell_number_init (GtkObject *object)
-{
-}
-
-/**
- * e_cell_number_new:
- * @fontname: font to be used to render on the screen
- * @justify: Justification of the string in the cell.
- *
- * Creates a new ECell renderer that can be used to render numbers that
- * that come from the model.  The value returned from the model is
- * interpreted as being an int.
- *
- * See ECellText for other features.
- * 
- * Returns: an ECell object that can be used to render numbers.
- */
-ECell *
-e_cell_number_new (const char *fontname, GtkJustification justify)
-{
-	ECellNumber *ecn = g_object_new (E_CELL_NUMBER_TYPE, NULL);
-
-	e_cell_text_construct(E_CELL_TEXT(ecn), fontname, justify);
-      
-	return (ECell *) ecn;
-}
-
-E_MAKE_TYPE(e_cell_number, "ECellNumber", ECellNumber, e_cell_number_class_init, e_cell_number_init, PARENT_TYPE)
diff --git a/widgets/table/e-cell-number.h b/widgets/table/e-cell-number.h
deleted file mode 100644
index 3cce1ec412..0000000000
--- a/widgets/table/e-cell-number.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* 
- * e-cell-number.h - Number item for e-table.
- * Copyright 2001, Ximian, Inc.
- *
- * Authors:
- *  Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_CELL_NUMBER_H_
-#define _E_CELL_NUMBER_H_
-
-#include <gal/e-table/e-cell-text.h>
-
-G_BEGIN_DECLS
-
-#define E_CELL_NUMBER_TYPE        (e_cell_number_get_type ())
-#define E_CELL_NUMBER(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_CELL_NUMBER_TYPE, ECellNumber))
-#define E_CELL_NUMBER_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_CELL_NUMBER_TYPE, ECellNumberClass))
-#define E_IS_CELL_NUMBER(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_NUMBER_TYPE))
-#define E_IS_CELL_NUMBER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_NUMBER_TYPE))
-
-typedef struct {
-	ECellText base;
-} ECellNumber;
-
-typedef struct {
-	ECellTextClass parent_class;
-} ECellNumberClass;
-
-GType      e_cell_number_get_type (void);
-ECell     *e_cell_number_new      (const char *fontname, GtkJustification justify);
-
-G_END_DECLS
-
-#endif /* _E_CELL_NUMBER_H_ */
diff --git a/widgets/table/e-cell-pixbuf.c b/widgets/table/e-cell-pixbuf.c
deleted file mode 100644
index 50c3b2cc7a..0000000000
--- a/widgets/table/e-cell-pixbuf.c
+++ /dev/null
@@ -1,417 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-cell-pixbuf.c - An ECell that displays a GdkPixbuf
- * Copyright 2001, Ximian, Inc.
- *
- * Authors:
- *  Vladimir Vukicevic <vladimir@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <stdio.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include "e-cell-pixbuf.h"
-#include <gal/util/e-i18n.h>
-
-#define PARENT_TYPE E_CELL_TYPE
-static ECellClass *parent_class;
-
-typedef struct _ECellPixbufView ECellPixbufView;
-
-struct _ECellPixbufView {
-	ECellView cell_view;
-	GnomeCanvas *canvas;
-};
-
-/* Object argument IDs */
-enum {
-	PROP_0,
-
-	PROP_SELECTED_COLUMN,
-	PROP_FOCUSED_COLUMN,
-	PROP_UNSELECTED_COLUMN
-};
-
-static int
-gnome_print_pixbuf (GnomePrintContext *pc, GdkPixbuf *pixbuf)
-{
-       if (gdk_pixbuf_get_has_alpha (pixbuf))
-               return gnome_print_rgbaimage  (pc,
-					      gdk_pixbuf_get_pixels    (pixbuf),
-					      gdk_pixbuf_get_width     (pixbuf),
-					      gdk_pixbuf_get_height    (pixbuf),
-					      gdk_pixbuf_get_rowstride (pixbuf));
-       else
-               return gnome_print_rgbimage  (pc,
-					     gdk_pixbuf_get_pixels    (pixbuf),
-					     gdk_pixbuf_get_width     (pixbuf),
-					     gdk_pixbuf_get_height    (pixbuf),
-					     gdk_pixbuf_get_rowstride (pixbuf));
-}
-
-/*
- * ECellPixbuf functions
- */
-
-ECell *
-e_cell_pixbuf_new (void)
-{
-    ECellPixbuf *ecp;
-
-    ecp = g_object_new (E_CELL_PIXBUF_TYPE, NULL);
-    e_cell_pixbuf_construct (ecp);
-
-    return (ECell *) ecp;
-}
-
-void
-e_cell_pixbuf_construct (ECellPixbuf *ecp)
-{
-    /* noop */
-    return;
-}
-
-/*
- * ECell methods
- */
-
-static ECellView *
-pixbuf_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
-    ECellPixbufView *pixbuf_view = g_new0 (ECellPixbufView, 1);
-    ETableItem *eti = E_TABLE_ITEM (e_table_item_view);
-    GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas;
-
-    pixbuf_view->cell_view.ecell = ecell;
-    pixbuf_view->cell_view.e_table_model = table_model;
-    pixbuf_view->cell_view.e_table_item_view = e_table_item_view;
-    pixbuf_view->canvas = canvas;
-
-    return (ECellView *) pixbuf_view;
-}
-
-static void
-pixbuf_kill_view (ECellView *ecell_view)
-{
-    ECellPixbufView *pixbuf_view = (ECellPixbufView *) ecell_view;
-
-    g_free (pixbuf_view);
-}
-
-static void
-pixbuf_draw (ECellView *ecell_view, GdkDrawable *drawable,
-             int model_col, int view_col, int row, ECellFlags flags,
-             int x1, int y1, int x2, int y2)
-{
-    GdkPixbuf *cell_pixbuf;
-    int real_x, real_y, real_w, real_h;
-    int pix_w, pix_h;
-    ECellPixbuf *ecp;
-
-    cell_pixbuf = NULL;
-
-    ecp = E_CELL_PIXBUF (ecell_view->ecell);
-
-    if (flags & E_CELL_SELECTED) {
-	    if (GTK_WIDGET_HAS_FOCUS (GNOME_CANVAS_ITEM (ecell_view->e_table_item_view)->canvas)) {
-		    if (ecp->focused_column != -1)
-			    cell_pixbuf = (GdkPixbuf *) e_table_model_value_at (ecell_view->e_table_model,
-										ecp->focused_column, row);
-	    } else {
-		    if (ecp->selected_column != -1)
-			    cell_pixbuf = (GdkPixbuf *) e_table_model_value_at (ecell_view->e_table_model,
-										ecp->selected_column, row);
-	    }
-    } else {
-	    if (ecp->unselected_column != -1)
-		    cell_pixbuf = e_table_model_value_at (ecell_view->e_table_model,
-							  ecp->unselected_column, row);
-    }
-
-    if (cell_pixbuf == NULL)
-	    cell_pixbuf = e_table_model_value_at (ecell_view->e_table_model,
-						  model_col, row);
-    /* we can't make sure we really got a pixbuf since, well, it's a Gdk thing */
-
-    if (x2 - x1 == 0)
-        return;
-
-    if (!cell_pixbuf)
-	return;
-
-    pix_w = gdk_pixbuf_get_width (cell_pixbuf);
-    pix_h = gdk_pixbuf_get_height (cell_pixbuf);
-
-    /* We center the pixbuf within our allocated space */
-    if (x2 - x1 > pix_w) {
-        int diff = (x2 - x1) - pix_w;
-        real_x = x1 + diff/2;
-        real_w = pix_w;
-    } else {
-        real_x = x1;
-        real_w = x2 - x1;
-    }
-
-    if (y2 - y1 > pix_h) {
-        int diff = (y2 - y1) - pix_h;
-        real_y = y1 + diff/2;
-        real_h = pix_h;
-    } else {
-        real_y = y1;
-        real_h = y2 - y1;
-    }
-
-
-    gdk_pixbuf_render_to_drawable_alpha (cell_pixbuf,
-					 drawable,
-					 0, 0,
-					 real_x, real_y, 
-					 real_w, real_h,
-					 GDK_PIXBUF_ALPHA_FULL,
-					 127,
-					 GDK_RGB_DITHER_NORMAL,
-					 0, 0);
-}
-
-static gint
-pixbuf_event (ECellView *ecell_view, GdkEvent *event,
-              int model_col, int view_col, int row,
-              ECellFlags flags, ECellActions *actions)
-{
-    /* noop */
-
-    return FALSE;
-}
-
-static gint
-pixbuf_height (ECellView *ecell_view, int model_col, int view_col, int row)
-{
-    GdkPixbuf *pixbuf;
-    if (row == -1) {
-      if (e_table_model_row_count (ecell_view->e_table_model) > 0) {
-        row = 0;
-      } else {
-	return 6;
-      }
-    }
-
-    pixbuf = (GdkPixbuf *) e_table_model_value_at (ecell_view->e_table_model, model_col, row);
-    if (!pixbuf)
-        return 0;
-
-    /* We give ourselves 3 pixels of padding on either side */
-    return gdk_pixbuf_get_height (pixbuf) + 6;
-}
-
-/*
- * ECell::print method
- */
-static void
-pixbuf_print (ECellView *ecell_view, GnomePrintContext *context, 
-	      int model_col, int view_col, int row,
-	      double width, double height)
-{
-	GdkPixbuf *pixbuf;
-	int scale;
-
-	pixbuf = (GdkPixbuf *) e_table_model_value_at (ecell_view->e_table_model, model_col, row);
-	if (pixbuf == NULL)
-		return;
-	scale = gdk_pixbuf_get_height (pixbuf);
-	
-	gnome_print_gsave(context);
-
-	gnome_print_translate (context, 0, (height - scale) / 2);
-	gnome_print_scale (context, scale, scale);
-	gnome_print_pixbuf (context, pixbuf);
-	
-	gnome_print_grestore(context);
-}
-
-static gdouble
-pixbuf_print_height (ECellView *ecell_view, GnomePrintContext *context, 
-		     int model_col, int view_col, int row,
-		     double width)
-{
-	GdkPixbuf *pixbuf;
-
-	if (row == -1) {
-		if (e_table_model_row_count (ecell_view->e_table_model) > 0) {
-			row = 0;
-		} else {
-			return 6;
-		}
-	}
-	
-	pixbuf = (GdkPixbuf *) e_table_model_value_at (ecell_view->e_table_model, model_col, row);
-	if (!pixbuf)
-		return 0;
-	
-	/* We give ourselves 3 pixels of padding on either side */
-	return gdk_pixbuf_get_height (pixbuf);
-}
-
-static gint
-pixbuf_max_width (ECellView *ecell_view, int model_col, int view_col)
-{
-    int pw;
-    gint num_rows, i;
-    gint max_width = -1;
-
-    if (model_col == 0) {
-        num_rows = e_table_model_row_count (ecell_view->e_table_model);
-
-        for (i = 0; i <= num_rows; i++) {
-            GdkPixbuf *pixbuf = (GdkPixbuf *) e_table_model_value_at
-                (ecell_view->e_table_model,
-                 model_col,
-                 i);
-	    if (!pixbuf)
-		continue;
-            pw = gdk_pixbuf_get_width (pixbuf);
-            if (max_width < pw)
-                max_width = pw;
-        }
-    } else {
-        return -1;
-    }
-
-    return max_width;
-}
-
-static void
-pixbuf_dispose (GObject *object)
-{
-	if (G_OBJECT_CLASS (parent_class)->dispose)
-		(* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-static void
-pixbuf_set_property (GObject *object,
-		     guint prop_id,
-		     const GValue *value,
-		     GParamSpec *pspec)
-{
-	ECellPixbuf *pixbuf;
-
-	pixbuf = E_CELL_PIXBUF (object);
-
-	switch (prop_id) {
-	case PROP_SELECTED_COLUMN:
-		pixbuf->selected_column = g_value_get_int (value);
-		break;
-
-	case PROP_FOCUSED_COLUMN:
-		pixbuf->focused_column = g_value_get_int (value);
-		break;
-
-	case PROP_UNSELECTED_COLUMN:
-		pixbuf->unselected_column = g_value_get_int (value);
-		break;
-
-	default:
-		return;
-	}
-}
-
-/* Get_arg handler for the pixbuf item */
-static void
-pixbuf_get_property (GObject *object,
-		     guint prop_id,
-		     GValue *value,
-		     GParamSpec *pspec)
-{
-	ECellPixbuf *pixbuf;
-
-	pixbuf = E_CELL_PIXBUF (object);
-	
-	switch (prop_id) {
-	case PROP_SELECTED_COLUMN:
-		g_value_set_int (value, pixbuf->selected_column);
-		break;
-
-	case PROP_FOCUSED_COLUMN:
-		g_value_set_int (value, pixbuf->focused_column);
-		break;
-
-	case PROP_UNSELECTED_COLUMN:
-		g_value_set_int (value, pixbuf->unselected_column);
-		break;
-
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-e_cell_pixbuf_init (GtkObject *object)
-{
-	ECellPixbuf *ecp = E_CELL_PIXBUF (object);
-
-	ecp->selected_column = -1;
-	ecp->focused_column = -1;
-	ecp->unselected_column = -1;
-}
-
-static void
-e_cell_pixbuf_class_init (GObjectClass *object_class)
-{
-	ECellClass *ecc = (ECellClass *) object_class;
-
-	object_class->dispose = pixbuf_dispose;
-	object_class->set_property = pixbuf_set_property;
-	object_class->get_property = pixbuf_get_property;
-
-	ecc->new_view = pixbuf_new_view;
-	ecc->kill_view = pixbuf_kill_view;
-	ecc->draw = pixbuf_draw;
-	ecc->event = pixbuf_event;
-	ecc->height = pixbuf_height;
-	ecc->print = pixbuf_print;
-	ecc->print_height = pixbuf_print_height;
-	ecc->max_width = pixbuf_max_width;
-
-	parent_class = g_type_class_ref (PARENT_TYPE);
-
-	g_object_class_install_property (object_class, PROP_SELECTED_COLUMN,
-					 g_param_spec_int ("selected_column",
-							   _("Selected Column"),
-							   /*_( */"XXX blurb" /*)*/,
-							   0, G_MAXINT, 0,
-							   G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_FOCUSED_COLUMN,
-					 g_param_spec_int ("focused_column",
-							   _("Focused Column"),
-							   /*_( */"XXX blurb" /*)*/,
-							   0, G_MAXINT, 0,
-							   G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_UNSELECTED_COLUMN,
-					 g_param_spec_int ("unselected_column",
-							   _("Unselected Column"),
-							   /*_( */"XXX blurb" /*)*/,
-							   0, G_MAXINT, 0,
-							   G_PARAM_READWRITE));
-}
-
-E_MAKE_TYPE (e_cell_pixbuf,
-	     "ECellPixbuf",
-	     ECellPixbuf,
-	     e_cell_pixbuf_class_init,
-	     e_cell_pixbuf_init,
-	     PARENT_TYPE)
diff --git a/widgets/table/e-cell-pixbuf.h b/widgets/table/e-cell-pixbuf.h
deleted file mode 100644
index 2f12521d58..0000000000
--- a/widgets/table/e-cell-pixbuf.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * e-cell-pixbuf.h - An ECell that displays a GdkPixbuf
- * Copyright 2001, Ximian, Inc.
- *
- * Authors:
- *  Vladimir Vukicevic <vladimir@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_CELL_PIXBUF_H_
-#define _E_CELL_PIXBUF_H_
-
-#include <gal/e-table/e-table.h>
-
-#define E_CELL_PIXBUF_TYPE		(e_cell_pixbuf_get_type ())
-#define E_CELL_PIXBUF(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), E_CELL_PIXBUF_TYPE, ECellPixbuf))
-#define E_CELL_PIXBUF_CLASS(k)	(G_TYPE_CHECK_INSTANCE_CAST_CLASS ((k), E_CELL_PIXBUF_TYPE, ECellPixbufClass))
-#define E_IS_CELL_PIXBUF(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_PIXBUF_TYPE))
-#define E_IS_CELL_PIXBUF_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_PIXBUF_TYPE))
-
-typedef struct _ECellPixbuf ECellPixbuf;
-typedef struct _ECellPixbufClass ECellPixbufClass;
-
-struct _ECellPixbuf {
-    ECell parent;
-
-	int selected_column;
-	int focused_column;
-	int unselected_column;
-};
-
-struct _ECellPixbufClass {
-    ECellClass parent_class;
-};
-
-GType   e_cell_pixbuf_get_type (void);
-ECell *e_cell_pixbuf_new (void);
-void e_cell_pixbuf_construct (ECellPixbuf *ecp);
-
-#endif
diff --git a/widgets/table/e-cell-popup.c b/widgets/table/e-cell-popup.c
deleted file mode 100644
index 50943d6004..0000000000
--- a/widgets/table/e-cell-popup.c
+++ /dev/null
@@ -1,519 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell-popup.c: Popup cell renderer
- * Copyright 2001, Ximian, Inc.
- *
- * Authors:
- *   Damon Chaplin <damon@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.  */
-
-/*
- * ECellPopup - an abstract ECell class used to support popup selections like
- * a GtkCombo widget. It contains a child ECell, e.g. an ECellText, but when
- * selected it displays an arrow on the right edge which the user can click to
- * show a popup. Subclasses implement the popup class function to show the
- * popup.
- */
-
-#include <config.h>
-#include <gdk/gdkkeysyms.h>
-#include "gal/util/e-util.h"
-#include "e-table-item.h"
-#include "e-cell-popup.h"
-#include "gal/a11y/e-table/gal-a11y-e-cell-popup.h"
-#include "gal/a11y/e-table/gal-a11y-e-cell-registry.h"
-
-#define E_CELL_POPUP_ARROW_WIDTH	16
-#define E_CELL_POPUP_ARROW_XPAD		3
-#define E_CELL_POPUP_ARROW_YPAD		3
-
-
-static void	e_cell_popup_class_init	(GtkObjectClass	*object_class);
-static void	e_cell_popup_init	(ECellPopup	*ecp);
-static void	e_cell_popup_dispose	(GObject	*object);
-
-
-static ECellView* ecp_new_view		(ECell		*ecell,
-					 ETableModel	*table_model,
-					 void		*e_table_item_view);
-static void	ecp_kill_view		(ECellView	*ecv);
-static void	ecp_realize		(ECellView	*ecv);
-static void	ecp_unrealize		(ECellView	*ecv);
-static void	ecp_draw		(ECellView	*ecv,
-					 GdkDrawable	*drawable,
-					 int		 model_col,
-					 int		 view_col,
-					 int		 row,
-					 ECellFlags	 flags,
-					 int		 x1,
-					 int		 y1,
-					 int		 x2,
-					 int		 y2);
-static gint	ecp_event		(ECellView	*ecv,
-					 GdkEvent	*event,
-					 int		 model_col,
-					 int		 view_col,
-					 int		 row,
-					 ECellFlags	 flags,
-					 ECellActions	*actions);
-static int	ecp_height		(ECellView	*ecv,
-					 int		 model_col,
-					 int		 view_col,
-					 int		 row);
-static void*	ecp_enter_edit		(ECellView	*ecv,
-					 int		 model_col,
-					 int		 view_col,
-					 int		 row);
-static void	ecp_leave_edit		(ECellView	*ecv,
-					 int		 model_col,
-					 int		 view_col,
-					 int		 row,
-					 void		*edit_context);
-static void	ecp_print		(ECellView	*ecv,
-					 GnomePrintContext *context, 
-					 int		 model_col,
-					 int		 view_col,
-					 int		 row,
-					 double		 width,
-					 double		 height);
-static gdouble	ecp_print_height	(ECellView	*ecv,
-					 GnomePrintContext *context, 
-					 int		 model_col,
-					 int		 view_col,
-					 int		 row,
-					 double		 width);
-static int	ecp_max_width		(ECellView	*ecv,
-					 int		 model_col,
-					 int		 view_col);
-static void	ecp_show_tooltip	(ECellView	*ecv, 
-					 int		 model_col,
-					 int		 view_col,
-					 int		 row,
-					 int		 col_width,
-					 ETableTooltip	*tooltip);
-static char *ecp_get_bg_color (ECellView *ecell_view, int row);
-
-static gint e_cell_popup_do_popup	(ECellPopupView	*ecp_view,
-					 GdkEvent	*event,
-					 int             row,
-					 int             model_col);
-
-static ECellClass *parent_class;
-
-
-E_MAKE_TYPE (e_cell_popup, "ECellPopup", ECellPopup, e_cell_popup_class_init,
-	     e_cell_popup_init, e_cell_get_type())
-
-
-static void
-e_cell_popup_class_init		(GtkObjectClass	*object_class)
-{
-	ECellClass *ecc = (ECellClass *) object_class;
-
-	G_OBJECT_CLASS (object_class)->dispose = e_cell_popup_dispose;
-
-	ecc->new_view     = ecp_new_view;
-	ecc->kill_view    = ecp_kill_view;
-	ecc->realize      = ecp_realize;
-	ecc->unrealize    = ecp_unrealize;
-	ecc->draw         = ecp_draw;
-	ecc->event        = ecp_event;
-	ecc->height       = ecp_height;
-	ecc->enter_edit   = ecp_enter_edit;
-	ecc->leave_edit   = ecp_leave_edit;
-	ecc->print        = ecp_print;
-	ecc->print_height = ecp_print_height;
-	ecc->max_width	  = ecp_max_width;
-	ecc->show_tooltip = ecp_show_tooltip;
-	ecc->get_bg_color = ecp_get_bg_color;
-
-	parent_class = g_type_class_ref (E_CELL_TYPE);
-	gal_a11y_e_cell_registry_add_cell_type (NULL,
-                                                E_CELL_POPUP_TYPE,
-                                                gal_a11y_e_cell_popup_new);
-}
-
-
-static void
-e_cell_popup_init		(ECellPopup	*ecp)
-{
-	ecp->popup_shown = FALSE;
-	ecp->popup_model = NULL;
-}
-
-
-/**
- * e_cell_popup_new:
- *
- * Creates a new ECellPopup renderer.
- *
- * Returns: an ECellPopup object.
- */
-ECell *
-e_cell_popup_new		(void)
-{
-	ECellPopup *ecp = g_object_new (E_CELL_POPUP_TYPE, NULL);
-
-	return (ECell*) ecp;
-}
-
-
-/*
- * GtkObject::destroy method
- */
-static void
-e_cell_popup_dispose (GObject *object)
-{
-	ECellPopup *ecp = E_CELL_POPUP (object);
-
-	if (ecp->child)
-		g_object_unref (ecp->child);
-	ecp->child = NULL;
-
-	G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-
-
-/*
- * ECell::new_view method
- */
-static ECellView *
-ecp_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
-	ECellPopup *ecp = E_CELL_POPUP (ecell);
-	ECellPopupView *ecp_view;
-	
-	/* We must have a child ECell before we create any views. */
-	g_return_val_if_fail (ecp->child != NULL, NULL);
-
-	ecp_view = g_new0 (ECellPopupView, 1);
-
-	ecp_view->cell_view.ecell = ecell;
-	ecp_view->cell_view.e_table_model = table_model;
-	ecp_view->cell_view.e_table_item_view = e_table_item_view;
-
-	ecp_view->child_view = e_cell_new_view (ecp->child, table_model,
-						e_table_item_view);
-
-	return (ECellView*) ecp_view;
-}
-
-
-/*
- * ECell::kill_view method
- */
-static void
-ecp_kill_view (ECellView *ecv)
-{
-	ECellPopupView *ecp_view = (ECellPopupView *) ecv;
-
-	if (ecp_view->child_view)
-		e_cell_kill_view (ecp_view->child_view);
-	g_free (ecp_view);
-}
-
-
-/*
- * ECell::realize method
- */
-static void
-ecp_realize (ECellView *ecv)
-{
-	ECellPopupView *ecp_view = (ECellPopupView *) ecv;
-
-	e_cell_realize (ecp_view->child_view);
-
-	if (parent_class->realize)
-		(* parent_class->realize) (ecv);
-}
-
-
-/*
- * ECell::unrealize method
- */
-static void
-ecp_unrealize (ECellView *ecv)
-{
-	ECellPopupView *ecp_view = (ECellPopupView *) ecv;
-
-	e_cell_unrealize (ecp_view->child_view);
-
-	if (parent_class->unrealize)
-		(* parent_class->unrealize) (ecv);
-}
-
-
-/*
- * ECell::draw method
- */
-static void
-ecp_draw (ECellView *ecv, GdkDrawable *drawable,
-	  int model_col, int view_col, int row, ECellFlags flags,
-	  int x1, int y1, int x2, int y2)
-{
-	ECellPopup *ecp = E_CELL_POPUP (ecv->ecell);
-	ECellPopupView *ecp_view = (ECellPopupView *) ecv;
-	GtkWidget *canvas = GTK_WIDGET (GNOME_CANVAS_ITEM (ecv->e_table_item_view)->canvas);
-	GtkShadowType shadow;
-	GdkRectangle rect;
-	gboolean show_popup_arrow;
-
-	/* Display the popup arrow if we are the cursor cell, or the popup
-	   is shown for this cell. */
-	show_popup_arrow = e_table_model_is_cell_editable (ecv->e_table_model, model_col, row) &&
-		(flags & E_CELL_CURSOR ||
-		 (ecp->popup_shown && ecp->popup_view_col == view_col
-		  && ecp->popup_row == row
-		  && ecp->popup_model == ((ECellView *) ecp_view)->e_table_model));
-
-	if (flags & E_CELL_CURSOR)
-		ecp->popup_arrow_shown = show_popup_arrow;
-
-	if (show_popup_arrow) {
-		e_cell_draw (ecp_view->child_view, drawable, model_col,
-			     view_col, row, flags,
-			     x1, y1, x2 - E_CELL_POPUP_ARROW_WIDTH, y2);
-
-		rect.x = x2 - E_CELL_POPUP_ARROW_WIDTH;
-		rect.y = y1 + 1;
-		rect.width = E_CELL_POPUP_ARROW_WIDTH;
-		rect.height = y2 - y1 - 2;
-
-		if (ecp->popup_shown)
-			shadow = GTK_SHADOW_IN;
-		else
-			shadow = GTK_SHADOW_OUT;
-
-		gtk_paint_box (canvas->style, drawable,
-			       GTK_STATE_NORMAL, shadow,
-			       &rect, canvas, "ecellpopup",
-			       rect.x, rect.y, rect.width, rect.height);
-		gtk_paint_arrow (canvas->style, drawable,
-				 GTK_STATE_NORMAL, GTK_SHADOW_NONE,
-				 &rect, canvas, NULL,
-				 GTK_ARROW_DOWN, TRUE,
-				 rect.x + E_CELL_POPUP_ARROW_XPAD,
-				 rect.y + E_CELL_POPUP_ARROW_YPAD,
-				 rect.width - E_CELL_POPUP_ARROW_XPAD * 2,
-				 rect.height - E_CELL_POPUP_ARROW_YPAD * 2);
-	} else {
-		e_cell_draw (ecp_view->child_view, drawable, model_col,
-			     view_col, row, flags, x1, y1, x2, y2);
-	}
-}
-
-
-/*
- * ECell::event method
- */
-static gint
-ecp_event (ECellView *ecv, GdkEvent *event, int model_col, int view_col,
-	   int row, ECellFlags flags, ECellActions *actions)
-{
-	ECellPopupView *ecp_view = (ECellPopupView *) ecv;
-	ECellPopup *ecp = E_CELL_POPUP (ecp_view->cell_view.ecell);
-	ETableItem *eti = E_TABLE_ITEM (ecv->e_table_item_view);
-	int width;
-
-	switch (event->type) {
-	case GDK_BUTTON_PRESS:
-		if (e_table_model_is_cell_editable (ecv->e_table_model, model_col, row) &&
-		    flags & E_CELL_CURSOR
-		    && ecp->popup_arrow_shown) {
-			width = e_table_header_col_diff (eti->header, view_col,
-							 view_col + 1);
-
-			/* FIXME: The event coords seem to be relative to the
-			   text within the cell, so we have to add 4. */
-			if (event->button.x + 4 >= width - E_CELL_POPUP_ARROW_WIDTH) {
-				return e_cell_popup_do_popup (ecp_view, event, row, view_col);
-			}
-		}
-		break;
-	case GDK_KEY_PRESS:
-		if (e_table_model_is_cell_editable (ecv->e_table_model, model_col, row) &&
-		    event->key.state & GDK_MOD1_MASK
-		    && event->key.keyval == GDK_Down) {
-			return e_cell_popup_do_popup (ecp_view, event, row, view_col);
-		}
-		break;
-	default:
-		break;
-	}
-
-	return e_cell_event (ecp_view->child_view, event, model_col, view_col,
-			     row, flags, actions);
-}
-
-
-/*
- * ECell::height method
- */
-static int
-ecp_height (ECellView *ecv, int model_col, int view_col, int row) 
-{
-	ECellPopupView *ecp_view = (ECellPopupView *) ecv;
-
-	return e_cell_height (ecp_view->child_view, model_col, view_col, row);
-}
-
-
-/*
- * ECellView::enter_edit method
- */
-static void *
-ecp_enter_edit (ECellView *ecv, int model_col, int view_col, int row)
-{
-	ECellPopupView *ecp_view = (ECellPopupView *) ecv;
-
-	return e_cell_enter_edit (ecp_view->child_view, model_col, view_col, row);
-}
-
-
-/*
- * ECellView::leave_edit method
- */
-static void
-ecp_leave_edit (ECellView *ecv, int model_col, int view_col, int row,
-		void *edit_context)
-{
-	ECellPopupView *ecp_view = (ECellPopupView *) ecv;
-
-	e_cell_leave_edit (ecp_view->child_view, model_col, view_col, row,
-			   edit_context);
-}
-
-
-static void
-ecp_print (ECellView *ecv, GnomePrintContext *context, 
-	   int model_col, int view_col, int row, double width, double height)
-{
-	ECellPopupView *ecp_view = (ECellPopupView *) ecv;
-
-	e_cell_print (ecp_view->child_view, context, model_col, view_col, row,
-		      width, height);
-}
-
-
-static gdouble
-ecp_print_height (ECellView *ecv, GnomePrintContext *context, 
-		  int model_col, int view_col, int row,
-		  double width)
-{
-	ECellPopupView *ecp_view = (ECellPopupView *) ecv;
-
-	return e_cell_print_height (ecp_view->child_view, context, model_col,
-				    view_col, row, width);
-}
-
-
-static int
-ecp_max_width (ECellView *ecv,
-	       int model_col,
-	       int view_col)
-{
-	ECellPopupView *ecp_view = (ECellPopupView *) ecv;
-
-	return e_cell_max_width (ecp_view->child_view, model_col, view_col);
-}
-
-
-static void
-ecp_show_tooltip (ECellView *ecv, 
-		  int model_col,
-		  int view_col,
-		  int row,
-		  int col_width,
-		  ETableTooltip *tooltip)
-{
-	ECellPopupView *ecp_view = (ECellPopupView *) ecv;
-
-	e_cell_show_tooltip (ecp_view->child_view, model_col, view_col, row,
-			     col_width, tooltip);
-}
-
-static char *
-ecp_get_bg_color (ECellView *ecell_view, int row)
-{		
-	ECellPopupView *ecp_view = (ECellPopupView *) ecell_view;
-
-	return e_cell_get_bg_color (ecp_view->child_view, row);
-}
-
-
-
-ECell*
-e_cell_popup_get_child			(ECellPopup	*ecp)
-{
-	g_return_val_if_fail (E_IS_CELL_POPUP (ecp), NULL);
-
-	return ecp->child;
-}
-
-
-void
-e_cell_popup_set_child			(ECellPopup	*ecp,
-					 ECell		*child)
-{
-	g_return_if_fail (E_IS_CELL_POPUP (ecp));
-
-	if (ecp->child)
-		g_object_unref (ecp->child);
-
-	ecp->child = child;
-	g_object_ref (child);
-}
-
-
-static gint
-e_cell_popup_do_popup			(ECellPopupView	*ecp_view,
-					 GdkEvent	*event,
-					 int             row,
-					 int             view_col)
-{
-	ECellPopup *ecp = E_CELL_POPUP (ecp_view->cell_view.ecell);
-	gint (*popup_func) (ECellPopup *ecp, GdkEvent *event, int row, int view_col);
-
-	ecp->popup_cell_view = ecp_view;
-
-	popup_func = E_CELL_POPUP_CLASS (GTK_OBJECT_GET_CLASS (ecp))->popup;
-
-	ecp->popup_view_col = view_col;
-	ecp->popup_row = row;
-	ecp->popup_model = ((ECellView *) ecp_view)->e_table_model;
-
-	return popup_func ? popup_func (ecp, event, row, view_col) : FALSE;
-}
-
-/* This redraws the popup cell. Only use this if you know popup_view_col and
-   popup_row are valid. */
-void
-e_cell_popup_queue_cell_redraw (ECellPopup *ecp)
-{
-       ETableItem *eti = E_TABLE_ITEM (ecp->popup_cell_view->cell_view.e_table_item_view);
-
-       e_table_item_redraw_range (eti, ecp->popup_view_col, ecp->popup_row,
-                                  ecp->popup_view_col, ecp->popup_row);
-}
-
-void
-e_cell_popup_set_shown  (ECellPopup *ecp,
-			 gboolean    shown)
-{
-	ecp->popup_shown = shown;
-	e_cell_popup_queue_cell_redraw (ecp);
-}
diff --git a/widgets/table/e-cell-popup.h b/widgets/table/e-cell-popup.h
deleted file mode 100644
index 26a7429127..0000000000
--- a/widgets/table/e-cell-popup.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell-popup.h: Popup cell renderer
- * Copyright 2001, Ximian, Inc.
- *
- * Authors:
- *   Damon Chaplin <damon@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-/*
- * ECellPopup - an ECell used to support popup selections like a GtkCombo
- * widget. It contains a child ECell, e.g. an ECellText, but when selected it
- * displays an arrow on the right edge which the user can click to show a
- * popup. It will support subclassing or signals so that different types of
- * popup can be provided.
- */
-
-#ifndef _E_CELL_POPUP_H_
-#define _E_CELL_POPUP_H_
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gal/e-table/e-cell.h>
-
-#define E_CELL_POPUP_TYPE        (e_cell_popup_get_type ())
-#define E_CELL_POPUP(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_CELL_POPUP_TYPE, ECellPopup))
-#define E_CELL_POPUP_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_CELL_POPUP_TYPE, ECellPopupClass))
-#define E_IS_CELL_POPUP(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_POPUP_TYPE))
-#define E_IS_CELL_POPUP_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_POPUP_TYPE))
-
-typedef struct _ECellPopupView ECellPopupView;
-
-typedef struct {
-	ECell parent;
-
-	ECell *child;
-
-	/* This is TRUE if the popup window is shown for the cell being
-	   edited. While shown we display the arrow indented. */
-	gboolean	 popup_shown;
-
-	/* This is TRUE if the popup arrow is shown for the cell being edited.
-	   This is needed to stop the first click on the cell from popping up
-	   the popup window. We only popup the window after we have drawn the
-	   arrow. */
-	gboolean	 popup_arrow_shown;
-
-	/* The view in which the popup is shown. */
-	ECellPopupView	*popup_cell_view;
-
-	gint		 popup_view_col;
-	gint		 popup_row;
-	ETableModel	*popup_model;
-} ECellPopup;
-
-
-typedef struct {
-	ECellClass parent_class;
-
-	/* Virtual function for subclasses to override. */
-	gint   	   (*popup)        (ECellPopup *ecp, GdkEvent *event, int row, int view_col);
-} ECellPopupClass;
-
-
-struct _ECellPopupView {
-	ECellView	 cell_view;
-
-	ECellView	*child_view;
-};
-
-
-GType    e_cell_popup_get_type           (void);
-ECell   *e_cell_popup_new                (void);
-
-/* Get and set the child ECell. */
-ECell   *e_cell_popup_get_child          (ECellPopup *ecp);
-void     e_cell_popup_set_child          (ECellPopup *ecp,
-					  ECell      *child);
-
-void     e_cell_popup_set_shown          (ECellPopup *ecp,
-					  gboolean    shown);
-void     e_cell_popup_queue_cell_redraw  (ECellPopup *ecp);
-
-void     e_cell_popup_set_shown          (ECellPopup *ecp,
-					  gboolean    shown);
-void     e_cell_popup_queue_cell_redraw  (ECellPopup *ecp);
-
-#endif /* _E_CELL_POPUP_H_ */
diff --git a/widgets/table/e-cell-progress.c b/widgets/table/e-cell-progress.c
deleted file mode 100644
index bf7fdd9951..0000000000
--- a/widgets/table/e-cell-progress.c
+++ /dev/null
@@ -1,456 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-cell-progress.c - Progress display cell object.
- * Copyright 1999-2002, Ximian, Inc.
- * Copyright 2001, 2002, Krisztian Pifko <monsta@users.sourceforge.net>
- *
- * Authors:
- *   Krisztian Pifko <monsta@users.sourceforge.net>
- *
- * A cell type for displaying progress bars.
- *
- * Derived from ECellToggle of Miguel de Icaza <miguel@ximian.com>.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-
-#include <gtk/gtkenums.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include "e-cell-progress.h"
-#include "gal/util/e-util.h"
-#include "e-table-item.h"
-
-#define PARENT_TYPE e_cell_get_type ()
-
-typedef struct {
-	ECellView    cell_view;
-	GdkGC       *gc;
-	GnomeCanvas *canvas;
-} ECellProgressView;
-
-static ECellClass *parent_class;
-
-static void
-eprog_queue_redraw (ECellProgressView *text_view, int view_col, int view_row)
-{
-	e_table_item_redraw_range (
-		text_view->cell_view.e_table_item_view,
-		view_col, view_row, view_col, view_row);
-}
-
-/*
- * ECell::realize method
- */
-static ECellView *
-eprog_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
-	ECellProgressView *progress_view = g_new0 (ECellProgressView, 1);
-	ETableItem *eti = E_TABLE_ITEM (e_table_item_view);
-	GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas;
-	
-	progress_view->cell_view.ecell = ecell;
-	progress_view->cell_view.e_table_model = table_model;
-	progress_view->cell_view.e_table_item_view = e_table_item_view;
-	progress_view->canvas = canvas;
-	
-	return (ECellView *) progress_view;
-}
-
-static void
-eprog_kill_view (ECellView *ecell_view)
-{
-	g_free (ecell_view);
-}	
-
-static void
-eprog_realize (ECellView *ecell_view)
-{
-	ECellProgressView *progress_view = (ECellProgressView *) ecell_view;
-
-	progress_view->gc = gdk_gc_new (GTK_WIDGET (progress_view->canvas)->window);
-}
-
-/*
- * ECell::unrealize method
- */
-static void
-eprog_unrealize (ECellView *ecv)
-{
-	ECellProgressView *progress_view = (ECellProgressView *) ecv;
-
-	gdk_gc_unref (progress_view->gc);
-	progress_view->gc = NULL;
-}
-
-static void
-eprog_clear (ECellProgress *progress)
-{
-  memset(progress->buffer,0x00,progress->width*progress->height*4);  
-}
-
-static void
-eprog_draw_border (ECellProgress *progress, guchar red, guchar green, guchar blue)
-{
-  gint i, j, w4, p4, pw4, wpb4, hp1;
-
-/*
- * some speedup
- */
-  w4=progress->width*4;
-  p4=progress->padding*4;
-  pw4=w4*progress->padding;
-  wpb4=(progress->width-progress->padding-progress->border)*4;
-  hp1=(progress->height-progress->padding-1);
-
-  for (i=progress->padding*4;i<(progress->width-progress->padding)*4;i+=4){
-    for (j=0;j<progress->border;j++){
-      progress->buffer[pw4+j*w4+i]=red;
-      progress->buffer[pw4+j*w4+i+1]=green;
-      progress->buffer[pw4+j*w4+i+2]=blue;
-      progress->buffer[pw4+j*w4+i+3]=255;
-      progress->buffer[(progress->height-1-progress->padding)*w4-j*w4+i]=red;
-      progress->buffer[(progress->height-1-progress->padding)*w4-j*w4+i+1]=green;
-      progress->buffer[(progress->height-1-progress->padding)*w4-j*w4+i+2]=blue;
-      progress->buffer[(progress->height-1-progress->padding)*w4-j*w4+i+3]=255;
-    }
-  }
-  for (i=progress->padding+progress->border;i<progress->height-progress->padding-progress->border;i++){
-    for (j=0;j<4*progress->border;j+=4){
-      progress->buffer[p4+i*w4+j]=red;
-      progress->buffer[p4+i*w4+j+1]=green;
-      progress->buffer[p4+i*w4+j+2]=blue;
-      progress->buffer[p4+i*w4+j+3]=255;
-      progress->buffer[i*w4+wpb4+j]=red;
-      progress->buffer[i*w4+wpb4+j+1]=green;
-      progress->buffer[i*w4+wpb4+j+2]=blue;
-      progress->buffer[i*w4+wpb4+j+3]=255;
-    }
-  }
-}
-
-static void
-eprog_draw_bar (ECellProgress *progress, guchar red, guchar green, guchar blue, gint value)
-{
-  gint i, j, w;
-  
-  w=value*(progress->width-2*(progress->padding+progress->border+1))/progress->max;
-  for (i=(progress->padding+progress->border+1)*4;i<(progress->padding+progress->border+1+w)*4;i+=4){
-    for (j=0;j<progress->height-2*(progress->padding+progress->border+1);j++){
-      progress->buffer[(progress->width*(progress->padding+progress->border+1)*4)+j*progress->width*4+i]=red;
-      progress->buffer[(progress->width*(progress->padding+progress->border+1)*4)+j*progress->width*4+i+1]=green;
-      progress->buffer[(progress->width*(progress->padding+progress->border+1)*4)+j*progress->width*4+i+2]=blue;
-      progress->buffer[(progress->width*(progress->padding+progress->border+1)*4)+j*progress->width*4+i+3]=255;
-    }
-  }
-}
-
-/*
- * ECell::draw method
- */
-static void
-eprog_draw (ECellView *ecell_view, GdkDrawable *drawable,
-	  int model_col, int view_col, int row, ECellFlags flags,
-	  int x1, int y1, int x2, int y2)
-{
-	ECellProgress *progress = E_CELL_PROGRESS (ecell_view->ecell);
-	gboolean selected;
-	GdkPixbuf *image;
-	int x, y, width, height;
-	
-	const int value = GPOINTER_TO_INT (
-		 e_table_model_value_at (ecell_view->e_table_model, model_col, row));
-	
-	selected = flags & E_CELL_SELECTED;
-
-	if ((value > progress->max)||(value < progress->min)){
-		g_warning ("Value from the table model is %d, the states we support are [%d..%d]\n",
-			   value, progress->min, progress->max);
-		return;
-	}
-
-	image = progress->image;
-
-	if ((x2 - x1) < progress->width){
-		x = x1;
-		width = x2 - x1;
-	} else {
-		x = x1 + ((x2 - x1) - progress->width) / 2;
-		width = progress->width;
-	}
-
-	if ((y2 - y1) < progress->height){
-		y = y1;
-		height = y2 - y1;
-	} else {
-		y = y1 + ((y2 - y1) - progress->height) / 2;
-		height = progress->height;
-	}
-
-	eprog_clear(progress);
-
-	eprog_draw_border(progress, progress->red, progress->green, progress->blue);
-
-	eprog_draw_bar(progress, progress->red, progress->green, progress->blue, value);
-
-	gdk_pixbuf_render_to_drawable_alpha (progress->image, drawable,
-					     0, 0,
-					     x, y,
-					     progress->width, progress->height,
-					     GDK_PIXBUF_ALPHA_BILEVEL,
-					     128,
-					     GDK_RGB_DITHER_NORMAL,
-					     x, y);
-}
-
-static void
-eprog_set_value (ECellProgressView *progress_view, int model_col, int view_col, int row, int value)
-{
-	ECell *ecell = progress_view->cell_view.ecell;
-	ECellProgress *progress = E_CELL_PROGRESS (ecell);
-
-	if (value > progress->max){
-	  value = progress->max;
-	}else if (value < progress->min){
-	  value = progress->min;
-	}
-	e_table_model_set_value_at (progress_view->cell_view.e_table_model,
-				    model_col, row, GINT_TO_POINTER (value));
-	eprog_queue_redraw (progress_view, view_col, row);
-}
-
-/*
- * ECell::event method
- */
-static gint
-eprog_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row, ECellFlags flags, ECellActions *actions)
-{
-	ECellProgressView *progress_view = (ECellProgressView *) ecell_view;
-	void *_value = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
-	const int value = GPOINTER_TO_INT (_value);
-
-#if 0
-	if (!(flags & E_CELL_EDITING))
-		return FALSE;
-#endif
-
-	switch (event->type){
-	case GDK_KEY_PRESS:
-		if (event->key.keyval != GDK_space)
-			return FALSE;
-		/* Fall through */
-	case GDK_BUTTON_PRESS:
-		if (!e_table_model_is_cell_editable(ecell_view->e_table_model, model_col, row))
-			return FALSE;
-		
-		eprog_set_value (progress_view, model_col, view_col, row, value + 1);
-		return TRUE;
-
-	default:
-		return FALSE;
-	}
-	return TRUE;
-}
-
-/*
- * ECell::height method
- */
-static int
-eprog_height (ECellView *ecell_view, int model_col, int view_col, int row)
-{
-	ECellProgress *progress = E_CELL_PROGRESS (ecell_view->ecell);
-
-	return progress->height;
-}
-
-/*
- * ECell::max_width method
- */
-static int
-eprog_max_width (ECellView *ecell_view, int model_col, int view_col)
-{
-	ECellProgress *progress = E_CELL_PROGRESS (ecell_view->ecell);
-
-	return progress->width;
-}
-
-static void
-eprog_dispose (GObject *object)
-{
-	ECellProgress *eprog = E_CELL_PROGRESS (object);
-	
-	gdk_pixbuf_unref (eprog->image);
-	g_free (eprog->image);
-	g_free (eprog->buffer);
-
-	G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static void
-e_cell_progress_class_init (GObjectClass *object_class)
-{
-	ECellClass *ecc = (ECellClass *) object_class;
-
-	object_class->dispose = eprog_dispose;
-
-	ecc->new_view   = eprog_new_view;
-	ecc->kill_view  = eprog_kill_view;
-	ecc->realize    = eprog_realize;
-	ecc->unrealize  = eprog_unrealize;
-	ecc->draw       = eprog_draw;
-	ecc->event      = eprog_event;
-	ecc->height     = eprog_height;
-	ecc->max_width  = eprog_max_width;
-
-	parent_class = g_type_class_ref (PARENT_TYPE);
-}
-
-E_MAKE_TYPE(e_cell_progress, "ECellProgress", ECellProgress, e_cell_progress_class_init, NULL, PARENT_TYPE);
-
-/**
- * e_cell_progress_construct:
- * @eprog: a fresh ECellProgress object
- * @padding: number of pixels used as a padding
- * @border: number of pixels used as a border
- * @min: the minimum value
- * @max: the maximum value
- * @width: the width of the progress bar in pixels
- * @height: the height of the progress bar in pixels
- * @red: the red component of the progress bars rgb color
- * @green: the green component of the progress bars rgb color
- * @blue: the blue component of the progress bars rgb color
- *
- * Constructs the @eprog object with the arguments
- */
-void
-e_cell_progress_construct (ECellProgress *eprog, int padding, int border, int min, int max, int width, int height, guchar red, guchar green, guchar blue)
-{
-	eprog->padding = padding;
-	eprog->border = border;
-	eprog->min = min;
-	eprog->max = max;
-	eprog->red = red;
-	eprog->green = green;
-	eprog->blue = blue;
-
-	eprog->width = (width<((padding+border)*2+5)) ? ((padding+border)*2+5) : width;
-	eprog->height = (height<((padding+border)*2+5)) ? ((padding+border)*2+5) : height;
-
-	eprog->buffer=g_new(guchar, eprog->width*eprog->height*4);
-
-	eprog_clear(eprog);
-	eprog_draw_border(eprog, red, green, blue);
-
-	eprog->image = gdk_pixbuf_new_from_data (eprog->buffer,GDK_COLORSPACE_RGB, TRUE, 8, eprog->width, eprog->height, eprog->width*4, NULL, NULL);
-}
-
-/**
- * e_cell_progress_new:
- * @min: the minimum value
- * @max: the maximum value
- * @width: the width of the progress bar in pixels
- * @height: the height of the progress bar in pixels
- *
- * Creates a new ECell renderer that can be used to render progress
- * bars displaying the percentage of the current value between min
- * and max.
- * 
- * Returns: an ECell object that can be used to render progress cells.
- */
-ECell *
-e_cell_progress_new (int min, int max, int width, int height)
-{
-	ECellProgress *eprog = g_object_new (E_CELL_PROGRESS_TYPE, NULL);
-
-	e_cell_progress_construct (eprog, 1, 1, min, max, (width<9) ? 9 : width, (height<9) ? 9 : height, 0x00, 0x00, 0x00);
-
-	return (ECell *) eprog;
-}
-
-/**
- * e_cell_progress_set_padding:
- * @eprog: an ECellProgress object
- * @padding: number of pixels used as a padding
- *
- * Sets the padding around the progress bar in the cell.
- */
-void
-e_cell_progress_set_padding (ECellProgress *eprog, int padding)
-{
-	eprog->padding = padding;
-
-	eprog->width = (eprog->width<((padding+eprog->border)*2+5)) ? ((padding+eprog->border)*2+5) : eprog->width;
-	eprog->height = (eprog->height<((padding+eprog->border)*2+5)) ? ((padding+eprog->border)*2+5) : eprog->height;
-
-	g_free (eprog->buffer);
-	eprog->buffer=g_new (guchar, eprog->width*eprog->height*4);
-
-	eprog_clear (eprog);
-	eprog_draw_border (eprog, eprog->red, eprog->green, eprog->blue);
-
-	eprog->image = gdk_pixbuf_new_from_data (eprog->buffer,GDK_COLORSPACE_RGB, TRUE, 8, eprog->width, eprog->height, eprog->width*4, NULL, NULL);
-}
-
-/**
- * e_cell_progress_set_border:
- * @eprog: an ECellProgress object
- * @border: number of pixels used as a border
- *
- * Sets the border around the progress bar in the cell.
- */
-void
-e_cell_progress_set_border (ECellProgress *eprog, int border)
-{
-	eprog->border = border;
-
-	eprog->width = (eprog->width<((eprog->padding+border)*2+5)) ? ((eprog->padding+border)*2+5) : eprog->width;
-	eprog->height = (eprog->height<((eprog->padding+border)*2+5)) ? ((eprog->padding+border)*2+5) : eprog->height;
-
-	g_free (eprog->buffer);
-	eprog->buffer=g_new (guchar, eprog->width*eprog->height*4);
-
-	eprog_clear (eprog);
-	eprog_draw_border (eprog, eprog->red, eprog->green, eprog->blue);
-
-	eprog->image = gdk_pixbuf_new_from_data (eprog->buffer,GDK_COLORSPACE_RGB, TRUE, 8, eprog->width, eprog->height, eprog->width*4, NULL, NULL);
-}
-
-/**
- * e_cell_progress_set_color:
- * @eprog: a fresh ECellProgress object
- * @red: the red component of the progress bars rgb color
- * @green: the green component of the progress bars rgb color
- * @blue: the blue component of the progress bars rgb color
- */
-void
-e_cell_progress_set_color (ECellProgress *eprog, guchar red, guchar green, guchar blue)
-{
-	eprog->red = red;
-	eprog->green = green;
-	eprog->blue = blue;
-
-	eprog_clear (eprog);
-	eprog_draw_border (eprog, red, green, blue);
-}
diff --git a/widgets/table/e-cell-progress.h b/widgets/table/e-cell-progress.h
deleted file mode 100644
index 01a0d0b504..0000000000
--- a/widgets/table/e-cell-progress.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-cell-progress.h - Progress display cell object.
- * Copyright 1999-2002, Ximian, Inc.
- * Copyright 2001, 2002, Krisztian Pifko <monsta@users.sourceforge.net>
- *
- * Authors:
- *   Krisztian Pifko <monsta@users.sourceforge.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_CELL_PROGRESS_H_
-#define _E_CELL_PROGRESS_H_
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gal/e-table/e-cell.h>
-
-G_BEGIN_DECLS
-
-#define E_CELL_PROGRESS_TYPE        (e_cell_progress_get_type ())
-#define E_CELL_PROGRESS(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_CELL_PROGRESS_TYPE, ECellProgress))
-#define E_CELL_PROGRESS_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_CELL_PROGRESS_TYPE, ECellProgressClass))
-#define E_IS_CELL_PROGRESS(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_PROGRESS_TYPE))
-#define E_IS_CELL_PROGRESS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_PROGRESS_TYPE))
-
-typedef struct {
-	ECell parent;
-
-	int        padding;
-	int        border;
-	int        min;
-	int        max;
-	guchar 	   red;
-	guchar 	   green;
-	guchar 	   blue;
-
-	guchar *buffer;
-	GdkPixbuf *image;
-
-	int        width;
-	int        height;
-} ECellProgress;
-
-typedef struct {
-	ECellClass parent_class;
-} ECellProgressClass;
-
-GType      e_cell_progress_get_type  (void);
-ECell     *e_cell_progress_new       (int min, int max, int width, int height);
-void       e_cell_progress_construct (ECellProgress *eprog, int padding, int border,
-				      int min, int max, int width, int height, guchar red, guchar green, guchar blue);
-void	   e_cell_progress_set_padding (ECellProgress *eprog, int padding);
-void	   e_cell_progress_set_border (ECellProgress *eprog, int border);
-void	   e_cell_progress_set_color (ECellProgress *eprog, guchar red, guchar green, guchar blue);
-
-G_END_DECLS
-
-#endif /* _E_CELL_PROGRESS_H_ */
-
-
diff --git a/widgets/table/e-cell-size.c b/widgets/table/e-cell-size.c
deleted file mode 100644
index 1ba8f6d2e6..0000000000
--- a/widgets/table/e-cell-size.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell-size.c: Size item for e-table.
- * Copyright 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <gal/util/e-util.h>
-#include "e-cell-size.h"
-
-#define PARENT_TYPE e_cell_text_get_type ()
-
-static ECellTextClass *parent_class;
-
-static char *
-ecd_get_text(ECellText *cell, ETableModel *model, int col, int row)
-{
-	gint size = GPOINTER_TO_INT(e_table_model_value_at(model, col, row));
-	gfloat fsize;
-	
-	if (size < 1024) {
-		return g_strdup_printf ("%d bytes", size);
-	} else {
-		fsize = ((gfloat) size) / 1024.0;
-		if (fsize < 1024.0) {
-			return g_strdup_printf ("%d K", (int)fsize);
-		} else {
-			fsize /= 1024.0;
-			return g_strdup_printf ("%.1f MB", fsize);
-		}
-	}
-}
-
-static void
-ecd_free_text(ECellText *cell, char *text)
-{
-	g_free(text);
-}
-
-static void
-e_cell_size_class_init (GtkObjectClass *object_class)
-{
-	ECellTextClass *ectc = (ECellTextClass *) object_class;
-
-	parent_class = g_type_class_ref (PARENT_TYPE);
-
-	ectc->get_text  = ecd_get_text;
-	ectc->free_text = ecd_free_text;
-}
-
-static void
-e_cell_size_init (GtkObject *object)
-{
-}
-
-/**
- * e_cell_size_new:
- * @fontname: font to be used to render on the screen
- * @justify: Justification of the string in the cell.
- *
- * Creates a new ECell renderer that can be used to render file sizes
- * that that come from the model.  The value returned from the model
- * is interpreted as being a time_t.
- *
- * The ECellSize object support a large set of properties that can be
- * configured through the Gtk argument system and allows the user to
- * have a finer control of the way the string is displayed.  The
- * arguments supported allow the control of strikeout, underline,
- * bold, color and a size filter.
- *
- * The arguments "strikeout_column", "underline_column", "bold_column"
- * and "color_column" set and return an integer that points to a
- * column in the model that controls these settings.  So controlling
- * the way things are rendered is achieved by having special columns
- * in the model that will be used to flag whether the size should be
- * rendered with strikeout, underline, or bolded.  In the case of the
- * "color_column" argument, the column in the model is expected to
- * have a string that can be parsed by gdk_color_parse().
- * 
- * Returns: an ECell object that can be used to render file sizes.  */
-ECell *
-e_cell_size_new (const char *fontname, GtkJustification justify)
-{
-	ECellSize *ecd = g_object_new (E_CELL_SIZE_TYPE, NULL);
-
-	e_cell_text_construct(E_CELL_TEXT(ecd), fontname, justify);
-      
-	return (ECell *) ecd;
-}
-
-E_MAKE_TYPE(e_cell_size, "ECellSize", ECellSize, e_cell_size_class_init, e_cell_size_init, PARENT_TYPE)
diff --git a/widgets/table/e-cell-size.h b/widgets/table/e-cell-size.h
deleted file mode 100644
index 744cc00a98..0000000000
--- a/widgets/table/e-cell-size.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell-size.h: Size item for e-table.
- * Copyright 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-#ifndef _E_CELL_SIZE_H_
-#define _E_CELL_SIZE_H_
-
-#include <gal/e-table/e-cell-text.h>
-
-G_BEGIN_DECLS
-
-#define E_CELL_SIZE_TYPE        (e_cell_size_get_type ())
-#define E_CELL_SIZE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_CELL_SIZE_TYPE, ECellSize))
-#define E_CELL_SIZE_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_CELL_SIZE_TYPE, ECellSizeClass))
-#define E_IS_CELL_SIZE(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_SIZE_TYPE))
-#define E_IS_CELL_SIZE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_SIZE_TYPE))
-
-typedef struct {
-	ECellText base;
-} ECellSize;
-
-typedef struct {
-	ECellTextClass parent_class;
-} ECellSizeClass;
-
-GType      e_cell_size_get_type (void);
-ECell     *e_cell_size_new      (const char *fontname, GtkJustification justify);
-
-G_END_DECLS
-
-#endif /* _E_CELL_SIZE_H_ */
diff --git a/widgets/table/e-cell-spin-button.c b/widgets/table/e-cell-spin-button.c
deleted file mode 100644
index b2af02c44d..0000000000
--- a/widgets/table/e-cell-spin-button.c
+++ /dev/null
@@ -1,670 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell-spin-button.c: Spin button item for e-table.
- * Copyright 2001, CodeFactory AB
- * Copyright 2001, Mikael Hallendal <micke@codefactory.se>
- *
- * Authors:
- *   Mikael Hallendal <micke@codefactory.se>
- *
- * Celltype for drawing a spinbutton in a cell. 
- *
- * Used ECellPopup by Damon Chaplin <damon@ximian.com> as base for 
- * buttondrawings.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtksignal.h>
-#include <gal/e-table/e-table-item.h>
-#include <gal/e-table/e-table-model.h>
-#include <gal/e-table/e-cell-float.h>
-#include <gal/e-table/e-cell-number.h>
-#include <gal/util/e-util.h>
-#include "e-cell-spin-button.h"
-
-#define E_CELL_SPIN_BUTTON_ARROW_WIDTH  16
-#define PARENT_TYPE e_cell_get_type ()
-
-static void e_cell_spin_button_class_init   (GObjectClass   *klass);
-static void e_cell_spin_button_init         (GtkObject        *object);
-
-static void         ecsb_dispose      (GObject	*object);
-
-/* ECell Functions */
-static ECellView *  ecsb_new_view     (ECell                 *ecell,
-				       ETableModel           *etm,
-				       void                  *eti_view);
-static void         ecsb_realize      (ECellView             *ecv);
-static void         ecsb_kill_view    (ECellView             *ecv);
-static void         ecsb_unrealize    (ECellView             *ecv);
-static void         ecsb_draw         (ECellView             *ecv, 
-				       GdkDrawable           *drawable, 
-				       int                    model_col, 
-				       int                    view_col, 
-				       int                    row, 
-				       ECellFlags             flags, 
-				       int                    x1, 
-				       int                    y1, 
-				       int                    x2, 
-				       int                    y2); 
-
-static gint         ecsb_event        (ECellView             *ecv, 
-				       GdkEvent              *event, 
-				       int                    model_col, 
-				       int                    view_col, 
-				       int                    row,
-				       ECellFlags             flags, 
-				       ECellActions          *actions); 
-
-static gint         ecsb_height       (ECellView             *ecv,
-				       int                    model_col,
-				       int                    view_col,
-				       int                    row);
-
-static void *       ecsb_enter_edit   (ECellView             *ecv,
-				       int                    model_col, 
-				       int                    view_col, 
-				       int                    row);
-
-static void         ecsb_leave_edit   (ECellView             *ecv,
-				       int                    model_col, 
-				       int                    view_col, 
-				       int                    row, 
-				       void                  *context);
-static void         ecsb_focus        (ECellView             *ecell_view,
-				       int                    model_col,
-				       int                    view_col,
-				       int                    row,
-				       int                    x1,
-				       int                    y1,
-				       int                    x2,
-				       int                    y2);
-static void         ecsb_unfocus      (ECellView             *ecell_view);
-
-static void         ecsb_show_tooltip (ECellView             *ecv,
-				       int                    model_col, 
-				       int                    view_col, 
-				       int                    row, 
-				       int                    col_width, 
-				       ETableTooltip          *tooltip);
-
-typedef struct {
-	ECellView    cell_view;
-	
-	ECellView   *child_view;
-} ECellSpinButtonView;
-
-enum {
-	STEP,
-	LAST_SIGNAL
-};
-
-static guint    signals[LAST_SIGNAL] = { 0 };
-static ECell   *parent_class;
-
-static void 
-e_cell_spin_button_class_init     (GObjectClass   *klass)
-{
-        ECellClass             *ecc    = (ECellClass *) klass;  
-	ECellSpinButtonClass   *ecsbc  = (ECellSpinButtonClass *) klass;
-        
-        klass->dispose     = ecsb_dispose;
-
-	ecc->realize       = ecsb_realize;
-	ecc->unrealize     = ecsb_unrealize;
-	ecc->new_view      = ecsb_new_view;
-	ecc->kill_view     = ecsb_kill_view;
-	ecc->draw          = ecsb_draw;
-	ecc->event         = ecsb_event;
-	ecc->height        = ecsb_height;
-	ecc->enter_edit    = ecsb_enter_edit;
-	ecc->leave_edit    = ecsb_leave_edit;
-	ecc->focus         = ecsb_focus;
-	ecc->unfocus       = ecsb_unfocus;	ecc->print         = NULL;
-	ecc->print_height  = NULL;
-	ecc->max_width     = NULL;
-	ecc->show_tooltip  = ecsb_show_tooltip;
-
-	ecsbc->step        = NULL;
-
-        parent_class       = g_type_class_ref (E_CELL_TYPE);
-
-	signals[STEP] =
-		g_signal_new ("step",
-			      G_OBJECT_CLASS_TYPE (klass),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ECellSpinButtonClass, step),
-			      NULL, NULL,
-			      e_marshal_NONE__POINTER_INT_INT_INT,
-			      G_TYPE_NONE,
-			      4, G_TYPE_POINTER, G_TYPE_INT, 
-			      G_TYPE_INT, G_TYPE_INT);
-}
-
-static void 
-e_cell_spin_button_init           (GtkObject        *object)
-{
-        ECellSpinButton   *ecsb;
-	
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (M_IS_CELL_SPIN_BUTTON (object));
-	
-	ecsb = E_CELL_SPIN_BUTTON (object);
-
-	ecsb->up_pressed    = FALSE;
-	ecsb->down_pressed  = FALSE;
-}
-
-static ECellView *  
-ecsb_new_view     (ECell            *ecell,
-		   ETableModel      *etm,
-		   void             *eti_view)
-{
-	ECellSpinButton       *ecsb = E_CELL_SPIN_BUTTON (ecell);
-	ECellSpinButtonView   *ecsb_view;
-
-	g_return_val_if_fail (ecsb->child != NULL, NULL);
-
-	ecsb_view = g_new0 (ECellSpinButtonView, 1);
-
-	ecsb_view->cell_view.ecell = ecell;
-	ecsb_view->cell_view.e_table_model = etm;
-	ecsb_view->cell_view.e_table_item_view = eti_view;
-
-	ecsb_view->child_view = e_cell_new_view (ecsb->child, etm, eti_view);
-
-	return (ECellView *) ecsb_view;
-}
-
-static void         
-ecsb_realize      (ECellView        *ecv)
-{ 
-	ECellSpinButtonView   *ecsb_view;
-	
-	g_return_if_fail (ecv != NULL);
-
-	ecsb_view = (ECellSpinButtonView *) ecv;
-
-	e_cell_realize (ecsb_view->child_view);
-} 
-
-static void         
-ecsb_kill_view    (ECellView        *ecv)
-{
-	ECellSpinButtonView   *ecsb_view;
-	
-	g_return_if_fail (ecv != NULL);
-
-	ecsb_view = (ECellSpinButtonView *) ecv;
-
-	if (ecsb_view->child_view) {
-		e_cell_kill_view (ecsb_view->child_view);
-	}
-	
-	g_free (ecsb_view);
-}
-
-static void         
-ecsb_unrealize    (ECellView        *ecv)
-{ 
-	ECellSpinButtonView   *ecsb_view;
-	
-	g_return_if_fail (ecv != NULL);
-
-	ecsb_view = (ECellSpinButtonView *) ecv;
-
-	e_cell_unrealize (ecsb_view->child_view);
-}
-
-static void         
-ecsb_draw         (ECellView        *ecv, 
-		   GdkDrawable      *drawable, 
-		   int               model_col, 
-		   int               view_col, 
-		   int               row, 
-		   ECellFlags        flags, 
-		   int               x1, 
-		   int               y1, 
-		   int               x2, 
-		   int               y2)
-{
-	ECellSpinButton        *ecsb;
-	ECellSpinButtonView    *ecsb_view;
-	ETableItem             *eti;
-	GtkWidget              *canvas;
-	GtkShadowType           shadow = GTK_SHADOW_OUT;
-	GdkRectangle            rect;
-	
-	g_return_if_fail (ecv != NULL);
-	
-	ecsb_view   = (ECellSpinButtonView *) ecv;
-	ecsb        = E_CELL_SPIN_BUTTON (ecsb_view->cell_view.ecell);
-	
-	eti         = E_TABLE_ITEM (ecsb_view->cell_view.e_table_item_view);
-	canvas      = GTK_WIDGET (GNOME_CANVAS_ITEM (eti)->canvas);
-	
-	if (eti->editing_col == view_col && 
-	    eti->editing_row == row) {
-
-		/* Draw child (Whats shown under the buttons) */
-		e_cell_draw (ecsb_view->child_view, 
-			     drawable, model_col, view_col,
-			     row, flags, 
-			     x1, y1, 
-			     x2 - E_CELL_SPIN_BUTTON_ARROW_WIDTH, y2); 
-
-		/* Draw down-arrow */
-		rect.x       = x2 - E_CELL_SPIN_BUTTON_ARROW_WIDTH;
-		rect.y       = y1 + (y2 - y1) / 2;
-		rect.width   = E_CELL_SPIN_BUTTON_ARROW_WIDTH;
-		rect.height  = (y2 - y1) / 2;
-		
-		if (ecsb->down_pressed) {
-			shadow = GTK_SHADOW_IN;
-		} else {
-			shadow = GTK_SHADOW_OUT;
-		}
-		
-		gtk_paint_box (canvas->style, drawable, 
-			       GTK_STATE_NORMAL, shadow,
-			       &rect, canvas, "ecellspinbutton_down",
-			       rect.x, rect.y, rect.width, rect.height);
-
-		gtk_paint_arrow (canvas->style, drawable,
-				 GTK_STATE_NORMAL, GTK_SHADOW_NONE,
-				 &rect, canvas, NULL,
-				 GTK_ARROW_DOWN, TRUE,
-				 rect.x,
-				 rect.y,
-				 rect.width,
-				 rect.height);
-
-		/* Draw up-arrow */
-		rect.y       = y1;
-		
-		if (ecsb->up_pressed) {
-			shadow = GTK_SHADOW_IN;
-		} else {
-			shadow = GTK_SHADOW_OUT;
-		}
-
-		gtk_paint_box (canvas->style, drawable, 
-			       GTK_STATE_NORMAL, shadow,
-			       &rect, canvas, "ecellspinbutton_up",
-			       rect.x, rect.y, rect.width, rect.height);
-
-		gtk_paint_arrow (canvas->style, drawable,
-				 GTK_STATE_NORMAL, GTK_SHADOW_NONE,
-				 &rect, canvas, NULL,
-				 GTK_ARROW_UP, TRUE,
-				 rect.x,
-				 rect.y,
-				 rect.width,
-				 rect.height);
-	} else {
-		/* Draw child */
-		e_cell_draw (ecsb_view->child_view, 
-			     drawable, model_col, view_col,
-			     row, flags, 
-			     x1, y1, 
-			     x2, y2); 
-	}
-}
-
-static gint         
-ecsb_event        (ECellView        *ecv, 
-		   GdkEvent         *event, 
-		   int               model_col, 
-		   int               view_col, 
-		   int               row,
-		   ECellFlags        flags, 
-		   ECellActions     *actions)
-{
-	ECellSpinButton       *ecsb;
-	ECellSpinButtonClass  *ecsb_class;
-	ECellSpinButtonView   *ecsb_view;
-	ETableItem            *eti;
-	gint                   height, width;
-	
-	g_return_val_if_fail (ecv != NULL, FALSE);
-		
-	ecsb_view   = (ECellSpinButtonView *) ecv;
-	ecsb        = E_CELL_SPIN_BUTTON (ecsb_view->cell_view.ecell);
-	ecsb_class  = E_CELL_SPIN_BUTTON_CLASS (GTK_OBJECT_GET_CLASS (ecsb));
-	eti         = E_TABLE_ITEM (ecsb_view->cell_view.e_table_item_view);
-	
-	switch (event->type) {
-	case GDK_BUTTON_PRESS:
-		if (eti->editing_col == view_col &&
-		    eti->editing_row == row) {
-			width = e_table_header_col_diff (eti->header,
-							 view_col,
-							 view_col + 1);
-			height = e_table_item_row_diff (eti, row, row + 1);
-
-			/* Check if inside a button */
-			if (event->button.x >= width - E_CELL_SPIN_BUTTON_ARROW_WIDTH) {
-				/* Yep, which one? */
-				if (event->button.y <= height / 2) {
-					ecsb->up_pressed = TRUE;
-					g_signal_emit (ecsb,
-						       signals[STEP], 0,
-						       ecv,
-						       STEP_UP,
-						       view_col,
-						       row);
-				} else {
-					ecsb->down_pressed = TRUE;
-					g_signal_emit (ecsb,
-						       signals[STEP], 0,
-						       ecv,
-						       STEP_DOWN,
-						       view_col,
-						       row);
-				}
-
-				e_table_item_redraw_range (eti,
-							   view_col,
-							   row,
-							   view_col,
-							   row);
-				
-			}
-		} 
-		
-		break;
-	case GDK_BUTTON_RELEASE:
-		ecsb->up_pressed = FALSE;
-		ecsb->down_pressed = FALSE;
-		e_table_item_redraw_range (eti,
-					   view_col,
-					   row,
-					   view_col,
-					   row);
-		break;
-	case GDK_KEY_PRESS:
-		break;
-	default:
-		break;
-	}
-
-	return e_cell_event (ecsb_view->child_view, event, model_col,
-			     view_col, row, flags, actions);
-}
-
-static gint         
-ecsb_height       (ECellView        *ecv,
-		   int               model_col,
-		   int               view_col,
-		   int               row)
-{
-	ECellSpinButtonView   *ecsb_view;
-	
-	g_return_val_if_fail (ecv != NULL, -1);
-	
-	ecsb_view = (ECellSpinButtonView *) ecv;
-
-	return e_cell_height (ecsb_view->child_view, model_col, view_col, row);
-}
-
-static void *       
-ecsb_enter_edit   (ECellView        *ecv,
-		   int               model_col, 
-		   int               view_col, 
-		   int               row)
-{
-	ECellSpinButtonView   *ecsb_view;
-	
-	g_return_val_if_fail (ecv != NULL, NULL);
-
-	ecsb_view = (ECellSpinButtonView *) ecv;
-
-	return e_cell_enter_edit (ecsb_view->child_view, model_col,
-				  view_col, row);
-}
-
-
-static void         
-ecsb_leave_edit   (ECellView        *ecv,
-		   int               model_col, 
-		   int               view_col, 
-		   int               row, 
-		   void             *context)
-{
-	ECellSpinButtonView   *ecsb_view;
-	
-	g_return_if_fail (ecv != NULL);
-	
-	ecsb_view = (ECellSpinButtonView *) ecv;
-
-	e_cell_leave_edit (ecsb_view->child_view, model_col, view_col, 
-			   row, context);
-}
-
-static void
-ecsb_focus        (ECellView        *ecell_view,
-		   int               model_col,
-		   int               view_col,
-		   int               row,
-		   int		     x1,
-		   int		     y1,
-		   int		     x2,
-		   int		     y2)
-{
-	ECellClass  *klass;
-	ECellSpinButtonView   *ecsb_view;
-	
-	ecsb_view = (ECellSpinButtonView *) ecell_view;
-
-	klass = E_CELL_GET_CLASS (ecell_view->ecell);
-
-	if (klass->focus)
-		klass->focus (ecell_view, model_col, view_col, row, 
-			      x1, y1, x2, y2);
-}
-
-static void
-ecsb_unfocus      (ECellView        *ecell_view)
-{
-	ECellClass  *klass;
-	ECellSpinButtonView   *ecsb_view;
-	
-	ecsb_view = (ECellSpinButtonView *) ecell_view;
-	klass = E_CELL_GET_CLASS (ecell_view->ecell);
-
-	if (klass->unfocus)
-		klass->unfocus (ecell_view);
-}
-
-static void         
-ecsb_show_tooltip (ECellView        *ecv,
-		   int               model_col, 
-		   int               view_col, 
-		   int               row, 
-		   int               col_width, 
-		   ETableTooltip    *tooltip)
-{
-	ECellSpinButtonView   *ecsb_view;
-	
-	g_return_if_fail (ecv != NULL);
-
-	ecsb_view = (ECellSpinButtonView *) ecv;
-	
-	e_cell_show_tooltip (ecsb_view->child_view, model_col, view_col, 
-			     row, col_width, tooltip);
-}
-
-static void 
-ecsb_dispose (GObject	*object)
-{
-	ECellSpinButton *mcsp;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (M_IS_CELL_SPIN_BUTTON (object));
-	
-	mcsp = E_CELL_SPIN_BUTTON (object);
-	
-	G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-ECell *
-e_cell_spin_button_new (gint     min,
-			gint     max,
-			gint     step,
-			ECell   *child_cell)
-{
-	ECellSpinButton   *ecsb;
-	
-	ecsb = g_object_new (E_CELL_SPIN_BUTTON_TYPE, NULL);
-
-	if (!child_cell) {
-		child_cell = e_cell_number_new (NULL, 
-						GTK_JUSTIFY_LEFT);
-		
-		g_signal_connect (ecsb, "step",
-				  G_CALLBACK (e_cell_spin_button_step),
-				  NULL);
-	}
-	
-	ecsb->child   = child_cell;
-	ecsb->min.i   = min;
-	ecsb->max.i   = max;
-	ecsb->step.i  = step;
-
-	return E_CELL (ecsb);
-}
-
-ECell *
-e_cell_spin_button_new_float (gfloat    min,
-			      gfloat    max,
-			      gfloat    step,
-			      ECell    *child_cell)
-{
-	ECellSpinButton   *ecsb;
-	
-	ecsb = g_object_new (E_CELL_SPIN_BUTTON_TYPE, NULL);
-
-	if (!child_cell) {
-		child_cell = e_cell_float_new (NULL, GTK_JUSTIFY_LEFT);
-		g_signal_connect (ecsb, "step",
-				  G_CALLBACK (e_cell_spin_button_step_float),
-				  NULL);
-	}
-	
-	ecsb->child   = child_cell;
-	ecsb->min.f   = min;
-	ecsb->max.f   = max;
-	ecsb->step.f  = step;
-
-	return E_CELL (ecsb);
-}
-
-void
-e_cell_spin_button_step   (ECellSpinButton       *ecsb,
-			   ECellView             *ecv,
-			   ECellSpinButtonStep    direction,
-			   gint                   col,
-			   gint                   row)
-{
- 	ECellSpinButtonView   *ecsb_view; 
-	
-	ETableModel           *etm;
-	gint                   value;
-	gint                   new_value;
-	gchar                 *str_value;
-	
-	g_return_if_fail (ecsb != NULL);
-	g_return_if_fail (M_IS_CELL_SPIN_BUTTON (ecsb));
-	g_return_if_fail (ecv != NULL);
-	
- 	ecsb_view  = (ECellSpinButtonView *) ecv; 
-	etm        = ecsb_view->cell_view.e_table_model;
-	
-	value  = GPOINTER_TO_INT (e_table_model_value_at (etm, col, row));
-	new_value = value;
-	
-	switch (direction) {
-	case STEP_UP:
-		new_value = CLAMP (value + ecsb->step.i, 
-				   ecsb->min.i, ecsb->max.i);
-		break;
-	case STEP_DOWN:
-		new_value = CLAMP (value - ecsb->step.i, 
-				   ecsb->min.i, ecsb->max.i);
-		break;
-	default:
-		break;
-	};
-
-	str_value = g_strdup_printf ("%d", new_value);
-
-	e_table_model_set_value_at (etm, col, row, str_value);
-
-	g_free (str_value);
-}
-
-void
-e_cell_spin_button_step_float  (ECellSpinButton       *ecsb,
-				ECellView             *ecv,
-				ECellSpinButtonStep    direction,
-				gint                   col,
-				gint                   row)
-{
- 	ECellSpinButtonView   *ecsb_view; 
-	
-	ETableModel           *etm;
-	gfloat                 value;
-	gfloat                 new_value;
-	gchar                 *str_value;
-	
-	g_return_if_fail (ecsb != NULL);
-	g_return_if_fail (M_IS_CELL_SPIN_BUTTON (ecsb));
-	g_return_if_fail (ecv != NULL);
-	
- 	ecsb_view  = (ECellSpinButtonView *) ecv; 
-	etm        = ecsb_view->cell_view.e_table_model;
-	
-	value  = *(gfloat *) e_table_model_value_at (etm, col, row);
-
-	switch (direction) {
-	case STEP_UP:
-		new_value = CLAMP (value + ecsb->step.f, 
-				   ecsb->min.f, ecsb->max.f);
-		break;
-	case STEP_DOWN:
-		new_value = CLAMP (value - ecsb->step.f, 
-				   ecsb->min.f, ecsb->max.f);
-		break;
-	default:
-		new_value = value;
-		break;
-	};
-	
-	str_value = g_strdup_printf ("%f", new_value);
-
-	e_table_model_set_value_at (etm, col, row, str_value);
-	
-	g_free (str_value);
-}
-
-E_MAKE_TYPE (e_cell_spin_button, "ECellSpinButton", ECellSpinButton, 
-	     e_cell_spin_button_class_init, e_cell_spin_button_init, 
-	     PARENT_TYPE)
-
diff --git a/widgets/table/e-cell-spin-button.h b/widgets/table/e-cell-spin-button.h
deleted file mode 100644
index 4326c0429c..0000000000
--- a/widgets/table/e-cell-spin-button.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell-spin-button.h: Spin button item for e-table.
- * Copyright 2001, CodeFactory AB
- * Copyright 2001, Mikael Hallendal <micke@codefactory.se>
- *
- * Authors:
- *   Mikael Hallendal <micke@codefactory.se>
- *
- * Celltype for drawing a spinbutton in a cell. 
- *
- * Used ECellPopup by Damon Chaplin <damon@ximian.com> as base for 
- * buttondrawings.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef __E_CELL_SPIN_BUTTON_H__
-#define __E_CELL_SPIN_BUTTON_H__
-
-#include <glib.h>
-#include <gtk/gtktypeutils.h>
-#include <gal/e-table/e-cell.h>
-
-#define E_CELL_SPIN_BUTTON_TYPE        (e_cell_spin_button_get_type ())
-#define E_CELL_SPIN_BUTTON(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_CELL_SPIN_BUTTON_TYPE, ECellSpinButton))
-#define E_CELL_SPIN_BUTTON_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_CELL_SPIN_BUTTON_TYPE, ECellSpinButtonClass))
-#define M_IS_CELL_SPIN_BUTTON(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_SPIN_BUTTON_TYPE))
-#define M_IS_CELL_SPIN_BUTTON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_SPIN_BUTTON_TYPE))
-
-typedef union {
-	gint     i;
-	gfloat   f;
-} ECellSpinButtonData;
-
-typedef enum {
-	STEP_UP,
-	STEP_DOWN
-} ECellSpinButtonStep;
-
-typedef struct {
-	ECell                  parent;
-
-	ECell                 *child;
-
-	ECellSpinButtonData    min;
-	ECellSpinButtonData    max;
-	ECellSpinButtonData    step;
-	
-	gboolean               up_pressed;
-	gboolean               down_pressed;
-
-} ECellSpinButton;
-
-typedef struct {
-	ECellClass    parent_class;
-	
-	/* Functions */
-	void    (*step)    (ECellSpinButton       *mcsb,
-			    ECellView             *ecv,
-			    ECellSpinButtonStep    direction,
-			    gint                   col,
-			    gint                   row);
-} ECellSpinButtonClass;
-
-GType      e_cell_spin_button_get_type     (void);
-ECell *    e_cell_spin_button_new          (gint     min,
-					    gint     max,
-					    gint     step,
-					    ECell   *child_cell);
-
-ECell *    e_cell_spin_button_new_float    (gfloat    min,
- 					    gfloat    max, 
- 					    gfloat    step,
-					    ECell    *child_cell); 
-
-
-void       e_cell_spin_button_step         (ECellSpinButton       *mcsb,
-					    ECellView             *ecv,
-					    ECellSpinButtonStep    direction,
-					    gint                   col,
-					    gint                   row);
-
-void       e_cell_spin_button_step_float   (ECellSpinButton       *mcsb,
-					    ECellView             *ecv,
-					    ECellSpinButtonStep    direction,
-					    gint                   col,
-					    gint                   row);
-
-#endif /* __E_CELL_SPIN_BUTTON__ */
-
diff --git a/widgets/table/e-cell-text.c b/widgets/table/e-cell-text.c
deleted file mode 100644
index cbc0fddca8..0000000000
--- a/widgets/table/e-cell-text.c
+++ /dev/null
@@ -1,2854 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell-text.c: Text cell renderer.
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Miguel de Icaza <miguel@ximian.com>
- *          Chris Lahey <clahey@ximian.com>
- *
- * A lot of code taken from:
- *
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget.  Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <math.h>
-#include <string.h>
-#include <gdk/gdkx.h> /* for BlackPixel */
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include "e-cell-text.h"
-#include "gal/util/e-util.h"
-#include "gal/widgets/e-canvas.h"
-#include "gal/widgets/e-unicode.h"
-#include "e-table-item.h"
-#include "gal/util/e-text-event-processor.h"
-#include "gal/e-text/e-text.h"
-#include "gal/util/e-text-event-processor-emacs-like.h"
-#include "gal/util/e-i18n.h"
-#include "e-table-tooltip.h"
-#include "gal/a11y/e-table/gal-a11y-e-cell-registry.h"
-#include "gal/a11y/e-table/gal-a11y-e-cell-text.h"
-
-#define d(x)
-#define DO_SELECTION 1
-#define VIEW_TO_CELL(view) E_CELL_TEXT (((ECellView *)view)->ecell)
-
-#if d(!)0
-#define e_table_item_leave_edit_(x) (e_table_item_leave_edit((x)), g_print ("%s: e_table_item_leave_edit\n", __FUNCTION__))
-#else
-#define e_table_item_leave_edit_(x) (e_table_item_leave_edit((x)))
-#endif
-
-#define ECT_CLASS(c) (E_CELL_TEXT_CLASS(GTK_OBJECT_GET_CLASS ((c))))
-
-/* This defines a line of text */
-struct line {
-	char *text;	/* Line's text UTF-8, it is a pointer into the text->text string */
-	int length;	/* Line's length in BYTES */
-	int width;	/* Line's width in pixels */
-	int ellipsis_length;  /* Length before adding ellipsis in BYTES */
-};
-
-/* Object argument IDs */
-enum {
-	PROP_0,
-
-	PROP_STRIKEOUT_COLUMN,
-	PROP_UNDERLINE_COLUMN,
-	PROP_BOLD_COLUMN,
-	PROP_COLOR_COLUMN,
-	PROP_EDITABLE,
-	PROP_BG_COLOR_COLUMN
-};
-
-
-enum {
-	E_SELECTION_PRIMARY,
-	E_SELECTION_CLIPBOARD
-};
-
-/* signals */
-enum {
-	TEXT_INSERTED,
-	TEXT_DELETED,
-	LAST_SIGNAL
-};
-
-static guint signals [LAST_SIGNAL] = { 0 };
-
-static GdkAtom clipboard_atom = GDK_NONE;
-
-#define PARENT_TYPE e_cell_get_type ()
-
-#define UTF8_ATOM  gdk_atom_intern ("UTF8_STRING", FALSE)
-
-#define TEXT_PAD 4
-
-typedef struct {
-	gpointer lines;			/* Text split into lines (private field) */
-	int num_lines;			/* Number of lines of text */
-	int max_width;
-	int ref_count;
-} ECellTextLineBreaks;
-	
-
-typedef struct _CellEdit CellEdit;
-
-typedef struct {
-	ECellView    cell_view;
-	GdkGC       *gc;
-	GdkCursor *i_cursor;
-	GdkBitmap *stipple;		/* Stipple for text */
-	
-	GnomeCanvas *canvas;
-
-	/*
-	 * During editing.
-	 */
-	CellEdit    *edit;
-
-
-	int xofs, yofs;                 /* This gets added to the x
-                                           and y for the cell text. */
-	double ellipsis_width[2];      /* The width of the ellipsis. */
-
-} ECellTextView;
-
-struct _CellEdit {
-
-	ECellTextView *text_view;
-
-	int model_col, view_col, row;
-	int cell_width;
-
-	PangoLayout *layout;
-
-	char *text;
-
-	char         *old_text;
-
-	/*
-	 * Where the editing is taking place
-	 */
-
-	int xofs_edit, yofs_edit;       /* Offset because of editing.
-                                           This is negative compared
-                                           to the other offsets. */
-
-	/* This needs to be reworked a bit once we get line wrapping. */
-	int selection_start;            /* Start of selection - IN BYTES */
-	int selection_end;              /* End of selection - IN BYTES */
-	gboolean select_by_word;        /* Current selection is by word */
-
-	/* This section is for drag scrolling and blinking cursor. */
-	/* Cursor handling. */
-	gint timeout_id;                /* Current timeout id for scrolling */
-	GTimer *timer;                  /* Timer for blinking cursor and scrolling */
-
-	gint lastx, lasty;              /* Last x and y motion events */
-	gint last_state;                /* Last state */
-	gulong scroll_start;            /* Starting time for scroll (microseconds) */
-
-	gint show_cursor;               /* Is cursor currently shown */
-	gboolean button_down;           /* Is mouse button 1 down */
-
-	ETextEventProcessor *tep;       /* Text Event Processor */
-
-	GtkWidget *invisible;           /* For selection handling */
-	gboolean has_selection;         /* TRUE if we have the selection */
-	gchar *primary_selection;       /* Primary selection text */
-	gint primary_length;            /* Primary selection text length in BYTES */
-	gchar *clipboard_selection;     /* Clipboard selection text */
-	gint clipboard_length;          /* Clipboard selection text length in BYTES */
-
-	guint pointer_in : 1;
-	guint default_cursor_shown : 1;
-	GtkIMContext *im_context;
-	gboolean need_im_reset;
-	gboolean im_context_signals_registered;
-
-	guint16 preedit_length;       /* length of preedit string, in bytes */
-
-	ECellActions actions;
-};
-
-static void e_cell_text_view_command (ETextEventProcessor *tep, ETextEventProcessorCommand *command, gpointer data);
-
-static void e_cell_text_view_get_selection (CellEdit *edit, GdkAtom selection, guint32 time);
-static void e_cell_text_view_supply_selection (CellEdit *edit, guint time, GdkAtom selection, char *data, gint length);
-
-static void _get_tep (CellEdit *edit);
-
-static gint get_position_from_xy (CellEdit *edit, gint x, gint y);
-static gboolean _blink_scroll_timeout (gpointer data);
-
-static void ect_free_color (gchar *color_spec, GdkColor *color, GdkColormap *colormap);
-static GdkColor* e_cell_text_get_color (ECellTextView *cell_view, gchar *color_spec);
-static void e_cell_text_preedit_changed_cb (GtkIMContext *context, ECellTextView *text_view);
-static void e_cell_text_commit_cb (GtkIMContext *context, const gchar  *str, ECellTextView *text_view);
-static gboolean e_cell_text_retrieve_surrounding_cb (GtkIMContext *context, ECellTextView *text_view);
-static gboolean e_cell_text_delete_surrounding_cb   (GtkIMContext *context, gint          offset, gint          n_chars, ECellTextView        *text_view);
-static void _insert (ECellTextView *text_view, char *string, int value);
-static void _delete_selection (ECellTextView *text_view);
-static PangoAttrList* build_attr_list (ECellTextView *text_view, int row, int text_length);
-
-static ECellClass *parent_class;
-
-char *
-e_cell_text_get_text (ECellText *cell, ETableModel *model, int col, int row)
-{
-	if (ECT_CLASS(cell)->get_text)
-		return ECT_CLASS(cell)->get_text (cell, model, col, row);
-	else
-		return NULL;
-}
-
-void
-e_cell_text_free_text (ECellText *cell, char *text)
-{
-	if (ECT_CLASS(cell)->free_text)
-		ECT_CLASS(cell)->free_text (cell, text);
-}
-
-void
-e_cell_text_set_value (ECellText *cell, ETableModel *model, int col, int row,
-		       const char *text)
-{
-	if (ECT_CLASS(cell)->set_value)
-		ECT_CLASS(cell)->set_value (cell, model, col, row, text);
-}
-
-static char *
-ect_real_get_text (ECellText *cell, ETableModel *model, int col, int row)
-{
-	return e_table_model_value_at(model, col, row);
-}
-
-static void
-ect_real_free_text (ECellText *cell, char *text)
-{
-}
-
-/* This is the default method for setting the ETableModel value based on
-   the text in the ECellText. This simply uses the text as it is - it assumes
-   the value in the model is a char*. Subclasses may parse the text into
-   data structures to pass to the model. */
-static void
-ect_real_set_value (ECellText *cell, ETableModel *model, int col, int row,
-		    const char *text)
-{
-	e_table_model_set_value_at (model, col, row, text);
-}
-
-static void
-ect_queue_redraw (ECellTextView *text_view, int view_col, int view_row)
-{
-	e_table_item_redraw_range (
-		text_view->cell_view.e_table_item_view,
-		view_col, view_row, view_col, view_row);
-}
-
-/*
- * Shuts down the editing process
- */
-static void
-ect_stop_editing (ECellTextView *text_view, gboolean commit)
-{
-	CellEdit *edit = text_view->edit;
-	int row, view_col, model_col;
-	char *old_text, *text;
-
-	if (!edit)
-		return;
-
-	row = edit->row;
-	view_col = edit->view_col;
-	model_col = edit->model_col;
-	
-	old_text = edit->old_text;
-	text = edit->text;
-	if (edit->invisible)
-		gtk_widget_destroy (edit->invisible);
-	if (edit->tep)
-		g_object_unref (edit->tep);
-	if (edit->primary_selection)
-		g_free (edit->primary_selection);
-	if (edit->clipboard_selection)
-		g_free (edit->clipboard_selection);
-	if (! edit->default_cursor_shown){
-		gdk_window_set_cursor (GTK_WIDGET(text_view->canvas)->window, NULL);
-		edit->default_cursor_shown = TRUE;
-	}
-	if (edit->timeout_id) {
-		g_source_remove (edit->timeout_id);
-		edit->timeout_id = 0;
-	}
-	if (edit->timer) {
-		g_timer_stop (edit->timer);
-		g_timer_destroy (edit->timer);
-		edit->timer = NULL;
-	}
-	
-	g_signal_handlers_disconnect_matched (
-		edit->im_context,
-		G_SIGNAL_MATCH_DATA, 0, 0,
-		NULL, NULL, text_view);
-
-	if (edit->layout)
-		g_object_unref (edit->layout);
-
-	g_free (edit);
-
-	text_view->edit = NULL;
-	if (commit) {
-		/*
-		 * Accept the currently edited text.  if it's the same as what's in the cell, do nothing.
-		 */
-		ECellView *ecell_view = (ECellView *) text_view;
-		ECellText *ect = (ECellText *) ecell_view->ecell;
-
-		if (strcmp (old_text, text)) {
-			e_cell_text_set_value (ect, ecell_view->e_table_model,
-					       model_col, row, text);
-		}
-	}
-	g_free (text);
-	g_free (old_text);
-
-	ect_queue_redraw (text_view, view_col, row);
-}
-
-/*
- * Cancels the edits
- */
-static void
-ect_cancel_edit (ECellTextView *text_view)
-{
-	ect_stop_editing (text_view, FALSE);
-	e_table_item_leave_edit_ (text_view->cell_view.e_table_item_view);
-}
-
-/*
- * ECell::new_view method
- */
-static ECellView *
-ect_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
-	ECellTextView *text_view = g_new0 (ECellTextView, 1);
-	GnomeCanvas *canvas = GNOME_CANVAS_ITEM (e_table_item_view)->canvas;
-	
-	text_view->cell_view.ecell = ecell;
-	text_view->cell_view.e_table_model = table_model;
-	text_view->cell_view.e_table_item_view = e_table_item_view;
-
-	text_view->canvas = canvas;
-
-	text_view->xofs = 0.0;
-	text_view->yofs = 0.0;
-	
-	return (ECellView *)text_view;
-}
-
-/*
- * ECell::kill_view method
- */
-static void
-ect_kill_view (ECellView *ecv)
-{
-	ECellTextView *text_view = (ECellTextView *) ecv;
-
-	g_free (text_view);
-}
-
-/*
- * ECell::realize method
- */
-static void
-ect_realize (ECellView *ecell_view)
-{
-	ECellTextView *text_view = (ECellTextView *) ecell_view;
-	
-	text_view->gc = gdk_gc_new (GTK_WIDGET (text_view->canvas)->window);
-
-	text_view->i_cursor = gdk_cursor_new (GDK_XTERM);
-	
-	if (parent_class->realize)
-		(* parent_class->realize) (ecell_view);
-}
-
-/*
- * ECell::unrealize method
- */
-static void
-ect_unrealize (ECellView *ecv)
-{
-	ECellTextView *text_view = (ECellTextView *) ecv;
-	ECellText *ect = (ECellText*) ecv->ecell;
-	GdkColormap *colormap;
-
-	gdk_gc_unref (text_view->gc);
-	text_view->gc = NULL;
-
-	if (text_view->edit){
-		ect_cancel_edit (text_view);
-	}
-
-	if (text_view->stipple)
-		gdk_bitmap_unref (text_view->stipple);
-
-	gdk_cursor_destroy (text_view->i_cursor);
-
-	if (ect->colors) {
-		colormap = gtk_widget_get_colormap (GTK_WIDGET (text_view->canvas));
-		g_hash_table_foreach (ect->colors, (GHFunc) ect_free_color,
-				      colormap);
-		g_hash_table_destroy (ect->colors);
-		ect->colors = NULL;
-	}
-
-	if (parent_class->unrealize)
-		(* parent_class->unrealize) (ecv);
-}
-
-static void
-ect_free_color (gchar *color_spec, GdkColor *color, GdkColormap *colormap)
-{
-	g_free (color_spec);
-
-	/* This frees the color. Note we don't free it if it is the special
-	   value. */
-	if (color != (GdkColor*) 1) {
-		gulong pix = color->pixel;
-
-		gdk_colors_free (colormap, &pix, 1, 0);
-
-		/* This frees the memory for the GdkColor. */
-		gdk_color_free (color);
-	}
-}
-
-
-static PangoAttrList*
-build_attr_list (ECellTextView *text_view, int row, int text_length) 
-{
-
-	ECellView *ecell_view = (ECellView *) text_view;
-	ECellText *ect = E_CELL_TEXT (ecell_view->ecell);
-	PangoAttrList *attrs = pango_attr_list_new ();
-	gboolean bold, strikeout, underline;
-
-	bold = ect->bold_column >= 0 &&
-		row >= 0 &&
-		e_table_model_value_at(ecell_view->e_table_model, ect->bold_column, row);
-	strikeout = ect->strikeout_column >= 0 &&
-		row >= 0 &&
-		e_table_model_value_at(ecell_view->e_table_model, ect->strikeout_column, row);
-	underline = ect->underline_column >= 0 &&
-		row >= 0 &&
-		e_table_model_value_at(ecell_view->e_table_model, ect->underline_column, row);
-
-	if (bold || strikeout || underline) {
-		if (bold) {
-			PangoAttribute *attr = pango_attr_weight_new (PANGO_WEIGHT_BOLD);
-			attr->start_index = 0;
-			attr->end_index = text_length;
-
-			pango_attr_list_insert_before (attrs, attr);
-		}
-		if (strikeout) {
-			PangoAttribute *attr = pango_attr_strikethrough_new (TRUE);
-			attr->start_index = 0;
-			attr->end_index = text_length;
-
-			pango_attr_list_insert_before (attrs, attr);
-		}
-		if (underline) {
-			PangoAttribute *attr = pango_attr_underline_new (TRUE);
-			attr->start_index = 0;
-			attr->end_index = text_length;
-
-			pango_attr_list_insert_before (attrs, attr);
-		}
-	}
-	return attrs;
-}
-
-static PangoLayout *
-layout_with_preedit (ECellTextView *text_view, int row, const char *text, gint width)
-{
-	CellEdit *edit = text_view->edit;
-	PangoAttrList *attrs ;
-	PangoLayout *layout;
-	GString *tmp_string = g_string_new (NULL);
-	PangoAttrList *preedit_attrs = NULL;
-	gchar *preedit_string = NULL;
-	gint preedit_length = 0;
-	gint text_length = strlen (text);
-	gint mlen = MIN(edit->selection_start,text_length);
-	
-
-	gtk_im_context_get_preedit_string (edit->im_context,
-					&preedit_string,&preedit_attrs,
-					NULL);
-	preedit_length = edit->preedit_length = strlen (preedit_string);;
-
-	layout = edit->layout;
-
-	g_string_prepend_len (tmp_string, text,text_length); 
-
-	if (preedit_length) {
-		
-		/* mlen is the text_length in bytes, not chars
-		 * check whether we are not inserting into
-		 * the middle of a utf8 character
-		 */
-
-		if (mlen < text_length) {
-			if (!g_utf8_validate (text+mlen, -1, NULL)) {
-				gchar *tc;
-				tc = g_utf8_find_next_char (text+mlen,NULL);
-				if (tc) {
-					mlen = (gint) (tc - text);
-				}
-			}
-		}
-
-		g_string_insert (tmp_string, mlen, preedit_string);
-	} 
-
-	pango_layout_set_text (layout, tmp_string->str, tmp_string->len);
-
-	attrs = (PangoAttrList *) build_attr_list (text_view, row, text_length);
-
-	if (preedit_length)
-		pango_attr_list_splice (attrs, preedit_attrs, mlen, preedit_length);
-	pango_layout_set_attributes (layout, attrs);
-	g_string_free (tmp_string, TRUE);
-	if (preedit_string)
-		g_free (preedit_string);
-	if (preedit_attrs)
-		pango_attr_list_unref (preedit_attrs);
-	pango_attr_list_unref (attrs);
-	return layout;
-}
-
-static PangoLayout *
-build_layout (ECellTextView *text_view, int row, const char *text, gint width)
-{
-	ECellView *ecell_view = (ECellView *) text_view;
-	ECellText *ect = E_CELL_TEXT (ecell_view->ecell);
-	PangoAttrList *attrs ;
-	PangoLayout *layout;
-
-	layout = gtk_widget_create_pango_layout (GTK_WIDGET (((GnomeCanvasItem *)ecell_view->e_table_item_view)->canvas), text);
-
-	attrs = (PangoAttrList *) build_attr_list (text_view, row, text ? strlen (text) : 0);
-
-	pango_layout_set_attributes (layout, attrs);
-	pango_attr_list_unref (attrs);
-
-	if (text_view->edit || width <= 0)
-		return layout;
-
-	pango_layout_set_width (layout, width * PANGO_SCALE);
-	pango_layout_set_wrap (layout, PANGO_WRAP_CHAR);
-
-	if (pango_layout_get_line_count (layout) > 1) {
-		PangoLayoutLine *line = pango_layout_get_line (layout, 0);
-		gchar *line_text = g_strdup (pango_layout_get_text (layout));
-		gchar *last_char = g_utf8_find_prev_char (line_text, line_text + line->length - 1);
-		while (last_char && pango_layout_get_line_count (layout) > 1) {
-			gchar *new_text;
-			last_char = g_utf8_find_prev_char (line_text, last_char);
-			if (last_char)
-				*last_char = '\0';
-			new_text = g_strconcat (line_text, "...", NULL);
-			pango_layout_set_text (layout, new_text, -1);
-			g_free (new_text);
-		}
-		g_free (line_text);
-	}
-
-	switch (ect->justify) {
-	case GTK_JUSTIFY_RIGHT:
-		pango_layout_set_alignment (layout, PANGO_ALIGN_RIGHT);
-		break;
-	case GTK_JUSTIFY_CENTER:
-		pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
-		break;
-	case GTK_JUSTIFY_LEFT:
-	default:
-		break;
-	}
-	
-	return layout;
-}
-
-static PangoLayout *
-generate_layout (ECellTextView *text_view, int model_col, int view_col, int row, int width)
-{
-	ECellView *ecell_view = (ECellView *) text_view;
-	ECellText *ect = E_CELL_TEXT (ecell_view->ecell);
-	PangoLayout *layout;
-	CellEdit *edit = text_view->edit;
-
-	if (edit && edit->layout && edit->model_col == model_col && edit->row == row) {
-		g_object_ref (edit->layout);
-		return edit->layout;
-	}
-
-	if (row >= 0) {
-		char *temp = e_cell_text_get_text(ect, ecell_view->e_table_model, model_col, row);
-		layout = build_layout (text_view, row, temp ? temp : "?", width);
-		e_cell_text_free_text(ect, temp);
-	} else
-		layout = build_layout (text_view, row, "Mumbo Jumbo", width);
-
-	return layout;
-}
-
-
-static void
-draw_pango_rectangle (GdkDrawable *drawable, GdkGC *gc, int x1, int y1, PangoRectangle rect)
-{
-	int width = rect.width / PANGO_SCALE;
-	int height = rect.height / PANGO_SCALE;
-	if (width <= 0)
-		width = 1;
-	if (height <= 0)
-		height = 1;
-	gdk_draw_rectangle (drawable, gc, TRUE,
-			    x1 + rect.x / PANGO_SCALE, y1 + rect.y / PANGO_SCALE, width, height);
-}
-
-static gboolean
-show_pango_rectangle (CellEdit *edit, PangoRectangle rect)
-{
-	int x1 = rect.x / PANGO_SCALE;
-	int x2 = (rect.x + rect.width) / PANGO_SCALE;
-#if 0
-	int y1 = rect.y / PANGO_SCALE;
-	int y2 = (rect.y + rect.height) / PANGO_SCALE;
-#endif
-
-	int new_xofs_edit = edit->xofs_edit;
-	int new_yofs_edit = edit->yofs_edit;
-
-	if (x1 < new_xofs_edit)
-		new_xofs_edit = x1;
-	if (2 + x2 - edit->cell_width > new_xofs_edit)
-		new_xofs_edit = 2 + x2 - edit->cell_width;
-	if (new_xofs_edit < 0)
-		new_xofs_edit = 0;
-
-#if 0
-	if (y1 < new_yofs_edit)
-		new_yofs_edit = y1;
-	if (2 + y2 - edit->cell_height > new_yofs_edit)
-		new_yofs_edit = 2 + y2 - edit->cell_height;
-	if (new_yofs_edit < 0)
-		new_yofs_edit = 0;
-#endif
-
-	if (new_xofs_edit != edit->xofs_edit ||
-	    new_yofs_edit != edit->yofs_edit) {
-		edit->xofs_edit = new_xofs_edit;
-		edit->yofs_edit = new_yofs_edit;
-		return TRUE;
-	}
-
-	return FALSE;
-}
-
-/*
- * ECell::draw method
- */
-static void
-ect_draw (ECellView *ecell_view, GdkDrawable *drawable,
-	  int model_col, int view_col, int row, ECellFlags flags,
-	  int x1, int y1, int x2, int y2)
-{
-	PangoLayout *layout;
-	ECellTextView *text_view = (ECellTextView *) ecell_view;
-	ECellText *ect = E_CELL_TEXT (ecell_view->ecell);
-	CellEdit *edit = text_view->edit;
-	gboolean selected;
-	GdkColor *foreground, *cursor_color;
-	GtkWidget *canvas = GTK_WIDGET (text_view->canvas);
-	GdkRectangle clip_rect;
-	int x_origin, y_origin;
-
-	selected = flags & E_CELL_SELECTED;
-
-	if (selected) {
-		if (flags & E_CELL_FOCUSED)
-			foreground = &canvas->style->fg [GTK_STATE_SELECTED];
-		else
-			foreground = &canvas->style->fg [GTK_STATE_ACTIVE];
-		cursor_color = foreground;
-	} else {
-		foreground = &canvas->style->text [GTK_STATE_NORMAL];
-		cursor_color = foreground;
-
-		if (ect->color_column != -1) {
-			char *color_spec;
-			GdkColor *cell_foreground;
-
-			color_spec = e_table_model_value_at (ecell_view->e_table_model,
-							     ect->color_column, row);
-			cell_foreground = e_cell_text_get_color (text_view,
-								 color_spec);
-			if (cell_foreground)
-				foreground = cell_foreground;
-		}
-	}
-
-	gdk_gc_set_foreground (text_view->gc, foreground);
-
-	x1 += 4;
-	y1 += 1;
-	x2 -= 4;
-	y2 -= 1;
-
-	x_origin = x1 + ect->x + text_view->xofs - (edit ? edit->xofs_edit : 0);
-	y_origin = y1 + ect->y + text_view->yofs - (edit ? edit->yofs_edit : 0);
-
-	clip_rect.x = x1;
-	clip_rect.y = y1;
-	clip_rect.width = x2 - x1;
-	clip_rect.height = y2 - y1;
-
-	gdk_gc_set_clip_rectangle (text_view->gc, &clip_rect);
-	/*	clip_rect = &rect;*/
-
-	layout = generate_layout (text_view, model_col, view_col, row, x2 - x1);
-
-	if (edit && edit->view_col == view_col && edit->row == row) {
-		layout = layout_with_preedit  (text_view, row, edit->text ? edit->text : "?",  x2 - x1);
-	} 
-
-	gdk_draw_layout (drawable, text_view->gc,
-			 x_origin, y_origin,
-			 layout);
-
-	if (edit && edit->view_col == view_col && edit->row == row) {
-		if (edit->selection_start != edit->selection_end) {
-			int start_index, end_index;
-			PangoLayoutLine *line;
-			gint *ranges;
-			gint n_ranges, i;
-			PangoRectangle logical_rect;
-			GdkRegion *clip_region = gdk_region_new ();
-			GdkRegion *rect_region;
-			GdkGC *selection_gc;
-			GdkGC *text_gc;
-
-			start_index = MIN (edit->selection_start, edit->selection_end);
-			end_index = edit->selection_start ^ edit->selection_end ^ start_index;
-
-			if (edit->has_selection) {
-				selection_gc = canvas->style->base_gc [GTK_STATE_SELECTED];
-				text_gc = canvas->style->text_gc[GTK_STATE_SELECTED];
-			} else {
-				selection_gc = canvas->style->base_gc [GTK_STATE_ACTIVE];
-				text_gc = canvas->style->text_gc[GTK_STATE_ACTIVE];
-			}
-
-			gdk_gc_set_clip_rectangle (selection_gc, &clip_rect);
-
-			line = pango_layout_get_lines (layout)->data;
-
-			pango_layout_line_get_x_ranges (line, start_index, end_index, &ranges, &n_ranges);
-
-			pango_layout_get_extents (layout, NULL, &logical_rect);
-
-			for (i=0; i < n_ranges; i++) {
-				GdkRectangle sel_rect;
-
-				sel_rect.x = x_origin + ranges[2*i] / PANGO_SCALE;
-				sel_rect.y = y_origin;
-				sel_rect.width = (ranges[2*i + 1] - ranges[2*i]) / PANGO_SCALE;
-				sel_rect.height = logical_rect.height / PANGO_SCALE;
-
-				gdk_draw_rectangle (drawable, selection_gc, TRUE,
-						    sel_rect.x, sel_rect.y, sel_rect.width, sel_rect.height);
-
-				gdk_region_union_with_rect (clip_region, &sel_rect);
-			}
-
-			rect_region = gdk_region_rectangle (&clip_rect);
-			gdk_region_intersect (clip_region, rect_region);
-			gdk_region_destroy (rect_region);
-
-			gdk_gc_set_clip_region (text_gc, clip_region);
-			gdk_draw_layout (drawable, text_gc, 
-					 x_origin, y_origin,
-					 layout);
-			gdk_gc_set_clip_region (text_gc, NULL);
-			gdk_gc_set_clip_region (selection_gc, NULL);
-
-			gdk_region_destroy (clip_region);
-			g_free (ranges);
-		} else {
-			if (edit->show_cursor) {
-				PangoRectangle strong_pos, weak_pos;
-				pango_layout_get_cursor_pos (layout, edit->selection_start + edit->preedit_length, &strong_pos, &weak_pos);
-				
-				draw_pango_rectangle (drawable, text_view->gc, x_origin, y_origin, strong_pos);
-				if (strong_pos.x != weak_pos.x ||
-				    strong_pos.y != weak_pos.y ||
-				    strong_pos.width != weak_pos.width ||
-				    strong_pos.height != weak_pos.height)
-					draw_pango_rectangle (drawable, text_view->gc, x_origin, y_origin, weak_pos);
-			}
-		}
-	}
-
-	g_object_unref (layout);
-}
-
-/*
- * Get the background color
- */
-static gchar *
-ect_get_bg_color(ECellView *ecell_view, int row)
-{
-	ECellText *ect = E_CELL_TEXT (ecell_view->ecell);
-	gchar *color_spec;
-
-	if (ect->bg_color_column == -1)
-		return NULL;
-
-	color_spec = e_table_model_value_at (ecell_view->e_table_model,
-	                                     ect->bg_color_column, row);
-
-	return color_spec;
-}
-
-
-/*
- * Selects the entire string
- */
-
-static void
-ect_edit_select_all (ECellTextView *text_view)
-{
-	g_assert (text_view->edit);
-	
-	text_view->edit->selection_start = 0;
-	text_view->edit->selection_end = strlen (text_view->edit->text);
-}
-
-static gboolean
-key_begins_editing (GdkEventKey *event)
-{
-	if (event->length == 0)
-		return FALSE;
-
-	return TRUE;
-}
-
-/*
- * ECell::event method
- */
-static gint
-ect_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row, ECellFlags flags, ECellActions *actions)
-{
-	ECellTextView *text_view = (ECellTextView *) ecell_view;
-	ETextEventProcessorEvent e_tep_event;
-	gboolean edit_display = FALSE;
-	gint preedit_len;
-	CellEdit *edit = text_view->edit;
-	GtkWidget *canvas = GTK_WIDGET (text_view->canvas);
-	gint return_val = 0;
-	d(gboolean press = FALSE);
-
-	if (!(flags & E_CELL_EDITING))
-		return 0;
-	
-	if ( edit && !edit->preedit_length && flags & E_CELL_PREEDIT)
-		return TRUE;
-
-	if (edit && edit->view_col == view_col && edit->row == row) {
-		edit_display = TRUE;
-	}
-
-	e_tep_event.type = event->type;
-	switch (event->type) {
-	case GDK_FOCUS_CHANGE:
-		break;
-	case GDK_KEY_PRESS: /* Fall Through */
-		if (edit_display) {
-			if (edit->im_context && 
-				!edit->im_context_signals_registered) {
-
-				g_signal_connect (edit->im_context, 
-						"preedit_changed",
-						G_CALLBACK (\
-						e_cell_text_preedit_changed_cb),
-						text_view);
-
-				g_signal_connect (edit->im_context, 
-						"commit",
-						G_CALLBACK (\
-						e_cell_text_commit_cb), 
-						text_view);
-
-				g_signal_connect (edit->im_context, 
-						"retrieve_surrounding",
-						G_CALLBACK (\
-						e_cell_text_retrieve_surrounding_cb), 
-						text_view);
-
-				g_signal_connect (edit->im_context, 
-						"delete_surrounding",
-						G_CALLBACK (\
-						e_cell_text_delete_surrounding_cb), 
-						text_view);
-
-				edit->im_context_signals_registered = TRUE;
-			}
-
-			edit->show_cursor = FALSE;
-
-		} else {
-			if (edit->im_context) {
-				g_signal_handlers_disconnect_matched (
-						edit->im_context, 
-						G_SIGNAL_MATCH_DATA, 0, 0, 
-						NULL, NULL, edit);
-				edit->im_context_signals_registered = FALSE;
-			}
-
-			ect_stop_editing (text_view, TRUE);
-			if (edit->timeout_id) {
-				g_source_remove(edit->timeout_id);
-				edit->timeout_id = 0;
-			}
-		}
-		return_val = TRUE;
-		/* Fallthrough */
-	case GDK_KEY_RELEASE:
-		preedit_len = edit->preedit_length;
-		if (edit_display && edit->im_context &&
-				gtk_im_context_filter_keypress (\
-					edit->im_context,
-					(GdkEventKey*)event)) {
-
-			edit->need_im_reset = TRUE;
-			if (preedit_len && flags & E_CELL_PREEDIT)
-				return FALSE;
-			else
-		 		return TRUE;
-		}
-				
-		if (event->key.keyval == GDK_Escape){
-			ect_cancel_edit (text_view);
-			return_val = TRUE;
-			break;
-		}
-
-		if ((!edit_display) &&
-		    e_table_model_is_cell_editable (ecell_view->e_table_model, model_col, row) &&
-		    key_begins_editing (&event->key)) {
-			  e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
-			  ect_edit_select_all (text_view);
-			  edit = text_view->edit;
-			  edit_display = TRUE;
-		}		
-		if (edit_display) {
-			GdkEventKey key = event->key;
-			if (key.keyval == GDK_KP_Enter || key.keyval == GDK_Return){
-				e_table_item_leave_edit_ (text_view->cell_view.e_table_item_view);
-			} else {
-				e_tep_event.key.time = key.time;
-				e_tep_event.key.state = key.state;
-				e_tep_event.key.keyval = key.keyval;
-
-				/* This is probably ugly hack, but we have to handle UTF-8 input somehow */
-#if 0
-				e_tep_event.key.length = key.length;
-				e_tep_event.key.string = key.string;
-#else
-				e_tep_event.key.string = e_utf8_from_gtk_event_key (canvas, key.keyval, key.string);
-				if (e_tep_event.key.string != NULL) {
-					e_tep_event.key.length = strlen (e_tep_event.key.string);
-				} else {
-					e_tep_event.key.length = 0;
-				}
-#endif
-				_get_tep (edit);
-				return_val = e_text_event_processor_handle_event (edit->tep, &e_tep_event);
-				if (e_tep_event.key.string) 
-					g_free (e_tep_event.key.string);
-				break;
-			}
-		}
-
-		break;
-	case GDK_BUTTON_PRESS: /* Fall Through */
-		d(press = TRUE);
-	case GDK_BUTTON_RELEASE:
-		d(g_print ("%s: %s\n", __FUNCTION__, press ? "GDK_BUTTON_PRESS" : "GDK_BUTTON_RELEASE"));
-		event->button.x -= 4;
-		event->button.y -= 1;
-		if ((!edit_display) 
-		    && e_table_model_is_cell_editable (ecell_view->e_table_model, model_col, row)
-		    && event->type == GDK_BUTTON_RELEASE
-		    && event->button.button == 1) {
-			GdkEventButton button = event->button;
-
-			e_table_item_enter_edit (text_view->cell_view.e_table_item_view, view_col, row);
-			edit = text_view->edit;
-			edit_display = TRUE;
-			
-			e_tep_event.button.type = GDK_BUTTON_PRESS;
-			e_tep_event.button.time = button.time;
-			e_tep_event.button.state = button.state;
-			e_tep_event.button.button = button.button;
-			e_tep_event.button.position = get_position_from_xy (edit, event->button.x, event->button.y);
-			_get_tep (edit);
-			edit->actions = 0;
-			return_val = e_text_event_processor_handle_event (edit->tep,
-									  &e_tep_event);
-			*actions = edit->actions;
-			if (event->button.button == 1) {
-				if (event->type == GDK_BUTTON_PRESS)
-					edit->button_down = TRUE;
-				else
-					edit->button_down = FALSE;
-			}
-			edit->lastx = button.x;
-			edit->lasty = button.y;
-			edit->last_state = button.state;
-
-			e_tep_event.button.type = GDK_BUTTON_RELEASE;
-		}
-		if (edit_display) {
-			GdkEventButton button = event->button;
-			e_tep_event.button.time = button.time;
-			e_tep_event.button.state = button.state;
-			e_tep_event.button.button = button.button;
-			e_tep_event.button.position = get_position_from_xy (edit, event->button.x, event->button.y);
-			_get_tep (edit);
-			edit->actions = 0;
-			return_val = e_text_event_processor_handle_event (edit->tep,
-									  &e_tep_event);
-			*actions = edit->actions;
-			if (event->button.button == 1) {
-				if (event->type == GDK_BUTTON_PRESS)
-					edit->button_down = TRUE;
-				else
-					edit->button_down = FALSE;
-			}
-			edit->lastx = button.x;
-			edit->lasty = button.y;
-			edit->last_state = button.state;
-		}
-		break;
-	case GDK_MOTION_NOTIFY:
-		event->motion.x -= 4;
-		event->motion.y -= 1;
-		if (edit_display) {
-			GdkEventMotion motion = event->motion;
-			e_tep_event.motion.time = motion.time;
-			e_tep_event.motion.state = motion.state;
-			e_tep_event.motion.position = get_position_from_xy (edit, event->motion.x, event->motion.y);
-			_get_tep (edit);
-			edit->actions = 0;
-			return_val = e_text_event_processor_handle_event (edit->tep,
-									  &e_tep_event);
-			*actions = edit->actions;
-			edit->lastx = motion.x;
-			edit->lasty = motion.y;
-			edit->last_state = motion.state;
-		}
-		break;
-	case GDK_ENTER_NOTIFY:
-#if 0
-		edit->pointer_in = TRUE;
-#endif
-		if (edit_display) {
-			if (edit->default_cursor_shown){
-				gdk_window_set_cursor (canvas->window, text_view->i_cursor);
-				edit->default_cursor_shown = FALSE;
-			}
-		}
-		break;
-	case GDK_LEAVE_NOTIFY:
-#if 0
-		text_view->pointer_in = FALSE;
-#endif
-		if (edit_display) {
-			if (! edit->default_cursor_shown){
-				gdk_window_set_cursor (canvas->window, NULL);
-				edit->default_cursor_shown = TRUE;
-			}
-		}
-		break;
-	default:
-		break;
-	}
-
-	return return_val;
-}
-
-/*
- * ECell::height method
- */
-static int
-ect_height (ECellView *ecell_view, int model_col, int view_col, int row) 
-{
-	ECellTextView *text_view = (ECellTextView *) ecell_view;
-	gint height;
-	PangoLayout *layout;
-
-	layout = generate_layout (text_view, model_col, view_col, row, 0);
-	pango_layout_get_pixel_size (layout, NULL, &height);
-	g_object_unref (layout);
-	return height + 2;
-}
-
-/*
- * ECellView::enter_edit method
- */
-static void *
-ect_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
-{
-	ECellTextView *text_view = (ECellTextView *) ecell_view;
-	CellEdit *edit;
-	ECellText *ect = E_CELL_TEXT(ecell_view->ecell);
-	char *temp;
-
-	edit = g_new0 (CellEdit, 1);
-	text_view->edit = edit;
-
-	edit->im_context =  E_CANVAS (text_view->canvas)->im_context;
-	edit->need_im_reset = FALSE;
-	edit->im_context_signals_registered = FALSE;
-	edit->view_col = -1;
-	edit->model_col = -1;
-	edit->row = -1;
-
-	edit->text_view = text_view;
-	edit->model_col = model_col;
-	edit->view_col = view_col;
-	edit->row = row;
-	edit->cell_width = e_table_header_get_column (
-		((ETableItem *)ecell_view->e_table_item_view)->header,
-		view_col)->width - 8;
-
-	edit->layout = generate_layout (text_view, model_col, view_col, row, edit->cell_width);
-	
-	edit->xofs_edit = 0.0;
-	edit->yofs_edit = 0.0;
-	
-	edit->selection_start = 0;
-	edit->selection_end = 0;
-	edit->select_by_word = FALSE;
-
-	edit->timeout_id = g_timeout_add (10, _blink_scroll_timeout, text_view);
-	edit->timer = g_timer_new ();
-	g_timer_elapsed (edit->timer, &(edit->scroll_start));
-	g_timer_start (edit->timer);
-
-	edit->lastx = 0;
-	edit->lasty = 0;
-	edit->last_state = 0;
-
-	edit->scroll_start = 0;
-	edit->show_cursor = TRUE;
-	edit->button_down = FALSE;
-	
-	edit->tep = NULL;
-
-	edit->has_selection = FALSE;
-	
-	edit->invisible = NULL;
-	edit->primary_selection = NULL;
-	edit->primary_length = 0;
-	edit->clipboard_selection = NULL;
-	edit->clipboard_length = 0;
-
-	edit->pointer_in = FALSE;
-	edit->default_cursor_shown = TRUE;
-	
-	temp = e_cell_text_get_text(ect, ecell_view->e_table_model, model_col, row);
-	edit->old_text = g_strdup (temp);
-	e_cell_text_free_text(ect, temp);
-	edit->text = g_strdup (edit->old_text);
-
-#if 0
-	if (edit->pointer_in){
-		if (edit->default_cursor_shown){
-			gdk_window_set_cursor (GTK_WIDGET(item->canvas)->window, text_view->i_cursor);
-			edit->default_cursor_shown = FALSE;
-		}
-	}
-#endif
-	ect_queue_redraw (text_view, view_col, row);
-	
-	return NULL;
-}
-
-/*
- * ECellView::leave_edit method
- */
-static void
-ect_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context)
-{
-	ECellTextView *text_view = (ECellTextView *) ecell_view;
-	CellEdit *edit = text_view->edit;
-
-	if (edit){
-		ect_stop_editing (text_view, TRUE);
-	} else {
-		/*
-		 * We did invoke this leave edit internally
-		 */
-	}
-}
-
-/*
- * ECellView::save_state method
- */
-static void *
-ect_save_state (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context)
-{
-	ECellTextView *text_view = (ECellTextView *) ecell_view;
-	CellEdit *edit = text_view->edit;
-
-	int *save_state = g_new (int, 2);
-
-	save_state[0] = edit->selection_start;
-	save_state[1] = edit->selection_end;
-	return save_state;
-}
-
-/*
- * ECellView::load_state method
- */
-static void
-ect_load_state (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context, void *save_state)
-{
-	ECellTextView *text_view = (ECellTextView *) ecell_view;
-	CellEdit *edit = text_view->edit;
-	int length;
-	int *selection = save_state;
-
-	length = strlen (edit->text);
-
-	edit->selection_start = MIN (selection[0], length);
-	edit->selection_end = MIN (selection[1], length);
-
-	ect_queue_redraw (text_view, view_col, row);
-}
-
-/*
- * ECellView::free_state method
- */
-static void
-ect_free_state (ECellView *ecell_view, int model_col, int view_col, int row, void *save_state)
-{
-	g_free (save_state);
-}
-
-#define FONT_NAME "Sans Regular"
-
-static GnomeFont *
-get_font_for_size (double h)
-{
-	GnomeFontFace *face;
-	GnomeFont *font;
-	double asc, desc, size;
-
-	face = gnome_font_face_find (FONT_NAME);
-
-	asc = gnome_font_face_get_ascender (face);
-	desc = abs (gnome_font_face_get_descender (face));
-	size = h * 1000 / (asc + desc);
-
-	font = gnome_font_find_closest (FONT_NAME, size);
-
-	g_object_unref (face);
-	return font;
-}
-
-static void
-ect_print (ECellView *ecell_view, GnomePrintContext *context, 
-	   int model_col, int view_col, int row,
-	   double width, double height)
-{
-	GnomeFont *font = get_font_for_size (16);
-	char *string;
-	ECellText *ect = E_CELL_TEXT(ecell_view->ecell);
-	double ty, ly, text_width;
-	gboolean strikeout, underline;
-
-	string = e_cell_text_get_text(ect, ecell_view->e_table_model, model_col, row);
-	gnome_print_gsave(context);
-	if (gnome_print_moveto(context, 2, 2) == -1)
-				/* FIXME */;
-	if (gnome_print_lineto(context, width - 2, 2) == -1)
-				/* FIXME */;
-	if (gnome_print_lineto(context, width - 2, height - 2) == -1)
-				/* FIXME */;
-	if (gnome_print_lineto(context, 2, height - 2) == -1)
-				/* FIXME */;
-	if (gnome_print_lineto(context, 2, 2) == -1)
-				/* FIXME */;
-	if (gnome_print_clip(context) == -1)
-				/* FIXME */;
-
-	ty = (height - gnome_font_get_ascender(font) - gnome_font_get_descender(font)) / 2;
-	text_width = gnome_font_get_width_utf8 (font, string);
-
-	strikeout = ect->strikeout_column >= 0 && row >= 0 &&
-		e_table_model_value_at (ecell_view->e_table_model, ect->strikeout_column, row);
-	underline = ect->underline_column >= 0 && row >= 0 &&
-		e_table_model_value_at(ecell_view->e_table_model, ect->underline_column, row);
-
-	if (underline) {
-		ly = ty + gnome_font_get_underline_position (font);
-		gnome_print_newpath (context);
-		gnome_print_moveto (context, 2, ly);
-		gnome_print_lineto (context, MIN (2 + text_width, width - 2), ly);
-		gnome_print_setlinewidth (context, gnome_font_get_underline_thickness (font));
-		gnome_print_stroke (context);
-	}
-
-	if (strikeout) {
-		ly = ty + (gnome_font_get_ascender (font)  - gnome_font_get_underline_thickness (font))/ 2.0;
-		gnome_print_newpath (context);
-		gnome_print_moveto (context, 2, ly);
-		gnome_print_lineto (context, MIN (2 + text_width, width - 2), ly);
-		gnome_print_setlinewidth (context, gnome_font_get_underline_thickness (font));
-		gnome_print_stroke (context);
-	}
-
-	gnome_print_moveto(context, 2, ty);
-	gnome_print_setfont(context, font);
-	gnome_print_show(context, string);
-	gnome_print_grestore(context);
-	e_cell_text_free_text(ect, string);
-	g_object_unref (font);
-}
-
-static gdouble
-ect_print_height (ECellView *ecell_view, GnomePrintContext *context, 
-		  int model_col, int view_col, int row,
-		  double width)
-{
-	return 16;
-}
-
-static int
-ect_max_width (ECellView *ecell_view,
-	       int model_col,
-	       int view_col)
-{
-	/* New ECellText */
-	ECellTextView *text_view = (ECellTextView *) ecell_view;
-	int row;
-	int number_of_rows;
-	int max_width = 0;
-
-	number_of_rows = e_table_model_row_count (ecell_view->e_table_model);
-
-	for (row = 0; row < number_of_rows; row++) {
-		PangoLayout *layout = generate_layout (text_view, model_col, view_col, row, 0);
-		int width;
-
-		pango_layout_get_pixel_size (layout, &width, NULL);
-
-		max_width = MAX (max_width, width);
-		g_object_unref (layout);
-	}
-	
-	return max_width + 8;
-}
-
-static int
-ect_max_width_by_row (ECellView *ecell_view,
-		      int model_col,
-		      int view_col,
-		      int row)
-{
-	/* New ECellText */
-	ECellTextView *text_view = (ECellTextView *) ecell_view;
-	int width;
-	PangoLayout *layout;
-
-	if (row >= e_table_model_row_count (ecell_view->e_table_model))
-		return 0;
-
-	layout = generate_layout (text_view, model_col, view_col, row, 0);
-	pango_layout_get_pixel_size (layout, &width, NULL);
-	g_object_unref (layout);
-	
-	return width + 8;
-}
-
-static gint
-tooltip_event (GtkWidget *window,
-	       GdkEvent *event,
-	       ETableTooltip *tooltip)
-{
-	gint ret_val = FALSE;
-	
-	switch (event->type) {
-	case GDK_LEAVE_NOTIFY:
-		e_canvas_hide_tooltip (E_CANVAS(GNOME_CANVAS_ITEM(tooltip->eti)->canvas));
-		break;
-	case GDK_BUTTON_PRESS:
-	case GDK_BUTTON_RELEASE:
-		if (event->type == GDK_BUTTON_RELEASE) {
-			e_canvas_hide_tooltip (E_CANVAS(GNOME_CANVAS_ITEM(tooltip->eti)->canvas));
-		}
-
-		event->button.x = tooltip->cx;
-		event->button.y = tooltip->cy;
-		g_signal_emit_by_name (tooltip->eti, "event",
-				       event, &ret_val);
-		if (!ret_val)
-			gtk_propagate_event (GTK_WIDGET(GNOME_CANVAS_ITEM(tooltip->eti)->canvas), event);
-		ret_val = TRUE;
-		break;
-	case GDK_KEY_PRESS:
-		e_canvas_hide_tooltip (E_CANVAS(GNOME_CANVAS_ITEM(tooltip->eti)->canvas));
-		g_signal_emit_by_name (tooltip->eti, "event",
-				       event, &ret_val);
-		if (!ret_val)
-			gtk_propagate_event (GTK_WIDGET(GNOME_CANVAS_ITEM(tooltip->eti)->canvas), event);
-		ret_val = TRUE;
-		break;
-	default:
-		break;
-	}
-
-	return ret_val;
-}
-
-static void
-ect_show_tooltip (ECellView *ecell_view, 
-		  int model_col,
-		  int view_col,
-		  int row,
-		  int col_width,
-		  ETableTooltip *tooltip)
-{
-	ECellTextView *text_view = (ECellTextView *) ecell_view;
-	GtkWidget *canvas;
-	double i2c[6];
-	ArtPoint origin = {0, 0};
-	ArtPoint pixel_origin;
-	int canvas_x, canvas_y;
-	GnomeCanvasItem *tooltip_text;
-	double tooltip_width;
-	double tooltip_height;
-	double tooltip_x;
-	double tooltip_y;
-	GnomeCanvasItem *rect;
-	ECellText *ect = E_CELL_TEXT(ecell_view->ecell);
-	GtkWidget *window;
-	PangoLayout *layout;
-	int width, height;
-
-	tooltip->timer = 0;
-
-	layout = generate_layout (text_view, model_col, view_col, row, col_width);
-
-	pango_layout_get_pixel_size (layout, &width, &height);
-	if (width < col_width - 8) {
-		return;
-	}
-
-	gnome_canvas_item_i2c_affine (GNOME_CANVAS_ITEM (tooltip->eti), i2c);
-	art_affine_point (&pixel_origin, &origin, i2c);
-
-	gdk_window_get_origin (GTK_WIDGET (text_view->canvas)->window,
-			       &canvas_x, &canvas_y);
-	pixel_origin.x += canvas_x;
-	pixel_origin.y += canvas_y;
-	pixel_origin.x -= (int) gtk_layout_get_hadjustment (GTK_LAYOUT (text_view->canvas))->value;
-	pixel_origin.y -= (int) gtk_layout_get_vadjustment (GTK_LAYOUT (text_view->canvas))->value;
-
-	window = gtk_window_new (GTK_WINDOW_POPUP);
-	gtk_container_set_border_width (GTK_CONTAINER (window), 1);
-
-	canvas = e_canvas_new ();
-	gtk_container_add (GTK_CONTAINER (window), canvas);
-	GTK_WIDGET_UNSET_FLAGS (canvas, GTK_CAN_FOCUS);
-	GTK_WIDGET_UNSET_FLAGS (window, GTK_CAN_FOCUS);
-
-	rect = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (canvas)),
-				      gnome_canvas_rect_get_type (),
-				      "x1", (double) 0.0,
-				      "y1", (double) 0.0,
-				      "x2", (double) width + 4,
-				      "y2", (double) height,
-				      "fill_color_gdk", tooltip->background,
-				      NULL);
-
-	tooltip_text = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (canvas)),
-					      e_text_get_type (),
-					      "anchor", GTK_ANCHOR_NW,
-					      "bold", (gboolean) ect->bold_column >= 0 && e_table_model_value_at(ecell_view->e_table_model, ect->bold_column, row),
-					      "strikeout", (gboolean) ect->strikeout_column >= 0 && e_table_model_value_at(ecell_view->e_table_model, ect->strikeout_column, row),
-					      "underline", (gboolean) ect->underline_column >= 0 && e_table_model_value_at(ecell_view->e_table_model, ect->underline_column, row),
-					      "fill_color_gdk", tooltip->foreground,
-					      "text", pango_layout_get_text (layout),
-					      "editable", FALSE,
-					      "clip_width", (double) width,
-					      "clip_height", (double) height,
-					      "clip", TRUE,
-					      "line_wrap", FALSE,
-  					      "justification", E_CELL_TEXT (text_view->cell_view.ecell)->justify,
-					      "draw_background", FALSE,
-					      NULL);
-
-	tooltip_width = width;
-	tooltip_height = height;
-	tooltip_y = tooltip->y;
-
-	switch (E_CELL_TEXT (text_view->cell_view.ecell)->justify) {
-	case GTK_JUSTIFY_CENTER:
-		tooltip_x = - tooltip_width / 2;
-		break;
-	case GTK_JUSTIFY_RIGHT:
-		tooltip_x = tooltip_width / 2;
-		break;
-	case GTK_JUSTIFY_FILL:
-	case GTK_JUSTIFY_LEFT:
-		tooltip_x = tooltip->x;
-		break;
-	}
-
-	gnome_canvas_item_move (tooltip_text, 3.0, 1.0);
-	gnome_canvas_item_set (rect,
-			       "x2", (double) tooltip_width + 6,
-			       "y2", (double) tooltip->row_height + 1,
-			       NULL);
-	gtk_widget_set_usize (window, tooltip_width + 6,
-			      tooltip->row_height + 1);
-	gnome_canvas_set_scroll_region (GNOME_CANVAS (canvas), 0.0, 0.0,
-					(double) tooltip_width + 6,
-					(double) tooltip_height);
-	gtk_widget_show (canvas);
-	gtk_widget_realize (window);
-	g_signal_connect (window, "event",
-			  G_CALLBACK (tooltip_event), tooltip);
-
-	e_canvas_popup_tooltip (E_CANVAS(text_view->canvas), window, pixel_origin.x + tooltip->x,
-				pixel_origin.y + tooltip->y - 1);
-
-	return;
-}
-
-/*
- * GtkObject::destroy method
- */
-static void
-ect_finalize (GObject *object)
-{
-	ECellText *ect = E_CELL_TEXT (object);
-
-	g_free (ect->font_name);
-
-	G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-/* Set_arg handler for the text item */
-static void
-ect_set_property (GObject *object,
-		  guint prop_id,
-		  const GValue *value,
-		  GParamSpec *pspec)
-{
-	ECellText *text;
-
-	text = E_CELL_TEXT (object);
-
-	switch (prop_id) {
-	case PROP_STRIKEOUT_COLUMN:
-		text->strikeout_column = g_value_get_int (value);
-		break;
-
-	case PROP_UNDERLINE_COLUMN:
-		text->underline_column = g_value_get_int (value);
-		break;
-
-	case PROP_BOLD_COLUMN:
-		text->bold_column = g_value_get_int (value);
-		break;
-
-	case PROP_COLOR_COLUMN:
-		text->color_column = g_value_get_int (value);
-		break;
-
-	case PROP_EDITABLE:
-		text->editable = g_value_get_boolean (value);
-		break;
-
-	case PROP_BG_COLOR_COLUMN:
-		text->bg_color_column = g_value_get_int (value);
-		break;
-
-	default:
-		return;
-	}
-}
-
-/* Get_arg handler for the text item */
-static void
-ect_get_property (GObject *object,
-		  guint prop_id,
-		  GValue *value,
-		  GParamSpec *pspec)
-{
-	ECellText *text;
-
-	text = E_CELL_TEXT (object);
-
-	switch (prop_id) {
-	case PROP_STRIKEOUT_COLUMN:
-		g_value_set_int (value, text->strikeout_column);
-		break;
-
-	case PROP_UNDERLINE_COLUMN:
-		g_value_set_int (value, text->underline_column);
-		break;
-
-	case PROP_BOLD_COLUMN:
-		g_value_set_int (value, text->bold_column);
-		break;
-
-	case PROP_COLOR_COLUMN:
-		g_value_set_int (value, text->color_column);
-		break;
-
-	case PROP_EDITABLE:
-		g_value_set_boolean (value, text->editable);
-		break;
-
-	case PROP_BG_COLOR_COLUMN:
-		g_value_set_int (value, text->bg_color_column);
-		break;
-
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static char *ellipsis_default = NULL;
-static gboolean use_ellipsis_default = TRUE;
-
-static void
-e_cell_text_class_init (GObjectClass *object_class)
-{
-	ECellClass *ecc = (ECellClass *) object_class;
-	ECellTextClass *ectc = (ECellTextClass *) object_class;
-	const char *ellipsis_env;
-
-	G_OBJECT_CLASS (object_class)->finalize = ect_finalize;
-
-	ecc->new_view   = ect_new_view;
-	ecc->kill_view  = ect_kill_view;
-	ecc->realize    = ect_realize;
-	ecc->unrealize  = ect_unrealize;
-	ecc->draw       = ect_draw;
-	ecc->event      = ect_event;
-	ecc->height     = ect_height;
-	ecc->enter_edit = ect_enter_edit;
-	ecc->leave_edit = ect_leave_edit;
-	ecc->save_state = ect_save_state;
- 	ecc->load_state = ect_load_state;
-	ecc->free_state = ect_free_state;
-	ecc->print      = ect_print;
-	ecc->print_height = ect_print_height;
-	ecc->max_width = ect_max_width;
-	ecc->max_width_by_row = ect_max_width_by_row;
-	ecc->show_tooltip = ect_show_tooltip;
-	ecc->get_bg_color = ect_get_bg_color;
-
-	ectc->get_text = ect_real_get_text;
-	ectc->free_text = ect_real_free_text;
-	ectc->set_value = ect_real_set_value;
-
-	object_class->get_property = ect_get_property;
-	object_class->set_property = ect_set_property;
-
-	parent_class = g_type_class_ref (PARENT_TYPE);
-
-	signals [TEXT_INSERTED] = 
-		g_signal_new ("text_inserted",
-			      G_TYPE_FROM_CLASS (object_class),
-			      G_SIGNAL_RUN_FIRST,
-			      G_STRUCT_OFFSET (ECellTextClass, text_inserted),
-			      NULL, NULL,
-			      e_marshal_VOID__POINTER_INT_INT_INT_INT,
-			      G_TYPE_NONE, 5,
-			      G_TYPE_POINTER, G_TYPE_INT, G_TYPE_INT,
-			      G_TYPE_INT, G_TYPE_INT);
-
-	signals [TEXT_DELETED] = 
-		g_signal_new ("text_deleted",
-			      G_TYPE_FROM_CLASS (object_class),
-			      G_SIGNAL_RUN_FIRST,
-			      G_STRUCT_OFFSET (ECellTextClass, text_deleted),
-			      NULL, NULL,
-			      e_marshal_VOID__POINTER_INT_INT_INT_INT,
-			      G_TYPE_NONE, 5,
-			      G_TYPE_POINTER, G_TYPE_INT, G_TYPE_INT,
-			      G_TYPE_INT, G_TYPE_INT);
-
-
-
-	g_object_class_install_property (object_class, PROP_STRIKEOUT_COLUMN,
-					 g_param_spec_int ("strikeout_column",
-							   _("Strikeout Column"),
-							   /*_( */"XXX blurb" /*)*/,
-							   -1, G_MAXINT, -1,
-							   G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_UNDERLINE_COLUMN,
-					 g_param_spec_int ("underline_column",
-							   _("Underline Column"),
-							   /*_( */"XXX blurb" /*)*/,
-							   -1, G_MAXINT, -1,
-							   G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_BOLD_COLUMN,
-					 g_param_spec_int ("bold_column",
-							   _("Bold Column"),
-							   /*_( */"XXX blurb" /*)*/,
-							   -1, G_MAXINT, -1,
-							   G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_COLOR_COLUMN,
-					 g_param_spec_int ("color_column",
-							   _("Color Column"),
-							   /*_( */"XXX blurb" /*)*/,
-							   -1, G_MAXINT, -1,
-							   G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_EDITABLE,
-					 g_param_spec_boolean ("editable",
-							       _("Editable"),
-							       /*_( */"XXX blurb" /*)*/,
-							       FALSE,
-							       G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_BG_COLOR_COLUMN,
-					 g_param_spec_int ("bg_color_column",
-							   _("BG Color Column"),
-							   /*_( */"XXX blurb" /*)*/,
-							   -1, G_MAXINT, -1,
-							   G_PARAM_READWRITE));
-
-	if (!clipboard_atom)
-		clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE);
-
-	ellipsis_env = g_getenv ("GAL_ELLIPSIS");
-	if (ellipsis_env) {
-		if (*ellipsis_env) {
-			ellipsis_default = g_strdup (ellipsis_env);
-		} else {
-			use_ellipsis_default = FALSE;
-		}
-	}
-	
-	gal_a11y_e_cell_registry_add_cell_type (NULL, E_CELL_TEXT_TYPE, gal_a11y_e_cell_text_new);
-}
-
-
-/* IM Context Callbacks */
-
-static void
-e_cell_text_preedit_changed_cb (GtkIMContext *context,
-		  ECellTextView    *tv)
-{
-	gchar *preedit_string;
-	gint cursor_pos;
-	CellEdit *edit=tv->edit;
-	gtk_im_context_get_preedit_string (edit->im_context, &preedit_string, 
-					NULL, &cursor_pos);
-	                                                  
-	edit->preedit_length = strlen (preedit_string);
-	cursor_pos =  CLAMP (cursor_pos, 0, g_utf8_strlen (preedit_string, -1)); 
-	g_free (preedit_string);
-	ect_queue_redraw (tv, edit->view_col, edit->row);
-}
-
-static void
-e_cell_text_commit_cb (GtkIMContext *context,
-		  const gchar  *str,
-		  ECellTextView    *tv)
-{
-	CellEdit *edit = tv->edit;
-	ETextEventProcessorCommand command;
-	                                                  
-	if (g_utf8_validate (str, strlen (str), NULL)) {
-		command.action = E_TEP_INSERT;
-		command.position = E_TEP_SELECTION;
-		command.string = (gchar *)str;
-		command.value = strlen(str);
-		e_cell_text_view_command (edit->tep, &command, edit);
-	}
-
-}
-
-static gboolean
-e_cell_text_retrieve_surrounding_cb (GtkIMContext *context,
-				ECellTextView        *tv)
-{
-	int cur_pos = 0;
-	CellEdit *edit = tv->edit;
-
-	cur_pos = g_utf8_pointer_to_offset (edit->text, edit->text + edit->selection_start);
-
-	gtk_im_context_set_surrounding (context,
-					edit->text,
-					strlen (edit->text),
-					cur_pos
-					);
-	
-	return TRUE;
-}
-
-static gboolean
-e_cell_text_delete_surrounding_cb   (GtkIMContext *context,
-				gint          offset,
-				gint          n_chars,
-				ECellTextView        *tv)
-{
-	CellEdit *edit = tv->edit;
-
-	gtk_editable_delete_text (GTK_EDITABLE (edit),
-				  edit->selection_end + offset,
-				  edit->selection_end + offset + n_chars);
-
-	return TRUE;
-}
-
-static void
-e_cell_text_init (ECellText *ect)
-{
-	ect->ellipsis = g_strdup (ellipsis_default);
-	ect->use_ellipsis = use_ellipsis_default;
-	ect->strikeout_column = -1;
-	ect->underline_column = -1;
-	ect->bold_column = -1;
-	ect->color_column = -1;
-	ect->bg_color_column = -1;
-	ect->editable = TRUE;
-}
-
-E_MAKE_TYPE(e_cell_text, "ECellText", ECellText, e_cell_text_class_init, e_cell_text_init, PARENT_TYPE)
-
-/**
- * e_cell_text_construct:
- * @cell: The cell to construct
- * @fontname: this param is no longer used, but left here for api stability
- * @justify: Justification of the string in the cell
- *
- * constructs the ECellText.  To be used by subclasses and language
- * bindings.
- *
- * Returns: The ECellText.
- */
-ECell *
-e_cell_text_construct (ECellText *cell, const char *fontname, GtkJustification justify)
-{
-	if(!cell)
-		return E_CELL(NULL);
-	if(fontname)
-		cell->font_name = g_strdup (fontname);
-	cell->justify = justify;
-	return E_CELL(cell);
-}
-
-/**
- * e_cell_text_new:
- * @fontname: this param is no longer used, but left here for api stability
- * @justify: Justification of the string in the cell.
- *
- * Creates a new ECell renderer that can be used to render strings that
- * that come from the model.  The value returned from the model is
- * interpreted as being a char *.
- *
- * The ECellText object support a large set of properties that can be
- * configured through the Gtk argument system and allows the user to have
- * a finer control of the way the string is displayed.  The arguments supported
- * allow the control of strikeout, underline, bold, and color.
- *
- * The arguments "strikeout_column", "underline_column", "bold_column"
- * and "color_column" set and return an integer that points to a
- * column in the model that controls these settings.  So controlling
- * the way things are rendered is achieved by having special columns
- * in the model that will be used to flag whether the text should be
- * rendered with strikeout, or bolded.  In the case of the
- * "color_column" argument, the column in the model is expected to
- * have a string that can be parsed by gdk_color_parse().
- * 
- * Returns: an ECell object that can be used to render strings.
- */
-ECell *
-e_cell_text_new (const char *fontname, GtkJustification justify)
-{
-	ECellText *ect = g_object_new (E_CELL_TEXT_TYPE, NULL);
-
-	e_cell_text_construct(ect, fontname, justify);
-
-	return (ECell *) ect;
-}
-
-
-/* fixme: Handle Font attributes */
-/* position is in BYTES */
-
-static gint
-get_position_from_xy (CellEdit *edit, gint x, gint y)
-{
-	int index;
-	int trailing;
-	const char *text;
-
-	PangoLayout *layout = generate_layout (edit->text_view, edit->model_col, edit->view_col, edit->row, edit->cell_width);
-	ECellTextView *text_view = edit->text_view;
-	ECellText *ect = (ECellText *) ((ECellView *)text_view)->ecell;
-
-	x -= (ect->x + text_view->xofs - edit->xofs_edit);
-	y -= (ect->y + text_view->yofs - edit->yofs_edit);
-
-	pango_layout_xy_to_index (layout, x * PANGO_SCALE, y * PANGO_SCALE, &index, &trailing);
-
-	text = pango_layout_get_text (layout);
-
-	return g_utf8_offset_to_pointer (text + index, trailing) - text;
-}
-
-#define SCROLL_WAIT_TIME 30000
-
-static gboolean
-_blink_scroll_timeout (gpointer data)
-{
-	ECellTextView *text_view = (ECellTextView *) data;
-	ECellText *ect = E_CELL_TEXT (((ECellView *)text_view)->ecell);
-	CellEdit *edit = text_view->edit;
-
-	gulong current_time;
-	gboolean scroll = FALSE;
-	gboolean redraw = FALSE;
-	int width, height;
-	
-	g_timer_elapsed (edit->timer, &current_time);
-
-	if (edit->scroll_start + SCROLL_WAIT_TIME > 1000000) {
-		if (current_time > edit->scroll_start - (1000000 - SCROLL_WAIT_TIME) &&
-		    current_time < edit->scroll_start)
-			scroll = TRUE;
-	} else {
-		if (current_time > edit->scroll_start + SCROLL_WAIT_TIME ||
-		    current_time < edit->scroll_start)
-			scroll = TRUE;
-	}
-
-	pango_layout_get_pixel_size (edit->layout, &width, &height);
-
-	if (scroll && edit->button_down) {
-		/* FIXME: Copy this for y. */
-		if (edit->lastx - ect->x > edit->cell_width) {
-			if (edit->xofs_edit < width - edit->cell_width) {
-				edit->xofs_edit += 4;
-				if (edit->xofs_edit > width - edit->cell_width + 1)
-					edit->xofs_edit = width - edit->cell_width + 1;
-				redraw = TRUE;
-			}
-		}
-		if (edit->lastx - ect->x < 0 &&
-		    edit->xofs_edit > 0) {
-			edit->xofs_edit -= 4;
-			if (edit->xofs_edit < 0)
-				edit->xofs_edit = 0;
-			redraw = TRUE;
-		}
-		if (redraw) {
-			ETextEventProcessorEvent e_tep_event;
-			e_tep_event.type = GDK_MOTION_NOTIFY;
-			e_tep_event.motion.state = edit->last_state;
-			e_tep_event.motion.time = 0;
-			e_tep_event.motion.position = get_position_from_xy (edit, edit->lastx, edit->lasty);
-			_get_tep (edit);
-			e_text_event_processor_handle_event (edit->tep,
-							     &e_tep_event);
-			edit->scroll_start = current_time;
-		}
-	}
-
-	if (!((current_time / 500000) % 2)) {
-		if (!edit->show_cursor)
-			redraw = TRUE;
-		edit->show_cursor = TRUE;
-	} else {
-		if (edit->show_cursor)
-			redraw = TRUE;
-		edit->show_cursor = FALSE;
-	}
-	if (redraw){
-		ect_queue_redraw (text_view, edit->view_col, edit->row);
-	}
-	return TRUE;
-}
-
-static int
-next_word (CellEdit *edit, int start)
-{
-	char *p;
-	int length;
-
-	length = strlen (edit->text);
-	if (start >= length)
-		return length;
-
-	p = g_utf8_next_char (edit->text + start);
-
-	while (*p && g_unichar_validate (g_utf8_get_char (p))) {
-		gunichar unival = g_utf8_get_char (p);
-		if (g_unichar_isspace (unival))
-			return p - edit->text;
-		p = g_utf8_next_char (p);
-	}
-
-	return p - edit->text;
-}
-
-static int
-_get_position (ECellTextView *text_view, ETextEventProcessorCommand *command)
-{
-	int length;
-	CellEdit *edit = text_view->edit;
-	gchar *p;
-	int unival;
-	int index;
-	int trailing;
-	
-	switch (command->position) {
-		
-	case E_TEP_VALUE:
-		return command->value;
-
-	case E_TEP_SELECTION:
-		return edit->selection_end;
-
-	case E_TEP_START_OF_BUFFER:
-		return 0;
-
-		/* fixme: this probably confuses TEP */
-
-	case E_TEP_END_OF_BUFFER:
-		return strlen (edit->text);
-
-	case E_TEP_START_OF_LINE:
-
-		if (edit->selection_end < 1) return 0;
-
-		p = g_utf8_find_prev_char (edit->text, edit->text + edit->selection_end);
-
-		if (p == edit->text) return 0;
-
-		p = g_utf8_find_prev_char (edit->text, p);
-
-		while (p && p > edit->text) {
-			if (*p == '\n') return p - edit->text + 1;
-			p = g_utf8_find_prev_char (edit->text, p);
-		}
-
-		return 0;
-
-	case E_TEP_END_OF_LINE:
-
-		length = strlen (edit->text);
-		if (edit->selection_end >= length) return length;
-
-		p = g_utf8_next_char (edit->text + edit->selection_end);
-
-		while (*p && g_unichar_validate (g_utf8_get_char (p))) {
-			if (*p == '\n') return p - edit->text;
-			p = g_utf8_next_char (p);
-		}
-
-		return p - edit->text;
-
-	case E_TEP_FORWARD_CHARACTER:
-
-		length = strlen (edit->text);
-		if (edit->selection_end >= length) return length;
-
-		p = g_utf8_next_char (edit->text + edit->selection_end);
-
-		return p - edit->text;
-
-	case E_TEP_BACKWARD_CHARACTER:
-
-		if (edit->selection_end < 1) return 0;
-
-		p = g_utf8_find_prev_char (edit->text, edit->text + edit->selection_end);
-
-		if (p == NULL) return 0;
-
-		return p - edit->text;
-
-	case E_TEP_FORWARD_WORD:
-		return next_word (edit, edit->selection_end);
-
-	case E_TEP_BACKWARD_WORD:
-
-		if (edit->selection_end < 1) return 0;
-
-		p = g_utf8_find_prev_char (edit->text, edit->text + edit->selection_end);
-
-		if (p == edit->text) return 0;
-
-		p = g_utf8_find_prev_char (edit->text, p);
-
-		while (p && p > edit->text && g_unichar_validate (g_utf8_get_char (p))) {
-			unival = g_utf8_get_char (p);
-			if (g_unichar_isspace (unival)) {
-				return (g_utf8_next_char (p) - edit->text);
-			}
-			p = g_utf8_find_prev_char (edit->text, p);
-		}
-
-		return 0;
-
-	case E_TEP_FORWARD_LINE:
-		pango_layout_move_cursor_visually (edit->layout,
-						   TRUE,
-						   edit->selection_end,
-						   0,
-						   TRUE,
-						   &index,
-						   &trailing);
-		index = g_utf8_offset_to_pointer (edit->text + index, trailing) - edit->text;
-		if (index < 0)
-			return 0;
-		length = strlen (edit->text);
-		if (index >= length)
-			return length;
-		return index;
-	case E_TEP_BACKWARD_LINE:
-		pango_layout_move_cursor_visually (edit->layout,
-						   TRUE,
-						   edit->selection_end,
-						   0,
-						   TRUE,
-						   &index,
-						   &trailing);
-
-		index = g_utf8_offset_to_pointer (edit->text + index, trailing) - edit->text;
-		if (index < 0)
-			return 0;
-		length = strlen (edit->text);
-		if (index >= length)
-			return length;
-		return index;
-	case E_TEP_FORWARD_PARAGRAPH:
-	case E_TEP_BACKWARD_PARAGRAPH:
-		
-	case E_TEP_FORWARD_PAGE:
-	case E_TEP_BACKWARD_PAGE:
-		return edit->selection_end;
-	default:
-		return edit->selection_end;
-	}
-	g_assert_not_reached ();
-	return 0; /* Kill warning */
-}
-
-static void
-_delete_selection (ECellTextView *text_view)
-{
-	CellEdit *edit = text_view->edit;
-	gint length;
-	gchar *sp, *ep;
-
-	if (edit->selection_end == edit->selection_start) return;
-
-	if (edit->selection_end < edit->selection_start) {
-		edit->selection_end ^= edit->selection_start;
-		edit->selection_start ^= edit->selection_end;
-		edit->selection_end ^= edit->selection_start;
-	}
-
-	sp = edit->text + edit->selection_start;
-	ep = edit->text + edit->selection_end;
-	length = strlen (ep) + 1;
-
-	memmove (sp, ep, length);
-
-	edit->selection_end = edit->selection_start;
-
-	g_signal_emit (VIEW_TO_CELL (text_view), signals[TEXT_DELETED], 0, text_view, edit->selection_start, ep-sp, edit->row, edit->model_col);
-}
-
-/* fixme: */
-/* NB! We expect value to be length IN BYTES */
-
-static void
-_insert (ECellTextView *text_view, char *string, int value)
-{
-	CellEdit *edit = text_view->edit;
-	char *temp;
-
-	if (value <= 0) return;
-
-	edit->selection_start = MIN (strlen(edit->text), edit->selection_start);
-
-	temp = g_new (gchar, strlen (edit->text) + value + 1);
-
-	strncpy (temp, edit->text, edit->selection_start);
-	strncpy (temp + edit->selection_start, string, value);
-	strcpy (temp + edit->selection_start + value, edit->text + edit->selection_end);
-
-	g_free (edit->text);
-
-	edit->text = temp;
-
-	edit->selection_start += value;
-	edit->selection_end = edit->selection_start;
-
-	g_signal_emit (VIEW_TO_CELL (text_view), signals[TEXT_INSERTED], 0, text_view, edit->selection_end-value, value, edit->row, edit->model_col);
-}
-
-static void
-capitalize (CellEdit *edit, int start, int end, ETextEventProcessorCaps type)
-{
-	ECellTextView *text_view = edit->text_view;
-
-	gboolean first = TRUE;
-	int character_length = g_utf8_strlen (edit->text + start, start - end);
-	const char *p = edit->text + start;
-	const char *text_end = edit->text + end;
-	char *new_text = g_new0 (char, character_length * 6 + 1);
-	char *output = new_text;
-
-	while (p && *p && p < text_end && g_unichar_validate (g_utf8_get_char (p))) {
-		gunichar unival = g_utf8_get_char (p);
-		gunichar newval = unival;
-
-		switch (type) {
-		case E_TEP_CAPS_UPPER:
-			newval = g_unichar_toupper (unival);
-			break;
-		case E_TEP_CAPS_LOWER:
-			newval = g_unichar_tolower (unival);
-			break;
-		case E_TEP_CAPS_TITLE:
-			if (g_unichar_isalpha (unival)) {
-				if (first)
-					newval = g_unichar_totitle (unival);
-				else
-					newval = g_unichar_tolower (unival);
-				first = FALSE;
-			} else {
-				first = TRUE;
-			}
-			break;
-		}
-		g_unichar_to_utf8 (newval, output);
-		output = g_utf8_next_char (output);
-
-		p = g_utf8_next_char (p);
-	}
-	*output = 0;
-
-	edit->selection_end = end;
-	edit->selection_start = start;
-	_delete_selection (text_view);
-
-	_insert (text_view, new_text, output - new_text);
-
-	g_free (new_text);
-}
-
-static void
-e_cell_text_view_command (ETextEventProcessor *tep, ETextEventProcessorCommand *command, gpointer data)
-{
-	CellEdit *edit = (CellEdit *) data;
-	ECellTextView *text_view = edit->text_view;
-	ECellText *ect = E_CELL_TEXT (text_view->cell_view.ecell);
-
-	gboolean change = FALSE;
-	gboolean redraw = FALSE;
-
-	int sel_start, sel_end;
-	
-	/* If the EText isn't editable, then ignore any commands that would
-	   modify the text. */
-	if (!ect->editable && (command->action == E_TEP_DELETE
-			       || command->action == E_TEP_INSERT
-			       || command->action == E_TEP_PASTE
-			       || command->action == E_TEP_GET_SELECTION))
-		return;
-
-	switch (command->action) {
-	case E_TEP_MOVE:
-		edit->selection_start = _get_position (text_view, command);
-		edit->selection_end = edit->selection_start;
-		if (edit->timer) {
-			g_timer_reset (edit->timer);
-		}
-		redraw = TRUE;
-		break;
-	case E_TEP_SELECT:
-		edit->selection_end = _get_position (text_view, command);
-		sel_start = MIN(edit->selection_start, edit->selection_end);
-		sel_end = MAX(edit->selection_start, edit->selection_end);
-		if (sel_start != sel_end) {
-			e_cell_text_view_supply_selection (edit, command->time, GDK_SELECTION_PRIMARY,
-							   edit->text + sel_start,
-							   sel_end - sel_start);
-		} else if (edit->timer) {
-			g_timer_reset (edit->timer);
-		}
-		redraw = TRUE;
-		break;
-	case E_TEP_DELETE:
-		if (edit->selection_end == edit->selection_start) {
-			edit->selection_end = _get_position (text_view, command);
-		}
-		_delete_selection (text_view);
-		if (edit->timer) {
-			g_timer_reset (edit->timer);
-		}
-		redraw = TRUE;
-		change = TRUE;
-		break;
-
-	case E_TEP_INSERT:
-		if (!edit->preedit_length && edit->selection_end != edit->selection_start) {
-			_delete_selection (text_view);
-		}
-		_insert (text_view, command->string, command->value);
-		if (edit->timer) {
-			g_timer_reset (edit->timer);
-		}
-		redraw = TRUE;
-		change = TRUE;
-		break;
-	case E_TEP_COPY:
-		sel_start = MIN(edit->selection_start, edit->selection_end);
-		sel_end = MAX(edit->selection_start, edit->selection_end);
-		if (sel_start != sel_end) {
-			e_cell_text_view_supply_selection (edit, command->time, clipboard_atom,
-							   edit->text + sel_start,
-							   sel_end - sel_start);
-		}
-		if (edit->timer) {
-			g_timer_reset (edit->timer);
-		}
-		break;
-	case E_TEP_PASTE:
-		e_cell_text_view_get_selection (edit, clipboard_atom, command->time);
-		if (edit->timer) {
-			g_timer_reset (edit->timer);
-		}
-		redraw = TRUE;
-		change = TRUE;
-		break;
-	case E_TEP_GET_SELECTION:
-		e_cell_text_view_get_selection (edit, GDK_SELECTION_PRIMARY, command->time);
-		break;
-	case E_TEP_ACTIVATE:
-		e_table_item_leave_edit_ (text_view->cell_view.e_table_item_view);
-		break;
-	case E_TEP_SET_SELECT_BY_WORD:
-		edit->select_by_word = command->value;
-		break;
-	case E_TEP_GRAB:
-		edit->actions = E_CELL_GRAB;
-		break;
-	case E_TEP_UNGRAB:
-		edit->actions = E_CELL_UNGRAB;
-		break;
-	case E_TEP_CAPS:
-		if (edit->selection_start == edit->selection_end) {
-			capitalize (edit, edit->selection_start, next_word (edit, edit->selection_start), command->value);
-		} else {
-			int selection_start = MIN (edit->selection_start, edit->selection_end);
-			int selection_end = edit->selection_start + edit->selection_end - selection_start; /* Slightly faster than MAX */
-			capitalize (edit, selection_start, selection_end, command->value);
-		}
-		if (edit->timer) {
-			g_timer_reset (edit->timer);
-		}
-		redraw = TRUE;
-		change = TRUE;
-		break;
-	case E_TEP_NOP:
-		break;
-	}
-
-	if (change) {
-		if (edit->layout)
-			g_object_unref (edit->layout);
-		edit->layout = build_layout (text_view, edit->row, edit->text, edit->cell_width);
-	}
-
-	if (!edit->button_down) {
-		PangoRectangle strong_pos, weak_pos;
-		pango_layout_get_cursor_pos (edit->layout, edit->selection_end, &strong_pos, &weak_pos);
-		if (strong_pos.x != weak_pos.x ||
-		    strong_pos.y != weak_pos.y ||
-		    strong_pos.width != weak_pos.width ||
-		    strong_pos.height != weak_pos.height) {
-			if (show_pango_rectangle (edit, weak_pos))
-				redraw = TRUE;
-		}
-		if (show_pango_rectangle (edit, strong_pos)) {
-			redraw = TRUE;
-		}
-	}
-
-	if (redraw){
-		ect_queue_redraw (text_view, edit->view_col, edit->row);
-	}
-}
-
-#ifdef DO_SELECTION
-static void
-_selection_clear_event (GtkInvisible *invisible,
-			GdkEventSelection *event,
-			CellEdit *edit)
-{
-	if (event->selection == GDK_SELECTION_PRIMARY) {
-		g_free (edit->primary_selection);
-		edit->primary_selection = NULL;
-		edit->primary_length = 0;
-
-		edit->has_selection = FALSE;
-#if 0
-		gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(text));
-#endif
-
-	} else if (event->selection == clipboard_atom) {
-		g_free (edit->clipboard_selection);
-		edit->clipboard_selection = NULL;
-		edit->clipboard_length = 0;
-	}
-}
-
-static void
-_selection_get (GtkInvisible *invisible,
-		GtkSelectionData *selection_data,
-		guint info,
-		guint time_stamp,
-		CellEdit *edit)
-{
-	switch (info) {
-	case E_SELECTION_PRIMARY:
-		gtk_selection_data_set (selection_data, UTF8_ATOM,
-					8, edit->primary_selection, 
-					edit->primary_length);
-		break;
-	case E_SELECTION_CLIPBOARD:
-		gtk_selection_data_set (selection_data, UTF8_ATOM,
-					8, edit->clipboard_selection, 
-					edit->clipboard_length);
-		break;
-	}
-}
-
-/* fixme: What happens, if delivered string is not UTF-8? */
-
-static void
-_selection_received (GtkInvisible *invisible,
-		     GtkSelectionData *selection_data,
-		     guint time,
-		     CellEdit *edit)
-{
-	if (selection_data->length < 0 || 
-			!(selection_data->type == UTF8_ATOM ||
-			selection_data->type == GDK_SELECTION_TYPE_STRING)) {
-		return;
-	} else {
-		ETextEventProcessorCommand command;
-		command.action = E_TEP_INSERT;
-		command.position = E_TEP_SELECTION;
-		command.string = selection_data->data;
-		command.value = selection_data->length;
-		command.time = time;
-		e_cell_text_view_command (edit->tep, &command, edit);
-	}
-}
-
-static GtkWidget *e_cell_text_view_get_invisible (CellEdit *edit)
-{
-	if (edit->invisible == NULL) {
-		GtkWidget *invisible = gtk_invisible_new ();
-		edit->invisible = invisible;
-		
-		gtk_selection_add_target (invisible,
-					  GDK_SELECTION_PRIMARY,
-					  UTF8_ATOM,
-					  E_SELECTION_PRIMARY);
-		gtk_selection_add_target (invisible,
-					  clipboard_atom,
-					  UTF8_ATOM,
-					  E_SELECTION_CLIPBOARD);
-		
-		g_signal_connect (invisible, "selection_get",
-				  G_CALLBACK (_selection_get), 
-				  edit);
-		g_signal_connect (invisible, "selection_clear_event",
-				  G_CALLBACK (_selection_clear_event),
-				  edit);
-		g_signal_connect (invisible, "selection_received",
-				  G_CALLBACK (_selection_received),
-				  edit);
-	}
-	return edit->invisible;
-}
-#endif
-
-static void
-e_cell_text_view_supply_selection (CellEdit *edit, guint time, GdkAtom selection, char *data, gint length)
-{
-#if DO_SELECTION
-	gboolean successful;
-	GtkWidget *invisible;
-
-	invisible = e_cell_text_view_get_invisible (edit);
-
-	if (selection == GDK_SELECTION_PRIMARY){
-		if (edit->primary_selection) {
-			g_free (edit->primary_selection);
-		}
-		edit->primary_selection = g_strndup (data, length);
-		edit->primary_length = length;
-	} else if (selection == clipboard_atom) {
-		if (edit->clipboard_selection) {
-			g_free (edit->clipboard_selection);
-		}
-		edit->clipboard_selection = g_strndup (data, length);
-		edit->clipboard_length = length;
-	}
-
-	successful = gtk_selection_owner_set (invisible,
-					      selection,
-					      time);
-	
-	if (selection == GDK_SELECTION_PRIMARY)
-		edit->has_selection = successful;
-#endif
-}
-
-static void
-e_cell_text_view_get_selection (CellEdit *edit, GdkAtom selection, guint32 time)
-{
-#if DO_SELECTION
-	GtkWidget *invisible;
-	invisible = e_cell_text_view_get_invisible (edit);
-	gtk_selection_convert (invisible,
-			      selection,
-			      UTF8_ATOM,
-			      time);
-#endif
-}
-
-static void
-_get_tep (CellEdit *edit)
-{
-	if (!edit->tep) {
-		edit->tep = e_text_event_processor_emacs_like_new ();
-		g_signal_connect (edit->tep,
-				  "command",
-				  G_CALLBACK(e_cell_text_view_command),
-				  (gpointer) edit);
-	}
-}
-
-static GdkColor*
-e_cell_text_get_color (ECellTextView *cell_view, gchar *color_spec)
-{
-	ECellText *ect = E_CELL_TEXT (((ECellView*) cell_view)->ecell);
-	GdkColormap *colormap;
-	GdkColor *color, tmp_color;
-
-	/* If the color spec is NULL we use the default color. */
-	if (color_spec == NULL)
-		return NULL;
-
-	/* Create the hash table if we haven't already. */
-	if (!ect->colors)
-		ect->colors = g_hash_table_new (g_str_hash, g_str_equal);
-
-	/* See if we've already allocated the color. Note that we use a
-	   special value of (GdkColor*) 1 in the hash to indicate that we've
-	   already tried and failed to allocate the color, so we don't keep
-	   trying to allocate it. */
-	color = g_hash_table_lookup (ect->colors, color_spec);
-	if (color == (GdkColor*) 1)
-		return NULL;
-	if (color)
-		return color;
-
-	/* Try to parse the color. */
-	if (gdk_color_parse (color_spec, &tmp_color)) {
-		colormap = gtk_widget_get_colormap (GTK_WIDGET (cell_view->canvas));
-
-		/* Try to allocate the color. */
-		if (gdk_color_alloc (colormap, &tmp_color))
-			color = gdk_color_copy (&tmp_color);
-	}
-
-	g_hash_table_insert (ect->colors, g_strdup (color_spec),
-			     color ? color : (GdkColor*) 1);
-	return color;
-}
-
-/**
- * e_cell_text_set_selection:
- * @cell_view: the given cell view
- * @col: column of the given cell in the view
- * @row: row of the given cell in the view
- * @start: start offset of the selection
- * @end: end offset of the selection
- *
- * Sets the selection of given text cell.
- * If the current editing cell is not the given cell, this function
- * will return FALSE;
- *
- * If success, the [start, end) part of the text will be selected.
- *
- * This API is most likely to be used by a11y implementations.
- * 
- * Returns: whether the action is successful.
- */
-gboolean
-e_cell_text_set_selection (ECellView *cell_view,
-			   gint col,
-			   gint row,
-			   gint start,
-			   gint end)
-{
-	ECellTextView *ectv;
-	CellEdit *edit;
-	ETextEventProcessorCommand command1, command2;
-
-	ectv = (ECellTextView *)cell_view;
-	edit = ectv->edit;
-	if (!edit)
-		return FALSE;
-
-	if (edit->view_col != col || edit->row != row)
-		return FALSE;
-
-	command1.action = E_TEP_MOVE;
-	command1.position = E_TEP_VALUE;
-	command1.value = start;
-	e_cell_text_view_command (edit->tep, &command1, edit);
-
-	command2.action = E_TEP_SELECT;
-	command2.position = E_TEP_VALUE;
-	command2.value = end;
-	e_cell_text_view_command (edit->tep, &command2, edit);
-
-	return TRUE;
-}
-
-/**
- * e_cell_text_get_selection:
- * @cell_view: the given cell view
- * @col: column of the given cell in the view
- * @row: row of the given cell in the view
- * @start: a pointer to an int value indicates the start offset of the selection
- * @end: a pointer to an int value indicates the end offset of the selection
- *
- * Gets the selection of given text cell.
- * If the current editing cell is not the given cell, this function
- * will return FALSE;
- *
- * This API is most likely to be used by a11y implementations.
- * 
- * Returns: whether the action is successful.
- */
-gboolean
-e_cell_text_get_selection (ECellView *cell_view,
-			   gint col,
-			   gint row,
-			   gint *start,
-			   gint *end)
-{
-	ECellTextView *ectv;
-	CellEdit *edit;
-
-	ectv = (ECellTextView *)cell_view;
-	edit = ectv->edit;
-	if (!edit)
-		return FALSE;
-
-	if (edit->view_col != col || edit->row != row)
-		return FALSE;
-
-	if (start)
-		*start = edit->selection_start;
-	if (end)
-		*end = edit->selection_end;
-	return TRUE;
-}
-
-/**
- * e_cell_text_copy_clipboard:
- * @cell_view: the given cell view
- * @col: column of the given cell in the view
- * @row: row of the given cell in the view
- *
- * Copys the selected text to clipboard.
- *
- * This API is most likely to be used by a11y implementations.
- */
-void
-e_cell_text_copy_clipboard (ECellView *cell_view, gint col, gint row)
-{
-	ECellTextView *ectv;
-	CellEdit *edit;
-	ETextEventProcessorCommand command;
-
-	ectv = (ECellTextView *)cell_view;
-	edit = ectv->edit;
-	if (!edit)
-		return;
-
-	if (edit->view_col != col || edit->row != row)
-		return;
-
-	command.action = E_TEP_COPY;
-	command.time = GDK_CURRENT_TIME;
-	e_cell_text_view_command (edit->tep, &command, edit);
-}
-
-/**
- * e_cell_text_paste_clipboard:
- * @cell_view: the given cell view
- * @col: column of the given cell in the view
- * @row: row of the given cell in the view
- *
- * Pastes the text from the clipboardt.
- *
- * This API is most likely to be used by a11y implementations.
- */
-void
-e_cell_text_paste_clipboard (ECellView *cell_view, gint col, gint row)
-{
-	ECellTextView *ectv;
-	CellEdit *edit;
-	ETextEventProcessorCommand command;
-
-	ectv = (ECellTextView *)cell_view;
-	edit = ectv->edit;
-	if (!edit)
-		return;
-
-	if (edit->view_col != col || edit->row != row)
-		return;
-
-	command.action = E_TEP_PASTE;
-	command.time = GDK_CURRENT_TIME;
-	e_cell_text_view_command (edit->tep, &command, edit);
-}
-
-/**
- * e_cell_text_delete_selection:
- * @cell_view: the given cell view
- * @col: column of the given cell in the view
- * @row: row of the given cell in the view
- *
- * Deletes the selected text of the cell.
- *
- * This API is most likely to be used by a11y implementations.
- */
-void
-e_cell_text_delete_selection (ECellView *cell_view, gint col, gint row)
-{
-	ECellTextView *ectv;
-	CellEdit *edit;
-	ETextEventProcessorCommand command;
-
-	ectv = (ECellTextView *)cell_view;
-	edit = ectv->edit;
-	if (!edit)
-		return;
-
-	if (edit->view_col != col || edit->row != row)
-		return;
-
-	command.action = E_TEP_DELETE;
-	command.position = E_TEP_SELECTION;
-	e_cell_text_view_command (edit->tep, &command, edit);
-}
-
-/**
- * e_cell_text_get_text_by_view:
- * @cell_view: the given cell view
- * @col: column of the given cell in the model
- * @row: row of the given cell in the model
- * 
- * Get the cell's text directly from CellEdit,
- * during editting this cell, the cell's text value maybe inconsistant
- * with the text got from table_model.
- * The caller should free the text after using it.
- *
- * This API is most likely to be used by a11y implementations.
- */
-char *
-e_cell_text_get_text_by_view (ECellView *cell_view, gint col, gint row)
-{
-	ECellTextView *ectv;
-	CellEdit *edit;
-	gchar	*ret, *model_text;
-
-	ectv = (ECellTextView *)cell_view;
-	edit = ectv->edit;
-	
-	if (edit && ectv->edit->row == row && ectv->edit->model_col == col) { /* being editted now */
-		ret = g_strdup (edit->text);
-	} else{
-		model_text = e_cell_text_get_text (E_CELL_TEXT (cell_view->ecell), 
-					     cell_view->e_table_model, col, row);
-		ret = g_strdup (model_text);
-		e_cell_text_free_text (E_CELL_TEXT (cell_view->ecell), model_text);
-	}
-
-	return ret;
-
-}
diff --git a/widgets/table/e-cell-text.h b/widgets/table/e-cell-text.h
deleted file mode 100644
index 0ef32b9ede..0000000000
--- a/widgets/table/e-cell-text.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell-text.h: Text cell renderer.
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Miguel de Icaza <miguel@ximian.com>
- *   Chris Lahey <clahey@ximian.com>
- *
- * A lot of code taken from:
- * 
- * Text item type for GnomeCanvas widget
- *
- * GnomeCanvas is basically a port of the Tk toolkit's most excellent
- * canvas widget.  Tk is copyrighted by the Regents of the University
- * of California, Sun Microsystems, and other parties.
- *
- * Copyright (C) 1998 The Free Software Foundation
- *
- * Author: Federico Mena <federico@nuclecu.unam.mx>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_CELL_TEXT_H_
-#define _E_CELL_TEXT_H_
-#include <gtk/gtkmenu.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gal/e-table/e-cell.h>
-
-G_BEGIN_DECLS
-
-#define E_CELL_TEXT_TYPE        (e_cell_text_get_type ())
-#define E_CELL_TEXT(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_CELL_TEXT_TYPE, ECellText))
-#define E_CELL_TEXT_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_CELL_TEXT_TYPE, ECellTextClass))
-#define E_IS_CELL_TEXT(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_TEXT_TYPE))
-#define E_IS_CELL_TEXT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_TEXT_TYPE))
-
-typedef struct {
-	ECell parent;
-
-	GtkJustification  justify;
-	char             *font_name;
-
-	double x, y;			/* Position at anchor */
-
-	gulong pixel;			/* Fill color */
-
-	/* Clip handling */
-	char *ellipsis;                 /* The ellipsis characters.  NULL = "...". */
-
-	guint use_ellipsis : 1;         /* Whether to use the ellipsis. */
-	guint editable : 1;		/* Whether the text can be edited. */
-	
-	int strikeout_column;
-	int underline_column;
-	int bold_column;
-
-	/* This column in the ETable should return a string specifying a color,
-	   either a color name like "red" or a color spec like "rgb:F/0/0".
-	   See the XParseColor man page for the formats available. */
-	int color_column;
-	int bg_color_column;
-
-	/* This stores the colors we have allocated. */
-	GHashTable *colors;
-} ECellText;
-
-typedef struct {
-	ECellClass parent_class;
-
-	char *(*get_text)  (ECellText *cell, ETableModel *model, int col, int row);
-	void  (*free_text) (ECellText *cell, char *text);
-	void  (*set_value) (ECellText *cell, ETableModel *model, int col, int row, const char *text);
-	/* signal handlers */
-	void (*text_inserted) (ECellText *cell, ECellView *cell_view, int pos, int len, int row, int model_col);
-	void (*text_deleted)  (ECellText *cell, ECellView *cell_view, int pos, int len, int row, int model_col);
-} ECellTextClass;
-
-GType      e_cell_text_get_type (void);
-ECell     *e_cell_text_new      (const char *fontname, GtkJustification justify);
-ECell     *e_cell_text_construct(ECellText *cell, const char *fontname, GtkJustification justify);
-
-/* Gets the value from the model and converts it into a string. In ECellText
-   itself, the value is assumed to be a char* and so needs no conversion.
-   In subclasses the ETableModel value may be a more complicated datatype. */
-char	  *e_cell_text_get_text (ECellText *cell, ETableModel *model, int col, int row);
-
-/* Frees the value returned by e_cell_text_get_text(). */
-void	   e_cell_text_free_text (ECellText *cell, char *text);
-
-/* Sets the ETableModel value, based on the given string. */
-void	   e_cell_text_set_value (ECellText *cell, ETableModel *model, int col, int row, const char *text);
-
-/* Sets the selection of given text cell */
-gboolean e_cell_text_set_selection (ECellView *cell_view, gint col, gint row, gint start, gint end);
-
-/* Gets the selection of given text cell */
-gboolean e_cell_text_get_selection (ECellView *cell_view, gint col, gint row, gint *start, gint *end);
-
-/* Copys the selected text to the clipboard */
-void e_cell_text_copy_clipboard (ECellView *cell_view, gint col, gint row);
-
-/* Pastes the text from the clipboard */
-void e_cell_text_paste_clipboard (ECellView *cell_view, gint col, gint row);
-
-/* Deletes selected text */
-void e_cell_text_delete_selection (ECellView *cell_view, gint col, gint row);
-
-/* get text directly from view, both col and row are model format */
-char *e_cell_text_get_text_by_view (ECellView *cell_view, gint col, gint row);
-
-G_END_DECLS
-
-#endif /* _E_CELL_TEXT_H_ */
-
-
diff --git a/widgets/table/e-cell-toggle.c b/widgets/table/e-cell-toggle.c
deleted file mode 100644
index 34e8a8b76d..0000000000
--- a/widgets/table/e-cell-toggle.c
+++ /dev/null
@@ -1,489 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell-toggle.c - Multi-state image toggle cell object.
- * Copyright 1999, 2000, Ximian, Inc.
- *
- * Authors:
- *   Miguel de Icaza <miguel@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <gtk/gtkenums.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include "e-cell-toggle.h"
-#include "gal/util/e-util.h"
-#include "gal/widgets/e-hsv-utils.h"
-#include "e-table-item.h"
-#include "gal/a11y/e-table/gal-a11y-e-cell-toggle.h"
-#include "gal/a11y/e-table/gal-a11y-e-cell-registry.h"
-
-#define PARENT_TYPE e_cell_get_type ()
-
-typedef struct {
-	ECellView     cell_view;
-	GdkGC        *gc;
-	GnomeCanvas  *canvas;
-	GdkPixmap   **pixmap_cache;
-} ECellToggleView;
-
-static ECellClass *parent_class;
-
-#define CACHE_SEQ_COUNT 6
-
-static int
-gnome_print_pixbuf (GnomePrintContext *pc, GdkPixbuf *pixbuf)
-{
-       if (gdk_pixbuf_get_has_alpha (pixbuf))
-               return gnome_print_rgbaimage  (pc,
-					      gdk_pixbuf_get_pixels    (pixbuf),
-					      gdk_pixbuf_get_width     (pixbuf),
-					      gdk_pixbuf_get_height    (pixbuf),
-					      gdk_pixbuf_get_rowstride (pixbuf));
-       else
-               return gnome_print_rgbimage  (pc,
-					     gdk_pixbuf_get_pixels    (pixbuf),
-					     gdk_pixbuf_get_width     (pixbuf),
-					     gdk_pixbuf_get_height    (pixbuf),
-					     gdk_pixbuf_get_rowstride (pixbuf));
-}
-
-/*
- * ECell::realize method
- */
-static ECellView *
-etog_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
-	ECellToggleView *toggle_view = g_new0 (ECellToggleView, 1);
-	ETableItem *eti = E_TABLE_ITEM (e_table_item_view);
-	GnomeCanvas *canvas = GNOME_CANVAS_ITEM (eti)->canvas;
-	ECellToggle *etog = E_CELL_TOGGLE (ecell);
-	int i;
-
-	toggle_view->cell_view.ecell = ecell;
-	toggle_view->cell_view.e_table_model = table_model;
-	toggle_view->cell_view.e_table_item_view = e_table_item_view;
-	toggle_view->canvas = canvas;
-	toggle_view->pixmap_cache = g_new (GdkPixmap *, etog->n_states * CACHE_SEQ_COUNT);
-	for (i = 0; i < etog->n_states * CACHE_SEQ_COUNT; i++)
-		toggle_view->pixmap_cache[i] = NULL;
-
-	return (ECellView *) toggle_view;
-}
-
-static void
-etog_kill_view (ECellView *ecell_view)
-{
-	ECellToggle *etog = E_CELL_TOGGLE (ecell_view->ecell);
-	ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
-	int i;
-
-	for (i = 0; i < etog->n_states * CACHE_SEQ_COUNT; i++)
-		if (toggle_view->pixmap_cache[i])
-			gdk_pixmap_unref (toggle_view->pixmap_cache[i]);
-	g_free (toggle_view->pixmap_cache);
-	g_free (ecell_view);
-}	
-
-static void
-etog_realize (ECellView *ecell_view)
-{
-	ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
-
-	toggle_view->gc = gdk_gc_new (GTK_WIDGET (toggle_view->canvas)->window);
-}
-
-/*
- * ECell::unrealize method
- */
-static void
-etog_unrealize (ECellView *ecv)
-{
-	ECellToggleView *toggle_view = (ECellToggleView *) ecv;
-
-	gdk_gc_unref (toggle_view->gc);
-	toggle_view->gc = NULL;
-}
-
-#define PIXMAP_CACHE(toggle_view, cache_seq, image_seq) ((toggle_view)->pixmap_cache[(cache_seq) * E_CELL_TOGGLE (((ECellView *) (toggle_view))->ecell)->n_states + (image_seq)])
-
-#define RGB_COLOR(color) (((color).red & 0xff00) << 8 | \
-			   ((color).green & 0xff00) | \
-			   ((color).blue & 0xff00) >> 8)
-
-static void
-check_cache (ECellToggleView *toggle_view, int image_seq, int cache_seq)
-{
-	ECellView *ecell_view = (ECellView *) toggle_view;
-	ECellToggle *etog = E_CELL_TOGGLE (ecell_view->ecell);
-
-	if (PIXMAP_CACHE (toggle_view, cache_seq, image_seq) == NULL) {
-		GdkPixbuf *image = etog->images[image_seq];
-		GdkPixbuf *flat;
-		GdkColor  color;
-		int width = gdk_pixbuf_get_width (image);
-		int height = gdk_pixbuf_get_height (image);
-
-		PIXMAP_CACHE (toggle_view, cache_seq, image_seq) =
-			gdk_pixmap_new (toggle_view->canvas->layout.bin_window, width, height,
-					gtk_widget_get_visual (GTK_WIDGET (toggle_view->canvas))->depth);
-
-		
-		switch (cache_seq % 3) {
-		case 0:
-			color = GTK_WIDGET (toggle_view->canvas)->style->bg [GTK_STATE_SELECTED];
-			break;
-		case 1:
-			color = GTK_WIDGET (toggle_view->canvas)->style->bg [GTK_STATE_ACTIVE];
-			break;
-		case 2:
-			color = GTK_WIDGET (toggle_view->canvas)->style->base [GTK_STATE_NORMAL];
-			break;
-		}
-
-		if (cache_seq >= 3) {
-			e_hsv_tweak (&color, 0.0f, 0.0f, -0.07f);
-		}
-
-		flat = gdk_pixbuf_composite_color_simple (image,
-							  width, height,
-							  GDK_INTERP_BILINEAR,
-							  255,
-							  1,
-							  RGB_COLOR (color), RGB_COLOR (color));
-
-		gdk_pixbuf_render_to_drawable (flat, PIXMAP_CACHE (toggle_view, cache_seq, image_seq),
-					       toggle_view->gc,
-					       0, 0,
-					       0, 0,
-					       width, height,
-					       GDK_RGB_DITHER_NORMAL,
-					       0, 0);
-		gdk_pixbuf_unref (flat);
-	}
-}
-
-/*
- * ECell::draw method
- */
-static void
-etog_draw (ECellView *ecell_view, GdkDrawable *drawable,
-	  int model_col, int view_col, int row, ECellFlags flags,
-	  int x1, int y1, int x2, int y2)
-{
-	ECellToggle *toggle = E_CELL_TOGGLE (ecell_view->ecell);
-	gboolean selected;
-	ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
-	GdkPixmap *pixmap;
-	GdkPixbuf *image;
-	int x, y, width, height;
-	int cache_seq;
-	
-	const int value = GPOINTER_TO_INT (
-		 e_table_model_value_at (ecell_view->e_table_model, model_col, row));
-	
-	selected = flags & E_CELL_SELECTED;
-
-	if (value < 0 || value >= toggle->n_states){
-		g_warning ("Value from the table model is %d, the states we support are [0..%d)\n",
-			   value, toggle->n_states);
-		return;
-	}
-
-	if (flags & E_CELL_SELECTED) {
-		if (GTK_WIDGET_HAS_FOCUS (toggle_view->canvas))
-			cache_seq = 0;
-		else
-			cache_seq = 1;
-	} else
-		cache_seq = 2;
-
-	if (E_TABLE_ITEM (ecell_view->e_table_item_view)->alternating_row_colors && (row % 2) == 0)
-		cache_seq += 3;
-
-	check_cache (toggle_view, value, cache_seq);
-
-	pixmap = PIXMAP_CACHE (toggle_view, cache_seq, value);
-	image = toggle->images[value];
-
-	if ((x2 - x1) < gdk_pixbuf_get_width (image)){
-		x = x1;
-		width = x2 - x1;
-	} else {
-		x = x1 + ((x2 - x1) - gdk_pixbuf_get_width (image)) / 2;
-		width = gdk_pixbuf_get_width (image);
-	}
-
-	if ((y2 - y1) < gdk_pixbuf_get_height (image)){
-		y = y1;
-		height = y2 - y1;
-	} else {
-		y = y1 + ((y2 - y1) - gdk_pixbuf_get_height (image)) / 2;
-		height = gdk_pixbuf_get_height (image);
-	}
-
-	gdk_draw_pixmap	 (drawable, toggle_view->gc,
-			  pixmap,
-			  0, 0,
-			  x, y,
-			  width, height);
-}
-
-static void
-etog_set_value (ECellToggleView *toggle_view, int model_col, int view_col, int row, int value)
-{
-	ECell *ecell = toggle_view->cell_view.ecell;
-	ECellToggle *toggle = E_CELL_TOGGLE (ecell);
-
-	if (value >= toggle->n_states)
-		value = 0;
-
-	e_table_model_set_value_at (toggle_view->cell_view.e_table_model,
-				    model_col, row, GINT_TO_POINTER (value));
-}
-
-/*
- * ECell::event method
- */
-static gint
-etog_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row, ECellFlags flags, ECellActions *actions)
-{
-	ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
-	void *_value = e_table_model_value_at (ecell_view->e_table_model, model_col, row);
-	const int value = GPOINTER_TO_INT (_value);
-
-#if 0
-	if (!(flags & E_CELL_EDITING))
-		return FALSE;
-#endif
-
-	switch (event->type){
-	case GDK_KEY_PRESS:
-		if (event->key.keyval != GDK_space)
-			return FALSE;
-		/* Fall through */
-	case GDK_BUTTON_PRESS:
-		if (!e_table_model_is_cell_editable(ecell_view->e_table_model, model_col, row))
-			return FALSE;
-		
-		etog_set_value (toggle_view, model_col, view_col, row, value + 1);
-		return TRUE;
-
-	default:
-		return FALSE;
-	}
-	return TRUE;
-}
-
-/*
- * ECell::height method
- */
-static int
-etog_height (ECellView *ecell_view, int model_col, int view_col, int row)
-{
-	ECellToggle *toggle = E_CELL_TOGGLE (ecell_view->ecell);
-
-	return toggle->height;
-}
-
-/*
- * ECell::print method
- */
-static void
-etog_print (ECellView *ecell_view, GnomePrintContext *context, 
-	    int model_col, int view_col, int row,
-	    double width, double height)
-{
-	ECellToggle *toggle = E_CELL_TOGGLE(ecell_view->ecell);
-	GdkPixbuf *image;
-	const int value = GPOINTER_TO_INT (
-		e_table_model_value_at (ecell_view->e_table_model, model_col, row));
-
-	if (value >= toggle->n_states){
-		g_warning ("Value from the table model is %d, the states we support are [0..%d)\n",
-			   value, toggle->n_states);
-		return;
-	}
-
-	gnome_print_gsave(context);
-
-	image = toggle->images[value];
-
-	gnome_print_translate (context, 0, (height - toggle->height) / 2);
-	gnome_print_scale (context, toggle->height, toggle->height);
-	gnome_print_pixbuf (context, image);
-	
-	gnome_print_grestore(context);
-}
-
-static gdouble
-etog_print_height (ECellView *ecell_view, GnomePrintContext *context, 
-		   int model_col, int view_col, int row,
-		   double width)
-{
-	ECellToggle *toggle = E_CELL_TOGGLE (ecell_view->ecell);
-
-	return toggle->height;
-}
-
-/*
- * ECell::max_width method
- */
-static int
-etog_max_width (ECellView *ecell_view, int model_col, int view_col)
-{
-	ECellToggle *toggle = E_CELL_TOGGLE (ecell_view->ecell);
-	int max_width = 0;
-	int number_of_rows;
-	int row;
-
-	number_of_rows = e_table_model_row_count (ecell_view->e_table_model);
-	for (row = 0; row < number_of_rows; row++) {
-		void *value = e_table_model_value_at (ecell_view->e_table_model,
-						      model_col, row);
-		max_width = MAX (max_width, gdk_pixbuf_get_width (toggle->images[GPOINTER_TO_INT (value)]));
-	}
-
-	return max_width;
-}
-
-static void
-etog_style_set (ECellView *ecell_view, GtkStyle *previous_style)
-{
-	ECellToggle *toggle = E_CELL_TOGGLE (ecell_view->ecell);
-	ECellToggleView *toggle_view = (ECellToggleView *) ecell_view;
-	int i;
-
-	for (i = 0; i < toggle->n_states * CACHE_SEQ_COUNT; i++) {
-		if (toggle_view->pixmap_cache[i]) {
-			gdk_pixmap_unref (toggle_view->pixmap_cache[i]);
-			toggle_view->pixmap_cache[i] = NULL;
-		}
-	}
-}
-
-static void
-etog_finalize (GObject *object)
-{
-	ECellToggle *etog = E_CELL_TOGGLE (object);
-	int i;
-	
-	for (i = 0; i < etog->n_states; i++)
-		gdk_pixbuf_unref (etog->images [i]);
-
-	g_free (etog->images);
-
-	etog->images = NULL;
-	etog->n_states = 0;
-
-	G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-static void
-e_cell_toggle_class_init (GtkObjectClass *object_class)
-{
-	ECellClass *ecc = (ECellClass *) object_class;
-
-	G_OBJECT_CLASS (object_class)->finalize = etog_finalize;
-
-	ecc->new_view   = etog_new_view;
-	ecc->kill_view  = etog_kill_view;
-	ecc->realize    = etog_realize;
-	ecc->unrealize  = etog_unrealize;
-	ecc->draw       = etog_draw;
-	ecc->event      = etog_event;
-	ecc->height     = etog_height;
-	ecc->print      = etog_print;
-	ecc->print_height = etog_print_height;
-	ecc->max_width  = etog_max_width;
-	ecc->style_set  = etog_style_set;
-
-	parent_class = g_type_class_ref (PARENT_TYPE);
-	gal_a11y_e_cell_registry_add_cell_type (NULL,
-                                                E_CELL_TOGGLE_TYPE,
-                                                gal_a11y_e_cell_toggle_new);
-}
-
-static void
-e_cell_toggle_init (GtkObject *object)
-{
-	ECellToggle *etog = (ECellToggle *) object;
-
-	etog->images = NULL;
-	etog->n_states = 0;
-}
-
-E_MAKE_TYPE(e_cell_toggle, "ECellToggle", ECellToggle, e_cell_toggle_class_init, e_cell_toggle_init, PARENT_TYPE)
-
-/**
- * e_cell_toggle_construct:
- * @etog: a fresh ECellToggle object
- * @border: number of pixels used as a border
- * @n_states: number of states the toggle will have
- * @images: a collection of @n_states images, one for each state.
- *
- * Constructs the @etog object with the @border, @n_staes, and @images
- * arguments.
- */
-void
-e_cell_toggle_construct (ECellToggle *etog, int border, int n_states, GdkPixbuf **images)
-{
-	int max_height =  0;
-	int i;
-	
-	etog->border = border;
-	etog->n_states = n_states;
-
-	etog->images = g_new (GdkPixbuf *, n_states);
-
-	for (i = 0; i < n_states; i++){
-		etog->images [i] = images [i];
-		gdk_pixbuf_ref (images [i]);
-
-		if (gdk_pixbuf_get_height (images [i]) > max_height)
-			max_height = gdk_pixbuf_get_height (images [i]);
-	}
-
-	etog->height = max_height;
-}
-
-/**
- * e_cell_checkbox_new:
- * @border: number of pixels used as a border
- * @n_states: number of states the toggle will have
- * @images: a collection of @n_states images, one for each state.
- *
- * Creates a new ECell renderer that can be used to render toggle
- * buttons with the images specified in @images.  The value returned 
- * by ETableModel::get_value is typecase into an integer and clamped
- * to the [0..n_states) range.  That will select the image rendered.
- * 
- * Returns: an ECell object that can be used to render multi-state
- * toggle cells.
- */
-ECell *
-e_cell_toggle_new (int border, int n_states, GdkPixbuf **images)
-{
-	ECellToggle *etog = g_object_new (E_CELL_TOGGLE_TYPE, NULL);
-
-	e_cell_toggle_construct (etog, border, n_states, images);
-
-	return (ECell *) etog;
-}
diff --git a/widgets/table/e-cell-toggle.h b/widgets/table/e-cell-toggle.h
deleted file mode 100644
index 71d9de3883..0000000000
--- a/widgets/table/e-cell-toggle.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-cell-toggle.h - Multi-state image toggle cell object.
- * Copyright 1999, 2000, Ximian, Inc.
- *
- * Authors:
- *   Miguel de Icaza <miguel@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_CELL_TOGGLE_H_
-#define _E_CELL_TOGGLE_H_
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gal/e-table/e-cell.h>
-
-G_BEGIN_DECLS
-
-#define E_CELL_TOGGLE_TYPE        (e_cell_toggle_get_type ())
-#define E_CELL_TOGGLE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_CELL_TOGGLE_TYPE, ECellToggle))
-#define E_CELL_TOGGLE_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_CELL_TOGGLE_TYPE, ECellToggleClass))
-#define E_IS_CELL_TOGGLE(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_TOGGLE_TYPE))
-#define E_IS_CELL_TOGGLE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_TOGGLE_TYPE))
-
-typedef struct {
-	ECell parent;
-
-	int        border;
-	int        n_states;
-	GdkPixbuf **images;
-
-	int        height;
-} ECellToggle;
-
-typedef struct {
-	ECellClass parent_class;
-} ECellToggleClass;
-
-GType      e_cell_toggle_get_type  (void);
-ECell     *e_cell_toggle_new       (int border, int n_states, GdkPixbuf **images);
-void       e_cell_toggle_construct (ECellToggle *etog, int border,
-				    int n_states, GdkPixbuf **images);
-
-G_END_DECLS
-
-#endif /* _E_CELL_TOGGLE_H_ */
-
-
diff --git a/widgets/table/e-cell-tree.c b/widgets/table/e-cell-tree.c
deleted file mode 100644
index a0be81e889..0000000000
--- a/widgets/table/e-cell-tree.c
+++ /dev/null
@@ -1,911 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-cell-tree.c - Tree cell object.
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Toshok <toshok@ximian.com>
- *
- * A majority of code taken from:
- *
- * the ECellText renderer.
- * Copyright 1998, The Free Software Foundation
- * Copyright 1999, 2000, Ximian, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include <ctype.h>
-#include <math.h>
-#include <stdio.h>
-
-#include <gdk/gdkx.h> /* for BlackPixel */
-#include <gtk/gtkenums.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtkinvisible.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-#include <libgnomecanvas/gnome-canvas.h>
-
-#include "e-tree-table-adapter.h"
-#include "e-tree.h"
-#include "e-tree-model.h"
-#include "gal/util/e-util.h"
-#include "e-table-item.h"
-#include "e-cell-tree.h"
-
-#include "tree-expanded.xpm"
-#include "tree-unexpanded.xpm"
-
-#include "gal/a11y/e-table/gal-a11y-e-cell-registry.h"
-#include "gal/a11y/e-table/gal-a11y-e-cell-tree.h"
-
-#define PARENT_TYPE e_cell_get_type ()
-
-typedef struct {
-	ECellView    cell_view;
-	ECellView   *subcell_view;
-	GdkGC       *gc;
-
-	GnomeCanvas *canvas;
-	gboolean retro_look;
-	gboolean prelit;
-	gint animate_timeout;
-
-} ECellTreeView;
-
-static ECellClass *parent_class;
-
-#define INDENT_AMOUNT 16
-
-ECellView *
-e_cell_tree_view_get_subcell_view (ECellView *ect)
-{
-	return ((ECellTreeView *)ect)->subcell_view;
-}
-
-static ETreePath
-e_cell_tree_get_node (ETableModel *table_model, int row)
-{
-	return e_table_model_value_at (table_model, -1, row);
-}
-
-static ETreeModel*
-e_cell_tree_get_tree_model (ETableModel *table_model, int row)
-{
-	return e_table_model_value_at (table_model, -2, row);
-}
-
-static ETreeTableAdapter *
-e_cell_tree_get_tree_table_adapter (ETableModel *table_model, int row)
-{
-	return e_table_model_value_at (table_model, -3, row);
-}
-
-static int
-visible_depth_of_node (ETableModel *model, int row)
-{
-	ETreeModel *tree_model = e_cell_tree_get_tree_model(model, row);
-	ETreeTableAdapter *adapter = e_cell_tree_get_tree_table_adapter(model, row);
-	ETreePath path = e_cell_tree_get_node(model, row);
-	return (e_tree_model_node_depth (tree_model, path)
-		- (e_tree_table_adapter_root_node_is_visible (adapter) ? 0 : 1));
-}
-
-/* If this is changed to not include the width of the expansion pixmap
-   if the path is not expandable, then max_width needs to change as
-   well. */
-static gint
-offset_of_node (ETableModel *table_model, int row)
-{
-	ETreeModel *tree_model = e_cell_tree_get_tree_model(table_model, row);
-	ETreePath path = e_cell_tree_get_node(table_model, row);
-
-	if (visible_depth_of_node (table_model, row) > 0 ||
-	    e_tree_model_node_is_expandable(tree_model, path)) {
-		return (visible_depth_of_node(table_model, row) + 1) * INDENT_AMOUNT;
-	} else {
-		return 0;
-	}
-}
-
-/*
- * ECell::new_view method
- */
-static ECellView *
-ect_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
-	ECellTree *ect = E_CELL_TREE (ecell);
-	ECellTreeView *tree_view = g_new0 (ECellTreeView, 1);
-	GnomeCanvas *canvas = GNOME_CANVAS_ITEM (e_table_item_view)->canvas;
-	
-	tree_view->cell_view.ecell = ecell;
-	tree_view->cell_view.e_table_model = table_model;
-	tree_view->cell_view.e_table_item_view = e_table_item_view;
-	
-	/* create our subcell view */
-	tree_view->subcell_view = e_cell_new_view (ect->subcell, table_model, e_table_item_view /* XXX */);
-
-	tree_view->canvas = canvas;
-
-	return (ECellView *)tree_view;
-}
-
-/*
- * ECell::kill_view method
- */
-static void
-ect_kill_view (ECellView *ecv)
-{
-	ECellTreeView *tree_view = (ECellTreeView *) ecv;
-
-	/* kill our subcell view */
-	e_cell_kill_view (tree_view->subcell_view);
-
-	g_free (tree_view);
-}
-
-/*
- * ECell::realize method
- */
-static void
-ect_realize (ECellView *ecell_view)
-{
-	ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
-	/* realize our subcell view */
-	e_cell_realize (tree_view->subcell_view);
-
-	tree_view->gc = gdk_gc_new (GTK_WIDGET (tree_view->canvas)->window);
-
-	gdk_gc_set_line_attributes (tree_view->gc, 1, 
-				    GDK_LINE_ON_OFF_DASH, None, None);
-	gdk_gc_set_dashes (tree_view->gc, 0, "\1\1", 2);
-
-	if (parent_class->realize)
-		(* parent_class->realize) (ecell_view);
-}
-
-/*
- * ECell::unrealize method
- */
-static void
-ect_unrealize (ECellView *ecv)
-{
-	ECellTreeView *tree_view = (ECellTreeView *) ecv;
-
-	/* unrealize our subcell view. */
-	e_cell_unrealize (tree_view->subcell_view);
-
-	gdk_gc_unref (tree_view->gc);
-	tree_view->gc = NULL;
-
-	if (parent_class->unrealize)
-		(* parent_class->unrealize) (ecv);
-}
-
-static void
-draw_retro_expander (ECellTreeView *ectv, GdkDrawable *drawable, gboolean expanded, GdkRectangle *rect)
-{
-	GdkPixbuf *image;
-	int image_width, image_height;
-	ECellTree *ect = E_CELL_TREE(ectv->cell_view.ecell);
-
-	image = expanded ? ect->open_pixbuf : ect->closed_pixbuf;
-
-	image_width = gdk_pixbuf_get_width(image);
-	image_height = gdk_pixbuf_get_height(image);
-
-	gdk_pixbuf_render_to_drawable_alpha (image,
-					     drawable,
-					     rect->x, rect->y,
-					     rect->width - image_width / 2, 
-					     rect->height - image_height / 2,
-					     image_width, image_height,
-					     GDK_PIXBUF_ALPHA_BILEVEL,
-					     128,
-					     GDK_RGB_DITHER_NORMAL,
-					     image_width, 0);
-}
-
-static void
-draw_expander (ECellTreeView *ectv, GdkDrawable *drawable, GtkExpanderStyle expander_style, GtkStateType state, GdkRectangle *rect)
-{
-	GtkWidget *tree = GTK_WIDGET (ectv->canvas)->parent;
-	gint exp_size;
-	gtk_widget_style_get (tree, "expander_size", &exp_size, NULL);
-
-	gtk_paint_expander (tree->style, drawable, state, rect, tree, "treeview", rect->x + rect->width - exp_size / 2, rect->y + rect->height / 2, expander_style);
-}
-
-/*
- * ECell::draw method
- */
-static void
-ect_draw (ECellView *ecell_view, GdkDrawable *drawable,
-	  int model_col, int view_col, int row, ECellFlags flags,
-	  int x1, int y1, int x2, int y2)
-{
-	ECellTreeView *tree_view = (ECellTreeView *)ecell_view;
-	ETreeModel *tree_model = e_cell_tree_get_tree_model(ecell_view->e_table_model, row);
-	ETreeTableAdapter *tree_table_adapter = e_cell_tree_get_tree_table_adapter(ecell_view->e_table_model, row);
-	ETreePath node;
-	GdkRectangle rect, *clip_rect = NULL;
-	GtkWidget *canvas = GTK_WIDGET (tree_view->canvas);
-	GdkGC *fg_gc = canvas->style->fg_gc[GTK_STATE_ACTIVE];
-	GdkColor *foreground;
-	gboolean selected;
-
-	int offset, subcell_offset;
-
-	selected = flags & E_CELL_SELECTED;
-
-	/* only draw the tree effects if we're the active sort */
-	if (/* XXX */ TRUE) {
-		GdkPixbuf *node_image;
-		int node_image_width = 0, node_image_height = 0;
-		ETreePath parent_node;
-		ETree *tree = E_TREE (canvas->parent);
-
-		gtk_widget_style_get (GTK_WIDGET (tree),
-				      "retro_look", &tree_view->retro_look,
-				      NULL);
-		tree_view->prelit = FALSE;
-
-		node = e_cell_tree_get_node (ecell_view->e_table_model, row);
-
-		offset = offset_of_node (ecell_view->e_table_model, row);
-		subcell_offset = offset;
-
-		node_image = e_tree_model_icon_at (tree_model, node);
-
-		if (node_image) {
-			node_image_width = gdk_pixbuf_get_width (node_image);
-			node_image_height = gdk_pixbuf_get_height (node_image);
-		}
-
-		/*
-		 * Be a nice citizen: clip to the region we are supposed to draw on
-		 */
-		rect.x = x1;
-		rect.y = y1;
-		rect.width = subcell_offset + node_image_width;
-		rect.height = y2 - y1;
-	
-		gdk_gc_set_clip_rectangle (tree_view->gc, &rect);
-		gdk_gc_set_clip_rectangle (fg_gc, &rect);
-		clip_rect = &rect;
-
-		if (selected) {
-			foreground = &canvas->style->text [GTK_STATE_SELECTED];
-		} else {
-			foreground = &canvas->style->text [GTK_STATE_NORMAL];
-		}
-
-		gdk_gc_set_foreground (tree_view->gc, foreground);
-
-		/* draw our lines */
-		if (tree_view->retro_look && E_CELL_TREE(tree_view->cell_view.ecell)->draw_lines) {
-
-			int depth;
-
-			if (visible_depth_of_node (ecell_view->e_table_model, row) > 0
-			    || e_tree_model_node_get_children (tree_model, node, NULL) > 0)
-				gdk_draw_line (drawable, tree_view->gc,
-					       rect.x + offset - INDENT_AMOUNT / 2 + 1,
-					       rect.y + rect.height / 2,
-					       rect.x + offset,
-					       rect.y + rect.height / 2);
-
-			if (visible_depth_of_node (ecell_view->e_table_model, row) != 0) {
-				gdk_draw_line (drawable, tree_view->gc,
-					       rect.x + offset - INDENT_AMOUNT / 2,
-					       rect.y,
-					       rect.x + offset - INDENT_AMOUNT / 2,
-					       (e_tree_table_adapter_node_get_next (tree_table_adapter, node)
-						? rect.y + rect.height
-						: rect.y + rect.height / 2));
-			}
-
-			/* now traverse back up to the root of the tree, checking at
-			   each level if the node has siblings, and drawing the
-			   correct vertical pipe for it's configuration. */
-			parent_node = e_tree_model_node_get_parent (tree_model, node);
-			offset -= INDENT_AMOUNT;
-			depth = visible_depth_of_node (ecell_view->e_table_model, row) - 1;
-			while (parent_node && depth != 0) {
-				if (e_tree_table_adapter_node_get_next(tree_table_adapter, parent_node)) {
-					gdk_draw_line (drawable, tree_view->gc,
-						       rect.x + offset - INDENT_AMOUNT / 2,
-						       rect.y,
-						       rect.x + offset - INDENT_AMOUNT / 2,
-						       rect.y + rect.height);
-				}
-				parent_node = e_tree_model_node_get_parent (tree_model, parent_node);
-				depth --;
-				offset -= INDENT_AMOUNT;
-			}
-		}
-
-		/* now draw our icon if we're expandable */
-		if (e_tree_model_node_is_expandable (tree_model, node)) {
-			gboolean expanded = e_tree_table_adapter_node_is_expanded (tree_table_adapter, node);
-			GdkRectangle r;
-			if (tree_view->retro_look) {
-				r.x = 0;
-				r.y = 0;
-				r.width = x1 + subcell_offset - INDENT_AMOUNT / 2,
-				r.height = y1 + (y2 - y1) / 2,
-				draw_retro_expander (tree_view, drawable, expanded, &r);
-			} else {
-				r = rect;
-				r.width -= node_image_width + 2;
-				draw_expander (tree_view, drawable, expanded ? GTK_EXPANDER_EXPANDED : GTK_EXPANDER_COLLAPSED, GTK_STATE_NORMAL, &r);
-			}
-		}
-
-		if (node_image) {
-			gdk_pixbuf_render_to_drawable_alpha (node_image,
-							     drawable,
-							     0, 0,
-							     x1 + subcell_offset,
-							     y1 + (y2 - y1) / 2 - node_image_height / 2,
-							     node_image_width, node_image_height,
-							     GDK_PIXBUF_ALPHA_BILEVEL,
-							     128,
-							     GDK_RGB_DITHER_NORMAL,
-							     node_image_width, 0);
-			subcell_offset += node_image_width;
-		}
-	}
-
-	/* Now cause our subcell to draw its contents, shifted by
-	   subcell_offset pixels */
-	e_cell_draw (tree_view->subcell_view, drawable,
-		     model_col, view_col, row, flags,
-		     x1 + subcell_offset, y1, x2, y2);
-
-	if (clip_rect) {
-		gdk_gc_set_clip_rectangle (tree_view->gc, NULL);
-		gdk_gc_set_clip_rectangle (fg_gc, NULL);
-	}
-}
-
-static void
-adjust_event_position (GdkEvent *event, gint offset)
-{
-	switch (event->type) {
-	case GDK_BUTTON_PRESS:
-	case GDK_BUTTON_RELEASE:
-	case GDK_2BUTTON_PRESS:
-	case GDK_3BUTTON_PRESS:
-		event->button.x += offset;
-		break;
-	case GDK_MOTION_NOTIFY:
-		event->motion.x += offset;
-		break;
-	default:
-		break;
-	}
-}
-
-static gboolean
-event_in_expander (GdkEvent *event, gint offset, gint height)
-{
-	switch (event->type) {
-	case GDK_BUTTON_PRESS:
-		return (event->button.x > (offset - INDENT_AMOUNT) && event->button.x < offset);
-	case GDK_MOTION_NOTIFY:
-		return (event->motion.x > (offset - INDENT_AMOUNT) && event->motion.x < offset &&
-			event->motion.y > 2 && event->motion.y < (height - 2));
-	default:
-		break;
-	}
-
-	return FALSE;
-}
-
-/*
- * ECell::height method
- */
-static int
-ect_height (ECellView *ecell_view, int model_col, int view_col, int row) 
-{
-	ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
-	return (((e_cell_height (tree_view->subcell_view, model_col, view_col, row)) + 1) / 2) * 2;
-}
-
-typedef struct {
-	ECellTreeView *ectv;
-	ETreeTableAdapter *etta;
-	ETreePath node;
-	gboolean expanded;
-	gboolean finish;
-	GdkRectangle area;
-} animate_closure_t;
-
-static gboolean
-animate_expander (gpointer data)
-{
-	animate_closure_t *closure = (animate_closure_t *) data;
-
-	if (closure->finish) {
-		e_tree_table_adapter_node_set_expanded (closure->etta, closure->node, !closure->expanded);
-		closure->ectv->animate_timeout = 0;
-		g_free (data);
-		return FALSE;
-	}
-
-	draw_expander (closure->ectv, GTK_LAYOUT (closure->ectv->canvas)->bin_window,
-		       closure->expanded ? GTK_EXPANDER_SEMI_COLLAPSED : GTK_EXPANDER_SEMI_EXPANDED,
-		       GTK_STATE_NORMAL, &closure->area);
-	closure->finish = TRUE;
-
-	return TRUE;
-}
-
-/*
- * ECell::event method
- */
-static gint
-ect_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row, ECellFlags flags, ECellActions *actions)
-{
-	ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-	ETreeModel *tree_model = e_cell_tree_get_tree_model (ecell_view->e_table_model, row);
-	ETreeTableAdapter *etta = e_cell_tree_get_tree_table_adapter(ecell_view->e_table_model, row);
-	ETreePath node = e_cell_tree_get_node (ecell_view->e_table_model, row);
-	int offset = offset_of_node (ecell_view->e_table_model, row);
-	gint result;
-
-	switch (event->type) {
-	case GDK_BUTTON_PRESS:
-
-		if (event_in_expander (event, offset, 0)) {
-			if (e_tree_model_node_is_expandable (tree_model, node)) {
-				gboolean expanded = e_tree_table_adapter_node_is_expanded(etta, node);
-				if (tree_view->retro_look)
-					e_tree_table_adapter_node_set_expanded (etta, node, !expanded);
-				else {
-					gint tmp_row = row;
-					GdkRectangle area;
-					animate_closure_t *closure = g_new0 (animate_closure_t, 1);
-					e_table_item_get_cell_geometry (tree_view->cell_view.e_table_item_view,
-								&tmp_row, &view_col, &area.x, &area.y, NULL, &area.height);
-					area.width = offset - 2;
-					draw_expander (tree_view, GTK_LAYOUT (tree_view->canvas)->bin_window,
-						       expanded ? GTK_EXPANDER_SEMI_EXPANDED : GTK_EXPANDER_SEMI_COLLAPSED,
-						       GTK_STATE_NORMAL, &area);
-					closure->ectv = tree_view;
-					closure->etta = etta;
-					closure->node = node;
-					closure->expanded = expanded;
-					closure->area = area;
-					tree_view->animate_timeout = g_timeout_add (50, animate_expander, closure);
-				}
-				return TRUE;
-			}
-		}
-		else if (event->button.x < (offset - INDENT_AMOUNT))
-			return FALSE;
-		break;
-
-	case GDK_MOTION_NOTIFY:
-
-		if (!tree_view->retro_look && e_tree_model_node_is_expandable (tree_model, node)) {
-			gint height = ect_height (ecell_view, model_col, view_col, row);
-			GdkRectangle area;
-			gboolean in_expander = event_in_expander (event, offset, height);
-
-			if (tree_view->prelit ^ in_expander) {
-				gint tmp_row = row;
-				e_table_item_get_cell_geometry (tree_view->cell_view.e_table_item_view,
-								&tmp_row, &view_col, &area.x, &area.y, NULL, &area.height);
-				area.width = offset - 2;
-				draw_expander (tree_view, GTK_LAYOUT (tree_view->canvas)->bin_window,
-					       e_tree_table_adapter_node_is_expanded (etta, node) ? GTK_EXPANDER_EXPANDED : GTK_EXPANDER_COLLAPSED,
-					       in_expander ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL, &area);
-				tree_view->prelit = in_expander;
-				return TRUE;
-			}
-
-		}
-		break;
-
-	case GDK_LEAVE_NOTIFY:
-
-		if (tree_view->prelit) {
-			gint tmp_row = row;
-			GdkRectangle area;
-			e_table_item_get_cell_geometry (tree_view->cell_view.e_table_item_view,
-							&tmp_row, &view_col, &area.x, &area.y, NULL, &area.height);
-			area.width = offset - 2;
-			draw_expander (tree_view, GTK_LAYOUT (tree_view->canvas)->bin_window,
-				       e_tree_table_adapter_node_is_expanded (etta, node) ? GTK_EXPANDER_EXPANDED : GTK_EXPANDER_COLLAPSED,
-				       GTK_STATE_NORMAL, &area);
-			tree_view->prelit = FALSE;
-		}
-		return TRUE;
-
-	default:
-		break;
-	}
-
-	adjust_event_position (event, -offset);
-	result = e_cell_event(tree_view->subcell_view, event, model_col, view_col, row, flags, actions);
-	adjust_event_position (event, offset);
-
-	return result;
-}
-
-/*
- * ECell::max_width method
- */
-static int
-ect_max_width (ECellView *ecell_view, int model_col, int view_col)
-{
-	ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-	int row;
-	int number_of_rows;
-	int max_width = 0;
-	int width = 0;
-	int subcell_max_width = 0;
-	gboolean per_row = e_cell_max_width_by_row_implemented (tree_view->subcell_view);
-
-	number_of_rows = e_table_model_row_count (ecell_view->e_table_model);
-
-	if (!per_row)
-		subcell_max_width = e_cell_max_width (tree_view->subcell_view, model_col, view_col);
-	
-	for (row = 0; row < number_of_rows; row++) {
-		ETreeModel *tree_model = e_cell_tree_get_tree_model(ecell_view->e_table_model, row);
-		ETreePath node;
-		GdkPixbuf *node_image;
-		int node_image_width = 0, node_image_height = 0;
-		
-		int offset, subcell_offset;
-#if 0
-		gboolean expanded, expandable;
-		ETreeTableAdapter *tree_table_adapter = e_cell_tree_get_tree_table_adapter(ecell_view->e_table_model, row);
-#endif
-		
-		node = e_cell_tree_get_node (ecell_view->e_table_model, row);
-		
-		offset = offset_of_node (ecell_view->e_table_model, row);
-		subcell_offset = offset;
-
-		node_image = e_tree_model_icon_at (tree_model, node);
-
-		if (node_image) {
-			node_image_width = gdk_pixbuf_get_width (node_image);
-			node_image_height = gdk_pixbuf_get_height (node_image);
-		}
-
-		width = subcell_offset + node_image_width;
-
-		if (per_row)
-			width += e_cell_max_width_by_row (tree_view->subcell_view, model_col, view_col, row);
-		else
-			width += subcell_max_width;
-
-#if 0
-		expandable = e_tree_model_node_is_expandable (tree_model, node);
-		expanded = e_tree_table_adapter_node_is_expanded (tree_table_adapter, node);
-
-		/* This is unnecessary since this is already handled
-                   by the offset_of_node function.  If that changes,
-                   this will have to change too. */
-
-		if (expandable) {
-			GdkPixbuf *image;
-
-			image = (expanded 
-				 ? E_CELL_TREE(tree_view->cell_view.ecell)->open_pixbuf
-				 : E_CELL_TREE(tree_view->cell_view.ecell)->closed_pixbuf);
-
-			width += gdk_pixbuf_get_width(image);
-		}
-#endif
-
-		max_width = MAX (max_width, width);
-	}
-
-	return max_width;
-}
-
-/*
- * ECellView::show_tooltip method
- */
-static void
-ect_show_tooltip (ECellView *ecell_view, int model_col, int view_col, int row,
-		  int col_width, ETableTooltip *tooltip)
-{		
-	ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-	ETreeModel *tree_model = e_cell_tree_get_tree_model (ecell_view->e_table_model, row);
-	ETreePath node = e_cell_tree_get_node (ecell_view->e_table_model, row);
-	int offset = offset_of_node (ecell_view->e_table_model, row);
-	GdkPixbuf *node_image;
-
-	node_image = e_tree_model_icon_at (tree_model, node);
-	if (node_image)
-		offset += gdk_pixbuf_get_width (node_image);
-
-	tooltip->x += offset;
-	e_cell_show_tooltip (tree_view->subcell_view, model_col, view_col, row, col_width - offset, tooltip);
-}
-
-/*
- * ECellView::get_bg_color method
- */
-static char *
-ect_get_bg_color (ECellView *ecell_view, int row)
-{		
-	ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
-	return e_cell_get_bg_color (tree_view->subcell_view, row);
-}
-		
-/*
- * ECellView::enter_edit method
- */
-static void *
-ect_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
-{
-	/* just defer to our subcell's view */
-	ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
-	return e_cell_enter_edit (tree_view->subcell_view, model_col, view_col, row);
-}
-
-/*
- * ECellView::leave_edit method
- */
-static void
-ect_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context)
-{
-	/* just defer to our subcell's view */
-	ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
-	e_cell_leave_edit (tree_view->subcell_view, model_col, view_col, row, edit_context);
-}
-
-static void
-ect_print (ECellView *ecell_view, GnomePrintContext *context, 
-	   int model_col, int view_col, int row,
-	   double width, double height)
-{
-	ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
-
-	if (/* XXX only if we're the active sort */ TRUE) {
-		ETreeModel *tree_model = e_cell_tree_get_tree_model (ecell_view->e_table_model, row);
-		ETreeTableAdapter *tree_table_adapter = e_cell_tree_get_tree_table_adapter(ecell_view->e_table_model, row);
-		ETreePath node = e_cell_tree_get_node (ecell_view->e_table_model, row);
-		int offset = offset_of_node (ecell_view->e_table_model, row);
-		int subcell_offset = offset;
-		gboolean expandable = e_tree_model_node_is_expandable (tree_model, node);
-		gboolean expanded = e_tree_table_adapter_node_is_expanded (tree_table_adapter, node);
-
-		/* draw our lines */
-		if (E_CELL_TREE(tree_view->cell_view.ecell)->draw_lines) {
-			int depth;
-
-			if (!e_tree_model_node_is_root (tree_model, node)
-			    || e_tree_model_node_get_children (tree_model, node, NULL) > 0) {
-				gnome_print_moveto (context,
-						    offset - INDENT_AMOUNT / 2,
-						    height / 2);
-
-				gnome_print_lineto (context,
-						    offset,
-						    height / 2);
-			}
-
-			if (visible_depth_of_node (ecell_view->e_table_model, row) != 0) {
-				gnome_print_moveto (context,
-						    offset - INDENT_AMOUNT / 2,
-						    height);
-				gnome_print_lineto (context,
-						    offset - INDENT_AMOUNT / 2,
-						    (e_tree_table_adapter_node_get_next (tree_table_adapter, node)
-						     ? 0
-						     : height / 2));
-			}
-
-			/* now traverse back up to the root of the tree, checking at
-			   each level if the node has siblings, and drawing the
-			   correct vertical pipe for it's configuration. */
-			node = e_tree_model_node_get_parent (tree_model, node);
-			depth = visible_depth_of_node (ecell_view->e_table_model, row) - 1;
-			offset -= INDENT_AMOUNT;
-			while (node && depth != 0) {
-				if (e_tree_table_adapter_node_get_next(tree_table_adapter, node)) {
-					gnome_print_moveto (context,
-							    offset - INDENT_AMOUNT / 2,
-							    height);
-					gnome_print_lineto (context,
-							    offset - INDENT_AMOUNT / 2,
-							    0);
-				}
-				node = e_tree_model_node_get_parent (tree_model, node);
-				depth --;
-				offset -= INDENT_AMOUNT;
-			}
-		}
-
-		/* now draw our icon if we're expandable */
-		if (expandable) {
-			double image_matrix [6] = {16, 0, 0, 16, 0, 0};
-			GdkPixbuf *image = (expanded 
-					    ? E_CELL_TREE(tree_view->cell_view.ecell)->open_pixbuf
-					    : E_CELL_TREE(tree_view->cell_view.ecell)->closed_pixbuf);
-			int image_width, image_height, image_rowstride;
-			guchar *image_pixels;
-
-			image_width = gdk_pixbuf_get_width(image);
-			image_height = gdk_pixbuf_get_height(image);
-			image_pixels = gdk_pixbuf_get_pixels(image);
-			image_rowstride = gdk_pixbuf_get_rowstride(image);
-
-			image_matrix [4] = subcell_offset - INDENT_AMOUNT / 2 - image_width / 2;
-			image_matrix [5] = height / 2 - image_height / 2;
-
-			gnome_print_gsave (context);
-			gnome_print_concat (context, image_matrix);
-
-			gnome_print_rgbaimage (context, image_pixels, image_width, image_height, image_rowstride);
-			gnome_print_grestore (context);
-		}
-
-		gnome_print_stroke (context);
-
-		if (gnome_print_translate(context, subcell_offset, 0) == -1)
-				/* FIXME */;
-		width -= subcell_offset;
-	}
-
-
-	e_cell_print (tree_view->subcell_view, context, model_col, view_col, row, width, height);
-}
-
-static gdouble
-ect_print_height (ECellView *ecell_view, GnomePrintContext *context, 
-		  int model_col, int view_col, int row,
-		  double width)
-{
-	return 12; /* XXX */
-}
-
-/*
- * GObject::dispose method
- */
-static void
-ect_dispose (GObject *object)
-{
-	ECellTree *ect = E_CELL_TREE (object);
-
-	/* destroy our subcell */
-	if (ect->subcell)
-		g_object_unref (ect->subcell);
-	ect->subcell = NULL;
-
-	if (ect->open_pixbuf)
-		gdk_pixbuf_unref (ect->open_pixbuf);
-	ect->open_pixbuf = NULL;
-
-	if (ect->closed_pixbuf)
-		gdk_pixbuf_unref (ect->closed_pixbuf);
-	ect->closed_pixbuf = NULL;
-
-	G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static void
-e_cell_tree_class_init (GObjectClass *object_class)
-{
-	ECellClass *ecc = (ECellClass *) object_class;
-
-	object_class->dispose = ect_dispose;
-
-	ecc->new_view         = ect_new_view;
-	ecc->kill_view        = ect_kill_view;
-	ecc->realize          = ect_realize;
-	ecc->unrealize        = ect_unrealize;
-	ecc->draw             = ect_draw;
-	ecc->event            = ect_event;
-	ecc->height           = ect_height;
-	ecc->enter_edit       = ect_enter_edit;
-	ecc->leave_edit       = ect_leave_edit;
-	ecc->print            = ect_print;
-	ecc->print_height     = ect_print_height;
-	ecc->max_width        = ect_max_width;
-	ecc->show_tooltip     = ect_show_tooltip;
-	ecc->get_bg_color     = ect_get_bg_color;
-
-	parent_class = g_type_class_ref (PARENT_TYPE);
-
-        gal_a11y_e_cell_registry_add_cell_type (NULL, E_CELL_TREE_TYPE, gal_a11y_e_cell_tree_new);
-}
-
-E_MAKE_TYPE(e_cell_tree, "ECellTree", ECellTree, e_cell_tree_class_init, NULL, PARENT_TYPE)
-
-/**
- * e_cell_tree_construct:
- * @ect: the ECellTree we're constructing.
- * @open_pixbuf: pixbuf to be used instead of the '-' icon.
- * @closed_pixbuf: pixbuf to be used instead of the '+' icon.
- * @draw_lines: whether or not to draw the lines between parents/children/siblings.
- * @subcell: the ECell to render to the right of the tree effects.
- * 
- * Constructs an ECellTree.  used by subclasses that need to
- * initialize a nested ECellTree.  See e_cell_tree_new() for more info.
- * 
- **/
-void
-e_cell_tree_construct (ECellTree *ect,
-		       GdkPixbuf *open_pixbuf,
-		       GdkPixbuf *closed_pixbuf,
-		       gboolean draw_lines,
-		       ECell *subcell)
-{		       
-	ect->subcell = subcell;
-	if (subcell) {
-		g_object_ref (subcell);
-		gtk_object_sink (GTK_OBJECT (subcell));
-	}
-	if (open_pixbuf)
-		ect->open_pixbuf = open_pixbuf;
-	else
-		ect->open_pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **)tree_expanded_xpm);
-	if (closed_pixbuf)
-		ect->closed_pixbuf = closed_pixbuf;
-	else
-		ect->closed_pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **)tree_unexpanded_xpm);
-
-	ect->draw_lines = draw_lines;
-}
-
-
-/**
- * e_cell_tree_new:
- * @open_pixbuf: pixbuf to be used instead of the '-' icon.
- * @closed_pixbuf: pixbuf to be used instead of the '+' icon.
- * @draw_lines: whether or not to draw the lines between parents/children/siblings.
- * @subcell: the ECell to render to the right of the tree effects.
- * 
- * Creates a new ECell renderer that can be used to render tree
- * effects that come from an ETreeModel.  Various assumptions are made
- * as to the fact that the ETableModel the ETable this cell is
- * associated with is in fact an ETreeModel.  The cell uses special
- * columns to get at structural information (needed to draw the
- * lines/icons.
- * 
- * Return value: an ECell object that can be used to render trees.
- **/
-ECell *
-e_cell_tree_new (GdkPixbuf *open_pixbuf,
-		 GdkPixbuf *closed_pixbuf,
-		 gboolean draw_lines,
-		 ECell *subcell)
-{
-	ECellTree *ect = g_object_new (E_CELL_TREE_TYPE, NULL);
-
-	e_cell_tree_construct (ect, open_pixbuf, closed_pixbuf, draw_lines, subcell);
-
-	return (ECell *) ect;
-}
-
diff --git a/widgets/table/e-cell-tree.h b/widgets/table/e-cell-tree.h
deleted file mode 100644
index dfdd6f0191..0000000000
--- a/widgets/table/e-cell-tree.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-cell-tree.h - Tree cell object.
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Toshok <toshok@ximian.com>
- *
- * A majority of code taken from:
- *
- * the ECellText renderer.
- * Copyright 1998, The Free Software Foundation
- * Copyright 1999, 2000, Ximian, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_CELL_TREE_H_
-#define _E_CELL_TREE_H_
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gal/e-table/e-cell.h>
-
-G_BEGIN_DECLS
-
-#define E_CELL_TREE_TYPE        (e_cell_tree_get_type ())
-#define E_CELL_TREE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_CELL_TREE_TYPE, ECellTree))
-#define E_CELL_TREE_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_CELL_TREE_TYPE, ECellTreeClass))
-#define E_IS_CELL_TREE(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_TREE_TYPE))
-#define E_IS_CELL_TREE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_TREE_TYPE))
-
-
-typedef struct {
-	ECell parent;
-
-	gboolean draw_lines;
-
-	GdkPixbuf   *open_pixbuf;
-	GdkPixbuf   *closed_pixbuf;
-
-	ECell *subcell;
-} ECellTree;
-
-typedef struct {
-	ECellClass parent_class;
-} ECellTreeClass;
-
-GType      e_cell_tree_get_type (void);
-ECell     *e_cell_tree_new      (GdkPixbuf *open_pixbuf,
-				 GdkPixbuf *closed_pixbuf,
-				 gboolean draw_lines,
-				 ECell *subcell);
-void       e_cell_tree_construct (ECellTree *ect,
-				  GdkPixbuf *open_pixbuf,
-				  GdkPixbuf *closed_pixbuf,
-				  gboolean draw_lines,
-				  ECell *subcell);
-
-ECellView *e_cell_tree_view_get_subcell_view (ECellView *ect);
-
-G_END_DECLS
-
-#endif /* _E_CELL_TREE_H_ */
-
-
diff --git a/widgets/table/e-cell-vbox.c b/widgets/table/e-cell-vbox.c
deleted file mode 100644
index ee18694742..0000000000
--- a/widgets/table/e-cell-vbox.c
+++ /dev/null
@@ -1,486 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-cell-vbox.c - Vbox cell object.
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Toshok <toshok@ximian.com>
- *   Chris Lahey  <clahey@ximian.com>
- *
- * A majority of code taken from:
- *
- * the ECellText renderer.
- * Copyright 1999, 2000, Ximian, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include <ctype.h>
-#include <math.h>
-#include <stdio.h>
-
-#include <gdk/gdkx.h> /* for BlackPixel */
-#include <gtk/gtkenums.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtkinvisible.h>
-#include <gtk/gtksignal.h>
-#include <gdk/gdkkeysyms.h>
-
-#include "gal/util/e-util.h"
-#include "gal/a11y/e-table/gal-a11y-e-cell-registry.h"
-#include "gal/a11y/e-table/gal-a11y-e-cell-vbox.h"
-#include "e-table-item.h"
-#include "e-cell-vbox.h"
-
-#define PARENT_TYPE e_cell_get_type ()
-
-static ECellClass *parent_class;
-
-#define INDENT_AMOUNT 16
-
-/*
- * ECell::new_view method
- */
-static ECellView *
-ecv_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
-	ECellVbox *ecv = E_CELL_VBOX (ecell);
-	ECellVboxView *vbox_view = g_new0 (ECellVboxView, 1);
-	int i;
-	
-	vbox_view->cell_view.ecell = ecell;
-	vbox_view->cell_view.e_table_model = table_model;
-	vbox_view->cell_view.e_table_item_view = e_table_item_view;
-	
-	/* create our subcell view */
-	vbox_view->subcell_view_count = ecv->subcell_count;
-	vbox_view->subcell_views = g_new (ECellView *, vbox_view->subcell_view_count);
-	vbox_view->model_cols = g_new (int, vbox_view->subcell_view_count);
-
-	for (i = 0; i < vbox_view->subcell_view_count; i++) {
-		vbox_view->subcell_views[i] = e_cell_new_view (ecv->subcells[i], table_model, e_table_item_view /* XXX */);
-		vbox_view->model_cols[i] = ecv->model_cols[i];
-	}
-
-	return (ECellView *)vbox_view;
-}
-
-/*
- * ECell::kill_view method
- */
-static void
-ecv_kill_view (ECellView *ecv)
-{
-	ECellVboxView *vbox_view = (ECellVboxView *) ecv;
-	int i;
-
-	/* kill our subcell view */
-	for (i = 0; i < vbox_view->subcell_view_count; i++)
-		e_cell_kill_view (vbox_view->subcell_views[i]);
-
-	g_free (vbox_view->model_cols);
-	g_free (vbox_view->subcell_views);
-	g_free (vbox_view);
-}
-
-/*
- * ECell::realize method
- */
-static void
-ecv_realize (ECellView *ecell_view)
-{
-	ECellVboxView *vbox_view = (ECellVboxView *) ecell_view;
-	int i;
-
-	/* realize our subcell view */
-	for (i = 0; i < vbox_view->subcell_view_count; i++)
-		e_cell_realize (vbox_view->subcell_views[i]);
-
-	if (parent_class->realize)
-		(* parent_class->realize) (ecell_view);
-}
-
-/*
- * ECell::unrealize method
- */
-static void
-ecv_unrealize (ECellView *ecv)
-{
-	ECellVboxView *vbox_view = (ECellVboxView *) ecv;
-	int i;
-
-	/* unrealize our subcell view. */
-	for (i = 0; i < vbox_view->subcell_view_count; i++)
-		e_cell_unrealize (vbox_view->subcell_views[i]);
-
-	if (parent_class->unrealize)
-		(* parent_class->unrealize) (ecv);
-}
-
-/*
- * ECell::draw method
- */
-static void
-ecv_draw (ECellView *ecell_view, GdkDrawable *drawable,
-	  int model_col, int view_col, int row, ECellFlags flags,
-	  int x1, int y1, int x2, int y2)
-{
-	ECellVboxView *vbox_view = (ECellVboxView *)ecell_view;
-
-	int subcell_offset = 0;
-	int i;
-
-	for (i = 0; i < vbox_view->subcell_view_count; i++) {
-		/* Now cause our subcells to draw their contents,
-		   shifted by subcell_offset pixels */
-		int height = e_cell_height (vbox_view->subcell_views[i], vbox_view->model_cols[i], view_col, row);
-		e_cell_draw (vbox_view->subcell_views[i], drawable,
-			     vbox_view->model_cols[i], view_col, row, flags,
-			     x1, y1 + subcell_offset, x2, y1 + subcell_offset + height);
-
-		subcell_offset += e_cell_height (vbox_view->subcell_views[i], vbox_view->model_cols[i], view_col, row);
-	}
-}
-
-/*
- * ECell::event method
- */
-static gint
-ecv_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row, ECellFlags flags, ECellActions *actions)
-{
-	ECellVboxView *vbox_view = (ECellVboxView *)ecell_view;
-	int y = 0;
-	int i;
-	int subcell_offset = 0;
-
-	switch (event->type) {
-	case GDK_BUTTON_PRESS:
-	case GDK_BUTTON_RELEASE:
-	case GDK_2BUTTON_PRESS:
-	case GDK_3BUTTON_PRESS:
-		y = event->button.y;
-		break;
-	case GDK_MOTION_NOTIFY:
-		y = event->motion.y;
-		break;
-	default:
-		/* nada */
-		break;
-	}
-
-
-	for (i = 0; i < vbox_view->subcell_view_count; i++) {
-		int height = e_cell_height (vbox_view->subcell_views[i], vbox_view->model_cols[i], view_col, row);
-		if (y < subcell_offset + height)
-			return e_cell_event(vbox_view->subcell_views[i], event, vbox_view->model_cols[i], view_col, row, flags, actions);
-		subcell_offset += height;
-	}
-	return 0;
-}
-
-/*
- * ECell::height method
- */
-static int
-ecv_height (ECellView *ecell_view, int model_col, int view_col, int row) 
-{
-	ECellVboxView *vbox_view = (ECellVboxView *)ecell_view;
-	int height = 0;
-	int i;
-
-	for (i = 0; i < vbox_view->subcell_view_count; i++) {
-		height += e_cell_height (vbox_view->subcell_views[i], vbox_view->model_cols[i], view_col, row);
-	}
-	return height;
-}
-
-/*
- * ECell::max_width method
- */
-static int
-ecv_max_width (ECellView *ecell_view, int model_col, int view_col)
-{
-	ECellVboxView *vbox_view = (ECellVboxView *)ecell_view;
-	int max_width = 0;
-	int i;
-
-	for (i = 0; i < vbox_view->subcell_view_count; i++) {
-		int width = e_cell_max_width (vbox_view->subcell_views[i], vbox_view->model_cols[i], view_col);
-		max_width = MAX(width, max_width);
-	}
-
-	return max_width;
-}
-
-#if 0
-/*
- * ECellView::show_tooltip method
- */
-static void
-ecv_show_tooltip (ECellView *ecell_view, int model_col, int view_col, int row,
-		  int col_width, ETableTooltip *tooltip)
-{		
-	ECellVboxView *vbox_view = (ECellVboxView *) ecell_view;
-	EVboxModel *vbox_model = e_cell_vbox_get_vbox_model (ecell_view->e_table_model, row);
-	EVboxPath node = e_cell_vbox_get_node (ecell_view->e_table_model, row);
-	int offset = offset_of_node (ecell_view->e_table_model, row);
-	GdkPixbuf *node_image;
-
-	node_image = e_vbox_model_icon_at (vbox_model, node);
-	if (node_image)
-		offset += gdk_pixbuf_get_width (node_image);
-
-	tooltip->x += offset;
-	e_cell_show_tooltip (vbox_view->subcell_view, model_col, view_col, row, col_width - offset, tooltip);
-}
-
-/*
- * ECellView::get_bg_color method
- */
-static char *
-ecv_get_bg_color (ECellView *ecell_view, int row)
-{		
-	ECellVboxView *vbox_view = (ECellVboxView *) ecell_view;
-
-	return e_cell_get_bg_color (vbox_view->subcell_views[0], row);
-}
-		
-/*
- * ECellView::enter_edit method
- */
-static void *
-ecv_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
-{
-	/* just defer to our subcell's view */
-	ECellVboxView *vbox_view = (ECellVboxView *) ecell_view;
-
-	return e_cell_enter_edit (vbox_view->subcell_view, model_col, view_col, row);
-}
-
-/*
- * ECellView::leave_edit method
- */
-static void
-ecv_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context)
-{
-	/* just defer to our subcell's view */
-	ECellVboxView *vbox_view = (ECellVboxView *) ecell_view;
-
-	e_cell_leave_edit (vbox_view->subcell_view, model_col, view_col, row, edit_context);
-}
-
-static void
-ecv_print (ECellView *ecell_view, GnomePrintContext *context, 
-	   int model_col, int view_col, int row,
-	   double width, double height)
-{
-	ECellVboxView *vbox_view = (ECellVboxView *) ecell_view;
-
-	if (/* XXX only if we're the active sort */ TRUE) {
-		EVboxModel *vbox_model = e_cell_vbox_get_vbox_model (ecell_view->e_table_model, row);
-		EVboxTableAdapter *vbox_table_adapter = e_cell_vbox_get_vbox_table_adapter(ecell_view->e_table_model, row);
-		EVboxPath node = e_cell_vbox_get_node (ecell_view->e_table_model, row);
-		int offset = offset_of_node (ecell_view->e_table_model, row);
-		int subcell_offset = offset;
-		gboolean expandable = e_vbox_model_node_is_expandable (vbox_model, node);
-		gboolean expanded = e_vbox_table_adapter_node_is_expanded (vbox_table_adapter, node);
-
-		/* draw our lines */
-		if (E_CELL_VBOX(vbox_view->cell_view.ecell)->draw_lines) {
-			int depth;
-
-			if (!e_vbox_model_node_is_root (vbox_model, node)
-			    || e_vbox_model_node_get_children (vbox_model, node, NULL) > 0) {
-				gnome_print_moveto (context,
-						    offset - INDENT_AMOUNT / 2,
-						    height / 2);
-
-				gnome_print_lineto (context,
-						    offset,
-						    height / 2);
-			}
-
-			if (visible_depth_of_node (ecell_view->e_table_model, row) != 0) {
-				gnome_print_moveto (context,
-						    offset - INDENT_AMOUNT / 2,
-						    height);
-				gnome_print_lineto (context,
-						    offset - INDENT_AMOUNT / 2,
-						    (e_vbox_model_node_get_next (vbox_model, node)
-						     ? 0
-						     : height / 2));
-			}
-
-			/* now traverse back up to the root of the vbox, checking at
-			   each level if the node has siblings, and drawing the
-			   correct vertical pipe for it's configuration. */
-			node = e_vbox_model_node_get_parent (vbox_model, node);
-			depth = visible_depth_of_node (ecell_view->e_table_model, row) - 1;
-			offset -= INDENT_AMOUNT;
-			while (node && depth != 0) {
-				if (e_vbox_model_node_get_next(vbox_model, node)) {
-					gnome_print_moveto (context,
-							    offset - INDENT_AMOUNT / 2,
-							    height);
-					gnome_print_lineto (context,
-							    offset - INDENT_AMOUNT / 2,
-							    0);
-				}
-				node = e_vbox_model_node_get_parent (vbox_model, node);
-				depth --;
-				offset -= INDENT_AMOUNT;
-			}
-		}
-
-		/* now draw our icon if we're expandable */
-		if (expandable) {
-			double image_matrix [6] = {16, 0, 0, 16, 0, 0};
-			GdkPixbuf *image = (expanded 
-					    ? E_CELL_VBOX(vbox_view->cell_view.ecell)->open_pixbuf
-					    : E_CELL_VBOX(vbox_view->cell_view.ecell)->closed_pixbuf);
-			int image_width, image_height, image_rowstride;
-			guchar *image_pixels;
-
-			image_width = gdk_pixbuf_get_width(image);
-			image_height = gdk_pixbuf_get_height(image);
-			image_pixels = gdk_pixbuf_get_pixels(image);
-			image_rowstride = gdk_pixbuf_get_rowstride(image);
-
-			image_matrix [4] = subcell_offset - INDENT_AMOUNT / 2 - image_width / 2;
-			image_matrix [5] = height / 2 - image_height / 2;
-
-			gnome_print_gsave (context);
-			gnome_print_concat (context, image_matrix);
-
-			gnome_print_rgbaimage (context, image_pixels, image_width, image_height, image_rowstride);
-			gnome_print_grestore (context);
-		}
-
-		gnome_print_stroke (context);
-
-		if (gnome_print_translate(context, subcell_offset, 0) == -1)
-				/* FIXME */;
-		width -= subcell_offset;
-	}
-
-
-	e_cell_print (vbox_view->subcell_view, context, model_col, view_col, row, width, height);
-}
-
-static gdouble
-ecv_print_height (ECellView *ecell_view, GnomePrintContext *context, 
-		  int model_col, int view_col, int row,
-		  double width)
-{
-	return 12; /* XXX */
-}
-#endif
-
-/*
- * GObject::dispose method
- */
-static void
-ecv_dispose (GObject *object)
-{
-	ECellVbox *ecv = E_CELL_VBOX (object);
-	int i;
-
-	/* destroy our subcell */
-	for (i = 0; i < ecv->subcell_count; i++)
-		if (ecv->subcells[i])
-			g_object_unref (ecv->subcells[i]);
-	g_free (ecv->subcells);
-	ecv->subcells = NULL;
-	ecv->subcell_count = 0;
-
-	G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static void
-e_cell_vbox_class_init (GObjectClass *object_class)
-{
-	ECellClass *ecc = (ECellClass *) object_class;
-
-	object_class->dispose = ecv_dispose;
-
-	ecc->new_view         = ecv_new_view;
-	ecc->kill_view        = ecv_kill_view;
-	ecc->realize          = ecv_realize;
-	ecc->unrealize        = ecv_unrealize;
-	ecc->draw             = ecv_draw;
-	ecc->event            = ecv_event;
-	ecc->height           = ecv_height;
-#if 0
-	ecc->enter_edit       = ecv_enter_edit;
-	ecc->leave_edit       = ecv_leave_edit;
-	ecc->print            = ecv_print;
-	ecc->print_height     = ecv_print_height;
-#endif
-	ecc->max_width        = ecv_max_width;
-#if 0
-	ecc->show_tooltip     = ecv_show_tooltip;
-	ecc->get_bg_color     = ecv_get_bg_color;
-#endif
-
-	parent_class = g_type_class_ref (PARENT_TYPE);
-
-	gal_a11y_e_cell_registry_add_cell_type (NULL, E_CELL_VBOX_TYPE, gal_a11y_e_cell_vbox_new);
-}
-
-static void
-e_cell_vbox_init (GtkObject *object)
-{
-	ECellVbox *ecv = E_CELL_VBOX (object);
-
-	ecv->subcells = NULL;
-	ecv->subcell_count = 0;
-}
-
-E_MAKE_TYPE(e_cell_vbox, "ECellVbox", ECellVbox, e_cell_vbox_class_init, e_cell_vbox_init, PARENT_TYPE);
-
-/**
- * e_cell_vbox_new:
- * 
- * Creates a new ECell renderer that can be used to render multiple
- * child cells.
- * 
- * Return value: an ECell object that can be used to render multiple
- * child cells.
- **/
-ECell *
-e_cell_vbox_new (void)
-{
-	ECellVbox *ecv = g_object_new (E_CELL_VBOX_TYPE, NULL);
-
-	return (ECell *) ecv;
-}
-
-void
-e_cell_vbox_append (ECellVbox *vbox, ECell *subcell, int model_col)
-{
-	vbox->subcell_count ++;
-
-	vbox->subcells   = g_renew (ECell *, vbox->subcells,   vbox->subcell_count);
-	vbox->model_cols = g_renew (int,     vbox->model_cols, vbox->subcell_count);
-
-	vbox->subcells[vbox->subcell_count - 1]   = subcell;
-	vbox->model_cols[vbox->subcell_count - 1] = model_col;
-
-	if (subcell)
-		g_object_ref (subcell);
-}
diff --git a/widgets/table/e-cell-vbox.h b/widgets/table/e-cell-vbox.h
deleted file mode 100644
index f08e106128..0000000000
--- a/widgets/table/e-cell-vbox.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-cell-vbox.h - Vbox cell object.
- * Copyright 1999 - 2002, Ximian, Inc.
- *
- * Authors:
- *   Chris Toshok <toshok@ximian.com>
- *   Chris Lahey  <clahey@ximina.com
- *
- * A majority of code taken from:
- *
- * the ECellText renderer.
- * Copyright 1999, 2000, Ximian, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_CELL_VBOX_H_
-#define _E_CELL_VBOX_H_
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gal/e-table/e-cell.h>
-
-G_BEGIN_DECLS
-
-#define E_CELL_VBOX_TYPE        (e_cell_vbox_get_type ())
-#define E_CELL_VBOX(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_CELL_VBOX_TYPE, ECellVbox))
-#define E_CELL_VBOX_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_CELL_VBOX_TYPE, ECellVboxClass))
-#define E_IS_CELL_VBOX(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_VBOX_TYPE))
-#define E_IS_CELL_VBOX_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_VBOX_TYPE))
-
-typedef struct {
-	ECell parent;
-
-	int     subcell_count;
-	ECell **subcells;
-	int    *model_cols;
-} ECellVbox;
-
-typedef struct {
-	ECellView     cell_view;
-	int           subcell_view_count;
-	ECellView   **subcell_views;
-	int          *model_cols;
-} ECellVboxView;
-
-typedef struct {
-	ECellClass parent_class;
-} ECellVboxClass;
-
-GType    e_cell_vbox_get_type  (void);
-ECell   *e_cell_vbox_new       (void);
-void     e_cell_vbox_append    (ECellVbox *vbox,
-				ECell     *subcell,
-				int model_col);
-
-
-G_END_DECLS
-
-#endif /* _E_CELL_VBOX_H_ */
diff --git a/widgets/table/e-cell.c b/widgets/table/e-cell.c
deleted file mode 100644
index 8deeaa654c..0000000000
--- a/widgets/table/e-cell.c
+++ /dev/null
@@ -1,499 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-cell.c - base class for cell renderers in e-table
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Miguel de Icaza <miguel@ximian.com>
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include "e-cell.h"
-#include "gal/util/e-util.h"
-
-#define PARENT_TYPE GTK_TYPE_OBJECT
-
-#define ECVIEW_EC_CLASS(v) (E_CELL_GET_CLASS (v->ecell))
-
-static ECellView *
-ec_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
-	return NULL;
-}
-
-static void
-ec_realize (ECellView *e_cell)
-{
-}
-
-static void
-ec_kill_view (ECellView *ecell_view)
-{
-}
-
-static void
-ec_unrealize (ECellView *e_cell)
-{
-}
-
-static void
-ec_draw (ECellView *ecell_view, GdkDrawable *drawable,
-	 int model_col, int view_col, int row, ECellFlags flags,
-	 int x1, int y1, int x2, int y2)
-{
-	g_error ("e-cell-draw invoked\n");
-}
-
-static gint
-ec_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row, ECellFlags flags, ECellActions *actions)
-{
-	g_error ("e-cell-event invoked\n");
-	return 0;
-}
-
-static gint
-ec_height (ECellView *ecell_view, int model_col, int view_col, int row)
-{
-	g_error ("e-cell-height invoked\n");
-	return 0;
-}
-
-static void
-ec_focus (ECellView *ecell_view, int model_col, int view_col, int row, int x1, int y1, int x2, int y2)
-{
-	ecell_view->focus_col = view_col; 
-	ecell_view->focus_row = row;
-	ecell_view->focus_x1 = x1;
-	ecell_view->focus_y1 = y1;
-	ecell_view->focus_x2 = x2;
-	ecell_view->focus_y2 = y2;
-}
-
-static void
-ec_unfocus (ECellView *ecell_view)
-{
-	ecell_view->focus_col = -1;
-	ecell_view->focus_row = -1;
-	ecell_view->focus_x1 = -1;
-	ecell_view->focus_y1 = -1;
-	ecell_view->focus_x2 = -1;
-	ecell_view->focus_y2 = -1;
-}
-
-static void *
-ec_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
-{
-	return NULL;
-}
-
-static void
-ec_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, void *context)
-{
-}
-
-static void *
-ec_save_state (ECellView *ecell_view, int model_col, int view_col, int row, void *context)
-{
-	return NULL;
-}
-
-static void
-ec_load_state (ECellView *ecell_view, int model_col, int view_col, int row, void *context, void *save_state)
-{
-}
-
-static void
-ec_free_state (ECellView *ecell_view, int model_col, int view_col, int row, void *save_state)
-{
-}
-
-static void
-ec_show_tooltip (ECellView *ecell_view, int model_col, int view_col, int row, int col_width, ETableTooltip *tooltip)
-{
-	/* Do nothing */
-}
-
-static void
-e_cell_class_init (GtkObjectClass *object_class)
-{
-	ECellClass *ecc = (ECellClass *) object_class;
-
-	ecc->realize = ec_realize;
-	ecc->unrealize = ec_unrealize;
-	ecc->new_view = ec_new_view;
-	ecc->kill_view = ec_kill_view;
-	ecc->draw = ec_draw;
-	ecc->event = ec_event;
-	ecc->focus = ec_focus;
-	ecc->unfocus = ec_unfocus;
-	ecc->height = ec_height;
-	ecc->enter_edit = ec_enter_edit;
-	ecc->leave_edit = ec_leave_edit;
-	ecc->save_state = ec_save_state;
-	ecc->load_state = ec_load_state;
-	ecc->free_state = ec_free_state;
-	ecc->print = NULL;
-	ecc->print_height = NULL;
-	ecc->max_width = NULL;
-	ecc->max_width_by_row = NULL;
-	ecc->show_tooltip = ec_show_tooltip;
-}
-
-static void
-e_cell_init (GtkObject *object)
-{
-}
-
-E_MAKE_TYPE(e_cell, "ECell", ECell, e_cell_class_init, e_cell_init, PARENT_TYPE)
-
-/**
- * e_cell_event:
- * @ecell_view: The ECellView where the event will be dispatched
- * @event: The GdkEvent.
- * @model_col: the column in the model
- * @view_col: the column in the view
- * @row: the row
- * @flags: flags about the current state
- * @actions: A second return value in case the cell wants to take some action (specifically grabbing & ungrabbing)
- *
- * Dispatches the event @event to the @ecell_view for.
- *
- * Returns: processing state from the GdkEvent handling.
- */
-gint
-e_cell_event (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row, ECellFlags flags, ECellActions *actions)
-{
-	return ECVIEW_EC_CLASS(ecell_view)->event (
-		ecell_view, event, model_col, view_col, row, flags, actions);
-}
-
-/** 
- * e_cell_new_view:
- * @ecell: the Ecell that will create the new view
- * @table_model: the table model the ecell is bound to
- * @e_table_item_view: An ETableItem object (the CanvasItem that reprensents the view of the table)
- *
- * ECell renderers new to be bound to a table_model and to the actual view
- * during their life time to actually render the data.  This method is invoked
- * by the ETableItem canvas item to instatiate a new view of the ECell.
- *
- * This is invoked when the ETableModel is attached to the ETableItem (a CanvasItem
- * that can render ETableModels in the screen).
- *
- * Returns: a new ECellView for this @ecell on the @table_model displayed on the @e_table_item_view.
- */
-ECellView *
-e_cell_new_view (ECell *ecell, ETableModel *table_model, void *e_table_item_view)
-{
-	return E_CELL_GET_CLASS (ecell)->new_view (
-		ecell, table_model, e_table_item_view);
-}
-
-/**
- * e_cell_realize:
- * @ecell_view: The ECellView to be realized.
- *
- * This function is invoked to give a chance to the ECellView to allocate
- * any resources it needs from Gdk, equivalent to the GtkWidget::realize
- * signal.
- */
-void
-e_cell_realize (ECellView *ecell_view)
-{
-	ECVIEW_EC_CLASS(ecell_view)->realize (ecell_view);
-}
-
-/**
- * e_cell_kill_view:
- * @ecell_view: view to be destroyed.
- *
- * This method it used to destroy a view of an ECell renderer
- */
-void
-e_cell_kill_view (ECellView *ecell_view)
-{
-	ECVIEW_EC_CLASS(ecell_view)->kill_view (ecell_view);
-}
-
-/**
- * e_cell_unrealize:
- * @ecell_view: The ECellView to be unrealized.
- *
- * This function is invoked to give a chance to the ECellView to
- * release any resources it allocated during the realize method,
- * equivalent to the GtkWidget::unrealize signal.
- */
-void
-e_cell_unrealize (ECellView *ecell_view)
-{
-	ECVIEW_EC_CLASS(ecell_view)->unrealize (ecell_view);
-}
-
-/**
- * e_cell_draw:
- * @ecell_view: the ECellView to redraw
- * @drawable: draw desination
- * @model_col: the column in the model being drawn.
- * @view_col: the column in the view being drawn (what the model maps to).
- * @row: the row being drawn
- * @flags: rendering flags.
- * @x1: boudary for the rendering
- * @y1: boudary for the rendering
- * @x2: boudary for the rendering
- * @y2: boudary for the rendering
- *
- * This instructs the ECellView to render itself into the drawable.  The
- * region to be drawn in given by (x1,y1)-(x2,y2).
- *
- * The most important flags are %E_CELL_SELECTED and %E_CELL_FOCUSED, other
- * flags include alignments and justifications.
- */
-void
-e_cell_draw (ECellView *ecell_view, GdkDrawable *drawable,
-	     int model_col, int view_col, int row, ECellFlags flags,
-	     int x1, int y1, int x2, int y2)
-{
-	g_return_if_fail (ecell_view != NULL);
-	g_return_if_fail (row >= 0);
-	g_return_if_fail (row < e_table_model_row_count(ecell_view->e_table_model));
-
-	ECVIEW_EC_CLASS(ecell_view)->draw (ecell_view, drawable, model_col, view_col, row, flags, x1, y1, x2, y2);
-}
-
-/**
- * e_cell_print:
- * @ecell_view: the ECellView to redraw
- * @context: The GnomePrintContext where we output our printed data.
- * @model_col: the column in the model being drawn.
- * @view_col: the column in the view being drawn (what the model maps to).
- * @row: the row being drawn
- * @width: width 
- * @height: height
- *
- * FIXME:
- */
-void
-e_cell_print (ECellView *ecell_view, GnomePrintContext *context, 
-	      int model_col, int view_col, int row,
-	      double width, double height)
-{
-	if (ECVIEW_EC_CLASS(ecell_view)->print)
-		ECVIEW_EC_CLASS(ecell_view)->print (ecell_view, context, model_col, view_col, row, width, height);
-}
-
-/**
- * e_cell_print:
- *
- * FIXME:
- */
-gdouble
-e_cell_print_height (ECellView *ecell_view, GnomePrintContext *context, 
-		     int model_col, int view_col, int row,
-		     double width)
-{
-	if (ECVIEW_EC_CLASS(ecell_view)->print_height)
-		return ECVIEW_EC_CLASS(ecell_view)->print_height
-			(ecell_view, context, model_col, view_col, row, width);
-	else
-		return 0.0;
-}
-
-/**
- * e_cell_height:
- * @ecell_view: the ECellView.
- * @model_col: the column in the model
- * @view_col: the column in the view.
- * @row: the row to me measured
- *
- * Returns: the height of the cell at @model_col, @row rendered at
- * @view_col, @row.
- */
-int
-e_cell_height (ECellView *ecell_view, int model_col, int view_col, int row)
-{
-	return ECVIEW_EC_CLASS(ecell_view)->height (ecell_view, model_col, view_col, row);
-}
-
-/**
- * e_cell_enter_edit:
- * @ecell_view: the ECellView that will enter editing
- * @model_col: the column in the model
- * @view_col: the column in the view
- * @row: the row
- *
- * Notifies the ECellView that it is about to enter editing mode for
- * @model_col, @row rendered at @view_col, @row.
- */
-void *
-e_cell_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
-{
-	return ECVIEW_EC_CLASS(ecell_view)->enter_edit (ecell_view, model_col, view_col, row);
-}
-
-/**
- * e_cell_leave_edit:
- * @ecell_view: the ECellView that will leave editing
- * @model_col: the column in the model
- * @view_col: the column in the view
- * @row: the row
- * @edit_context: the editing context
- *
- * Notifies the ECellView that editing is finished at @model_col, @row
- * rendered at @view_col, @row.
- */
-void
-e_cell_leave_edit (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context)
-{
-	ECVIEW_EC_CLASS(ecell_view)->leave_edit (ecell_view, model_col, view_col, row, edit_context);
-}
-
-/**
- * e_cell_save_state:
- * @ecell_view: the ECellView to save
- * @model_col: the column in the model
- * @view_col: the column in the view
- * @row: the row
- * @edit_context: the editing context
- *
- * Returns: The save state.
- *
- * Requests that the ECellView return a void * representing the state
- * of the ECell.  This is primarily intended for things like selection
- * or scrolling.
- */
-void *
-e_cell_save_state (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context)
-{
-	if (ECVIEW_EC_CLASS(ecell_view)->save_state)
-		return ECVIEW_EC_CLASS(ecell_view)->save_state (ecell_view, model_col, view_col, row, edit_context);
-	else
-		return NULL;
-}
-
-/**
- * e_cell_load_state:
- * @ecell_view: the ECellView to load
- * @model_col: the column in the model
- * @view_col: the column in the view
- * @row: the row
- * @edit_context: the editing context
- * @save_state: the save state to load from
- *
- * Requests that the ECellView load from the given save state.
- */
-void
-e_cell_load_state (ECellView *ecell_view, int model_col, int view_col, int row, void *edit_context, void *save_state)
-{
-	if (ECVIEW_EC_CLASS(ecell_view)->load_state)
-		ECVIEW_EC_CLASS(ecell_view)->load_state (ecell_view, model_col, view_col, row, edit_context, save_state);
-}
-
-/**
- * e_cell_load_state:
- * @ecell_view: the ECellView
- * @model_col: the column in the model
- * @view_col: the column in the view
- * @row: the row
- * @edit_context: the editing context
- * @save_state: the save state to free
- *
- * Requests that the ECellView free the given save state.
- */
-void
-e_cell_free_state (ECellView *ecell_view, int model_col, int view_col, int row, void *save_state)
-{
-	if (ECVIEW_EC_CLASS(ecell_view)->free_state)
-		ECVIEW_EC_CLASS(ecell_view)->free_state (ecell_view, model_col, view_col, row, save_state);
-}
-
-/**
- * e_cell_max_width:
- * @ecell_view: the ECellView that will leave editing
- * @model_col: the column in the model
- * @view_col: the column in the view.
- *
- * Returns: the maximum width for the ECellview at @model_col which
- * is being rendered as @view_col
- */
-int
-e_cell_max_width (ECellView *ecell_view, int model_col, int view_col)
-{
-	return ECVIEW_EC_CLASS(ecell_view)->max_width 
-		(ecell_view, model_col, view_col);
-}
-
-/**
- * e_cell_max_width_by_row:
- * @ecell_view: the ECellView that we are curious about
- * @model_col: the column in the model
- * @view_col: the column in the view.
- * @row: The row in the model.
- *
- * Returns: the maximum width for the ECellview at @model_col which
- * is being rendered as @view_col for the data in @row.
- */
-int
-e_cell_max_width_by_row (ECellView *ecell_view, int model_col, int view_col, int row)
-{
-	if (ECVIEW_EC_CLASS(ecell_view)->max_width_by_row)
-		return ECVIEW_EC_CLASS(ecell_view)->max_width_by_row
-			(ecell_view, model_col, view_col, row);
-	else
-		return e_cell_max_width (ecell_view, model_col, view_col);
-}
-
-/**
- * e_cell_max_width_by_row_implemented:
- * @ecell_view: the ECellView that we are curious about
- * @model_col: the column in the model
- * @view_col: the column in the view.
- * @row: The row in the model.
- *
- * Returns: the maximum width for the ECellview at @model_col which
- * is being rendered as @view_col for the data in @row.
- */
-gboolean
-e_cell_max_width_by_row_implemented (ECellView *ecell_view)
-{
-	return (ECVIEW_EC_CLASS(ecell_view)->max_width_by_row != NULL);
-}
-	      
-void
-e_cell_show_tooltip (ECellView *ecell_view, int model_col, int view_col, 
-		     int row, int col_width, ETableTooltip *tooltip)
-{
-	ECVIEW_EC_CLASS(ecell_view)->show_tooltip
-		(ecell_view, model_col, view_col, row, col_width, tooltip);
-}
-
-gchar *
-e_cell_get_bg_color(ECellView *ecell_view, int row)
-{
-	if (ECVIEW_EC_CLASS(ecell_view)->get_bg_color)
-		return ECVIEW_EC_CLASS(ecell_view)->get_bg_color (ecell_view, row);
-	else
-		return NULL;
-}
-
-void
-e_cell_style_set(ECellView *ecell_view, GtkStyle *previous_style)
-{
-	if (ECVIEW_EC_CLASS(ecell_view)->style_set)
-		ECVIEW_EC_CLASS(ecell_view)->style_set (ecell_view, previous_style);
-}
-		 		
diff --git a/widgets/table/e-cell.h b/widgets/table/e-cell.h
deleted file mode 100644
index 2ba74c01f5..0000000000
--- a/widgets/table/e-cell.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-cell.h
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Miguel de Icaza <miguel@ximian.com>
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_CELL_H_
-#define _E_CELL_H_
-
-#include <gdk/gdktypes.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-font.h>
-#include <gal/e-table/e-table-model.h>
-#include <gal/e-table/e-table-tooltip.h>
-
-G_BEGIN_DECLS
-
-#define E_CELL_TYPE         (e_cell_get_type ())
-#define E_CELL(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), E_CELL_TYPE, ECell))
-#define E_CELL_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), E_CELL_TYPE, ECellClass))
-#define E_CELL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_CELL_TYPE, ECellClass))
-#define E_IS_CELL(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_CELL_TYPE))
-#define E_IS_CELL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), E_CELL_TYPE))
-
-typedef gboolean (*ETableSearchFunc) (gconstpointer haystack,
-				      const char *needle);
-
-typedef enum {
-	E_CELL_SELECTED       = 1 << 0,
-
-	E_CELL_JUSTIFICATION  = 3 << 1,
-	E_CELL_JUSTIFY_CENTER = 0 << 1,
-	E_CELL_JUSTIFY_LEFT   = 1 << 1,
-	E_CELL_JUSTIFY_RIGHT  = 2 << 1,
-	E_CELL_JUSTIFY_FILL   = 3 << 1,
-
-	E_CELL_ALIGN_LEFT     = 1 << 1,
-	E_CELL_ALIGN_RIGHT    = 1 << 2,
-
-	E_CELL_FOCUSED        = 1 << 3,
-
-	E_CELL_EDITING        = 1 << 4,
-
-	E_CELL_CURSOR         = 1 << 5,
-
-	E_CELL_PREEDIT        = 1 << 6
-} ECellFlags;
-
-typedef enum {
-	E_CELL_GRAB           = 1 << 0,
-	E_CELL_UNGRAB         = 1 << 1
-} ECellActions;
-
-typedef struct {
-	GtkObject       object;
-} ECell;
-
-typedef struct {
-	ECell *ecell;
-	ETableModel *e_table_model;
-	void        *e_table_item_view;
-	
-	gint   focus_x1, focus_y1, focus_x2, focus_y2;
-	gint   focus_col, focus_row;
-} ECellView;
-
-#define E_CELL_IS_FOCUSED(ecell_view) (ecell_view->focus_x1 != -1)
-
-typedef struct {
-	GtkObjectClass parent_class;
-	
-	ECellView *(*new_view)         (ECell *ecell, ETableModel *table_model, void *e_table_item_view);
-	void       (*kill_view)        (ECellView *ecell_view);
-
-	void       (*realize)          (ECellView *ecell_view);
-	void       (*unrealize)        (ECellView *ecell_view);
-
-	void   	   (*draw)             (ECellView *ecell_view, GdkDrawable *drawable,
-	       			       	int model_col, int view_col, int row,
-				       	ECellFlags flags, int x1, int y1, int x2, int y2);
-	gint   	   (*event)            (ECellView *ecell_view, GdkEvent *event, int model_col, int view_col, int row, ECellFlags flags, ECellActions *actions);
-	void   	   (*focus)            (ECellView *ecell_view, int model_col, int view_col,
-				       	int row, int x1, int y1, int x2, int y2);
-	void   	   (*unfocus)          (ECellView *ecell_view);
-	int        (*height)           (ECellView *ecell_view, int model_col, int view_col, int row);
-
-	void      *(*enter_edit)       (ECellView *ecell_view, int model_col, int view_col, int row);
-	void       (*leave_edit)       (ECellView *ecell_view, int model_col, int view_col, int row, void *context);
-	void      *(*save_state)       (ECellView *ecell_view, int model_col, int view_col, int row, void *context);
-	void       (*load_state)       (ECellView *ecell_view, int model_col, int view_col, int row, void *context, void *save_state);
-	void       (*free_state)       (ECellView *ecell_view, int model_col, int view_col, int row, void *save_state);
-	void       (*print)            (ECellView *ecell_view, GnomePrintContext *context,
-				       	int model_col, int view_col, int row,
-				       	gdouble width, gdouble height);
-	gdouble    (*print_height)     (ECellView *ecell_view, GnomePrintContext *context,
-				       	int model_col, int view_col, int row, gdouble width);
-	int        (*max_width)        (ECellView *ecell_view, int model_col, int view_col);
-	int        (*max_width_by_row) (ECellView *ecell_view, int model_col, int view_col, int row);
-	void       (*show_tooltip)     (ECellView *ecell_view, int model_col, int view_col, int row, int col_width, ETableTooltip *tooltip);
-	gchar     *(*get_bg_color)     (ECellView *ecell_view, int row);
-
-	void       (*style_set)        (ECellView *ecell_view, GtkStyle *previous_style);
-} ECellClass;
-
-GType      e_cell_get_type                      (void);
-
-/* View creation methods. */
-ECellView *e_cell_new_view                      (ECell             *ecell,
-						 ETableModel       *table_model,
-						 void              *e_table_item_view);
-void       e_cell_kill_view                     (ECellView         *ecell_view);
-
-/* Cell View methods. */
-gint       e_cell_event                         (ECellView         *ecell_view,
-						 GdkEvent          *event,
-						 int                model_col,
-						 int                view_col,
-						 int                row,
-						 ECellFlags         flags,
-						 ECellActions      *actions);
-void       e_cell_realize                       (ECellView         *ecell_view);
-void       e_cell_unrealize                     (ECellView         *ecell_view);
-void       e_cell_draw                          (ECellView         *ecell_view,
-						 GdkDrawable       *drawable,
-						 int                model_col,
-						 int                view_col,
-						 int                row,
-						 ECellFlags         flags,
-						 int                x1,
-						 int                y1,
-						 int                x2,
-						 int                y2);
-void       e_cell_print                         (ECellView         *ecell_view,
-						 GnomePrintContext *context,
-						 int                model_col,
-						 int                view_col,
-						 int                row,
-						 double             width,
-						 double             height);
-gdouble    e_cell_print_height                  (ECellView         *ecell_view,
-						 GnomePrintContext *context,
-						 int                model_col,
-						 int                view_col,
-						 int                row,
-						 gdouble            width);
-int        e_cell_max_width                     (ECellView         *ecell_view,
-						 int                model_col,
-						 int                view_col);
-int        e_cell_max_width_by_row              (ECellView         *ecell_view,
-						 int                model_col,
-						 int                view_col,
-						 int                row);
-gboolean   e_cell_max_width_by_row_implemented  (ECellView         *ecell_view);
-void       e_cell_show_tooltip                  (ECellView         *ecell_view,
-						 int                model_col,
-						 int                view_col,
-						 int                row,
-						 int                col_width,
-						 ETableTooltip     *tooltip);
-gchar     *e_cell_get_bg_color                  (ECellView         *ecell_view,
-						 int                row);
-void       e_cell_style_set                     (ECellView         *ecell_view,
-						 GtkStyle          *previous_style);
-
-void       e_cell_focus                         (ECellView         *ecell_view,
-						 int                model_col,
-						 int                view_col,
-						 int                row,
-						 int                x1,
-						 int                y1,
-						 int                x2,
-						 int                y2);
-void       e_cell_unfocus                       (ECellView         *ecell_view);
-int        e_cell_height                        (ECellView         *ecell_view,
-						 int                model_col,
-						 int                view_col,
-						 int                row);
-void      *e_cell_enter_edit                    (ECellView         *ecell_view,
-						 int                model_col,
-						 int                view_col,
-						 int                row);
-void       e_cell_leave_edit                    (ECellView         *ecell_view,
-						 int                model_col,
-						 int                view_col,
-						 int                row,
-						 void              *edit_context);
-void      *e_cell_save_state                    (ECellView         *ecell_view,
-						 int                model_col,
-						 int                view_col,
-						 int                row,
-						 void              *edit_context);
-void       e_cell_load_state                    (ECellView         *ecell_view,
-						 int                model_col,
-						 int                view_col,
-						 int                row,
-						 void              *edit_context,
-						 void              *state);
-void       e_cell_free_state                    (ECellView         *ecell_view,
-						 int                model_col,
-						 int                view_col,
-						 int                row,
-						 void              *state);
-
-G_END_DECLS
-
-#endif /* _E_CELL_H_ */
diff --git a/widgets/table/e-table-click-to-add.c b/widgets/table/e-table-click-to-add.c
deleted file mode 100644
index 544cbcbd86..0000000000
--- a/widgets/table/e-table-click-to-add.c
+++ /dev/null
@@ -1,601 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-click-to-add.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtksignal.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include <libgnomecanvas/gnome-canvas-util.h>
-#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <atk/atkregistry.h>
-#include <atk/atkutil.h>
-#include <atk/atkgobjectaccessible.h>
-#include "e-table-header.h"
-#include "e-table-click-to-add.h"
-#include "e-table-defines.h"
-#include "e-table-one.h"
-#include "gal/e-text/e-text.h"
-#include "gal/widgets/e-canvas.h"
-#include "gal/widgets/e-canvas-utils.h"
-#include "gal/util/e-util.h"
-#include "gal/util/e-i18n.h"
-#include "gal/util/e-marshal.h"
-#include "gal/a11y/e-table/gal-a11y-e-table-click-to-add.h"
-
-enum {
-	CURSOR_CHANGE,
-	STYLE_SET,
-	LAST_SIGNAL
-};
-
-static guint etcta_signals [LAST_SIGNAL] = { 0 };
-
-#define PARENT_OBJECT_TYPE gnome_canvas_group_get_type ()
-
-#define ELEMENTS(x) (sizeof (x) / sizeof (x[0]))
-
-static GnomeCanvasGroupClass *etcta_parent_class;
-
-enum {
-	PROP_0,
-	PROP_HEADER,
-	PROP_MODEL,
-	PROP_MESSAGE,
-	PROP_WIDTH,
-	PROP_HEIGHT
-};
-
-static void
-etcta_cursor_change (GtkObject *object, gint row, gint col, ETableClickToAdd *etcta)
-{
-	g_signal_emit (etcta,
-		       etcta_signals [CURSOR_CHANGE], 0,
-		       row, col);
-}
-
-static void
-etcta_style_set (ETableClickToAdd *etcta, GtkStyle *previous_style)
-{
-	GtkWidget *widget = GTK_WIDGET(GNOME_CANVAS_ITEM(etcta)->canvas);
-
-	if (etcta->rect) {
-		gnome_canvas_item_set (etcta->rect,
-					"outline_color_gdk", &widget->style->fg[GTK_STATE_NORMAL], 
-					"fill_color_gdk", &widget->style->bg[GTK_STATE_NORMAL],
-					NULL );
-
-	}
-
-	if (etcta->text)
-		gnome_canvas_item_set (etcta->text,
-					"fill_color_gdk", &widget->style->text[GTK_STATE_NORMAL],
-					NULL);
-
-}
-
-static void
-etcta_add_table_header (ETableClickToAdd *etcta, ETableHeader *header)
-{
-	etcta->eth = header;
-	if (etcta->eth)
-		g_object_ref (etcta->eth);
-	if (etcta->row)
-		gnome_canvas_item_set(GNOME_CANVAS_ITEM(etcta->row),
-				      "ETableHeader", header,
-				      NULL);
-}
-
-static void
-etcta_drop_table_header (ETableClickToAdd *etcta)
-{
-	if (!etcta->eth)
-		return;
-
-	g_object_unref (etcta->eth);
-	etcta->eth = NULL;
-}
-
-static void
-etcta_add_one (ETableClickToAdd *etcta, ETableModel *one)
-{
-	etcta->one = one;
-	if (etcta->one)
-		g_object_ref (etcta->one);
-	if (etcta->row)
-		gnome_canvas_item_set(GNOME_CANVAS_ITEM(etcta->row),
-				      "ETableModel", one,
-				      NULL);
-	g_object_set(etcta->selection,
-		     "model", one,
-		     NULL);
-}
-
-static void
-etcta_drop_one (ETableClickToAdd *etcta)
-{
-	if (!etcta->one)
-		return;
-	g_object_unref (etcta->one);
-	etcta->one = NULL;
-	g_object_set(etcta->selection,
-		     "model", NULL,
-		     NULL);
-}
-
-static void
-etcta_add_model (ETableClickToAdd *etcta, ETableModel *model)
-{
-	etcta->model = model;
-	if (etcta->model)
-		g_object_ref (etcta->model);
-}
-
-static void
-etcta_drop_model (ETableClickToAdd *etcta)
-{
-	etcta_drop_one (etcta);
-	if (!etcta->model)
-		return;
-	g_object_unref (etcta->model);
-	etcta->model = NULL;
-}
-
-static void
-etcta_add_message (ETableClickToAdd *etcta, char *message)
-{
-	etcta->message = g_strdup(message);
-}
-
-static void
-etcta_drop_message (ETableClickToAdd *etcta)
-{
-	g_free(etcta->message);
-	etcta->message = NULL;
-}
-
-
-static void
-etcta_dispose (GObject *object)
-{
-	ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (object);
-
-	etcta_drop_table_header (etcta);
-	etcta_drop_model (etcta);
-	etcta_drop_message (etcta);
-	if (etcta->selection)
-		g_object_unref (etcta->selection);
-	etcta->selection = NULL;
-
-	if (G_OBJECT_CLASS (etcta_parent_class)->dispose)
-		(*G_OBJECT_CLASS (etcta_parent_class)->dispose) (object);
-}
-
-static void
-etcta_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
-	GnomeCanvasItem *item;
-	ETableClickToAdd *etcta;
-
-	item = GNOME_CANVAS_ITEM (object);
-	etcta = E_TABLE_CLICK_TO_ADD (object);
-
-	switch (prop_id){
-	case PROP_HEADER:
-		etcta_drop_table_header (etcta);
-		etcta_add_table_header (etcta, E_TABLE_HEADER(g_value_get_object (value)));
-		break;
-	case PROP_MODEL:
-		etcta_drop_model (etcta);
-		etcta_add_model (etcta, E_TABLE_MODEL(g_value_get_object (value)));
-		break;
-	case PROP_MESSAGE:
-		etcta_drop_message (etcta);
-		etcta_add_message (etcta, (char*)g_value_get_string (value));
-		break;
-	case PROP_WIDTH:
-		etcta->width = g_value_get_double (value);
-		if (etcta->row)
-			gnome_canvas_item_set(etcta->row,
-					      "minimum_width", etcta->width,
-					      NULL);
-		if (etcta->text)
-			gnome_canvas_item_set(etcta->text,
-					      "width", etcta->width - 4,
-					      NULL);
-		if (etcta->rect)
-			gnome_canvas_item_set(etcta->rect,
-					      "x2", etcta->width - 1,
-					      NULL);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		return;
-
-	}
-	gnome_canvas_item_request_update(item);
-}
-
-static void
-create_rect_and_text (ETableClickToAdd *etcta)
-{
-	GtkWidget *widget = GTK_WIDGET (GNOME_CANVAS_ITEM(etcta)->canvas);
-
-	if (!etcta->rect)
-		etcta->rect = gnome_canvas_item_new(GNOME_CANVAS_GROUP(etcta),
-					    gnome_canvas_rect_get_type(),
-					    "x1", (double) 0,
-					    "y1", (double) 0,
-					    "x2", (double) etcta->width - 1,
-					    "y2", (double) etcta->height - 1,
-					    "outline_color_gdk", &widget->style->fg[GTK_STATE_NORMAL], 
-					    "fill_color_gdk", &widget->style->bg[GTK_STATE_NORMAL],
-					    NULL);
-
-	if (!etcta->text)
-		etcta->text = gnome_canvas_item_new(GNOME_CANVAS_GROUP(etcta),
-					    e_text_get_type(),
-					    "text", etcta->message ? etcta->message : "",
-					    "anchor", GTK_ANCHOR_NW,
-					    "width", etcta->width - 4,
-					    "draw_background", FALSE,
-					    "fill_color_gdk", &widget->style->text[GTK_STATE_NORMAL],
-					    NULL);
-}
-
-static void
-etcta_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
-	ETableClickToAdd *etcta;
-
-	etcta = E_TABLE_CLICK_TO_ADD (object);
-
-	switch (prop_id){
-	case PROP_HEADER:
-		g_value_set_object (value, etcta->eth);
-		break;
-	case PROP_MODEL:
-		g_value_set_object (value, etcta->model);
-		break;
-	case PROP_MESSAGE:
-		g_value_set_string (value, g_strdup(etcta->message));
-		break;
-	case PROP_WIDTH:
-		g_value_set_double (value, etcta->width);
-		break;
-	case PROP_HEIGHT:
-		g_value_set_double (value, etcta->height);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-etcta_realize (GnomeCanvasItem *item)
-{
-	ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (item);
-
-	create_rect_and_text (etcta);
-	e_canvas_item_move_absolute (etcta->text, 2, 2);
-
-	if (GNOME_CANVAS_ITEM_CLASS (etcta_parent_class)->realize)
-		(*GNOME_CANVAS_ITEM_CLASS (etcta_parent_class)->realize)(item);
-
-	e_canvas_item_request_reflow (item);
-}
-
-static void
-etcta_unrealize (GnomeCanvasItem *item)
-{
-	if (GNOME_CANVAS_ITEM_CLASS (etcta_parent_class)->unrealize)
-		(*GNOME_CANVAS_ITEM_CLASS (etcta_parent_class)->unrealize)(item);
-}
-
-static void finish_editing (ETableClickToAdd *etcta);
-
-static int
-item_key_press (ETableItem *item, int row, int col, GdkEvent *event, ETableClickToAdd *etcta)
-{
-	switch (event->key.keyval) {
-		case GDK_Return:
-		case GDK_KP_Enter:
-		case GDK_ISO_Enter:
-		case GDK_3270_Enter:
-			finish_editing(etcta);
-			return TRUE;
-	}
-	return FALSE;
-}
-
-static void
-set_initial_selection (ETableClickToAdd *etcta)
-{
-	e_selection_model_do_something (E_SELECTION_MODEL(etcta->selection), 
-					0, e_table_header_prioritized_column (etcta->eth), 
-					0);
-}
-
-static void
-finish_editing (ETableClickToAdd *etcta)
-{
-	if (etcta->row) {
-		ETableModel *one;
-
-		e_table_item_leave_edit (E_TABLE_ITEM (etcta->row));
-		e_table_one_commit(E_TABLE_ONE(etcta->one));
-		etcta_drop_one (etcta);
-		gtk_object_destroy(GTK_OBJECT (etcta->row));
-		etcta->row = NULL;
-
-		one = e_table_one_new(etcta->model);
-		etcta_add_one (etcta, one);
-		g_object_unref (one);
-
-		e_selection_model_clear(E_SELECTION_MODEL(etcta->selection));
-
-		etcta->row = gnome_canvas_item_new(GNOME_CANVAS_GROUP(etcta),
-						   e_table_item_get_type(),
-						   "ETableHeader", etcta->eth,
-						   "ETableModel", etcta->one,
-						   "minimum_width", etcta->width,
-						   "horizontal_draw_grid", TRUE,
-						   "vertical_draw_grid", TRUE,
-						   "selection_model", etcta->selection,
-						   "cursor_mode", E_CURSOR_SPREADSHEET,
-						   NULL);
-
-		g_signal_connect(etcta->row, "key_press",
-				 G_CALLBACK(item_key_press), etcta);
-
-		set_initial_selection (etcta);
-	}
-}
-
-/*
- * Handles the events on the ETableClickToAdd, particularly it creates the ETableItem and passes in some events.
- */
-static int
-etcta_event (GnomeCanvasItem *item, GdkEvent *e)
-{
-	ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (item);
-
-	switch (e->type){
-	case GDK_FOCUS_CHANGE:
-		if (!e->focus_change.in)
-			return TRUE;
-
-	case GDK_BUTTON_PRESS:
-		if (etcta->text) {
-			gtk_object_destroy(GTK_OBJECT (etcta->text));
-			etcta->text = NULL;
-		}
-		if (etcta->rect) {
-			gtk_object_destroy(GTK_OBJECT (etcta->rect));
-			etcta->rect = NULL;
-		}
-		if (!etcta->row) {
-			ETableModel *one;
-
-			one = e_table_one_new(etcta->model);
-			etcta_add_one (etcta, one);
-			g_object_unref (one);
-			
-			e_selection_model_clear(E_SELECTION_MODEL(etcta->selection));
-
-			etcta->row = gnome_canvas_item_new(GNOME_CANVAS_GROUP(item),
-							   e_table_item_get_type(),
-							   "ETableHeader", etcta->eth,
-							   "ETableModel", etcta->one,
-							   "minimum_width", etcta->width,
-							   "horizontal_draw_grid", TRUE,
-							   "vertical_draw_grid", TRUE,
-							   "selection_model", etcta->selection,
-							   "cursor_mode", E_CURSOR_SPREADSHEET,
-							   NULL);
-
-			g_signal_connect(etcta->row, "key_press",
-					 G_CALLBACK (item_key_press), etcta);
-
-			e_canvas_item_grab_focus (GNOME_CANVAS_ITEM(etcta->row), TRUE);
-
-			set_initial_selection (etcta);
-		}
-		break;
-
-	case GDK_KEY_PRESS:
-		switch (e->key.keyval) {
-		case GDK_Tab:
-		case GDK_KP_Tab:
-		case GDK_ISO_Left_Tab:
-			finish_editing (etcta);
-			break;
-		default:
-			return FALSE;
-			break;
-		}
-		break;
-			
-	default:
-		return FALSE;
-	}
-	return TRUE;
-}
-
-static void
-etcta_reflow (GnomeCanvasItem *item, int flags)
-{
-	ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (item);
-	
-	double old_height = etcta->height;
-
-	if (etcta->text) {
-		g_object_get(etcta->text,
-			     "height", &etcta->height,
-			     NULL);
-		etcta->height += 6;
-	}
-	if (etcta->row) {
-		g_object_get(etcta->row,
-			     "height", &etcta->height,
-			     NULL);
-	}
-
-	if (etcta->rect) {
-		g_object_set(etcta->rect,
-			     "y2", etcta->height - 1,
-			     NULL);
-	}
-
-	if (old_height != etcta->height)
-		e_canvas_item_request_parent_reflow(item);
-}
-
-static void
-etcta_class_init (ETableClickToAddClass *klass)
-{
-	GnomeCanvasItemClass *item_class = GNOME_CANVAS_ITEM_CLASS(klass);
-	GObjectClass *object_class = G_OBJECT_CLASS(klass);
-
-	etcta_parent_class = g_type_class_ref (PARENT_OBJECT_TYPE);
-
-	klass->cursor_change = NULL;
-	klass->style_set     = etcta_style_set;
-
-	object_class->dispose      = etcta_dispose;
-	object_class->set_property = etcta_set_property;
-	object_class->get_property = etcta_get_property;
-
-	item_class->realize     = etcta_realize;
-	item_class->unrealize   = etcta_unrealize;
-	item_class->event       = etcta_event;
-
-	g_object_class_install_property (object_class, PROP_HEADER, 
-					 g_param_spec_object ("header",
-							      _("Header"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_HEADER_TYPE,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_MODEL, 
-					 g_param_spec_object ("model",
-							      _("Model"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_MODEL_TYPE,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_MESSAGE, 
-					 g_param_spec_string ("message",
-							      _("Message"),
-							      /*_( */"XXX blurb" /*)*/,
-							      NULL,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_WIDTH, 
-					 g_param_spec_double ("width",
-							      _("Width"),
-							      /*_( */"XXX blurb" /*)*/,
-							      0.0, G_MAXDOUBLE, 0.0,
-							      G_PARAM_READWRITE | G_PARAM_LAX_VALIDATION));
-
-	g_object_class_install_property (object_class, PROP_HEIGHT, 
-					 g_param_spec_double ("height",
-							      _("Height"),
-							      /*_( */"XXX blurb" /*)*/,
-							      0.0, G_MAXDOUBLE, 0.0,
-							      G_PARAM_READABLE | G_PARAM_LAX_VALIDATION));
-
-	etcta_signals [CURSOR_CHANGE] =
-		g_signal_new ("cursor_change",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClickToAddClass, cursor_change),
-			      NULL, NULL,
-			      e_marshal_VOID__INT_INT,
-			      G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
-
-	etcta_signals [STYLE_SET] =
-		g_signal_new ("style_set",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClickToAddClass, style_set),
-			      NULL, NULL,
-			      e_marshal_NONE__OBJECT,
-			      G_TYPE_NONE, 1, GTK_TYPE_STYLE);
-
-	gal_a11y_e_table_click_to_add_init ();
-}
-
-static void
-etcta_init (GnomeCanvasItem *item)
-{
-	ETableClickToAdd *etcta = E_TABLE_CLICK_TO_ADD (item);
-	AtkObject *a11y;
-
-	etcta->one = NULL;
-	etcta->model = NULL;
-	etcta->eth = NULL;
-
-	etcta->message = NULL;
-
-	etcta->row = NULL;
-	etcta->text = NULL;
-	etcta->rect = NULL;
-
-	etcta->selection = e_table_selection_model_new();
-	g_signal_connect(etcta->selection, "cursor_changed",
-			 G_CALLBACK (etcta_cursor_change), etcta);
-
-	e_canvas_item_set_reflow_callback(item, etcta_reflow);
-
-	/* create its a11y object at this time if accessibility is enabled*/
-	if (atk_get_root () != NULL) {
-        	a11y = atk_gobject_accessible_for_object (G_OBJECT (etcta));
-		atk_object_set_name (a11y, _("click to add"));
-	}
-}
-
-E_MAKE_TYPE(e_table_click_to_add, "ETableClickToAdd", ETableClickToAdd, etcta_class_init, etcta_init, PARENT_OBJECT_TYPE)
-
-
-/* The colors in this need to be themefied. */
-/**
- * e_table_click_to_add_commit:
- * @etcta: The %ETableClickToAdd to commit.
- * 
- * This routine commits the current thing being edited and returns to
- * just displaying the click to add message.
- **/
-void
-e_table_click_to_add_commit (ETableClickToAdd *etcta)
-{
-	if (etcta->row) {
-		e_table_one_commit(E_TABLE_ONE(etcta->one));
-		etcta_drop_one (etcta);
-		gtk_object_destroy(GTK_OBJECT (etcta->row));
-		etcta->row = NULL;
-	}
-	create_rect_and_text (etcta);
-	e_canvas_item_move_absolute (etcta->text, 3, 3);
-}
diff --git a/widgets/table/e-table-click-to-add.h b/widgets/table/e-table-click-to-add.h
deleted file mode 100644
index 42ffd42d07..0000000000
--- a/widgets/table/e-table-click-to-add.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-click-to-add.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_CLICK_TO_ADD_H_
-#define _E_TABLE_CLICK_TO_ADD_H_
-
-#include <libxml/tree.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gal/e-table/e-table-header.h>
-#include <gal/e-table/e-table-sort-info.h>
-#include <gal/e-table/e-table-item.h>
-#include <gal/e-table/e-table-selection-model.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_CLICK_TO_ADD_TYPE        (e_table_click_to_add_get_type ())
-#define E_TABLE_CLICK_TO_ADD(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_CLICK_TO_ADD_TYPE, ETableClickToAdd))
-#define E_TABLE_CLICK_TO_ADD_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_CLICK_TO_ADD_TYPE, ETableClickToAddClass))
-#define E_IS_TABLE_CLICK_TO_ADD(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_CLICK_TO_ADD_TYPE))
-#define E_IS_TABLE_CLICK_TO_ADD_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_CLICK_TO_ADD_TYPE))
-
-typedef struct {
-	GnomeCanvasGroup  parent;
-
-	ETableModel      *one;    /* The ETableOne. */
-
-	ETableModel      *model;  /* The backend model. */
-	ETableHeader     *eth;    /* This is just to give to the ETableItem. */
-
-	char             *message;
-
-	GnomeCanvasItem  *row;    /* If row is NULL, we're sitting with no data and a "Click here" message. */
-	GnomeCanvasItem  *text;   /* If text is NULL, row shouldn't be. */
-	GnomeCanvasItem  *rect;   /* What the heck.  Why not. */
-	
-	gdouble           width;
-	gdouble           height;
-
-	ETableSelectionModel *selection;
-} ETableClickToAdd;
-
-typedef struct {
-	GnomeCanvasGroupClass parent_class;
-
-	/*
-	 * signals
-	 */
-	void (*cursor_change) (ETableClickToAdd *etcta, gint row, gint col);
-	void (*style_set) (ETableClickToAdd *etcta, GtkStyle *previous_style);
-} ETableClickToAddClass;
-
-GType      e_table_click_to_add_get_type (void);
-
-void       e_table_click_to_add_commit (ETableClickToAdd *etcta);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_CLICK_TO_ADD_H_ */
diff --git a/widgets/table/e-table-col-dnd.h b/widgets/table/e-table-col-dnd.h
deleted file mode 100644
index d31c94ed26..0000000000
--- a/widgets/table/e-table-col-dnd.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-col-dnd.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_COL_DND_H_
-#define _E_TABLE_COL_DND_H_
-
-#include <glib.h>
-
-G_BEGIN_DECLS
-
-#define TARGET_ETABLE_COL_TYPE "application/x-etable-column-header"
-
-enum {
-	TARGET_ETABLE_COL_HEADER
-};
-
-G_END_DECLS
-
-#endif /* _E_TABLE_COL_DND_H_ */
diff --git a/widgets/table/e-table-col.c b/widgets/table/e-table-col.c
deleted file mode 100644
index 9acc0ba4fd..0000000000
--- a/widgets/table/e-table-col.c
+++ /dev/null
@@ -1,236 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-col.c
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Miguel de Icaza <miguel@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include "e-table-col.h"
-#include "gal/util/e-util.h"
-#include "gal/util/e-i18n.h"
-
-static GObjectClass *parent_class;
-
-enum {
-	PROP_0,
-	PROP_COMPARE_COL,
-};
-
-static void
-etc_dispose (GObject *object)
-{
-	ETableCol *etc = E_TABLE_COL (object);
-
-	if (etc->ecell)
-		g_object_unref (etc->ecell);
-	etc->ecell = NULL;
-
-	if (etc->pixbuf)
-		gdk_pixbuf_unref (etc->pixbuf);
-	etc->pixbuf = NULL;
-
-	if (etc->text)
-		g_free (etc->text);
-	etc->text = NULL;
-	
-	parent_class->dispose (object);
-}
-
-static void
-etc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
-	ETableCol *etc = E_TABLE_COL (object);
-
-	switch (prop_id) {
-	case PROP_COMPARE_COL:
-		etc->compare_col = g_value_get_int (value);
-		break;
-	default:
-		break;
-	}
-}
-
-static void
-etc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
-	ETableCol *etc = E_TABLE_COL (object);
-
-	switch (prop_id) {
-	case PROP_COMPARE_COL:
-		g_value_set_int (value, etc->compare_col);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
- 
-static void
-e_table_col_class_init (GObjectClass *object_class)
-{
-	parent_class = g_type_class_peek_parent (object_class);
-
-	object_class->dispose = etc_dispose;
-	object_class->set_property = etc_set_property;
-	object_class->get_property = etc_get_property;
-
-	g_object_class_install_property (object_class, PROP_COMPARE_COL,
-					 g_param_spec_int ("compare_col",
-							   _( "Width" ),
-							   "Width", 
-							   0, G_MAXINT, 0,
-							   G_PARAM_READWRITE)); 
-}
-
-static void
-e_table_col_init (ETableCol *etc)
-{
-	etc->width = 0;
-	etc->sortable = 1;
-	etc->groupable = 1;
-	etc->justification = GTK_JUSTIFY_LEFT;
-	etc->priority = 0;
-}
-
-E_MAKE_TYPE(e_table_col, "ETableCol", ETableCol, e_table_col_class_init, e_table_col_init, G_TYPE_OBJECT)
-
-/** 
- * e_table_col_new:
- * @col_idx: the column we represent in the model
- * @text: a title for this column
- * @expansion: FIXME
- * @min_width: minimum width in pixels for this column
- * @ecell: the renderer to be used for this column
- * @compare: comparision function for the elements stored in this column
- * @resizable: whether the column can be resized interactively by the user
- * @priority: FIXME
- *
- * The ETableCol represents a column to be used inside an ETable.  The
- * ETableCol objects are inserted inside an ETableHeader (which is just a collection
- * of ETableCols).  The ETableHeader is the definition of the order in which
- * columns are shown to the user. 
- *
- * The @text argument is the the text that will be shown as a header to the
- * user. @col_idx reflects where the data for this ETableCol object will
- * be fetch from an ETableModel.  So even if the user changes the order
- * of the columns being viewed (the ETableCols in the ETableHeader), the
- * column will always point to the same column inside the ETableModel.
- *
- * The @ecell argument is an ECell object that needs to know how to render the
- * data in the ETableModel for this specific row. 
- *
- * Returns: the newly created ETableCol object.
- */
-ETableCol *
-e_table_col_new (int col_idx, const char *text, double expansion, int min_width,
-		 ECell *ecell, GCompareFunc compare, gboolean resizable, gboolean disabled, int priority)
-{
-	ETableCol *etc;
-	
-	g_return_val_if_fail (expansion >= 0, NULL);
-	g_return_val_if_fail (min_width >= 0, NULL);
-	g_return_val_if_fail (ecell != NULL, NULL);
-	g_return_val_if_fail (compare != NULL, NULL);
-	g_return_val_if_fail (text != NULL, NULL);
-
-	etc = g_object_new (E_TABLE_COL_TYPE, NULL);
-       
-	etc->is_pixbuf = FALSE;
-
-	etc->col_idx = col_idx;
-	etc->compare_col = col_idx;
-	etc->text = g_strdup (text);
-	etc->pixbuf = NULL;
-	etc->expansion = expansion;
-	etc->min_width = min_width;
-	etc->ecell = ecell;
-	etc->compare = compare;
-	etc->disabled = disabled;
-	etc->priority = priority;
-
-	etc->selected = 0;
-	etc->resizable = resizable;
-
-	g_object_ref (etc->ecell);
-
-	return etc;
-}
-
-/** 
- * e_table_col_new_with_pixbuf:
- * @col_idx: the column we represent in the model
- * @pixbuf: the image to be used for the header
- * @expansion: FIXME
- * @min_width: minimum width in pixels for this column
- * @ecell: the renderer to be used for this column
- * @compare: comparision function for the elements stored in this column
- * @resizable: whether the column can be resized interactively by the user
- *
- * The ETableCol represents a column to be used inside an ETable.  The
- * ETableCol objects are inserted inside an ETableHeader (which is just a collection
- * of ETableCols).  The ETableHeader is the definition of the order in which
- * columns are shown to the user. 
- *
- * The @text argument is the the text that will be shown as a header to the
- * user. @col_idx reflects where the data for this ETableCol object will
- * be fetch from an ETableModel.  So even if the user changes the order
- * of the columns being viewed (the ETableCols in the ETableHeader), the
- * column will always point to the same column inside the ETableModel.
- *
- * The @ecell argument is an ECell object that needs to know how to render the
- * data in the ETableModel for this specific row. 
- *
- * Returns: the newly created ETableCol object.
- */
-ETableCol *
-e_table_col_new_with_pixbuf (int col_idx, const char *text, GdkPixbuf *pixbuf, double expansion, int min_width,
-			     ECell *ecell, GCompareFunc compare, gboolean resizable, gboolean disabled, int priority)
-{
-	ETableCol *etc;
-	
-	g_return_val_if_fail (expansion >= 0, NULL);
-	g_return_val_if_fail (min_width >= 0, NULL);
-	g_return_val_if_fail (ecell != NULL, NULL);
-	g_return_val_if_fail (compare != NULL, NULL);
-	g_return_val_if_fail (pixbuf != NULL, NULL);
-
-	etc = g_object_new (E_TABLE_COL_TYPE, NULL);
-
-	etc->is_pixbuf = TRUE;
-
-	etc->col_idx = col_idx;
-	etc->compare_col = col_idx;
-	etc->text = g_strdup(text);
-	etc->pixbuf = pixbuf;
-	etc->expansion = expansion;
-	etc->min_width = min_width;
-	etc->ecell = ecell;
-	etc->compare = compare;
-	etc->disabled = disabled;
-	etc->priority = priority;
-
-	etc->selected = 0;
-	etc->resizable = resizable;
-
-	g_object_ref (etc->ecell);
-	gdk_pixbuf_ref (etc->pixbuf);
-
-	return etc;
-}
diff --git a/widgets/table/e-table-col.h b/widgets/table/e-table-col.h
deleted file mode 100644
index 8f2369c76a..0000000000
--- a/widgets/table/e-table-col.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-col.h
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Miguel de Icaza <miguel@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_COL_H_
-#define _E_TABLE_COL_H_
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gal/e-table/e-cell.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_COL_TYPE        (e_table_col_get_type ())
-#define E_TABLE_COL(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_COL_TYPE, ETableCol))
-#define E_TABLE_COL_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_COL_TYPE, ETableColClass))
-#define E_IS_TABLE_COL(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_COL_TYPE))
-#define E_IS_TABLE_COL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_COL_TYPE))
-#define E_TABLE_COL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TABLE_COL_TYPE, ETableColClass))
-
-typedef enum {
-	E_TABLE_COL_ARROW_NONE = 0,
-	E_TABLE_COL_ARROW_UP,
-	E_TABLE_COL_ARROW_DOWN
-} ETableColArrow;
-
-/*
- * Information about a single column
- */
-typedef struct {
-	GObject         base;
-	char             *text;
-	GdkPixbuf        *pixbuf;
-	int               min_width;
-	int               width;
-	double            expansion;
-	short             x;
-	GCompareFunc      compare;
-	ETableSearchFunc  search;
-	unsigned int      is_pixbuf:1;
-	unsigned int      selected:1;
-	unsigned int      resizable:1;
-	unsigned int      disabled:1;
-	unsigned int      sortable:1;
-	unsigned int      groupable:1;
-	int               col_idx;
-	int               compare_col;
-	int               priority;
-
-	GtkJustification  justification;
-
-	ECell            *ecell;
-} ETableCol;
-
-typedef struct {
-	GObjectClass parent_class;
-} ETableColClass;
-
-GType      e_table_col_get_type         (void);
-ETableCol *e_table_col_new              (int           col_idx,
-					 const char   *text,
-					 double        expansion,
-					 int           min_width,
-					 ECell        *ecell,
-					 GCompareFunc  compare,
-					 gboolean      resizable,
-					 gboolean      disabled,
-					 int           priority);
-ETableCol *e_table_col_new_with_pixbuf  (int           col_idx,
-					 const char   *text,
-					 GdkPixbuf    *pixbuf,
-					 double        expansion,
-					 int           min_width,
-					 ECell        *ecell,
-					 GCompareFunc  compare,
-					 gboolean      resizable,
-					 gboolean      disabled,
-					 int           priority);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_COL_H_ */
-
diff --git a/widgets/table/e-table-column-specification.c b/widgets/table/e-table-column-specification.c
deleted file mode 100644
index 2e992414d5..0000000000
--- a/widgets/table/e-table-column-specification.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-column-specification.c - Savable specification of a column.
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-#include "gal/util/e-xml-utils.h"
-#include "gal/util/e-util.h"
-#include "e-table-column-specification.h"
-
-static GObjectClass *etcs_parent_class;
-
-static void
-free_strings (ETableColumnSpecification *etcs)
-{
-	g_free(etcs->title);
-	etcs->title = NULL;
-	g_free(etcs->pixbuf);
-	etcs->pixbuf = NULL;
-	g_free(etcs->cell);
-	etcs->cell = NULL;
-	g_free(etcs->compare);
-	etcs->compare = NULL;
-	g_free(etcs->search);
-	etcs->search = NULL;
-}
-
-static void
-etcs_finalize (GObject *object)
-{
-	ETableColumnSpecification *etcs = E_TABLE_COLUMN_SPECIFICATION (object);
-
-	free_strings(etcs);
-
-	etcs_parent_class->finalize (object);
-}
-
-static void
-etcs_class_init (GObjectClass *klass)
-{
-	etcs_parent_class = g_type_class_peek_parent (klass);
-	
-	klass->finalize = etcs_finalize;
-}
-
-static void
-etcs_init (ETableColumnSpecification *specification)
-{
-	specification->model_col     = 0;
-	specification->compare_col   = 0;
-	specification->title         = g_strdup("");
-	specification->pixbuf        = NULL;
-	
-	specification->expansion     = 0;
-	specification->minimum_width = 0;
-	specification->resizable     = FALSE;
-	specification->disabled      = FALSE;
-	
-	specification->cell          = NULL;
-	specification->compare       = NULL;
-	specification->search        = NULL;
-	specification->priority      = 0;
-}
-
-E_MAKE_TYPE(e_table_column_specification, "ETableColumnSpecification", ETableColumnSpecification, etcs_class_init, etcs_init, G_TYPE_OBJECT)
-
-ETableColumnSpecification *
-e_table_column_specification_new (void)
-{
-	ETableColumnSpecification *etcs = g_object_new (E_TABLE_COLUMN_SPECIFICATION_TYPE, NULL);
-
-	return (ETableColumnSpecification *) etcs;
-}
-
-void
-e_table_column_specification_load_from_node (ETableColumnSpecification *etcs,
-					     const xmlNode       *node)
-{
-	free_strings(etcs);
-
-	etcs->model_col     = e_xml_get_integer_prop_by_name (node, "model_col");
-	etcs->compare_col   = e_xml_get_integer_prop_by_name_with_default (node, "compare_col", etcs->model_col);
-	etcs->title         = e_xml_get_string_prop_by_name (node, "_title");
-	etcs->pixbuf        = e_xml_get_string_prop_by_name (node, "pixbuf");
-
-	etcs->expansion     = e_xml_get_double_prop_by_name (node, "expansion");
-	etcs->minimum_width = e_xml_get_integer_prop_by_name (node, "minimum_width");
-	etcs->resizable     = e_xml_get_bool_prop_by_name (node, "resizable");
-	etcs->disabled      = e_xml_get_bool_prop_by_name (node, "disabled");
-
-	etcs->cell          = e_xml_get_string_prop_by_name (node, "cell");
-	etcs->compare       = e_xml_get_string_prop_by_name (node, "compare");
-	etcs->search        = e_xml_get_string_prop_by_name (node, "search");
-	etcs->priority      = e_xml_get_integer_prop_by_name_with_default (node, "priority", 0);
-
-	if (etcs->title == NULL)
-		etcs->title = g_strdup("");
-}
-
-xmlNode *
-e_table_column_specification_save_to_node (ETableColumnSpecification *specification,
-					   xmlNode                   *parent)
-{
-	xmlNode *node;
-	if (parent)
-		node = xmlNewChild(parent, NULL, "ETableColumn", NULL);
-	else
-		node = xmlNewNode(NULL, "ETableColumn");
-
-	e_xml_set_integer_prop_by_name(node, "model_col", specification->model_col);
-	if (specification->compare_col != specification->model_col)
-		e_xml_set_integer_prop_by_name(node, "compare_col", specification->compare_col);
-	e_xml_set_string_prop_by_name(node, "_title", specification->title);
-	e_xml_set_string_prop_by_name(node, "pixbuf", specification->pixbuf);
-
-	e_xml_set_double_prop_by_name(node, "expansion", specification->expansion);
-	e_xml_set_integer_prop_by_name(node, "minimum_width", specification->minimum_width);
-	e_xml_set_bool_prop_by_name(node, "resizable", specification->resizable);
-	e_xml_set_bool_prop_by_name(node, "disabled", specification->disabled);
-
-	e_xml_set_string_prop_by_name(node, "cell", specification->cell);
-	e_xml_set_string_prop_by_name(node, "compare", specification->compare);
-	e_xml_set_string_prop_by_name(node, "search", specification->search);
-	if (specification->priority != 0)
-		e_xml_set_integer_prop_by_name (node, "priority", specification->priority);
-
-	return node;
-}
-
diff --git a/widgets/table/e-table-column-specification.h b/widgets/table/e-table-column-specification.h
deleted file mode 100644
index 6bf5623398..0000000000
--- a/widgets/table/e-table-column-specification.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-column-specification.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_COLUMN_SPECIFICATION_H_
-#define _E_TABLE_COLUMN_SPECIFICATION_H_
-
-#include <glib.h>
-#include <glib-object.h>
-#include <libxml/tree.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_COLUMN_SPECIFICATION_TYPE        (e_table_column_specification_get_type ())
-#define E_TABLE_COLUMN_SPECIFICATION(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_COLUMN_SPECIFICATION_TYPE, ETableColumnSpecification))
-#define E_TABLE_COLUMN_SPECIFICATION_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_COLUMN_SPECIFICATION_TYPE, ETableColumnSpecificationClass))
-#define E_IS_TABLE_COLUMN_SPECIFICATION(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_COLUMN_SPECIFICATION_TYPE))
-#define E_IS_TABLE_COLUMN_SPECIFICATION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_COLUMN_SPECIFICATION_TYPE))
-#define E_TABLE_COLUMN_SPECIFICATION_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TABLE_COLUMN_SPECIFICATION_TYPE, ETableColumnSpecificationClass))
-
-typedef struct {
-	GObject base;
-	int model_col;
-	int compare_col;
-	char *title;
-	char *pixbuf;
-
-	double expansion;
-	int minimum_width;
-	guint resizable : 1;
-	guint disabled : 1;
-
-	char *cell;
-	char *compare;
-	char *search;
-	int priority;
-} ETableColumnSpecification;
-
-typedef struct {
-	GObjectClass parent_class;
-} ETableColumnSpecificationClass;
-
-GType                      e_table_column_specification_get_type        (void);
-
-ETableColumnSpecification *e_table_column_specification_new             (void);
-
-void                       e_table_column_specification_load_from_node  (ETableColumnSpecification *state,
-									 const xmlNode             *node);
-xmlNode                   *e_table_column_specification_save_to_node    (ETableColumnSpecification *state,
-									 xmlNode                   *parent);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_COLUMN_SPECIFICATION_H_ */
diff --git a/widgets/table/e-table-column.c b/widgets/table/e-table-column.c
deleted file mode 100644
index 514a25e74e..0000000000
--- a/widgets/table/e-table-column.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-column.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include "e-table-column.h"
-
-enum {
-	STRUCTURE_CHANGE,
-	DIMENSION_CHANGE,
-	LAST_SIGNAL
-};
-
-static guint etc_signals [LAST_SIGNAL] = { 0, };
-
-#define PARENT_CLASS GTK_TYPE_OBJECT
-static GtkObjectClass *e_table_column_parent_class;
-
-static void
-e_table_column_finalize (GObject *object)
-{
-	ETableColumn *etc = E_TABLE_COLUMN (object);
-	const int cols = etc->col_count;
-
-	/*
-	 * Destroy listeners
-	 */
-	for (l = etc->listeners; l; l = l->next)
-		g_free (l->data);
-	g_slist_free (etc->listeners);
-	etc->listeners = NULL;
-
-	/*
-	 * Destroy columns
-	 */
-	for (i = 0; i < cols; i++)
-		e_table_column_remove (etc, i);
-	
-	G_OBJECT_CLASS (e_table_column_parent_class)->finalize (object);
-}
-
-static void
-e_table_column_class_init (GtkObjectClass *object_class)
-{
-	G_OBJECT_CLASS (object_class)->finalize = e_table_column_finalize;
-
-	e_table_column_parent_class = g_type_class_ref (PARENT_CLASS);
-
-	etc_signals [STRUCTURE_CHANGE] =
-		g_signal_new ("structure_change",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableColumn, structure_change),
-			      NULL, NULL,
-			      e_marshal_NONE__NONE,
-			      G_TYPE_NONE, 0);
-	etc_signals [DIMENSION_CHANGE] = 
-		g_signal_new ("dimension_change", 
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableColumn, dimension_change),
-			      e_marshal_NONE__INT,
-			      G_TYPE_NONE, 1, G_TYPE_INT);
-}
-
-E_MAKE_TYPE (e_table_column,
-	     "ETableColumn",
-	     ETableColumn,
-	     e_table_column_class_init,
-	     NULL,
-	     PARENT_TYPE);
-
-static void
-etc_do_insert (ETableColumn *etc, int pos, ETableCol *val)
-{
-	memcpy (&etc->columns [pos+1], &etc->columns [pos],
-		sizeof (ETableCol *) * (etc->col_count - pos));
-	etc->columns [pos] = val;
-}
-
-void
-e_table_column_add_column (ETableColumn *etc, ETableCol *tc, int pos)
-{
-	ETableCol **new_ptr;
-	
-	g_return_if_fail (etc != NULL);
-	g_return_if_fail (E_IS_TABLE_COLUMN (etc));
-	g_return_if_fail (tc != NULL);
-	g_return_if_fail (pos >= 0 && pos < etc->col_count);
-
-	if (pos == -1)
-		pos = etc->col_count;
-	etc->columns = g_realloc (etc->columns, sizeof (ETableCol *) * (etc->col_count + 1));
-	etc_do_insert (etc, pos, tc);
-	etc->col_count++;
-
-	g_signal_emit (etc, etc_signals [STRUCTURE_CHANGE], 0);
-}
-
-ETableCol *
-e_table_column_get_column (ETableColumn *etc, int column)
-{
-	g_return_val_if_fail (etc != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), NULL);
-
-	if (column < 0)
-		return NULL;
-
-	if (column >= etc->col_count)
-		return NULL;
-
-	return etc->columns [column];
-}
-
-int
-e_table_column_count (ETableColumn *etc)
-{
-	g_return_val_if_fail (etc != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
-
-	return etc->col_count;
-}
-
-int
-e_table_column_index (ETableColumn *etc, const char *identifier)
-{
-	int i;
-	
-	g_return_val_if_fail (etc != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
-	g_return_val_if_fail (identifier != NULL, 0);
-
-	for (i = 0; i < etc->col_count; i++){
-		ETableCol *tc = etc->columns [i];
-		
-		if (strcmp (i->id, identifier) == 0)
-			return i;
-	}
-
-	return -1;
-}
-
-int
-e_table_column_get_index_at (ETableColumn *etc, int x_offset)
-{
-	int i, total;
-	
-	g_return_val_if_fail (etc != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
-	g_return_val_if_fail (identifier != NULL, 0);
-
-	total = 0;
-	for (i = 0; i < etc->col_count; i++){
-		total += etc->columns [i]->width;
-
-		if (x_offset < total)
-			return i;
-	}
-
-	return -1;
-}
-
-ETableCol **
-e_table_column_get_columns (ETableColumn *etc)
-{
-	ETableCol **ret;
-	int i;
-	
-	g_return_val_if_fail (etc != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
-
-	ret = g_new (ETableCol *, etc->col_count + 1);
-	memcpy (ret, etc->columns, sizeof (ETableCol *) * etc->col_count);
-	ret [etc->col_count] = NULL;
-
-	return ret;
-}
-
-gboolean
-e_table_column_selection_ok (ETableColumn *etc)
-{
-	g_return_val_if_fail (etc != NULL, FALSE);
-	g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), FALSE);
-
-	return etc->selectable;
-}
-
-int
-ve_table_column_get_selected (ETableColumn *etc)
-{
-	int i;
-	int selected = 0;
-	
-	g_return_val_if_fail (etc != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
-
-	for (i = 0; i < etc->col_count; i++){
-		if (etc->columns [i]->selected)
-			selected++;
-	}
-
-	return selected;
-}
-
-int
-e_table_column_total_width (ETableColumn *etc)
-{
-	int total;
-	
-	g_return_val_if_fail (etc != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_COLUMN (etc), 0);
-
-	total = 0;
-	for (i = 0; i < etc->col_count; i++)
-		total += etc->columns [i].width;
-
-	return total;
-}
-
-static void
-etc_do_remove (ETableColumn *etc, int idx)
-{
-	memcpy (&etc->columns [idx], &etc->columns [idx+1],
-		sizeof (ETableCol *) * etc->col_count - idx);
-	etc->col_count--;
-}
-
-void
-e_table_column_move (ETableColumn *etc, int source_index, int target_index)
-{
-	g_return_if_fail (etc != NULL);
-	g_return_if_fail (E_IS_TABLE_COLUMN (etc));
-	g_return_if_fail (source_index >= 0);
-	g_return_if_fail (target_index >= 0);
-	g_return_if_fail (source_index < etc->col_count);
-	g_return_if_fail (target_index < etc->col_count);
-
-	old = etc->columns [source_index];
-	etc_do_remove (etc, source_index);
-	etc_do_insert (etc, target_index, old);
-	g_signal_emit (etc, etc_signals [STRUCTURE_CHANGE], 0);
-}
-
-void
-e_table_column_remove (ETableColumn *etc, int idx)
-{
-	g_return_if_fail (etc != NULL);
-	g_return_if_fail (E_IS_TABLE_COLUMN (etc));
-	g_return_if_fail (idx >= 0);
-	g_return_if_fail (idx < etc->col_count);
-
-	etc_do_remove (etc, idx);
-	g_signal_emit (etc, etc_signals [STRUCTURE_CHANGE], 0);
-}
-
-void
-e_table_column_set_selection (ETableColumn *etc, gboolean allow_selection);
-{
-}
-
-void
-e_table_column_set_size (ETableColumn *etc, int idx, int size)
-{
-	g_return_if_fail (etc != NULL);
-	g_return_if_fail (E_IS_TABLE_COLUMN (etc));
-	g_return_if_fail (idx >= 0);
-	g_return_if_fail (idx < etc->col_count);
-	g_return_if_fail (size > 0);
-
-	etc->columns [idx]->width = size;
-	g_signal_emit (etc, etc_signals [SIZE_CHANGE], 0, idx);
-}
diff --git a/widgets/table/e-table-config-field.c b/widgets/table/e-table-config-field.c
deleted file mode 100644
index 7c23e10046..0000000000
--- a/widgets/table/e-table-config-field.c
+++ /dev/null
@@ -1,300 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-config-field.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <gtk/gtk.h>
-#include <gtk/gtkbox.h>
-#include "gal/util/e-util.h"
-#include "gal/util/e-i18n.h"
-#include "e-table-config-field.h"
-
-#define PARENT_TYPE (gtk_vbox_get_type())
-
-static GtkVBoxClass *etcf_parent_class;
-
-static void
-etcf_dispose (GObject *object)
-{
-	ETableConfigField *etcf = E_TABLE_CONFIG_FIELD (object);
-
-	if (etct->spec)
-		g_object_unref (etcf->spec);
-	etct->spec = NULL;
-
-	if (etct->sort_info)
-		g_object_unref (etcf->sort_info);
-	etct->sort_info = NULL;
-
-	G_OBJECT_CLASS (etcf_parent_class)->dispose (object);
-}
-
-static void
-etcf_class_init (GObjectClass *klass)
-{
-	etcf_parent_class = g_type_class_ref (PARENT_TYPE);
-	
-	klass->dispose = etcf_dispose;
-}
-
-static void
-etcf_init (ETableConfigField *etcf)
-{
-	etcf->spec             = NULL;
-	etcf->sort_info        = NULL;
-
-	etcf->combo            = NULL;
-	etcf->radio_ascending  = NULL;
-	etcf->radio_descending = NULL;
-	etcf->child_fields     = NULL;
-}
-
-E_MAKE_TYPE(e_table_config_field, "ETableConfigField", ETableConfigField, etcf_class_init, etcf_init, PARENT_TYPE)
-
-ETableConfigField *
-e_table_config_field_new       (ETableSpecification *spec,
-				ETableSortInfo      *sort_info,
-				gboolean             grouping)
-{
-	ETableConfigField *etcf = g_object_new (E_TABLE_CONFIG_FIELD_TYPE, NULL);
-
-	e_table_config_field_construct (etcf, spec, sort_info, grouping);
-
-	return (ETableConfigField *) etcf;
-}
-
-inline static int
-etcf_get_count (ETableConfigField *etcf)
-{
-	if (etcf->grouping)
-		return e_table_sort_info_grouping_get_count(etcf->sort_info);
-	else
-		return e_table_sort_info_sorting_get_count(etcf->sort_info);
-}
-
-inline static ETableSortColumn
-etcf_get_nth (ETableConfigField *etcf)
-{
-	if (etcf->grouping)
-		return e_table_sort_info_grouping_get_nth(etcf->sort_info, etcf->n);
-	else
-		return e_table_sort_info_sorting_get_nth(etcf->sort_info, etcf->n);
-}
-
-inline static void
-etcf_set_nth (ETableConfigField *etcf, ETableSortColumn column)
-{
-	if (etcf->grouping)
-		e_table_sort_info_grouping_set_nth(etcf->sort_info, etcf->n, column);
-	else
-		e_table_sort_info_sorting_set_nth(etcf->sort_info, etcf->n, column);
-}
-
-inline static void
-etcf_truncate (ETableConfigField *etcf)
-{
-	if (etcf->grouping)
-		e_table_sort_info_grouping_truncate(etcf->sort_info, etcf->n);
-	else
-		e_table_sort_info_sorting_truncate(etcf->sort_info, etcf->n);
-}
-
-static void
-etcf_set_sensitivity(ETableConfigField *etcf)
-{
-	int count = etcf_get_count(etcf);
-
-	if (etcf->n >= count) {
-		gtk_widget_set_sensitive(etcf->radio_ascending, FALSE);
-		gtk_widget_set_sensitive(etcf->radio_descending, FALSE);
-		if (etcf->child_fields)
-			gtk_widget_set_sensitive(etcf->child_fields, FALSE);
-	} else {
-		gtk_widget_set_sensitive(etcf->radio_ascending, TRUE);
-		gtk_widget_set_sensitive(etcf->radio_descending, TRUE);
-		if (etcf->child_fields)
-			gtk_widget_set_sensitive(etcf->child_fields, TRUE);
-	}
-}
-
-static void
-toggled(GtkWidget *widget, ETableConfigField *etcf)
-{
-	int count;
-
-	count = etcf_get_count(etcf);
-	if (count > etcf->n) {
-		ETableSortColumn sort_column;
-
-		sort_column = etcf_get_nth(etcf);
-		sort_column.ascending = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(etcf->radio_ascending));
-		etcf_set_nth(etcf, sort_column);
-	}
-}
-
-static void
-changed(GtkWidget *widget, ETableConfigField *etcf)
-{
-	ETableColumnSpecification **column;
-	gchar *text;
-
-	text = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(etcf->combo)->entry));
-	for (column = etcf->spec->columns; *column; column++) {
-		if (!strcmp((*column)->title_, text)) {
-			ETableSortColumn sort_column;
-
-			sort_column.ascending = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(etcf->radio_ascending));
-			sort_column.column = (*column)->model_col;
-
-			etcf_set_nth(etcf, sort_column);
-			etcf_set_sensitivity(etcf);
-			return;
-		}
-	}
-	etcf_truncate(etcf);
-	etcf_set_sensitivity(etcf);
-}
-
-static void
-etcf_setup(ETableConfigField *etcf)
-{
-	int count;
-	GList *list = NULL;
-	ETableColumnSpecification **column;
-	ETableColumnSpecification *chosen_column = NULL;
-	int model_col = -1;
-
-	etcf_set_sensitivity(etcf);
-
-	count = etcf_get_count(etcf);
-
-	if (count > etcf->n) {
-		ETableSortColumn sort_column;
-
-		sort_column = etcf_get_nth(etcf);
-		model_col = sort_column.column;
-		if (sort_column.ascending)
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(etcf->radio_ascending), TRUE);
-		else
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(etcf->radio_descending), TRUE);
-	}
-
-	for (column = etcf->spec->columns; *column; column++) {
-		list = g_list_prepend(list, (*column)->title_);
-		if (count > etcf->n && chosen_column == NULL && (*column)->model_col == model_col) {
-			chosen_column = *column;
-		}
-	}
-	list = g_list_reverse(list);
-	list = g_list_prepend(list, "None");
-
-	gtk_combo_set_popdown_strings(GTK_COMBO(etcf->combo), list);
-	g_list_free(list);
-
-	if (chosen_column) {
-		gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(etcf->combo)->entry), chosen_column->title_);
-	} else {
-		gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(etcf->combo)->entry), "None");
-	}
-
-	g_signal_connect(GTK_COMBO(etcf->combo)->entry, "changed",
-			 G_CALLBACK (changed), etcf);
-	g_signal_connect(etcf->radio_ascending, "toggled",
-			 G_CALLBACK (toggled), etcf);
-	g_signal_connect(etcf->radio_descending, "toggled",
-			 G_CALLBACK (toggled), etcf);
-}
-
-static ETableConfigField *
-e_table_config_field_construct_nth (ETableConfigField   *etcf,
-				    ETableSpecification *spec,
-				    ETableSortInfo      *sort_info,
-				    gboolean             grouping,
-				    int                  n)
-{
-	GtkWidget *frame;
-	GtkWidget *internal_hbox;
-	GtkWidget *internal_vbox1;
-	GtkWidget *internal_vbox2;
-
-	etcf->spec = spec;
-	g_object_ref (spec);
-
-	etcf->sort_info = sort_info;
-	g_object_ref (sort_info);
-
-	etcf->grouping = grouping;
-	etcf->n = n;
-
-	gtk_box_set_spacing(GTK_BOX(etcf), 6);
-
-	frame = gtk_frame_new(n > 0 ? _("Then By") : (grouping ? _("Group By") : _("Sort By")));
-	gtk_box_pack_start(GTK_BOX(etcf), frame, FALSE, FALSE, 0);
-
-	internal_hbox = gtk_hbox_new(FALSE, 6);
-	gtk_container_add(GTK_CONTAINER(frame), internal_hbox);
-	gtk_container_set_border_width(GTK_CONTAINER(internal_hbox), 6);
-
-	internal_vbox1 = gtk_vbox_new(FALSE, 6);
-	gtk_box_pack_start(GTK_BOX(internal_hbox), internal_vbox1, FALSE, FALSE, 0);
-
-	etcf->combo = gtk_combo_new();
-	gtk_box_pack_start(GTK_BOX(internal_vbox1), etcf->combo, FALSE, FALSE, 0);
-
-	internal_vbox2 = gtk_vbox_new(FALSE, 6);
-	gtk_box_pack_start(GTK_BOX(internal_hbox), internal_vbox2, FALSE, FALSE, 0);
-
-	etcf->radio_ascending = gtk_radio_button_new_with_label (NULL, _("Ascending"));
-	gtk_box_pack_start(GTK_BOX(internal_vbox2), etcf->radio_ascending, FALSE, FALSE, 0);
-
-	etcf->radio_descending = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(etcf->radio_ascending), _("Descending"));
-	gtk_box_pack_start(GTK_BOX(internal_vbox2), etcf->radio_descending, FALSE, FALSE, 0);
-
-	if (n < 3) {
-		etcf->child_fields = GTK_WIDGET(g_object_new (E_TABLE_CONFIG_FIELD_TYPE, NULL));
-		e_table_config_field_construct_nth(E_TABLE_CONFIG_FIELD(etcf->child_fields), spec, sort_info, grouping, n + 1);
-		gtk_box_pack_start(GTK_BOX(etcf), etcf->child_fields, FALSE, FALSE, 0);
-		gtk_widget_show(etcf->child_fields);
-	} else
-		etcf->child_fields = NULL;
-
-	etcf_setup(etcf);
-
-	gtk_widget_show(etcf->radio_descending);
-	gtk_widget_show(etcf->radio_ascending);
-	gtk_widget_show(internal_vbox2);
-	gtk_widget_show(etcf->combo);
-	gtk_widget_show(internal_vbox1);
-	gtk_widget_show(internal_hbox);
-	gtk_widget_show(frame);
-	return etcf;
-}
-
-ETableConfigField *
-e_table_config_field_construct (ETableConfigField   *etcf,
-				ETableSpecification *spec,
-				ETableSortInfo      *sort_info,
-				gboolean             grouping)
-{
-	return e_table_config_field_construct_nth(etcf, spec, sort_info, grouping, 0);
-}
diff --git a/widgets/table/e-table-config-field.h b/widgets/table/e-table-config-field.h
deleted file mode 100644
index bb8f540c4a..0000000000
--- a/widgets/table/e-table-config-field.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-config-field.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_CONFIG_FIELD_H_
-#define _E_TABLE_CONFIG_FIELD_H_
-
-#include <gtk/gtkvbox.h>
-#include <gal/e-table/e-table-sort-info.h>
-#include <gal/e-table/e-table-specification.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_CONFIG_FIELD_TYPE        (e_table_config_field_get_type ())
-#define E_TABLE_CONFIG_FIELD(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_CONFIG_FIELD_TYPE, ETableConfigField))
-#define E_TABLE_CONFIG_FIELD_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_CONFIG_FIELD_TYPE, ETableConfigFieldClass))
-#define E_IS_TABLE_CONFIG_FIELD(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_CONFIG_FIELD_TYPE))
-#define E_IS_TABLE_CONFIG_FIELD_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_CONFIG_FIELD_TYPE))
-
-typedef struct {
-	GtkVBox base;
-
-	ETableSpecification *spec;
-	ETableSortInfo *sort_info;
-	guint grouping : 1;
-	int n;
-
-	GtkWidget *combo;
-	GtkWidget *radio_ascending;
-	GtkWidget *radio_descending;
-
-	GtkWidget *child_fields;
-} ETableConfigField;
-
-typedef struct {
-	GtkVBoxClass parent_class;
-} ETableConfigFieldClass;
-
-GType              e_table_config_field_get_type  (void);
-ETableConfigField *e_table_config_field_new       (ETableSpecification *spec,
-						   ETableSortInfo      *sort_info,
-						   gboolean             grouping);
-ETableConfigField *e_table_config_field_construct (ETableConfigField   *field,
-						   ETableSpecification *spec,
-						   ETableSortInfo      *sort_info,
-						   gboolean             grouping);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_CONFIG_FIELD_H_ */
diff --git a/widgets/table/e-table-config-no-group.glade b/widgets/table/e-table-config-no-group.glade
deleted file mode 100644
index 75473b67f2..0000000000
--- a/widgets/table/e-table-config-no-group.glade
+++ /dev/null
@@ -1,2112 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-<requires lib="gnome"/>
-
-<widget class="GtkDialog" id="dialog-show-fields">
-  <property name="title" translatable="yes">Show Fields</property>
-  <property name="type">GTK_WINDOW_TOPLEVEL</property>
-  <property name="window_position">GTK_WIN_POS_NONE</property>
-  <property name="modal">False</property>
-  <property name="resizable">True</property>
-  <property name="destroy_with_parent">False</property>
-  <property name="decorated">True</property>
-  <property name="skip_taskbar_hint">False</property>
-  <property name="skip_pager_hint">False</property>
-  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
-  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-  <property name="has_separator">True</property>
-
-  <child internal-child="vbox">
-    <widget class="GtkVBox" id="dialog-vbox3">
-      <property name="visible">True</property>
-      <property name="homogeneous">False</property>
-      <property name="spacing">8</property>
-
-      <child internal-child="action_area">
-	<widget class="GtkHButtonBox" id="dialog-action_area3">
-	  <property name="visible">True</property>
-	  <property name="layout_style">GTK_BUTTONBOX_END</property>
-
-	  <child>
-	    <widget class="GtkButton" id="button22">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-cancel</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-6</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="button20">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-ok</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-5</property>
-	    </widget>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">True</property>
-	  <property name="pack_type">GTK_PACK_END</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkVBox" id="vbox2">
-	  <property name="visible">True</property>
-	  <property name="homogeneous">False</property>
-	  <property name="spacing">6</property>
-
-	  <child>
-	    <widget class="GtkTable" id="table2">
-	      <property name="visible">True</property>
-	      <property name="n_rows">1</property>
-	      <property name="n_columns">5</property>
-	      <property name="homogeneous">True</property>
-	      <property name="row_spacing">6</property>
-	      <property name="column_spacing">6</property>
-
-	      <child>
-		<widget class="GtkLabel" id="label-available">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">A_vailable Fields:</property>
-		  <property name="use_underline">True</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">2</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		  <property name="y_options">fill</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label-displayed">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">Sh_ow these fields in order:</property>
-		  <property name="use_underline">True</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">3</property>
-		  <property name="right_attach">5</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		  <property name="y_options">fill</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">False</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkTable" id="table3">
-	      <property name="visible">True</property>
-	      <property name="n_rows">1</property>
-	      <property name="n_columns">5</property>
-	      <property name="homogeneous">True</property>
-	      <property name="row_spacing">6</property>
-	      <property name="column_spacing">6</property>
-
-	      <child>
-		<widget class="GtkVBox" id="vbox4">
-		  <property name="visible">True</property>
-		  <property name="homogeneous">False</property>
-		  <property name="spacing">6</property>
-
-		  <child>
-		    <widget class="Custom" id="custom-available">
-		      <property name="visible">True</property>
-		      <property name="creation_function">e_table_proxy_etable_available_new</property>
-		      <property name="int1">0</property>
-		      <property name="int2">0</property>
-		      <property name="last_modification_time">Thu, 21 Feb 2002 05:42:43 GMT</property>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">True</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">2</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkVBox" id="vbox5">
-		  <property name="visible">True</property>
-		  <property name="homogeneous">False</property>
-		  <property name="spacing">6</property>
-
-		  <child>
-		    <widget class="Custom" id="custom-shown">
-		      <property name="visible">True</property>
-		      <property name="creation_function">e_table_proxy_etable_shown_new</property>
-		      <property name="int1">0</property>
-		      <property name="int2">0</property>
-		      <property name="last_modification_time">Thu, 21 Feb 2002 15:52:40 GMT</property>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">True</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-
-		  <child>
-		    <widget class="GtkHBox" id="hbox4">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">True</property>
-		      <property name="spacing">6</property>
-
-		      <child>
-			<widget class="GtkButton" id="button-up">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Move _Up</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkButton" id="button-down">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Move _Down</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">False</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="left_attach">3</property>
-		  <property name="right_attach">5</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkVBox" id="vbox6">
-		  <property name="visible">True</property>
-		  <property name="homogeneous">False</property>
-		  <property name="spacing">6</property>
-
-		  <child>
-		    <widget class="GtkButton" id="button-add">
-		      <property name="visible">True</property>
-		      <property name="can_focus">True</property>
-		      <property name="label" translatable="yes">_Add -&gt;</property>
-		      <property name="use_underline">True</property>
-		      <property name="relief">GTK_RELIEF_NORMAL</property>
-		      <property name="focus_on_click">True</property>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">False</property>
-		      <property name="fill">False</property>
-		    </packing>
-		  </child>
-
-		  <child>
-		    <widget class="GtkButton" id="button-remove">
-		      <property name="visible">True</property>
-		      <property name="can_focus">True</property>
-		      <property name="label" translatable="yes">&lt;- _Remove</property>
-		      <property name="use_underline">True</property>
-		      <property name="relief">GTK_RELIEF_NORMAL</property>
-		      <property name="focus_on_click">True</property>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">False</property>
-		      <property name="fill">False</property>
-		    </packing>
-		  </child>
-
-		  <child>
-		    <placeholder/>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="left_attach">2</property>
-		  <property name="right_attach">3</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">True</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">True</property>
-	  <property name="fill">True</property>
-	</packing>
-      </child>
-    </widget>
-  </child>
-</widget>
-
-<widget class="GtkDialog" id="dialog-group-by">
-  <property name="title" translatable="yes">Group</property>
-  <property name="type">GTK_WINDOW_TOPLEVEL</property>
-  <property name="window_position">GTK_WIN_POS_NONE</property>
-  <property name="modal">False</property>
-  <property name="resizable">True</property>
-  <property name="destroy_with_parent">False</property>
-  <property name="decorated">True</property>
-  <property name="skip_taskbar_hint">False</property>
-  <property name="skip_pager_hint">False</property>
-  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
-  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-  <property name="has_separator">True</property>
-
-  <child internal-child="vbox">
-    <widget class="GtkVBox" id="dialog-vbox4">
-      <property name="visible">True</property>
-      <property name="homogeneous">False</property>
-      <property name="spacing">8</property>
-
-      <child internal-child="action_area">
-	<widget class="GtkHButtonBox" id="dialog-action_area4">
-	  <property name="visible">True</property>
-	  <property name="layout_style">GTK_BUTTONBOX_END</property>
-
-	  <child>
-	    <widget class="GtkButton" id="button39">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label" translatable="yes">Clear All</property>
-	      <property name="use_underline">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">0</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="button42">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-cancel</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-6</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="button41">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-ok</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-5</property>
-	    </widget>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">True</property>
-	  <property name="pack_type">GTK_PACK_END</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkVBox" id="vbox24">
-	  <property name="visible">True</property>
-	  <property name="homogeneous">False</property>
-	  <property name="spacing">0</property>
-
-	  <child>
-	    <widget class="GtkHBox" id="hbox13">
-	      <property name="visible">True</property>
-	      <property name="homogeneous">False</property>
-	      <property name="spacing">6</property>
-
-	      <child>
-		<widget class="GtkFrame" id="frame-group-1">
-		  <property name="visible">True</property>
-		  <property name="label_xalign">0</property>
-		  <property name="label_yalign">0.5</property>
-		  <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-		  <child>
-		    <widget class="GtkHBox" id="hbox5">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">6</property>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox7">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="Custom" id="group-combo-1">
-			      <property name="visible">True</property>
-			      <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			      <property name="int1">0</property>
-			      <property name="int2">0</property>
-			      <property name="last_modification_time">Fri, 19 Jan 2001 04:52:09 GMT</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkCheckButton" id="checkbutton-group-1">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Show field in View</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">True</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox8">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-ascending-group-1">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Ascending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-descending-group-1">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Descending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			      <property name="group">radiobutton-ascending-group-1</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-		    </widget>
-		  </child>
-
-		  <child>
-		    <widget class="GtkLabel" id="label1">
-		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">Group Items By</property>
-		      <property name="use_underline">False</property>
-		      <property name="use_markup">False</property>
-		      <property name="justify">GTK_JUSTIFY_LEFT</property>
-		      <property name="wrap">False</property>
-		      <property name="selectable">False</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xpad">0</property>
-		      <property name="ypad">0</property>
-		    </widget>
-		    <packing>
-		      <property name="type">label_item</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">True</property>
-		  <property name="fill">True</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label8">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label9">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label10">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">True</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkHBox" id="hbox14">
-	      <property name="visible">True</property>
-	      <property name="homogeneous">False</property>
-	      <property name="spacing">6</property>
-
-	      <child>
-		<widget class="GtkLabel" id="label11">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkFrame" id="frame-group-2">
-		  <property name="visible">True</property>
-		  <property name="label_xalign">0</property>
-		  <property name="label_yalign">0.5</property>
-		  <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-		  <child>
-		    <widget class="GtkHBox" id="hbox6">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">6</property>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox9">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="Custom" id="group-combo-2">
-			      <property name="visible">True</property>
-			      <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			      <property name="int1">0</property>
-			      <property name="int2">0</property>
-			      <property name="last_modification_time">Fri, 19 Jan 2001 04:52:14 GMT</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkCheckButton" id="checkbutton-group-2">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Show field in View</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">True</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox10">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-ascending-group-2">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Ascending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-descending-group-2">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Descending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			      <property name="group">radiobutton-ascending-group-2</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-		    </widget>
-		  </child>
-
-		  <child>
-		    <widget class="GtkLabel" id="label12">
-		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">Then By</property>
-		      <property name="use_underline">False</property>
-		      <property name="use_markup">False</property>
-		      <property name="justify">GTK_JUSTIFY_LEFT</property>
-		      <property name="wrap">False</property>
-		      <property name="selectable">False</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xpad">0</property>
-		      <property name="ypad">0</property>
-		    </widget>
-		    <packing>
-		      <property name="type">label_item</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">True</property>
-		  <property name="fill">True</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label19">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label18">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">True</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkHBox" id="hbox15">
-	      <property name="visible">True</property>
-	      <property name="homogeneous">False</property>
-	      <property name="spacing">6</property>
-
-	      <child>
-		<widget class="GtkLabel" id="label13">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label12">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkFrame" id="frame-group-3">
-		  <property name="visible">True</property>
-		  <property name="label_xalign">0</property>
-		  <property name="label_yalign">0.5</property>
-		  <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-		  <child>
-		    <widget class="GtkHBox" id="hbox7">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">6</property>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox11">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="Custom" id="group-combo-3">
-			      <property name="visible">True</property>
-			      <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			      <property name="int1">0</property>
-			      <property name="int2">0</property>
-			      <property name="last_modification_time">Fri, 19 Jan 2001 04:52:18 GMT</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkCheckButton" id="checkbutton-group-3">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Show field in View</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">True</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox12">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-ascending-group-3">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Ascending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-descending-group-3">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Descending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			      <property name="group">radiobutton-ascending-group-3</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-		    </widget>
-		  </child>
-
-		  <child>
-		    <widget class="GtkLabel" id="label20">
-		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">Then By</property>
-		      <property name="use_underline">False</property>
-		      <property name="use_markup">False</property>
-		      <property name="justify">GTK_JUSTIFY_LEFT</property>
-		      <property name="wrap">False</property>
-		      <property name="selectable">False</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xpad">0</property>
-		      <property name="ypad">0</property>
-		    </widget>
-		    <packing>
-		      <property name="type">label_item</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">True</property>
-		  <property name="fill">True</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label17">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">True</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkHBox" id="hbox16">
-	      <property name="visible">True</property>
-	      <property name="homogeneous">False</property>
-	      <property name="spacing">6</property>
-
-	      <child>
-		<widget class="GtkLabel" id="label14">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label16">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label15">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkFrame" id="frame-group-4">
-		  <property name="visible">True</property>
-		  <property name="label_xalign">0</property>
-		  <property name="label_yalign">0.5</property>
-		  <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-		  <child>
-		    <widget class="GtkHBox" id="hbox8">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">6</property>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox13">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="Custom" id="group-combo-4">
-			      <property name="visible">True</property>
-			      <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			      <property name="int1">0</property>
-			      <property name="int2">0</property>
-			      <property name="last_modification_time">Fri, 19 Jan 2001 04:52:21 GMT</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkCheckButton" id="checkbutton-group-4">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Show field in View</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">True</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox14">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-ascending-group-4">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Ascending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-descending-group-4">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Descending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			      <property name="group">radiobutton-ascending-group-4</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-		    </widget>
-		  </child>
-
-		  <child>
-		    <widget class="GtkLabel" id="label21">
-		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">Then By</property>
-		      <property name="use_underline">False</property>
-		      <property name="use_markup">False</property>
-		      <property name="justify">GTK_JUSTIFY_LEFT</property>
-		      <property name="wrap">False</property>
-		      <property name="selectable">False</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xpad">0</property>
-		      <property name="ypad">0</property>
-		    </widget>
-		    <packing>
-		      <property name="type">label_item</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">True</property>
-		  <property name="fill">True</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">True</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">True</property>
-	  <property name="fill">True</property>
-	</packing>
-      </child>
-    </widget>
-  </child>
-</widget>
-
-<widget class="GtkDialog" id="dialog-sort">
-  <property name="title" translatable="yes">Sort</property>
-  <property name="type">GTK_WINDOW_TOPLEVEL</property>
-  <property name="window_position">GTK_WIN_POS_NONE</property>
-  <property name="modal">False</property>
-  <property name="resizable">True</property>
-  <property name="destroy_with_parent">False</property>
-  <property name="decorated">True</property>
-  <property name="skip_taskbar_hint">False</property>
-  <property name="skip_pager_hint">False</property>
-  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
-  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-  <property name="has_separator">True</property>
-
-  <child internal-child="vbox">
-    <widget class="GtkVBox" id="vbox15">
-      <property name="visible">True</property>
-      <property name="homogeneous">False</property>
-      <property name="spacing">8</property>
-
-      <child internal-child="action_area">
-	<widget class="GtkHButtonBox" id="hbuttonbox1">
-	  <property name="visible">True</property>
-	  <property name="layout_style">GTK_BUTTONBOX_END</property>
-
-	  <child>
-	    <widget class="GtkButton" id="button43">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label" translatable="yes">Clear All</property>
-	      <property name="use_underline">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">0</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="button45">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-cancel</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-6</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="button44">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="has_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-ok</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-5</property>
-	    </widget>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">True</property>
-	  <property name="pack_type">GTK_PACK_END</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkTable" id="table5">
-	  <property name="visible">True</property>
-	  <property name="n_rows">4</property>
-	  <property name="n_columns">1</property>
-	  <property name="homogeneous">False</property>
-	  <property name="row_spacing">6</property>
-	  <property name="column_spacing">6</property>
-
-	  <child>
-	    <widget class="GtkFrame" id="frame-sort-4">
-	      <property name="visible">True</property>
-	      <property name="label_xalign">0</property>
-	      <property name="label_yalign">0.5</property>
-	      <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-	      <child>
-		<widget class="GtkHBox" id="hbox9">
-		  <property name="visible">True</property>
-		  <property name="homogeneous">False</property>
-		  <property name="spacing">6</property>
-
-		  <child>
-		    <widget class="GtkAlignment" id="alignment1">
-		      <property name="visible">True</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xscale">1</property>
-		      <property name="yscale">0</property>
-		      <property name="top_padding">0</property>
-		      <property name="bottom_padding">0</property>
-		      <property name="left_padding">0</property>
-		      <property name="right_padding">0</property>
-
-		      <child>
-			<widget class="Custom" id="sort-combo-4">
-			  <property name="visible">True</property>
-			  <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			  <property name="int1">0</property>
-			  <property name="int2">0</property>
-			  <property name="last_modification_time">Tue, 16 Jan 2001 08:33:52 GMT</property>
-			</widget>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">True</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-
-		  <child>
-		    <widget class="GtkVBox" id="vbox17">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">0</property>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-ascending-sort-4">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Ascending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-descending-sort-4">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Descending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			  <property name="group">radiobutton-ascending-sort-4</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">False</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-		</widget>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label22">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">Then By</property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="type">label_item</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="left_attach">0</property>
-	      <property name="right_attach">1</property>
-	      <property name="top_attach">3</property>
-	      <property name="bottom_attach">4</property>
-	      <property name="y_options">fill</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkFrame" id="frame-sort-3">
-	      <property name="visible">True</property>
-	      <property name="label_xalign">0</property>
-	      <property name="label_yalign">0.5</property>
-	      <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-	      <child>
-		<widget class="GtkHBox" id="hbox10">
-		  <property name="visible">True</property>
-		  <property name="homogeneous">False</property>
-		  <property name="spacing">6</property>
-
-		  <child>
-		    <widget class="GtkAlignment" id="alignment2">
-		      <property name="visible">True</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xscale">1</property>
-		      <property name="yscale">0</property>
-		      <property name="top_padding">0</property>
-		      <property name="bottom_padding">0</property>
-		      <property name="left_padding">0</property>
-		      <property name="right_padding">0</property>
-
-		      <child>
-			<widget class="Custom" id="sort-combo-3">
-			  <property name="visible">True</property>
-			  <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			  <property name="int1">0</property>
-			  <property name="int2">0</property>
-			  <property name="last_modification_time">Tue, 16 Jan 2001 05:22:22 GMT</property>
-			</widget>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">True</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-
-		  <child>
-		    <widget class="GtkVBox" id="vbox19">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">0</property>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-ascending-sort-3">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Ascending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-descending-sort-3">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Descending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			  <property name="group">radiobutton-ascending-sort-3</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">False</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-		</widget>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label23">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">Then By</property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="type">label_item</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="left_attach">0</property>
-	      <property name="right_attach">1</property>
-	      <property name="top_attach">2</property>
-	      <property name="bottom_attach">3</property>
-	      <property name="y_options">fill</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkFrame" id="frame-sort-2">
-	      <property name="visible">True</property>
-	      <property name="label_xalign">0</property>
-	      <property name="label_yalign">0.5</property>
-	      <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-	      <child>
-		<widget class="GtkHBox" id="hbox11">
-		  <property name="visible">True</property>
-		  <property name="homogeneous">False</property>
-		  <property name="spacing">6</property>
-
-		  <child>
-		    <widget class="GtkAlignment" id="alignment3">
-		      <property name="visible">True</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xscale">1</property>
-		      <property name="yscale">0</property>
-		      <property name="top_padding">0</property>
-		      <property name="bottom_padding">0</property>
-		      <property name="left_padding">0</property>
-		      <property name="right_padding">0</property>
-
-		      <child>
-			<widget class="Custom" id="sort-combo-2">
-			  <property name="visible">True</property>
-			  <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			  <property name="int1">0</property>
-			  <property name="int2">0</property>
-			  <property name="last_modification_time">Tue, 16 Jan 2001 05:22:15 GMT</property>
-			</widget>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">True</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-
-		  <child>
-		    <widget class="GtkVBox" id="vbox21">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">0</property>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-ascending-sort-2">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Ascending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-descending-sort-2">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Descending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			  <property name="group">radiobutton-ascending-sort-2</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">False</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-		</widget>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label24">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">Then By</property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="type">label_item</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="left_attach">0</property>
-	      <property name="right_attach">1</property>
-	      <property name="top_attach">1</property>
-	      <property name="bottom_attach">2</property>
-	      <property name="y_options">fill</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkFrame" id="frame-sort-1">
-	      <property name="visible">True</property>
-	      <property name="label_xalign">0</property>
-	      <property name="label_yalign">0.5</property>
-	      <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-	      <child>
-		<widget class="GtkHBox" id="hbox12">
-		  <property name="visible">True</property>
-		  <property name="homogeneous">False</property>
-		  <property name="spacing">6</property>
-
-		  <child>
-		    <widget class="GtkAlignment" id="alignment4">
-		      <property name="visible">True</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xscale">1</property>
-		      <property name="yscale">0</property>
-		      <property name="top_padding">0</property>
-		      <property name="bottom_padding">0</property>
-		      <property name="left_padding">0</property>
-		      <property name="right_padding">0</property>
-
-		      <child>
-			<widget class="Custom" id="sort-combo-1">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="has_focus">True</property>
-			  <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			  <property name="int1">0</property>
-			  <property name="int2">0</property>
-			  <property name="last_modification_time">Tue, 16 Jan 2001 05:22:00 GMT</property>
-			</widget>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">True</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-
-		  <child>
-		    <widget class="GtkVBox" id="vbox23">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">0</property>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-ascending-sort-1">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Ascending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-descending-sort-1">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Descending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			  <property name="group">radiobutton-ascending-sort-1</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">False</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-		</widget>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label25">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">Sort Items By</property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="type">label_item</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="left_attach">0</property>
-	      <property name="right_attach">1</property>
-	      <property name="top_attach">0</property>
-	      <property name="bottom_attach">1</property>
-	      <property name="y_options">fill</property>
-	    </packing>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">True</property>
-	  <property name="fill">True</property>
-	</packing>
-      </child>
-    </widget>
-  </child>
-</widget>
-
-<widget class="GtkDialog" id="e-table-config">
-  <property name="title" translatable="yes">dialog1</property>
-  <property name="type">GTK_WINDOW_TOPLEVEL</property>
-  <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
-  <property name="modal">True</property>
-  <property name="resizable">False</property>
-  <property name="destroy_with_parent">False</property>
-  <property name="decorated">True</property>
-  <property name="skip_taskbar_hint">False</property>
-  <property name="skip_pager_hint">False</property>
-  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-  <property name="has_separator">True</property>
-
-  <child internal-child="vbox">
-    <widget class="GtkVBox" id="dialog-vbox5">
-      <property name="visible">True</property>
-      <property name="homogeneous">False</property>
-      <property name="spacing">0</property>
-
-      <child internal-child="action_area">
-	<widget class="GtkHButtonBox" id="dialog-action_area5">
-	  <property name="visible">True</property>
-	  <property name="layout_style">GTK_BUTTONBOX_END</property>
-
-	  <child>
-	    <widget class="GtkButton" id="cancelbutton1">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-cancel</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-6</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="applybutton1">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-apply</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-10</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="okbutton1">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-ok</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-5</property>
-	    </widget>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">True</property>
-	  <property name="pack_type">GTK_PACK_END</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkFrame" id="top-frame">
-	  <property name="border_width">2</property>
-	  <property name="visible">True</property>
-	  <property name="label_xalign">0</property>
-	  <property name="label_yalign">0.5</property>
-	  <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-	  <child>
-	    <widget class="GtkTable" id="table1">
-	      <property name="border_width">2</property>
-	      <property name="visible">True</property>
-	      <property name="n_rows">2</property>
-	      <property name="n_columns">3</property>
-	      <property name="homogeneous">False</property>
-	      <property name="row_spacing">2</property>
-	      <property name="column_spacing">4</property>
-
-	      <child>
-		<widget class="GtkButton" id="button-sort">
-		  <property name="visible">True</property>
-		  <property name="can_default">True</property>
-		  <property name="can_focus">True</property>
-		  <property name="label" translatable="yes">_Sort...</property>
-		  <property name="use_underline">True</property>
-		  <property name="relief">GTK_RELIEF_NORMAL</property>
-		  <property name="focus_on_click">True</property>
-		  <signal name="clicked" handler="on_sort_clicked"/>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">1</property>
-		  <property name="top_attach">1</property>
-		  <property name="bottom_attach">2</property>
-		  <property name="x_options">fill</property>
-		  <property name="y_options"></property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label-sort">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">True</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">1</property>
-		  <property name="right_attach">2</property>
-		  <property name="top_attach">1</property>
-		  <property name="bottom_attach">2</property>
-		  <property name="y_options">fill</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label4">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">2</property>
-		  <property name="right_attach">3</property>
-		  <property name="top_attach">1</property>
-		  <property name="bottom_attach">2</property>
-		  <property name="x_options">fill</property>
-		  <property name="y_options">fill</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label21">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">2</property>
-		  <property name="right_attach">3</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		  <property name="x_options">fill</property>
-		  <property name="y_options">fill</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label-fields">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">True</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">1</property>
-		  <property name="right_attach">2</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		  <property name="y_options">fill</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkButton" id="button-fields">
-		  <property name="visible">True</property>
-		  <property name="can_default">True</property>
-		  <property name="can_focus">True</property>
-		  <property name="label" translatable="yes">_Fields Shown...</property>
-		  <property name="use_underline">True</property>
-		  <property name="relief">GTK_RELIEF_NORMAL</property>
-		  <property name="focus_on_click">True</property>
-		  <signal name="clicked" handler="on_sort_clicked"/>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">1</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		  <property name="x_options">fill</property>
-		  <property name="y_options"></property>
-		</packing>
-	      </child>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkLabel" id="label26">
-	      <property name="visible">True</property>
-	      <property name="label" translatable="yes">Description</property>
-	      <property name="use_underline">False</property>
-	      <property name="use_markup">False</property>
-	      <property name="justify">GTK_JUSTIFY_LEFT</property>
-	      <property name="wrap">False</property>
-	      <property name="selectable">False</property>
-	      <property name="xalign">0.5</property>
-	      <property name="yalign">0.5</property>
-	      <property name="xpad">0</property>
-	      <property name="ypad">0</property>
-	    </widget>
-	    <packing>
-	      <property name="type">label_item</property>
-	    </packing>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">True</property>
-	  <property name="fill">True</property>
-	</packing>
-      </child>
-    </widget>
-  </child>
-</widget>
-
-</glade-interface>
diff --git a/widgets/table/e-table-config.c b/widgets/table/e-table-config.c
deleted file mode 100644
index 4e40c150fd..0000000000
--- a/widgets/table/e-table-config.c
+++ /dev/null
@@ -1,1225 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-config.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Miguel de Icaza <miguel@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-/*
- * FIXME:
- *    Sort Dialog: when text is selected, the toggle button switches state.
- *    Make Clear all work.
- */
-
-#include <config.h>
-
-#include "e-table-config.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtktogglebutton.h>
-#include <libgnomeui/gnome-propertybox.h>
-#include <glade/glade.h>
-#include "gal/util/e-util.h"
-#include "gal/util/e-i18n.h"
-#include "gal/widgets/e-unicode.h"
-
-#include <e-table-scrolled.h>
-#include <e-table-without.h>
-#include <e-table-memory-store.h>
-
-
-static GObjectClass *config_parent_class;
-
-enum {
-	CHANGED,
-	LAST_SIGNAL
-};
-
-enum {
-	PROP_0,
-	PROP_STATE,
-};
-
-static guint e_table_config_signals [LAST_SIGNAL] = { 0, };
-
-static void
-config_finalize (GObject *object)
-{
-	ETableConfig *config = E_TABLE_CONFIG (object);
-
-	if (config->state)
-		g_object_unref (config->state);
-	config->state = NULL;
-
-	if (config->source_state)
-		g_object_unref (config->source_state);
-	config->source_state = NULL;
-
-	if (config->source_spec)
-		g_object_unref (config->source_spec);
-	config->source_spec = NULL;
-
-	g_free (config->header);
-	config->header = NULL;
-
-	g_slist_free (config->column_names);
-	config->column_names = NULL;
-
-	g_free (config->domain);
-	config->domain = NULL;
-
-	config_parent_class->finalize (object);
-}
-
-static void
-e_table_config_changed (ETableConfig *config, ETableState *state)
-{
-	g_return_if_fail (E_IS_TABLE_CONFIG (config));
-
-	g_signal_emit(G_OBJECT(config), e_table_config_signals [CHANGED], 0, state);
-}
-
-static void
-config_dialog_changed (ETableConfig *config)
-{
-	/* enable the apply/ok buttons */
-	gtk_dialog_set_response_sensitive (GTK_DIALOG (config->dialog_toplevel),
-					   GTK_RESPONSE_APPLY, TRUE);
-	gtk_dialog_set_response_sensitive (GTK_DIALOG (config->dialog_toplevel),
-					   GTK_RESPONSE_OK, TRUE);
-}
-
-static void
-config_get_property (GObject *object,
-		     guint prop_id,
-		     GValue *value,
-		     GParamSpec *pspec)
-{
-	ETableConfig *config = E_TABLE_CONFIG (object);
-
-	switch (prop_id) {
-	case PROP_STATE:
-		g_value_set_object (value, config->state);
-		break;
-	default:
-		break;
-	}
-}
-
-static void
-config_class_init (GObjectClass *object_class)
-{
-	ETableConfigClass *klass = E_TABLE_CONFIG_CLASS(object_class);
-
-	config_parent_class   = g_type_class_peek_parent (klass);
-	
-	klass->changed        = NULL;
-
-	object_class->finalize = config_finalize;
-	object_class->get_property = config_get_property;
-
-	e_table_config_signals [CHANGED] =
-		g_signal_new ("changed",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableConfigClass, changed),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
-
-	g_object_class_install_property (object_class, PROP_STATE,
-					 g_param_spec_object ("state",
-							      _("State"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_STATE_TYPE,
-							      G_PARAM_READABLE));
-
-	glade_init ();
-}
-
-static ETableColumnSpecification *
-find_column_in_spec (ETableSpecification *spec, int model_col)
-{
-	ETableColumnSpecification **column;
-
-	for (column = spec->columns; *column; column++){
-		if ((*column)->disabled)
-			continue;
-		if ((*column)->model_col != model_col)
-			continue;
-
-		return *column;
-	}
-
-	return NULL;
-}
-
-static int
-find_model_column_by_name (ETableSpecification *spec, const char *s)
-{
-	ETableColumnSpecification **column;
-
-	for (column = spec->columns; *column; column++){
-
-		if ((*column)->disabled)
-			continue;
-		if (g_strcasecmp ((*column)->title, s) == 0)
-			return (*column)->model_col;
-	}
-	return -1;
-}
-
-static void
-update_sort_and_group_config_dialog (ETableConfig *config, gboolean is_sort)
-{
-	ETableConfigSortWidgets *widgets;
-	int count, i;
-
-	if (is_sort){
-		count = e_table_sort_info_sorting_get_count (
-			config->temp_state->sort_info);
-		widgets = &config->sort [0];
-	} else {
-		count = e_table_sort_info_grouping_get_count (
-			config->temp_state->sort_info);
-		widgets = &config->group [0];
-	}
-	
-	for (i = 0; i < 4; i++){
-		gboolean sensitive = (i <= count);
-		char *text = "";
-		
-		gtk_widget_set_sensitive (widgets [i].frames, sensitive);
-
-		/*
-		 * Sorting is set, auto select the text
-		 */
-		g_signal_handler_block (
-			widgets [i].radio_ascending,
-			widgets [i].toggled_id);
-		g_signal_handler_block (
-			widgets [i].combo->entry,
-			widgets [i].changed_id);
-		
-		if (i < count){
-			GtkToggleButton *a, *d;
-			ETableSortColumn col =
-				is_sort
-				? e_table_sort_info_sorting_get_nth (
-					config->temp_state->sort_info,
-					i)
-				:  e_table_sort_info_grouping_get_nth (
-					config->temp_state->sort_info,
-					i);
-			
-			ETableColumnSpecification *column =
-				find_column_in_spec (config->source_spec, col.column);
-
-			if (!column){
-				/*
-				 * This is a bug in the programmer
-				 * stuff, but by the time we arrive
-				 * here, the user has been given a
-				 * warning
-				 */
-				continue;
-			}
-
-			text = dgettext (config->domain, column->title);
-
-			/*
-			 * Update radio buttons
-			 */
-			a = GTK_TOGGLE_BUTTON (
-				widgets [i].radio_ascending);
-			d = GTK_TOGGLE_BUTTON (
-				widgets [i].radio_descending);
-			
-			gtk_toggle_button_set_active (col.ascending ? a:d, 1);
-		} else {
-			GtkToggleButton *t;
-			
-			t = GTK_TOGGLE_BUTTON (
-				widgets [i].radio_ascending);
-
-			if (is_sort)
-				g_assert (widgets [i].radio_ascending != config->group [i].radio_ascending);
-			else
-				g_assert (widgets [i].radio_ascending != config->sort [i].radio_ascending);
-			gtk_toggle_button_set_active (t, 1);
-		}
-
-		/* Set the text */
-		gal_combo_text_set_text (widgets [i].combo, text);
-
-		g_signal_handler_unblock (
-			widgets [i].radio_ascending,
-			widgets [i].toggled_id);
-		g_signal_handler_unblock (
-			widgets [i].combo->entry,
-			widgets [i].changed_id);
-	}
-}
-
-static void
-config_sort_info_update (ETableConfig *config)
-{
-	ETableSortInfo *info = config->state->sort_info;
-	GString *res;
-	int count, i;
-
-	count = e_table_sort_info_sorting_get_count (info);
-	res = g_string_new ("");
-
-	for (i = 0; i < count; i++) {
-		ETableSortColumn col = e_table_sort_info_sorting_get_nth (info, i);
-		ETableColumnSpecification *column;
-		
-		column = find_column_in_spec (config->source_spec, col.column);
-		if (!column){
-			g_warning ("Could not find column model in specification");
-			continue;
-		}
-		
-		g_string_append (res, dgettext (config->domain, (column)->title));
-		g_string_append_c (res, ' ');
-		g_string_append (
-			res,
-			col.ascending ?
-			_("(Ascending)") : _("(Descending)"));
-
-		if ((i + 1) != count)
-			g_string_append (res, ", ");
-	}
-	
-	if (res->str [0] == 0)
-		g_string_append (res, _("Not sorted"));
-	
-	gtk_label_set_text (GTK_LABEL(config->sort_label), res->str);
-
-	g_string_free (res, TRUE);
-}
-
-static void
-config_group_info_update (ETableConfig *config)
-{
-	ETableSortInfo *info = config->state->sort_info;
-	GString *res;
-	int count, i;
-
-	if (!e_table_sort_info_get_can_group (info))
-		return;
-
-	count = e_table_sort_info_grouping_get_count (info);
-	res = g_string_new ("");
-
-	for (i = 0; i < count; i++) {
-		ETableSortColumn col = e_table_sort_info_grouping_get_nth (info, i);
-		ETableColumnSpecification *column;
-
-		column = find_column_in_spec (config->source_spec, col.column);
-		if (!column){
-			g_warning ("Could not find model column in specification");
-			continue;
-		}
-
-		g_string_append (res, dgettext (config->domain, (column)->title));
-		g_string_append_c (res, ' ');
-		g_string_append (
-			res,
-			col.ascending ?
-			_("(Ascending)") : _("(Descending)"));
-
-		if ((i+1) != count)
-			g_string_append (res, ", ");
-	}
-	if (res->str [0] == 0)
-		g_string_append (res, _("No grouping"));
-
-	gtk_label_set_text (GTK_LABEL (config->group_label), res->str);
-	g_string_free (res, TRUE);
-}
-
-static void
-setup_fields (ETableConfig *config)
-{
-	int i;
-
-	e_table_model_freeze (config->available_model);
-	e_table_model_freeze (config->shown_model);
-	e_table_without_show_all (config->available_model);
-	e_table_subset_variable_clear (config->shown_model);
-
-	if (config->temp_state) {
-		for (i = 0; i < config->temp_state->col_count; i++) {
-			gint j, idx;
-			for (j = 0, idx = 0; j < config->temp_state->columns[i]; j++)
-				if (!config->source_spec->columns[j]->disabled)
-					idx++;
-
-			e_table_subset_variable_add (config->shown_model, idx);
-			e_table_without_hide (config->available_model, GINT_TO_POINTER(idx));
-		}
-	}
-	e_table_model_thaw (config->available_model);
-	e_table_model_thaw (config->shown_model);
-}
-
-static void
-config_fields_info_update (ETableConfig *config)
-{
-	ETableColumnSpecification **column;
-	GString *res = g_string_new ("");
-	int i;
-
-	for (i = 0; i < config->state->col_count; i++){
-		for (column = config->source_spec->columns; *column; column++){
-
-			if ((*column)->disabled)
-				continue;
-
-			if (config->state->columns [i] != (*column)->model_col)
-				continue;
-
-			g_string_append (res, dgettext (config->domain, (*column)->title));
-			if (column [1])
-				g_string_append (res, ", ");
-		}
-	}
-	
-	gtk_label_set_text (GTK_LABEL (config->fields_label), res->str);
-	g_string_free (res, TRUE);
-}
-
-static void
-do_sort_and_group_config_dialog (ETableConfig *config, gboolean is_sort)
-{
-	GtkDialog *dialog;
-	int response, running = 1;
-
-	config->temp_state = e_table_state_duplicate (config->state);
-
-	update_sort_and_group_config_dialog (config, is_sort);
-
-	gtk_widget_grab_focus (GTK_WIDGET (
-		is_sort
-		? config->sort [0].combo
-		: config->group [0].combo));
-		
-
-	if (is_sort)
-		dialog = GTK_DIALOG (config->dialog_sort);
-	else
-		dialog = GTK_DIALOG (config->dialog_group_by);
-	
-	gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (config->dialog_toplevel));
-
-	do {
-		response = gtk_dialog_run (dialog);
-		switch (response){
-		case 0: /* clear fields */
-			if (is_sort){
-				e_table_sort_info_sorting_truncate (
-					config->temp_state->sort_info, 0);
-			} else {
-				e_table_sort_info_grouping_truncate (
-					config->temp_state->sort_info, 0);
-			}
-			update_sort_and_group_config_dialog (config, is_sort);
-			break;
-
-		case GTK_RESPONSE_OK:
-			g_object_unref (config->state);
-			config->state = config->temp_state;
-			config->temp_state = 0;
-			running = 0;
-			config_dialog_changed (config);
-			break;
-
-		case GTK_RESPONSE_DELETE_EVENT:
-		case GTK_RESPONSE_CANCEL:
-			g_object_unref (config->temp_state);
-			config->temp_state = 0;
-			running = 0;
-			break;
-		}
-		
-	} while (running);
-	gtk_widget_hide (GTK_WIDGET (dialog));
-	
-	if (is_sort)
-		config_sort_info_update (config);
-	else
-		config_group_info_update (config);
-}
-
-static void
-do_fields_config_dialog (ETableConfig *config)
-{
-	int response, running = 1;
-
-	gtk_widget_ensure_style (config->dialog_show_fields);
-	gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (config->dialog_show_fields)->vbox), 0);
-	gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (config->dialog_show_fields)->action_area), 12);
-
-	config->temp_state = e_table_state_duplicate (config->state);
-
-	setup_fields (config);
-
-	gtk_window_set_transient_for (GTK_WINDOW (config->dialog_show_fields),
-				      GTK_WINDOW (config->dialog_toplevel));
-
-	do {
-		response = gtk_dialog_run (GTK_DIALOG(config->dialog_show_fields));
-		switch (response){
-		case GTK_RESPONSE_OK:
-			g_object_unref (config->state);
-			config->state = config->temp_state;
-			config->temp_state = 0;
-			running = 0;
-			config_dialog_changed (config);
-			break;
-
-		case GTK_RESPONSE_DELETE_EVENT:
-		case GTK_RESPONSE_CANCEL:
-			g_object_unref (config->temp_state);
-			config->temp_state = 0;
-			running = 0;
-			break;
-		}
-		
-	} while (running);
-	gtk_widget_hide (GTK_WIDGET (config->dialog_show_fields));
-
-	config_fields_info_update (config);
-}
-
-
-ETableMemoryStoreColumnInfo store_columns[] = {
-	E_TABLE_MEMORY_STORE_STRING,
-	E_TABLE_MEMORY_STORE_INTEGER,
-	E_TABLE_MEMORY_STORE_TERMINATOR
-};
-
-static ETableModel *global_store;  /* Glade better not be reentrant any time soon. */
-
-static void
-create_global_store (ETableConfig *config)
-{
-	int i;
-
-	global_store = e_table_memory_store_new (store_columns);
-	for (i = 0; config->source_spec->columns[i]; i++) {
-
-		char *text;
-
-		if (config->source_spec->columns[i]->disabled)
-			continue;
-
-		text = g_strdup (dgettext (config->domain, config->source_spec->columns[i]->title));
-		e_table_memory_store_insert_adopt (E_TABLE_MEMORY_STORE (global_store), -1, NULL, text, i);
-	}
-}
-
-char *spec = "<ETableSpecification gettext-domain=\"" E_I18N_DOMAIN "\" no-headers=\"true\" cursor-mode=\"line\" "
-    " draw-grid=\"false\" draw-focus=\"true\" selection-mode=\"browse\">"
-  "<ETableColumn model_col= \"0\" _title=\"Name\" minimum_width=\"30\" resizable=\"true\" cell=\"string\" compare=\"string\"/>"
-  "<ETableState> <column source=\"0\"/>"
-  "<grouping/>"
-  "</ETableState>"
-  "</ETableSpecification>";
-
-GtkWidget *e_table_proxy_etable_shown_new (void);
-
-GtkWidget *
-e_table_proxy_etable_shown_new (void)
-{
-	ETableModel *model = NULL;
-
-	model = e_table_subset_variable_new (global_store);
-
-	return e_table_scrolled_new (model, NULL, spec, NULL);
-}
-
-GtkWidget *e_table_proxy_etable_available_new (void);
-
-GtkWidget *
-e_table_proxy_etable_available_new (void)
-{
-	ETableModel *model;
-
-	model = e_table_without_new (global_store,
-				     NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-
-	e_table_without_show_all (E_TABLE_WITHOUT (model));
-
-	return e_table_scrolled_new (model, NULL, spec, NULL);
-}
-
-static void
-config_button_fields (GtkWidget *widget, ETableConfig *config)
-{
-	do_fields_config_dialog (config);
-}
-
-static void
-config_button_sort (GtkWidget *widget, ETableConfig *config)
-{
-	do_sort_and_group_config_dialog (config, TRUE);
-}
-
-static void
-config_button_group (GtkWidget *widget, ETableConfig *config)
-{
-	do_sort_and_group_config_dialog (config, FALSE);
-}
-
-static void
-dialog_destroyed (gpointer data, GObject *where_object_was)
-{
-	ETableConfig *config = data;
-	g_object_unref (config);
-}
-
-static void
-dialog_response (GtkWidget *dialog, int response_id, ETableConfig *config)
-{
-	if (response_id == GTK_RESPONSE_APPLY
-	    || response_id == GTK_RESPONSE_OK) {
-		e_table_config_changed (config, config->state);
-	}
-
-	if (response_id == GTK_RESPONSE_CANCEL
-	    || response_id == GTK_RESPONSE_OK) {
-		gtk_widget_destroy (dialog);
-	}
-}	
-
-/*
- * Invoked by the Glade auto-connect code
- */
-GtkWidget *e_table_proxy_gtk_combo_text_new (void);
-GtkWidget *
-e_table_proxy_gtk_combo_text_new (void)
-{
-	return gal_combo_text_new (TRUE);
-}
-
-#if 0
-static GtkWidget *
-configure_dialog (GladeXML *gui, const char *widget_name, ETableConfig *config)
-{
-	GtkWidget *w;
-	
-	w = glade_xml_get_widget (gui, widget_name);
-
-	return w;
-}
-#endif
-
-static void
-connect_button (ETableConfig *config, GladeXML *gui, const char *widget_name, GCallback cback)
-{
-	GtkWidget *button = glade_xml_get_widget (gui, widget_name);
-
-	if (button) {
-		g_signal_connect (G_OBJECT (button), "clicked",
-				  cback, config);
-	}
-}
-
-static gint
-get_source_model_col_index (ETableConfig *config, gint idx)
-{
-	gint visible_index;
-	ETableModel *src_model = E_TABLE_SUBSET (config->available_model)->source;
-
-        visible_index = e_table_subset_view_to_model_row (E_TABLE_SUBSET (config->available_model), idx);
-	
-	return GPOINTER_TO_INT (e_table_model_value_at (src_model, 1, visible_index));
-}
-
-static void
-sort_entry_changed (GtkEntry *entry, ETableConfigSortWidgets *sort)
-{
-	ETableConfig *config = sort->e_table_config;
-	ETableSortInfo *sort_info = config->temp_state->sort_info;
-	ETableConfigSortWidgets *base = &config->sort[0];
-	int idx = sort - base;
-	
-	const char *s = gtk_entry_get_text (entry);
-
-	if (s && s [0] && g_hash_table_lookup (sort->combo->elements, s)){
-		ETableSortColumn c;
-		int col;
-		
-		col = find_model_column_by_name (config->source_spec, s);
-		if (col == -1){
-			g_warning ("sort: This should not happen (%s)", s);
-			return;
-		}
-
-		c.ascending = GTK_TOGGLE_BUTTON (
-			config->sort [idx].radio_ascending)->active;
-		c.column = col;
-		e_table_sort_info_sorting_set_nth (sort_info, idx, c);
-		  
-		update_sort_and_group_config_dialog (config, TRUE);
-	}  else {
-		e_table_sort_info_sorting_truncate (sort_info, idx);
-		update_sort_and_group_config_dialog (config, TRUE);
-	}
-}
-
-static void
-sort_ascending_toggled (GtkToggleButton *t, ETableConfigSortWidgets *sort)
-{
-	ETableConfig *config = sort->e_table_config;
-	ETableSortInfo *si = config->temp_state->sort_info;
-	ETableConfigSortWidgets *base = &config->sort[0];
-	int idx = sort - base;
-	ETableSortColumn c;
-	
-	c = e_table_sort_info_sorting_get_nth (si, idx);
-	c.ascending = t->active;
-	e_table_sort_info_sorting_set_nth (si, idx, c);
-}
-
-static void
-configure_sort_dialog (ETableConfig *config, GladeXML *gui)
-{
-	GSList *l;
-	int i;
-	
-	for (i = 0; i < 4; i++){
-		char buffer [80];
-
-		snprintf (buffer, sizeof (buffer), "sort-combo-%d", i + 1);
-		config->sort [i].combo = GAL_COMBO_TEXT (
-			glade_xml_get_widget (gui, buffer));
-		gtk_widget_show (GTK_WIDGET (config->sort [i].combo));
-		gal_combo_text_add_item (config->sort [i].combo, "", "");
-
-		snprintf (buffer, sizeof (buffer), "frame-sort-%d", i + 1);
-		config->sort [i].frames = 
-			glade_xml_get_widget (gui, buffer);
-
-		snprintf (
-			buffer, sizeof (buffer),
-			"radiobutton-ascending-sort-%d", i+1);
-		config->sort [i].radio_ascending = glade_xml_get_widget (
-			gui, buffer);
-
-		snprintf (
-			buffer, sizeof (buffer),
-			"radiobutton-descending-sort-%d", i+1);
-		config->sort [i].radio_descending = glade_xml_get_widget (
-			gui, buffer);
-
-		config->sort [i].e_table_config = config;
-	}
-
-	for (l = config->column_names; l; l = l->next){
-		char *label = l->data;
-
-		for (i = 0; i < 4; i++){
-			gal_combo_text_add_item (config->sort [i].combo,
-						 dgettext (config->domain, label), label);
-		}
-	}
-
-	/*
-	 * After we have runtime modified things, signal connect
-	 */
-	for (i = 0; i < 4; i++){
-		config->sort [i].changed_id = g_signal_connect (
-			config->sort [i].combo->entry,
-			"changed", G_CALLBACK (sort_entry_changed),
-			&config->sort [i]);
-
-		config->sort [i].toggled_id = g_signal_connect (
-			config->sort [i].radio_ascending,
-			"toggled", G_CALLBACK (sort_ascending_toggled),
-			&config->sort [i]);
-	}
-}
-
-static void
-group_entry_changed (GtkEntry *entry, ETableConfigSortWidgets *group)
-{
-	ETableConfig *config = group->e_table_config;
-	ETableSortInfo *sort_info = config->temp_state->sort_info;
-	ETableConfigSortWidgets *base = &config->group[0];
-	int idx = group - base;
-	const char *s = gtk_entry_get_text (entry);
-
-	if (s && s [0] && g_hash_table_lookup (group->combo->elements, s)){
-		ETableSortColumn c;
-		int col;
-		
-		col = find_model_column_by_name (config->source_spec, s);
-		if (col == -1){
-			g_warning ("grouping: this should not happen, %s", s);
-			return;
-		}
-
-		c.ascending = GTK_TOGGLE_BUTTON (
-			config->group [idx].radio_ascending)->active;
-		c.column = col;
-		e_table_sort_info_grouping_set_nth (sort_info, idx, c);
-		  
-		update_sort_and_group_config_dialog (config, FALSE);
-	}  else {
-		e_table_sort_info_grouping_truncate (sort_info, idx);
-		update_sort_and_group_config_dialog (config, FALSE);
-	}
-}
-
-static void
-group_ascending_toggled (GtkToggleButton *t, ETableConfigSortWidgets *group)
-{
-	ETableConfig *config = group->e_table_config;
-	ETableSortInfo *si = config->temp_state->sort_info;
-	ETableConfigSortWidgets *base = &config->group[0];
-	int idx = group - base;
-	ETableSortColumn c;
-	
-	c = e_table_sort_info_grouping_get_nth (si, idx);
-	c.ascending = t->active;
-	e_table_sort_info_grouping_set_nth (si, idx, c);
-}
-
-static void
-configure_group_dialog (ETableConfig *config, GladeXML *gui)
-{
-	GSList *l;
-	int i;
-	
-	for (i = 0; i < 4; i++){
-		char buffer [80];
-
-		snprintf (buffer, sizeof (buffer), "group-combo-%d", i + 1);
-		config->group [i].combo = GAL_COMBO_TEXT (
-			glade_xml_get_widget (gui, buffer));
-		gtk_widget_show (GTK_WIDGET (config->group [i].combo));
-
-		gal_combo_text_add_item (config->group [i].combo, "", "");
-
-		snprintf (buffer, sizeof (buffer), "frame-group-%d", i + 1);
-		config->group [i].frames = 
-			glade_xml_get_widget (gui, buffer);
-
-		snprintf (
-			buffer, sizeof (buffer),
-			"radiobutton-ascending-group-%d", i+1);
-		config->group [i].radio_ascending = glade_xml_get_widget (
-			gui, buffer);
-
-		snprintf (
-			buffer, sizeof (buffer),
-			"radiobutton-descending-group-%d", i+1);
-		config->group [i].radio_descending = glade_xml_get_widget (
-			gui, buffer);
-
-		snprintf (
-			buffer, sizeof (buffer),
-			"checkbutton-group-%d", i+1);
-		config->group [i].view_check = glade_xml_get_widget (
-			gui, buffer);
-		
-		config->group [i].e_table_config = config;
-	}
-
-	
-	for (l = config->column_names; l; l = l->next){
-		char *label = l->data;
-
-		for (i = 0; i < 4; i++){
-			gal_combo_text_add_item (
-				config->group [i].combo,
-				dgettext (config->domain, label), label);
-		}
-	}
-
-	/*
-	 * After we have runtime modified things, signal connect
-	 */
-	for (i = 0; i < 4; i++){
-		config->group [i].changed_id = g_signal_connect (
-			config->group [i].combo->entry,
-			"changed", G_CALLBACK (group_entry_changed),
-			&config->group [i]);
-
-		config->group [i].toggled_id = g_signal_connect (
-			config->group [i].radio_ascending,
-			"toggled", G_CALLBACK (group_ascending_toggled),
-			&config->group [i]);
-	}
-}
-
-static void
-add_column (int model_row, gpointer closure)
-{
-	GList **columns = closure;
-	*columns = g_list_prepend (*columns, GINT_TO_POINTER (model_row));
-}
-
-static void
-config_button_add (GtkWidget *widget, ETableConfig *config)
-{
-	GList *columns = NULL;
-	GList *column;
-	int count;
-	int i;
-
-	e_table_selected_row_foreach (config->available, add_column, &columns);
-	columns = g_list_reverse (columns);
-
-	count = g_list_length (columns);
-
-	config->temp_state->columns = g_renew (int, config->temp_state->columns, config->temp_state->col_count + count);
-	config->temp_state->expansions = g_renew (double, config->temp_state->expansions, config->temp_state->col_count + count);
-	i = config->temp_state->col_count;
-	for (column = columns; column; column = column->next) {
-		config->temp_state->columns[i] = get_source_model_col_index (config, GPOINTER_TO_INT (column->data));
-		config->temp_state->expansions[i] = config->source_spec->columns[config->temp_state->columns[i]]->expansion;
-		i++;
-	}
-	config->temp_state->col_count += count;
-
-	g_list_free (columns);
-
-	setup_fields (config);
-}
-
-static void
-config_button_remove (GtkWidget *widget, ETableConfig *config)
-{
-	GList *columns = NULL;
-	GList *column;
-
-	e_table_selected_row_foreach (config->shown, add_column, &columns);
-
-	for (column = columns; column; column = column->next) {
-		int row = GPOINTER_TO_INT (column->data);
-
-		memmove (config->temp_state->columns + row, config->temp_state->columns + row + 1, sizeof (int) * (config->temp_state->col_count - row - 1));
-		memmove (config->temp_state->expansions + row, config->temp_state->expansions + row + 1, sizeof (double) * (config->temp_state->col_count - row - 1));
-		config->temp_state->col_count --;
-	}
-	config->temp_state->columns = g_renew (int, config->temp_state->columns, config->temp_state->col_count);
-	config->temp_state->expansions = g_renew (double, config->temp_state->expansions, config->temp_state->col_count);
-
-	g_list_free (columns);
-
-	setup_fields (config);
-}
-
-static void
-config_button_up (GtkWidget *widget, ETableConfig *config)
-{
-	GList *columns = NULL;
-	GList *column;
-	int *new_shown;
-	double *new_expansions;
-	int next_col;
-	double next_expansion;
-	int i;
-
-	e_table_selected_row_foreach (config->shown, add_column, &columns);
-
-	/* if no columns left, just return */
-	if (columns == NULL)
-		return;
-
-	columns = g_list_reverse (columns);
-
-	new_shown = g_new (int, config->temp_state->col_count);
-	new_expansions = g_new (double, config->temp_state->col_count);
-
-	column = columns;
-
-	next_col = config->temp_state->columns[0];
-	next_expansion = config->temp_state->expansions[0];
-
-	for (i = 1; i < config->temp_state->col_count; i++) {
-		if (column && (GPOINTER_TO_INT (column->data) == i)) {
-			new_expansions[i - 1] = config->temp_state->expansions[i];
-			new_shown[i - 1] = config->temp_state->columns[i];
-			column = column->next;
-		} else {
-			new_shown[i - 1] = next_col;
-			next_col = config->temp_state->columns[i];
-
-			new_expansions[i - 1] = next_expansion;
-			next_expansion = config->temp_state->expansions[i];
-		}
-	}
-
-	new_shown[i - 1] = next_col;
-	new_expansions[i - 1] = next_expansion;
-
-	g_free (config->temp_state->columns);
-	g_free (config->temp_state->expansions);
-
-	config->temp_state->columns = new_shown;
-	config->temp_state->expansions = new_expansions;
-
-	g_list_free (columns);
-
-	setup_fields (config);
-}
-
-static void
-config_button_down (GtkWidget *widget, ETableConfig *config)
-{
-	GList *columns = NULL;
-	GList *column;
-	int *new_shown;
-	double *new_expansions;
-	int next_col;
-	double next_expansion;
-	int i;
-
-	e_table_selected_row_foreach (config->shown, add_column, &columns);
-
-	/* if no columns left, just return */
-	if (columns == NULL)
-		return;
-
-
-	new_shown = g_new (int, config->temp_state->col_count);
-	new_expansions = g_new (double, config->temp_state->col_count);
-
-	column = columns;
-
-	next_col = config->temp_state->columns[config->temp_state->col_count - 1];
-	next_expansion = config->temp_state->expansions[config->temp_state->col_count - 1];
-
-	for (i = config->temp_state->col_count - 1; i > 0; i--) {
-		if (column && (GPOINTER_TO_INT (column->data) == i - 1)) {
-			new_expansions[i] = config->temp_state->expansions[i - 1];
-			new_shown[i] = config->temp_state->columns[i - 1];
-			column = column->next;
-		} else {
-			new_shown[i] = next_col;
-			next_col = config->temp_state->columns[i - 1];
-
-			new_expansions[i] = next_expansion;
-			next_expansion = config->temp_state->expansions[i - 1];
-		}
-	}
-
-	new_shown[0] = next_col;
-	new_expansions[0] = next_expansion;
-
-	g_free (config->temp_state->columns);
-	g_free (config->temp_state->expansions);
-
-	config->temp_state->columns = new_shown;
-	config->temp_state->expansions = new_expansions;
-
-	g_list_free (columns);
-
-	setup_fields (config);
-}
-
-static void
-configure_fields_dialog (ETableConfig *config, GladeXML *gui)
-{
-	GtkWidget *scrolled;
-
-	scrolled = glade_xml_get_widget (gui, "custom-available");
-	config->available = e_table_scrolled_get_table (E_TABLE_SCROLLED (scrolled));
-	g_object_get (config->available,
-		      "model", &config->available_model,
-		      NULL);
-	gtk_widget_show_all (scrolled);
-
-	scrolled = glade_xml_get_widget (gui, "custom-shown");
-	config->shown = e_table_scrolled_get_table (E_TABLE_SCROLLED (scrolled));
-	g_object_get (config->shown,
-		      "model", &config->shown_model,
-		      NULL);
-	gtk_widget_show_all (scrolled);
-
-	connect_button (config, gui, "button-add",    G_CALLBACK (config_button_add));
-	connect_button (config, gui, "button-remove", G_CALLBACK (config_button_remove));
-	connect_button (config, gui, "button-up",     G_CALLBACK (config_button_up));
-	connect_button (config, gui, "button-down",   G_CALLBACK (config_button_down));
-
-	setup_fields (config);
-}
-
-static void
-setup_gui (ETableConfig *config)
-{
-	GladeXML *gui;
-
-	create_global_store (config);
-
-	if (e_table_sort_info_get_can_group (config->state->sort_info)) {
-		gui = glade_xml_new (ETABLE_GLADEDIR "/e-table-config.glade", NULL, E_I18N_DOMAIN);
-	} else {
-		gui = glade_xml_new (ETABLE_GLADEDIR "/e-table-config-no-group.glade", NULL, E_I18N_DOMAIN);
-	}
-
-	g_object_unref (global_store);
-	
-	config->dialog_toplevel = glade_xml_get_widget (
-		gui, "e-table-config");
-
-	if (config->header)
-		gtk_window_set_title (GTK_WINDOW (config->dialog_toplevel), config->header);
-
-	config->dialog_show_fields = glade_xml_get_widget (
-		gui, "dialog-show-fields");
-	config->dialog_group_by =  glade_xml_get_widget (
-		gui, "dialog-group-by");
-	config->dialog_sort = glade_xml_get_widget (
-		gui, "dialog-sort");
-
-	config->sort_label = glade_xml_get_widget (
-		gui, "label-sort");
-	config->group_label = glade_xml_get_widget (
-		gui, "label-group");
-	config->fields_label = glade_xml_get_widget (
-		gui, "label-fields");
-
-	connect_button (config, gui, "button-sort", G_CALLBACK (config_button_sort));
-	connect_button (config, gui, "button-group", G_CALLBACK (config_button_group));
-	connect_button (config, gui, "button-fields", G_CALLBACK (config_button_fields));
-	
-	configure_sort_dialog (config, gui);
-	configure_group_dialog (config, gui);
-	configure_fields_dialog (config, gui);
-
-	g_object_weak_ref (G_OBJECT (config->dialog_toplevel),
-			   dialog_destroyed, config);
-
-	g_signal_connect (config->dialog_toplevel, "response",
-			  G_CALLBACK (dialog_response), config);
-
-	g_object_unref (gui);
-}
-
-static void
-config_init (ETableConfig *config)
-{
-	config->domain = NULL;
-}
-
-ETableConfig *
-e_table_config_construct (ETableConfig        *config,
-			  const char          *header,
-			  ETableSpecification *spec,
-			  ETableState         *state,
-			  GtkWindow           *parent_window)
-{
-	ETableColumnSpecification **column;
-
-	g_return_val_if_fail (config != NULL, NULL);
-	g_return_val_if_fail (header != NULL, NULL);
-	g_return_val_if_fail (spec != NULL, NULL);
-	g_return_val_if_fail (state != NULL, NULL);
-	
-	config->source_spec = spec;
-	config->source_state = state;
-	config->header = g_strdup (header);
-
-	g_object_ref (config->source_spec);
-	g_object_ref (config->source_state);
-
-	config->state = e_table_state_duplicate (state);
-
-	config->domain = g_strdup (spec->domain);
-
-	for (column = config->source_spec->columns; *column; column++){
-		char *label = (*column)->title;
-
-		if ((*column)->disabled)
-			continue;
-
-		config->column_names = g_slist_append (
-			config->column_names, label);
-	}
-
-	setup_gui (config);
-
-	gtk_window_set_transient_for (GTK_WINDOW (config->dialog_toplevel),
-				      parent_window);
-
-	config_sort_info_update   (config);
-	config_group_info_update  (config);
-	config_fields_info_update (config);
-	
-	return E_TABLE_CONFIG (config);
-}
-
-/**
- * e_table_config_new:
- * @header: The title of the dialog for the ETableConfig.
- * @spec: The specification for the columns to allow.
- * @state: The current state of the configuration.
- *
- * Creates a new ETable config object.
- *
- * Returns: The config object.
- */
-ETableConfig *
-e_table_config_new (const char          *header,
-		    ETableSpecification *spec,
-		    ETableState         *state,
-		    GtkWindow           *parent_window)
-{
-	ETableConfig *config = g_object_new (E_TABLE_CONFIG_TYPE, NULL);
-
-	if (e_table_config_construct (config, header, spec, state, parent_window) == NULL){
-		g_object_unref (config);
-		return NULL;
-	}
-
-	gtk_widget_ensure_style (config->dialog_toplevel);
-	gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (config->dialog_toplevel)->vbox), 0);
-	gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (config->dialog_toplevel)->action_area), 12);
-
-	gtk_dialog_set_response_sensitive (GTK_DIALOG (config->dialog_toplevel),
-					   GTK_RESPONSE_APPLY, FALSE);
-	gtk_widget_show (config->dialog_toplevel);
-
-	return E_TABLE_CONFIG (config);
-}
-
-/**
- * e_table_config_raise:
- * @config: The ETableConfig object.
- *
- * Raises the dialog associated with this ETableConfig object.
- */
-void
-e_table_config_raise (ETableConfig *config)
-{
-	gdk_window_raise (GTK_WIDGET (config->dialog_toplevel)->window);
-}
-
-E_MAKE_TYPE(e_table_config, "ETableConfig", ETableConfig, config_class_init, config_init, G_TYPE_OBJECT)
diff --git a/widgets/table/e-table-config.glade b/widgets/table/e-table-config.glade
deleted file mode 100644
index f721c7c8fb..0000000000
--- a/widgets/table/e-table-config.glade
+++ /dev/null
@@ -1,2181 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-<requires lib="gnome"/>
-
-<widget class="GtkDialog" id="dialog-show-fields">
-  <property name="title" translatable="yes">Show Fields</property>
-  <property name="type">GTK_WINDOW_TOPLEVEL</property>
-  <property name="window_position">GTK_WIN_POS_NONE</property>
-  <property name="modal">True</property>
-  <property name="resizable">True</property>
-  <property name="destroy_with_parent">False</property>
-  <property name="decorated">True</property>
-  <property name="skip_taskbar_hint">False</property>
-  <property name="skip_pager_hint">False</property>
-  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
-  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-  <property name="has_separator">True</property>
-
-  <child internal-child="vbox">
-    <widget class="GtkVBox" id="dialog-vbox3">
-      <property name="visible">True</property>
-      <property name="homogeneous">False</property>
-      <property name="spacing">8</property>
-
-      <child internal-child="action_area">
-	<widget class="GtkHButtonBox" id="dialog-action_area3">
-	  <property name="visible">True</property>
-	  <property name="layout_style">GTK_BUTTONBOX_END</property>
-
-	  <child>
-	    <widget class="GtkButton" id="button22">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-cancel</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-6</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="button20">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-ok</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-5</property>
-	    </widget>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">True</property>
-	  <property name="pack_type">GTK_PACK_END</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkVBox" id="vbox2">
-	  <property name="visible">True</property>
-	  <property name="homogeneous">False</property>
-	  <property name="spacing">6</property>
-
-	  <child>
-	    <widget class="GtkTable" id="table2">
-	      <property name="visible">True</property>
-	      <property name="n_rows">1</property>
-	      <property name="n_columns">5</property>
-	      <property name="homogeneous">True</property>
-	      <property name="row_spacing">6</property>
-	      <property name="column_spacing">6</property>
-
-	      <child>
-		<widget class="GtkLabel" id="label-available">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">A_vailable Fields:</property>
-		  <property name="use_underline">True</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">2</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		  <property name="y_options">fill</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label-displayed">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">_Show these fields in order:</property>
-		  <property name="use_underline">True</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">3</property>
-		  <property name="right_attach">5</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		  <property name="y_options">fill</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">False</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkTable" id="table3">
-	      <property name="visible">True</property>
-	      <property name="n_rows">1</property>
-	      <property name="n_columns">5</property>
-	      <property name="homogeneous">True</property>
-	      <property name="row_spacing">6</property>
-	      <property name="column_spacing">6</property>
-
-	      <child>
-		<widget class="GtkVBox" id="vbox4">
-		  <property name="visible">True</property>
-		  <property name="homogeneous">False</property>
-		  <property name="spacing">6</property>
-
-		  <child>
-		    <widget class="Custom" id="custom-available">
-		      <property name="visible">True</property>
-		      <property name="creation_function">e_table_proxy_etable_available_new</property>
-		      <property name="int1">0</property>
-		      <property name="int2">0</property>
-		      <property name="last_modification_time">Thu, 21 Feb 2002 16:09:53 GMT</property>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">True</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">2</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkVBox" id="vbox5">
-		  <property name="visible">True</property>
-		  <property name="homogeneous">False</property>
-		  <property name="spacing">6</property>
-
-		  <child>
-		    <widget class="Custom" id="custom-shown">
-		      <property name="visible">True</property>
-		      <property name="creation_function">e_table_proxy_etable_shown_new</property>
-		      <property name="int1">0</property>
-		      <property name="int2">0</property>
-		      <property name="last_modification_time">Thu, 21 Feb 2002 16:09:58 GMT</property>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">True</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-
-		  <child>
-		    <widget class="GtkHBox" id="hbox4">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">True</property>
-		      <property name="spacing">6</property>
-
-		      <child>
-			<widget class="GtkButton" id="button-up">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Move _Up</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkButton" id="button-down">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Move _Down</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">False</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="left_attach">3</property>
-		  <property name="right_attach">5</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkVBox" id="vbox6">
-		  <property name="visible">True</property>
-		  <property name="homogeneous">False</property>
-		  <property name="spacing">6</property>
-
-		  <child>
-		    <widget class="GtkButton" id="button-add">
-		      <property name="visible">True</property>
-		      <property name="can_focus">True</property>
-		      <property name="label" translatable="yes">_Add -&gt;</property>
-		      <property name="use_underline">True</property>
-		      <property name="relief">GTK_RELIEF_NORMAL</property>
-		      <property name="focus_on_click">True</property>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">False</property>
-		      <property name="fill">False</property>
-		    </packing>
-		  </child>
-
-		  <child>
-		    <widget class="GtkButton" id="button-remove">
-		      <property name="visible">True</property>
-		      <property name="can_focus">True</property>
-		      <property name="label" translatable="yes">&lt;- _Remove</property>
-		      <property name="use_underline">True</property>
-		      <property name="relief">GTK_RELIEF_NORMAL</property>
-		      <property name="focus_on_click">True</property>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">False</property>
-		      <property name="fill">False</property>
-		    </packing>
-		  </child>
-
-		  <child>
-		    <placeholder/>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="left_attach">2</property>
-		  <property name="right_attach">3</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">True</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">True</property>
-	  <property name="fill">True</property>
-	</packing>
-      </child>
-    </widget>
-  </child>
-</widget>
-
-<widget class="GtkDialog" id="dialog-group-by">
-  <property name="title" translatable="yes">Group</property>
-  <property name="type">GTK_WINDOW_TOPLEVEL</property>
-  <property name="window_position">GTK_WIN_POS_NONE</property>
-  <property name="modal">True</property>
-  <property name="resizable">True</property>
-  <property name="destroy_with_parent">False</property>
-  <property name="decorated">True</property>
-  <property name="skip_taskbar_hint">False</property>
-  <property name="skip_pager_hint">False</property>
-  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
-  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-  <property name="has_separator">True</property>
-
-  <child internal-child="vbox">
-    <widget class="GtkVBox" id="dialog-vbox4">
-      <property name="visible">True</property>
-      <property name="homogeneous">False</property>
-      <property name="spacing">8</property>
-
-      <child internal-child="action_area">
-	<widget class="GtkHButtonBox" id="dialog-action_area4">
-	  <property name="visible">True</property>
-	  <property name="layout_style">GTK_BUTTONBOX_END</property>
-
-	  <child>
-	    <widget class="GtkButton" id="button39">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label" translatable="yes">Clear All</property>
-	      <property name="use_underline">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">0</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="button42">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-cancel</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-6</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="button41">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-ok</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-5</property>
-	    </widget>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">True</property>
-	  <property name="pack_type">GTK_PACK_END</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkVBox" id="vbox24">
-	  <property name="visible">True</property>
-	  <property name="homogeneous">False</property>
-	  <property name="spacing">0</property>
-
-	  <child>
-	    <widget class="GtkHBox" id="hbox13">
-	      <property name="visible">True</property>
-	      <property name="homogeneous">False</property>
-	      <property name="spacing">6</property>
-
-	      <child>
-		<widget class="GtkFrame" id="frame-group-1">
-		  <property name="visible">True</property>
-		  <property name="label_xalign">0</property>
-		  <property name="label_yalign">0.5</property>
-		  <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-		  <child>
-		    <widget class="GtkHBox" id="hbox5">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">6</property>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox7">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="Custom" id="group-combo-1">
-			      <property name="visible">True</property>
-			      <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			      <property name="int1">0</property>
-			      <property name="int2">0</property>
-			      <property name="last_modification_time">Fri, 19 Jan 2001 04:52:09 GMT</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkCheckButton" id="checkbutton-group-1">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Show field in View</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">True</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox8">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-ascending-group-1">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Ascending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-descending-group-1">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Descending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			      <property name="group">radiobutton-ascending-group-1</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-		    </widget>
-		  </child>
-
-		  <child>
-		    <widget class="GtkLabel" id="label1">
-		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">Group Items By</property>
-		      <property name="use_underline">False</property>
-		      <property name="use_markup">False</property>
-		      <property name="justify">GTK_JUSTIFY_LEFT</property>
-		      <property name="wrap">False</property>
-		      <property name="selectable">False</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xpad">0</property>
-		      <property name="ypad">0</property>
-		    </widget>
-		    <packing>
-		      <property name="type">label_item</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">True</property>
-		  <property name="fill">True</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label8">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label9">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label10">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">True</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkHBox" id="hbox14">
-	      <property name="visible">True</property>
-	      <property name="homogeneous">False</property>
-	      <property name="spacing">6</property>
-
-	      <child>
-		<widget class="GtkLabel" id="label11">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkFrame" id="frame-group-2">
-		  <property name="visible">True</property>
-		  <property name="label_xalign">0</property>
-		  <property name="label_yalign">0.5</property>
-		  <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-		  <child>
-		    <widget class="GtkHBox" id="hbox6">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">6</property>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox9">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="Custom" id="group-combo-2">
-			      <property name="visible">True</property>
-			      <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			      <property name="int1">0</property>
-			      <property name="int2">0</property>
-			      <property name="last_modification_time">Fri, 19 Jan 2001 04:52:14 GMT</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkCheckButton" id="checkbutton-group-2">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Show field in View</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">True</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox10">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-ascending-group-2">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Ascending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-descending-group-2">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Descending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			      <property name="group">radiobutton-ascending-group-2</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-		    </widget>
-		  </child>
-
-		  <child>
-		    <widget class="GtkLabel" id="label12">
-		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">Then By</property>
-		      <property name="use_underline">False</property>
-		      <property name="use_markup">False</property>
-		      <property name="justify">GTK_JUSTIFY_LEFT</property>
-		      <property name="wrap">False</property>
-		      <property name="selectable">False</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xpad">0</property>
-		      <property name="ypad">0</property>
-		    </widget>
-		    <packing>
-		      <property name="type">label_item</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">True</property>
-		  <property name="fill">True</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label19">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label18">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">True</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkHBox" id="hbox15">
-	      <property name="visible">True</property>
-	      <property name="homogeneous">False</property>
-	      <property name="spacing">6</property>
-
-	      <child>
-		<widget class="GtkLabel" id="label13">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label12">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkFrame" id="frame-group-3">
-		  <property name="visible">True</property>
-		  <property name="label_xalign">0</property>
-		  <property name="label_yalign">0.5</property>
-		  <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-		  <child>
-		    <widget class="GtkHBox" id="hbox7">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">6</property>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox11">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="Custom" id="group-combo-3">
-			      <property name="visible">True</property>
-			      <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			      <property name="int1">0</property>
-			      <property name="int2">0</property>
-			      <property name="last_modification_time">Fri, 19 Jan 2001 04:52:18 GMT</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkCheckButton" id="checkbutton-group-3">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Show field in View</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">True</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox12">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-ascending-group-3">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Ascending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-descending-group-3">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Descending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			      <property name="group">radiobutton-ascending-group-3</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-		    </widget>
-		  </child>
-
-		  <child>
-		    <widget class="GtkLabel" id="label20">
-		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">Then By</property>
-		      <property name="use_underline">False</property>
-		      <property name="use_markup">False</property>
-		      <property name="justify">GTK_JUSTIFY_LEFT</property>
-		      <property name="wrap">False</property>
-		      <property name="selectable">False</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xpad">0</property>
-		      <property name="ypad">0</property>
-		    </widget>
-		    <packing>
-		      <property name="type">label_item</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">True</property>
-		  <property name="fill">True</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label17">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">True</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkHBox" id="hbox16">
-	      <property name="visible">True</property>
-	      <property name="homogeneous">False</property>
-	      <property name="spacing">6</property>
-
-	      <child>
-		<widget class="GtkLabel" id="label14">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label16">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label15">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkFrame" id="frame-group-4">
-		  <property name="visible">True</property>
-		  <property name="label_xalign">0</property>
-		  <property name="label_yalign">0.5</property>
-		  <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-		  <child>
-		    <widget class="GtkHBox" id="hbox8">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">6</property>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox13">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="Custom" id="group-combo-4">
-			      <property name="visible">True</property>
-			      <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			      <property name="int1">0</property>
-			      <property name="int2">0</property>
-			      <property name="last_modification_time">Fri, 19 Jan 2001 04:52:21 GMT</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkCheckButton" id="checkbutton-group-4">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Show field in View</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">True</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox14">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-ascending-group-4">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Ascending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton-descending-group-4">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Descending</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			      <property name="group">radiobutton-ascending-group-4</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-		    </widget>
-		  </child>
-
-		  <child>
-		    <widget class="GtkLabel" id="label21">
-		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">Then By</property>
-		      <property name="use_underline">False</property>
-		      <property name="use_markup">False</property>
-		      <property name="justify">GTK_JUSTIFY_LEFT</property>
-		      <property name="wrap">False</property>
-		      <property name="selectable">False</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xpad">0</property>
-		      <property name="ypad">0</property>
-		    </widget>
-		    <packing>
-		      <property name="type">label_item</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">True</property>
-		  <property name="fill">True</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">True</property>
-	      <property name="fill">True</property>
-	    </packing>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">True</property>
-	  <property name="fill">True</property>
-	</packing>
-      </child>
-    </widget>
-  </child>
-</widget>
-
-<widget class="GtkDialog" id="dialog-sort">
-  <property name="title" translatable="yes">Sort</property>
-  <property name="type">GTK_WINDOW_TOPLEVEL</property>
-  <property name="window_position">GTK_WIN_POS_NONE</property>
-  <property name="modal">True</property>
-  <property name="resizable">True</property>
-  <property name="destroy_with_parent">False</property>
-  <property name="decorated">True</property>
-  <property name="skip_taskbar_hint">False</property>
-  <property name="skip_pager_hint">False</property>
-  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
-  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-  <property name="has_separator">True</property>
-
-  <child internal-child="vbox">
-    <widget class="GtkVBox" id="vbox15">
-      <property name="visible">True</property>
-      <property name="homogeneous">False</property>
-      <property name="spacing">8</property>
-
-      <child internal-child="action_area">
-	<widget class="GtkHButtonBox" id="hbuttonbox1">
-	  <property name="visible">True</property>
-	  <property name="layout_style">GTK_BUTTONBOX_END</property>
-
-	  <child>
-	    <widget class="GtkButton" id="button43">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label" translatable="yes">Clear All</property>
-	      <property name="use_underline">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">0</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="button45">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-cancel</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-6</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="button44">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="has_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-ok</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-5</property>
-	    </widget>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">True</property>
-	  <property name="pack_type">GTK_PACK_END</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkTable" id="table5">
-	  <property name="visible">True</property>
-	  <property name="n_rows">4</property>
-	  <property name="n_columns">1</property>
-	  <property name="homogeneous">False</property>
-	  <property name="row_spacing">6</property>
-	  <property name="column_spacing">6</property>
-
-	  <child>
-	    <widget class="GtkFrame" id="frame-sort-4">
-	      <property name="visible">True</property>
-	      <property name="label_xalign">0</property>
-	      <property name="label_yalign">0.5</property>
-	      <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-	      <child>
-		<widget class="GtkHBox" id="hbox9">
-		  <property name="visible">True</property>
-		  <property name="homogeneous">False</property>
-		  <property name="spacing">6</property>
-
-		  <child>
-		    <widget class="GtkAlignment" id="alignment1">
-		      <property name="visible">True</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xscale">1</property>
-		      <property name="yscale">0</property>
-		      <property name="top_padding">0</property>
-		      <property name="bottom_padding">0</property>
-		      <property name="left_padding">0</property>
-		      <property name="right_padding">0</property>
-
-		      <child>
-			<widget class="Custom" id="sort-combo-4">
-			  <property name="visible">True</property>
-			  <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			  <property name="int1">0</property>
-			  <property name="int2">0</property>
-			  <property name="last_modification_time">Tue, 16 Jan 2001 08:33:52 GMT</property>
-			</widget>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">True</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-
-		  <child>
-		    <widget class="GtkVBox" id="vbox17">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">0</property>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-ascending-sort-4">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Ascending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-descending-sort-4">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Descending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			  <property name="group">radiobutton-ascending-sort-4</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">False</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-		</widget>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label22">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">Then By</property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="type">label_item</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="left_attach">0</property>
-	      <property name="right_attach">1</property>
-	      <property name="top_attach">3</property>
-	      <property name="bottom_attach">4</property>
-	      <property name="y_options">fill</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkFrame" id="frame-sort-3">
-	      <property name="visible">True</property>
-	      <property name="label_xalign">0</property>
-	      <property name="label_yalign">0.5</property>
-	      <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-	      <child>
-		<widget class="GtkHBox" id="hbox10">
-		  <property name="visible">True</property>
-		  <property name="homogeneous">False</property>
-		  <property name="spacing">6</property>
-
-		  <child>
-		    <widget class="GtkAlignment" id="alignment2">
-		      <property name="visible">True</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xscale">1</property>
-		      <property name="yscale">0</property>
-		      <property name="top_padding">0</property>
-		      <property name="bottom_padding">0</property>
-		      <property name="left_padding">0</property>
-		      <property name="right_padding">0</property>
-
-		      <child>
-			<widget class="Custom" id="sort-combo-3">
-			  <property name="visible">True</property>
-			  <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			  <property name="int1">0</property>
-			  <property name="int2">0</property>
-			  <property name="last_modification_time">Tue, 16 Jan 2001 05:22:22 GMT</property>
-			</widget>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">True</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-
-		  <child>
-		    <widget class="GtkVBox" id="vbox19">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">0</property>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-ascending-sort-3">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Ascending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-descending-sort-3">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Descending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			  <property name="group">radiobutton-ascending-sort-3</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">False</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-		</widget>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label23">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">Then By</property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="type">label_item</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="left_attach">0</property>
-	      <property name="right_attach">1</property>
-	      <property name="top_attach">2</property>
-	      <property name="bottom_attach">3</property>
-	      <property name="y_options">fill</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkFrame" id="frame-sort-2">
-	      <property name="visible">True</property>
-	      <property name="label_xalign">0</property>
-	      <property name="label_yalign">0.5</property>
-	      <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-	      <child>
-		<widget class="GtkHBox" id="hbox11">
-		  <property name="visible">True</property>
-		  <property name="homogeneous">False</property>
-		  <property name="spacing">6</property>
-
-		  <child>
-		    <widget class="GtkAlignment" id="alignment3">
-		      <property name="visible">True</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xscale">1</property>
-		      <property name="yscale">0</property>
-		      <property name="top_padding">0</property>
-		      <property name="bottom_padding">0</property>
-		      <property name="left_padding">0</property>
-		      <property name="right_padding">0</property>
-
-		      <child>
-			<widget class="Custom" id="sort-combo-2">
-			  <property name="visible">True</property>
-			  <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			  <property name="int1">0</property>
-			  <property name="int2">0</property>
-			  <property name="last_modification_time">Tue, 16 Jan 2001 05:22:15 GMT</property>
-			</widget>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">True</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-
-		  <child>
-		    <widget class="GtkVBox" id="vbox21">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">0</property>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-ascending-sort-2">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Ascending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-descending-sort-2">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Descending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			  <property name="group">radiobutton-ascending-sort-2</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">False</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-		</widget>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label24">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">Then By</property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="type">label_item</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="left_attach">0</property>
-	      <property name="right_attach">1</property>
-	      <property name="top_attach">1</property>
-	      <property name="bottom_attach">2</property>
-	      <property name="y_options">fill</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkFrame" id="frame-sort-1">
-	      <property name="visible">True</property>
-	      <property name="label_xalign">0</property>
-	      <property name="label_yalign">0.5</property>
-	      <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-	      <child>
-		<widget class="GtkHBox" id="hbox12">
-		  <property name="visible">True</property>
-		  <property name="homogeneous">False</property>
-		  <property name="spacing">6</property>
-
-		  <child>
-		    <widget class="GtkAlignment" id="alignment4">
-		      <property name="visible">True</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xscale">1</property>
-		      <property name="yscale">0</property>
-		      <property name="top_padding">0</property>
-		      <property name="bottom_padding">0</property>
-		      <property name="left_padding">0</property>
-		      <property name="right_padding">0</property>
-
-		      <child>
-			<widget class="Custom" id="sort-combo-1">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="has_focus">True</property>
-			  <property name="creation_function">e_table_proxy_gtk_combo_text_new</property>
-			  <property name="int1">0</property>
-			  <property name="int2">0</property>
-			  <property name="last_modification_time">Tue, 16 Jan 2001 05:22:00 GMT</property>
-			</widget>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">True</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-
-		  <child>
-		    <widget class="GtkVBox" id="vbox23">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">0</property>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-ascending-sort-1">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Ascending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkRadioButton" id="radiobutton-descending-sort-1">
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="label" translatable="yes">Descending</property>
-			  <property name="use_underline">True</property>
-			  <property name="relief">GTK_RELIEF_NORMAL</property>
-			  <property name="focus_on_click">True</property>
-			  <property name="active">False</property>
-			  <property name="inconsistent">False</property>
-			  <property name="draw_indicator">True</property>
-			  <property name="group">radiobutton-ascending-sort-1</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">False</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-		</widget>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label25">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">Sort Items By</property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="type">label_item</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="left_attach">0</property>
-	      <property name="right_attach">1</property>
-	      <property name="top_attach">0</property>
-	      <property name="bottom_attach">1</property>
-	      <property name="y_options">fill</property>
-	    </packing>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">True</property>
-	  <property name="fill">True</property>
-	</packing>
-      </child>
-    </widget>
-  </child>
-</widget>
-
-<widget class="GtkDialog" id="e-table-config">
-  <property name="title" translatable="yes">dialog1</property>
-  <property name="type">GTK_WINDOW_TOPLEVEL</property>
-  <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
-  <property name="modal">True</property>
-  <property name="resizable">False</property>
-  <property name="destroy_with_parent">False</property>
-  <property name="decorated">True</property>
-  <property name="skip_taskbar_hint">False</property>
-  <property name="skip_pager_hint">False</property>
-  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-  <property name="has_separator">True</property>
-
-  <child internal-child="vbox">
-    <widget class="GtkVBox" id="dialog-vbox6">
-      <property name="visible">True</property>
-      <property name="homogeneous">False</property>
-      <property name="spacing">0</property>
-
-      <child internal-child="action_area">
-	<widget class="GtkHButtonBox" id="dialog-action_area6">
-	  <property name="visible">True</property>
-	  <property name="layout_style">GTK_BUTTONBOX_END</property>
-
-	  <child>
-	    <widget class="GtkButton" id="cancelbutton2">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-cancel</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-6</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="applybutton2">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-apply</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-10</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="okbutton2">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-ok</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-5</property>
-	    </widget>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">True</property>
-	  <property name="pack_type">GTK_PACK_END</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkFrame" id="top-frame">
-	  <property name="border_width">2</property>
-	  <property name="visible">True</property>
-	  <property name="label_xalign">0</property>
-	  <property name="label_yalign">0.5</property>
-	  <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
-	  <child>
-	    <widget class="GtkTable" id="table1">
-	      <property name="border_width">2</property>
-	      <property name="visible">True</property>
-	      <property name="n_rows">3</property>
-	      <property name="n_columns">3</property>
-	      <property name="homogeneous">False</property>
-	      <property name="row_spacing">2</property>
-	      <property name="column_spacing">4</property>
-
-	      <child>
-		<widget class="GtkButton" id="button-sort">
-		  <property name="visible">True</property>
-		  <property name="can_default">True</property>
-		  <property name="can_focus">True</property>
-		  <property name="label" translatable="yes">_Sort...</property>
-		  <property name="use_underline">True</property>
-		  <property name="relief">GTK_RELIEF_NORMAL</property>
-		  <property name="focus_on_click">True</property>
-		  <signal name="clicked" handler="on_sort_clicked"/>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">1</property>
-		  <property name="top_attach">2</property>
-		  <property name="bottom_attach">3</property>
-		  <property name="x_options">fill</property>
-		  <property name="y_options"></property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkButton" id="button-group">
-		  <property name="visible">True</property>
-		  <property name="can_default">True</property>
-		  <property name="can_focus">True</property>
-		  <property name="label" translatable="yes">_Group By...</property>
-		  <property name="use_underline">True</property>
-		  <property name="relief">GTK_RELIEF_NORMAL</property>
-		  <property name="focus_on_click">True</property>
-		  <signal name="clicked" handler="on_group_by_clicked"/>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">1</property>
-		  <property name="top_attach">1</property>
-		  <property name="bottom_attach">2</property>
-		  <property name="x_options">fill</property>
-		  <property name="y_options"></property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label-sort">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">True</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">1</property>
-		  <property name="right_attach">2</property>
-		  <property name="top_attach">2</property>
-		  <property name="bottom_attach">3</property>
-		  <property name="y_options">fill</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkButton" id="button-fields">
-		  <property name="visible">True</property>
-		  <property name="can_default">True</property>
-		  <property name="can_focus">True</property>
-		  <property name="label" translatable="yes">_Fields Shown...</property>
-		  <property name="use_underline">True</property>
-		  <property name="relief">GTK_RELIEF_NORMAL</property>
-		  <property name="focus_on_click">True</property>
-		  <signal name="clicked" handler="on_group_by_clicked"/>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">1</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		  <property name="x_options">fill</property>
-		  <property name="y_options"></property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label-fields">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">True</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">1</property>
-		  <property name="right_attach">2</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		  <property name="y_options">fill</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label3">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">2</property>
-		  <property name="right_attach">3</property>
-		  <property name="top_attach">1</property>
-		  <property name="bottom_attach">2</property>
-		  <property name="x_options">fill</property>
-		  <property name="y_options">fill</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label4">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">2</property>
-		  <property name="right_attach">3</property>
-		  <property name="top_attach">2</property>
-		  <property name="bottom_attach">3</property>
-		  <property name="x_options">fill</property>
-		  <property name="y_options">fill</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label22">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_CENTER</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">2</property>
-		  <property name="right_attach">3</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		  <property name="x_options">fill</property>
-		  <property name="y_options">fill</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label-group">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes"></property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">True</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">1</property>
-		  <property name="right_attach">2</property>
-		  <property name="top_attach">1</property>
-		  <property name="bottom_attach">2</property>
-		  <property name="x_options">fill</property>
-		  <property name="y_options"></property>
-		</packing>
-	      </child>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkLabel" id="label26">
-	      <property name="visible">True</property>
-	      <property name="label" translatable="yes">Description</property>
-	      <property name="use_underline">False</property>
-	      <property name="use_markup">False</property>
-	      <property name="justify">GTK_JUSTIFY_LEFT</property>
-	      <property name="wrap">False</property>
-	      <property name="selectable">False</property>
-	      <property name="xalign">0.5</property>
-	      <property name="yalign">0.5</property>
-	      <property name="xpad">0</property>
-	      <property name="ypad">0</property>
-	    </widget>
-	    <packing>
-	      <property name="type">label_item</property>
-	    </packing>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">True</property>
-	  <property name="fill">True</property>
-	</packing>
-      </child>
-    </widget>
-  </child>
-</widget>
-
-</glade-interface>
diff --git a/widgets/table/e-table-config.h b/widgets/table/e-table-config.h
deleted file mode 100644
index cad376b955..0000000000
--- a/widgets/table/e-table-config.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-config.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Miguel de Icaza <miguel@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_CONFIG_H_
-#define _E_TABLE_CONFIG_H_
-
-#include <gal/e-table/e-table-sort-info.h>
-#include <gal/e-table/e-table-specification.h>
-#include <gal/widgets/gal-combo-text.h>
-#include <gal/e-table/e-table-without.h>
-#include <gal/e-table/e-table-subset-variable.h>
-#include <gal/e-table/e-table.h>
-#include <gtk/gtkwindow.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_CONFIG_TYPE        (e_table_config_get_type ())
-#define E_TABLE_CONFIG(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_CONFIG_TYPE, ETableConfig))
-#define E_TABLE_CONFIG_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_CONFIG_TYPE, ETableConfigClass))
-#define E_IS_TABLE_CONFIG(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_CONFIG_TYPE))
-#define E_IS_TABLE_CONFIG_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_CONFIG_TYPE))
-#define E_TABLE_CONFIG_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TABLE_CONFIG_TYPE, ETableConfigClass))
-
-typedef struct {
-	GalComboText *combo;
-	GtkWidget    *frames;
-	GtkWidget    *radio_ascending;
-	GtkWidget    *radio_descending;
-	GtkWidget    *view_check; /* Only for group dialog */
-	guint         changed_id, toggled_id;
-	void *e_table_config;
-} ETableConfigSortWidgets; 
-
-
-typedef struct {
-	GObject parent;
-
-	char *header;
-
-	/*
-	 * Our various dialog boxes
-	 */
-	GtkWidget *dialog_toplevel;
-	GtkWidget *dialog_show_fields;
-	GtkWidget *dialog_group_by;
-	GtkWidget *dialog_sort;
-
-	/*
-	 * The state we manipulate
-	 */
-	ETableSpecification *source_spec;
-	ETableState         *source_state, *state, *temp_state;
-
-	GtkWidget *sort_label;
-	GtkWidget *group_label;
-	GtkWidget *fields_label;
-
-	ETableConfigSortWidgets sort [4];
-	ETableConfigSortWidgets group [4];
-
-	ETable               *available;
-	ETableWithout        *available_model;
-	ETable               *shown;
-	ETableSubsetVariable *shown_model;
-	char *domain;
-
-	/*
-	 * List of valid column names
-	 */
-	GSList *column_names;
-} ETableConfig;
-
-typedef struct {
-	GObjectClass parent_class;
-
-	/* Signals */
-	void        (*changed)        (ETableConfig *config);
-} ETableConfigClass;
-
-GType         e_table_config_get_type  (void);
-ETableConfig *e_table_config_new       (const char          *header,
-					ETableSpecification *spec,
-					ETableState         *state,
-					GtkWindow           *parent_window);
-ETableConfig *e_table_config_construct (ETableConfig        *etco,
-					const char          *header,
-					ETableSpecification *spec,
-					ETableState         *state,
-					GtkWindow           *parent_window);
-void          e_table_config_raise     (ETableConfig        *config);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_CONFIG_H */
diff --git a/widgets/table/e-table-defines.h b/widgets/table/e-table-defines.h
deleted file mode 100644
index 34585789d4..0000000000
--- a/widgets/table/e-table-defines.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-defines.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef __E_TABLE_DEFINES__
-#define __E_TABLE_DEFINES__ 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define BUTTON_HEIGHT        10
-#define BUTTON_PADDING       2
-#define GROUP_INDENT         (BUTTON_HEIGHT + (BUTTON_PADDING * 2))
-
-/* Padding around the contents of a header button */
-#define HEADER_PADDING 1
-
-#define MIN_ARROW_SIZE 10
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif
diff --git a/widgets/table/e-table-example-1.c b/widgets/table/e-table-example-1.c
deleted file mode 100644
index 37ac85770f..0000000000
--- a/widgets/table/e-table-example-1.c
+++ /dev/null
@@ -1,308 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-example-1.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-/* This code is GPL. */
-#include <stdio.h>
-#include <string.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "gal/e-util/e-cursors.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-checkbox.h"
-#include "e-table.h"
-
-#include "table-test.h"
-
-/*
- * One way in which we make it simpler to build an ETableModel is through
- * the ETableSimple class.  Instead of creating your own ETableModel
- * class, you simply create a new object of the ETableSimple class.  You
- * give it a bunch of functions that act as callbacks.
- * 
- * You also get to pass a void * to ETableSimple and it gets passed to
- * your callbacks.  This would be for having multiple models of the same
- * type.  This is just an example though, so we statically define all the
- * data and ignore the void *data parameter.
- * 
- * In our example we will be creating a table model with 6 columns and 10
- * rows.  This corresponds to having 6 different types of information and
- * 10 different sets of data in our database.
- * 
- * The headers will be hard coded, as will be the example data.
- *
- */
-
-/*
- * There are two different meanings to the word "column".  The first is
- * the model column.  A model column corresponds to a specific type of
- * data.  This is very much like the usage in a database table where a
- * column is a field in the database.
- *
- * The second type of column is a view column.  A view column
- * corresponds to a visually displayed column.  Each view column
- * corresponds to a specific model column, though a model column may
- * have any number of view columns associated with it, from zero to
- * greater than one.
- *
- * Also, a view column doesn't necessarily depend on only one model
- * column.  In some cases, the view column renderer can be given a
- * reference to another column to get extra information about its
- * display.
-*/
-
-#define ROWS 10
-#define COLS 4
-
-#define IMPORTANCE_COLUMN 4
-#define COLOR_COLUMN 5
-
-/*
- * Here we define the initial layout of the table.  This is an xml
- * format that allows you to change the initial ordering of the
- * columns or to do sorting or grouping initially.  This specification
- * shows all 5 columns, but moves the importance column nearer to the
- * front.  It also sorts by the "Full Name" column (ascending.)
- * Sorting and grouping take the model column as their arguments
- * (sorting is specified by the "column" argument to the leaf elemnt.
- */
-
-#define INITIAL_SPEC "<ETableSpecification>                    	       \
-	<columns-shown>                  			       \
-		<column> 0 </column>     			       \
-		<column> 4 </column>     			       \
-		<column> 1 </column>     			       \
-		<column> 2 </column>     			       \
-		<column> 3 </column>     			       \
-	</columns-shown>                 			       \
-	<grouping> <leaf column=\"1\" ascending=\"true\"/> </grouping>    \
-</ETableSpecification>"
-
-char *headers [COLS] = {
-  "Email",
-  "Full Name",
-  "Address",
-  "Phone"
-};
-
-/*
- * Virtual Column list:
- * 0   Email
- * 1   Full Name
- * 2   Address
- * 3   Phone
- */
-
-char *table_data [ROWS] [COLS];
-
-/*
- * ETableSimple callbacks
- * These are the callbacks that define the behavior of our custom model.
- */
-
-/*
- * Since our model is a constant size, we can just return its size in
- * the column and row count fields.
- */
-
-/* This function returns the number of columns in our ETableModel. */
-static int
-my_col_count (ETableModel *etc, void *data)
-{
-	return COLS;
-}
-
-/* This function returns the number of rows in our ETableModel. */
-static int
-my_row_count (ETableModel *etc, void *data)
-{
-	return ROWS;
-}
-
-/* This function returns the value at a particular point in our ETableModel. */
-static void *
-my_value_at (ETableModel *etc, int col, int row, void *data)
-{
-	return (void *) table_data [row] [col];
-}
-
-/* This function sets the value at a particular point in our ETableModel. */
-static void
-my_set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
-	g_free (table_data [row] [col]);
-	table_data [row] [col] = g_strdup (val);
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-my_is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
-	return TRUE;
-}
-
-/* This function duplicates the value passed to it. */
-static void *
-my_duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
-	return g_strdup (value);
-}
-
-/* This function frees the value passed to it. */
-static void
-my_free_value (ETableModel *etc, int col, void *value, void *data)
-{
-	g_free (value);
-}
-
-/* This function creates an empty value. */
-static void *
-my_initialize_value (ETableModel *etc, int col, void *data)
-{
-	return g_strdup ("");
-}
-
-/* This function reports if a value is empty. */
-static gboolean
-my_value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
-	return !(value && *(char *)value);
-}
-
-/* This function reports if a value is empty. */
-static char *
-my_value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
-	return g_strdup(value);
-}
-
-/* We create a window containing our new table. */
-static void
-create_table (void)
-{
-	GtkWidget *e_table, *window, *frame;
-	ECell *cell_left_just;
-	ETableHeader *e_table_header;
-	int i, j;
-	ETableModel *e_table_model = NULL;
-
-	/* First we fill in the simple data. */
-	for (i = 0; i < ROWS; i++){
-		for (j = 0; j < COLS; j++)
-			table_data [i] [j] = g_strdup ("");
-	}
-	/* Next we create our model.  This uses the functions we defined
-	   earlier. */
-	e_table_model = e_table_simple_new (
-					    my_col_count, my_row_count, my_value_at,
-					    my_set_value_at, my_is_cell_editable,
-					    my_duplicate_value, my_free_value, 
-					    my_initialize_value, my_value_is_empty,
-					    my_value_to_string,
-					    NULL);
-	/*
-	 * Next we create a header.  The ETableHeader is used in two
-	 * different way.  The first is the full_header.  This is the
-	 * list of possible columns in the view.  The second use is
-	 * completely internal.  Many of the ETableHeader functions are
-	 * for that purpose.  The only functions we really need are
-	 * e_table_header_new and e_table_header_add_col.
-	 *
-	 * First we create the header.
-	 */
-	e_table_header = e_table_header_new ();
-	
-	/*
-	 * Next we have to build renderers for all of the columns.
-	 * Since all our columns are text columns, we can simply use
-	 * the same renderer over and over again.  If we had different
-	 * types of columns, we could use a different renderer for
-	 * each column.
-	 */
-	cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-		
-	/*
-	 * Next we create a column object for each view column and add
-	 * them to the header.  We don't create a column object for
-	 * the importance column since it will not be shown.
-	 */
-	for (i = 0; i < COLS; i++) {
-		/* Create the column. */
-		ETableCol *ecol = e_table_col_new (
-						   i, headers [i],
-						   1.0, 20, cell_left_just,
-						   g_str_compare, TRUE);
-		/* Add it to the header. */
-		e_table_header_add_column (e_table_header, ecol, i);
-	}
-
-	/*
-	 * Here we create a window for our new table.  This window
-	 * will get shown and the person will be able to test their
-	 * item.
-	 */
-	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-
-	/* This frame is simply to get a bevel around our table. */
-	frame = gtk_frame_new (NULL);
-
-	/*
-	 * Here we create the table.  We give it the three pieces of
-	 * the table we've created, the header, the model, and the
-	 * initial layout.  It does the rest.
-	 */
-	e_table = e_table_new (e_table_header, e_table_model, INITIAL_SPEC);
-
-	/* Build the gtk widget hierarchy. */
-	gtk_container_add (GTK_CONTAINER (frame), e_table);
-	gtk_container_add (GTK_CONTAINER (window), frame);
-
-	/* Size the initial window. */
-	gtk_widget_set_usize (window, 200, 200);
-
-	/* Show it all. */
-	gtk_widget_show_all (window);
-}
-
-/* This is the main function which just initializes gnome and call our create_table function */
-
-int
-main (int argc, char *argv [])
-{
-	gnome_init ("TableExample", "TableExample", argc, argv);
-	e_cursors_init ();
-
-	gtk_widget_push_visual (gdk_rgb_get_visual ());
-	gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
-	create_table ();
-	
-	gtk_main ();
-
-	e_cursors_shutdown ();
-	return 0;
-}
-
diff --git a/widgets/table/e-table-example-2.c b/widgets/table/e-table-example-2.c
deleted file mode 100644
index 2321e4e7dd..0000000000
--- a/widgets/table/e-table-example-2.c
+++ /dev/null
@@ -1,349 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-example-2.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "gal/e-util/e-cursors.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-checkbox.h"
-#include "e-table.h"
-
-#include "table-test.h"
-
-/*
-One way in which we make it simpler to build an ETableModel is through
-the ETableSimple class.  Instead of creating your own ETableModel
-class, you simply create a new object of the ETableSimple class.  You
-give it a bunch of functions that act as callbacks.
-
-You also get to pass a void * to ETableSimple and it gets passed to
-your callbacks.  This would be for having multiple models of the same
-type.  This is just an example though, so we statically define all the
-data and ignore the void *data parameter.
-
-In our example we will be creating a table model with 6 columns and 10
-rows.  This corresponds to having 6 different types of information and
-10 different sets of data in our database.
-
-The headers will be hard coded, as will be the example data.
-
-*/
-
-/*
-  There are two different meanings to the word "column".  The first is
-  the model column.  A model column corresponds to a specific type of
-  data.  This is very much like the usage in a database table where a
-  column is a field in the database.
-
-  The second type of column is a view column.  A view column
-  corresponds to a visually displayed column.  Each view column
-  corresponds to a specific model column, though a model column may
-  have any number of view columns associated with it, from zero to
-  greater than one.
-
-  Also, a view column doesn't necessarily depend on only one model
-  column.  In some cases, the view column renderer can be given a
-  reference to another column to get extra information about its
-  display.
-*/
-
-#define ROWS 10
-#define VIEW_COLS 4
-#define PHYSICAL_COLS 5
-#define VIRTUAL_COLS 6
-
-#define IMPORTANCE_COLUMN 4
-#define COLOR_COLUMN 5
-
-/* Here we define the initial layout of the table.  This is an xml
-   format that allows you to change the initial ordering of the
-   columns or to do sorting or grouping initially.  This specification
-   shows all 5 columns, but moves the importance column nearer to the
-   front.  It also sorts by the "Full Name" column (ascending.)
-   Sorting and grouping take the model column as their arguments
-   (sorting is specified by the "column" argument to the leaf elemnt. */
-#define INITIAL_SPEC "<ETableSpecification>                    	       \
-	<columns-shown>                  			       \
-		<column> 0 </column>     			       \
-		<column> 4 </column>     			       \
-		<column> 1 </column>     			       \
-		<column> 2 </column>     			       \
-		<column> 3 </column>     			       \
-	</columns-shown>                 			       \
-	<grouping> <leaf column=\"1\" ascending=\"true\"/> </grouping> \
-</ETableSpecification>"
-
-char *headers[VIEW_COLS] = {
-  "Email",
-  "Full Name",
-  "Address",
-  "Phone"
-};
-
-/* Virtual Column list:
-   0   Full Name
-   1   Email
-   2   Address
-   3   Phone
-   4   Importance field.  This field will be a boolean.  It also has a
-       special header, so doesn't appear in the headers list.
-   5   Color field.  This column is also not displayed.  It is also
-       not stored in the database.  It's calculated based on the
-       Importance field.
-*/
-
-char *table_data[ROWS][VIEW_COLS];
-gboolean importance_data[ROWS];
-
-/*
- * ETableSimple callbacks
- * These are the callbacks that define the behavior of our custom model.
- */
-
-/* Since our model is a constant size, we can just return its size in
-   the column and row count fields. */
-
-static GdkColor *color1;
-static GdkColor *color2;
-
-static int
-my_col_count (ETableModel *etc, void *data)
-{
-	return VIRTUAL_COLS;
-}
-
-static int
-my_row_count (ETableModel *etc, void *data)
-{
-	return ROWS;
-}
-
-static void *
-my_value_at (ETableModel *etc, int col, int row, void *data)
-{
-	if (col == COLOR_COLUMN){
-		if (importance_data[row]){
-			return color1;
-		} else {
-			return color2;
-		}
-	} else if (col == IMPORTANCE_COLUMN){
-		return (gpointer) importance_data[row];
-	} else {
-		return (void *) table_data [row][col];
-	}
-}
-
-static void
-my_set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
-	if (col == COLOR_COLUMN){ 
-	} else if (col == IMPORTANCE_COLUMN){
-		importance_data[row] = (gboolean) val;
-	} else {
-		g_free (table_data [row][col]);
-		table_data [row][col] = g_strdup (val);
-	}
-}
-
-static gboolean
-my_is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
-	if (col == IMPORTANCE_COLUMN)
-		return FALSE;
-	else
-		return TRUE;
-}
-
-static void *
-my_duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
-	if (col == COLOR_COLUMN){
-		return (void *) value;
-	} else if (col == IMPORTANCE_COLUMN){
-		return (void *) value;
-	} else {
-		return g_strdup (value);
-	}
-}
-
-static void
-my_free_value (ETableModel *etc, int col, void *value, void *data)
-{
-	if (col == COLOR_COLUMN){
-	} else if (col == IMPORTANCE_COLUMN){
-	} else {
-		g_free (value);
-	}
-}
-
-static void *
-my_initialize_value (ETableModel *etc, int col, void *data)
-{
-	if (col == COLOR_COLUMN){
-		return NULL;
-	} else if (col == IMPORTANCE_COLUMN){
-		return NULL;
-	} else {
-		return g_strdup ("");
-	}
-}
-
-static gboolean
-my_value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
-	if (col == COLOR_COLUMN){
-		return value == NULL;
-	} else if (col == IMPORTANCE_COLUMN){
-		return value == NULL;
-	} else {
-		return !(value && *(char *)value);
-	}
-}
-
-static char *
-my_value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
-	if (col == COLOR_COLUMN){
-		return g_strdup_printf("%d", (int) value);
-	} else if (col == IMPORTANCE_COLUMN){
-		return g_strdup_printf("%d", (int) value);
-	} else {
-		return g_strdup(value);
-	}
-}
-
-/* We create a window containing our new table. */
-static void
-create_table ()
-{
-	GtkWidget *e_table, *window, *frame;
-	ECell *cell_left_just;
-	ECell *cell_checkbox;
-	ETableHeader *e_table_header;
-	int i, j;
-	ETableModel *e_table_model = NULL;
-	ETableCol *ecol;
-	GdkPixbuf *pixbuf;
-
-	/* First we fill in the simple data. */
-	for (i = 0; i < ROWS; i++){
-		for (j = 0; j < VIEW_COLS; j++){
-			table_data[i][j] = g_strdup ("");
-		}
-		importance_data[i] = FALSE;
-	}
-	/* Next we create our model.  This uses the functions we defined
-	   earlier. */
-	e_table_model = e_table_simple_new (
-					    my_col_count, my_row_count, my_value_at,
-					    my_set_value_at, my_is_cell_editable,
-					    my_duplicate_value, my_free_value,
-					    my_initialize_value, my_value_is_empty,
-					    my_value_to_string,
-					    NULL);
-	/*
-	  Next we create a header.  The ETableHeader is used in two
-	  different way.  The first is the full_header.  This is the
-	  list of possible columns in the view.  The second use is
-	  completely internal.  Many of the ETableHeader functions are
-	  for that purpose.  The only functions we really need are
-	  e_table_header_new and e_table_header_add_col.
-
-	  First we create the header.  */
-	e_table_header = e_table_header_new ();
-	
-	/* Next we have to build renderers for all of the columns.
-	   Since all our columns are text columns, we can simply use
-	   the same renderer over and over again.  If we had different
-	   types of columns, we could use a different renderer for
-	   each column. */
-	cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-		
-	/* Next we create a column object for each view column and add
-	   them to the header.  We don't create a column object for
-	   the importance column since it will not be shown. */
-	for (i = 0; i < VIEW_COLS; i++){
-		/* Create the column. */
-		ETableCol *ecol = e_table_col_new (
-						   i, headers [i],
-						   1.0, 20, cell_left_just,
-						   g_str_compare, TRUE);
-		/* Add it to the header. */
-		e_table_header_add_column (e_table_header, ecol, i);
-	}
-       
-	/* Next we add a special column for the check box. */
-
-	cell_checkbox = e_cell_checkbox_new ();
-	pixbuf = gdk_pixbuf_new_from_file ("clip.png");
-	ecol = e_table_col_new_with_pixbuf (i, pixbuf, 0.0, 18, cell_checkbox, g_int_compare, TRUE);
-	e_table_header_add_column (e_table_header, ecol, i);
-
-	/*
-	 * Setup GUI
-	 */
-	/* Here we create a window for our new table.  This window
-	   will get shown and the person will be able to test their
-	   item. */
-	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-	/* This frame is simply to get a bevel around our table. */
-	frame = gtk_frame_new (NULL);
-	/* Here we create the table.  We give it the three pieces of
-	   the table we've created, the header, the model, and the
-	   initial layout.  It does the rest.  */
-	e_table = e_table_new (e_table_header, e_table_model, INITIAL_SPEC);
-
-	/* Build the gtk widget hierarchy. */
-	gtk_container_add (GTK_CONTAINER (frame), e_table);
-	gtk_container_add (GTK_CONTAINER (window), frame);
-
-	/* Size the initial window. */
-	gtk_widget_set_usize (window, 200, 200);
-	/* Show it all. */
-	gtk_widget_show_all (window);
-}
-
-
-
-int
-main (int argc, char *argv [])
-{
-	gnome_init ("TableExample", "TableExample", argc, argv);
-	e_cursors_init ();
-
-	gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
-	create_table ();
-	
-	gtk_main ();
-
-	e_cursors_shutdown ();
-	return 0;
-}
diff --git a/widgets/table/e-table-extras.c b/widgets/table/e-table-extras.c
deleted file mode 100644
index 81947a6e94..0000000000
--- a/widgets/table/e-table-extras.c
+++ /dev/null
@@ -1,292 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-extras.c - Set of hash table sort of thingies.
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <gtk/gtksignal.h>
-#include "gal/util/e-util.h"
-#include "gal/e-table/e-cell-text.h"
-#include "gal/e-table/e-cell-checkbox.h"
-#include "gal/e-table/e-cell-date.h"
-#include "gal/e-table/e-cell-number.h"
-#include "gal/e-table/e-cell-pixbuf.h"
-#include "gal/e-table/e-cell-size.h"
-#include "gal/e-table/e-cell-tree.h"
-#include "e-table-extras.h"
-#include <string.h>
-
-static GObjectClass *ete_parent_class;
-
-static void
-cell_hash_free(gchar	*key,
-	       ECell    *cell,
-	       gpointer	user_data)
-{
-	g_free(key);
-	if (cell)
-		g_object_unref(cell);
-}
-
-static void
-pixbuf_hash_free(gchar	*key,
-		 GdkPixbuf *pixbuf,
-		 gpointer	user_data)
-{
-	g_free(key);
-	if (pixbuf)
-		gdk_pixbuf_unref(pixbuf);
-}
-
-static void
-ete_finalize (GObject *object)
-{
-	ETableExtras *ete = E_TABLE_EXTRAS (object);
-
-	if (ete->cells) {
-		g_hash_table_foreach (ete->cells, (GHFunc) cell_hash_free, NULL);
-		g_hash_table_destroy (ete->cells);
-	}
-
-	if (ete->compares) {
-		g_hash_table_foreach (ete->compares, (GHFunc) g_free, NULL);
-		g_hash_table_destroy (ete->compares);
-	}
-
-	if (ete->searches) {
-		g_hash_table_foreach (ete->searches, (GHFunc) g_free, NULL);
-		g_hash_table_destroy (ete->searches);
-	}
-
-	if (ete->pixbufs) {
-		g_hash_table_foreach (ete->pixbufs, (GHFunc) pixbuf_hash_free, NULL);
-		g_hash_table_destroy (ete->pixbufs);
-	}
-
-	ete->cells = NULL;
-	ete->compares = NULL;
-	ete->searches = NULL;
-	ete->pixbufs = NULL;
-
-	ete_parent_class->finalize (object);
-}
-
-static void
-ete_class_init (GObjectClass *klass)
-{
-	ete_parent_class = g_type_class_peek_parent (klass);
-	
-	klass->finalize = ete_finalize;
-}
-
-static gint
-e_strint_compare(gconstpointer data1, gconstpointer data2)
-{
-	int int1 = atoi(data1);
-	int int2 = atoi(data2);
-
-	return g_int_compare(GINT_TO_POINTER(int1), GINT_TO_POINTER(int2));
-}
-
-/* UTF-8 strncasecmp - not optimized */
-
-static gint
-g_utf8_strncasecmp (const gchar *s1,
-		    const gchar *s2,
-		    guint n)
-{
-	gunichar c1, c2;
-
-	g_return_val_if_fail (s1 != NULL && g_utf8_validate (s1, -1, NULL), 0);
-	g_return_val_if_fail (s2 != NULL && g_utf8_validate (s2, -1, NULL), 0);
-
-	while (n && *s1 && *s2)
-		{
-
-			n -= 1;
-
-			c1 = g_unichar_tolower (g_utf8_get_char (s1));
-			c2 = g_unichar_tolower (g_utf8_get_char (s2));
-
-			/* Collation is locale-dependent, so this totally fails to do the right thing. */
-			if (c1 != c2)
-				return c1 < c2 ? -1 : 1;
-
-			s1 = g_utf8_next_char (s1);
-			s2 = g_utf8_next_char (s2);
-		}
-
-	if (n == 0 || (*s1 == '\0' && *s2 == '\0'))
-		return 0;
-
-	return *s1 ? 1 : -1;
-}
-
-static gboolean
-e_string_search(gconstpointer haystack, const char *needle)
-{
-	int length;
-	if (haystack == NULL)
-		return FALSE;
-
-	length = g_utf8_strlen (needle, -1);
-	if (g_utf8_strncasecmp (haystack, needle, length) == 0)
-		return TRUE;
-	else
-		return FALSE;
-}
-
-static void
-ete_init (ETableExtras *extras)
-{
-	extras->cells = g_hash_table_new(g_str_hash, g_str_equal);
-	extras->compares = g_hash_table_new(g_str_hash, g_str_equal);
-	extras->searches = g_hash_table_new(g_str_hash, g_str_equal);
-	extras->pixbufs = g_hash_table_new(g_str_hash, g_str_equal);
-
-	e_table_extras_add_compare(extras, "string", g_str_compare);
-	e_table_extras_add_compare(extras, "collate", g_collate_compare);
-	e_table_extras_add_compare(extras, "integer", g_int_compare);
-	e_table_extras_add_compare(extras, "string-integer", e_strint_compare);
-
-	e_table_extras_add_search(extras, "string", e_string_search);
-
-	e_table_extras_add_cell(extras, "checkbox", e_cell_checkbox_new());
-	e_table_extras_add_cell(extras, "date", e_cell_date_new (NULL, GTK_JUSTIFY_LEFT));
-	e_table_extras_add_cell(extras, "number", e_cell_number_new (NULL, GTK_JUSTIFY_RIGHT));
-	e_table_extras_add_cell(extras, "pixbuf", e_cell_pixbuf_new ());
-	e_table_extras_add_cell(extras, "size", e_cell_size_new (NULL, GTK_JUSTIFY_RIGHT));
-	e_table_extras_add_cell(extras, "string", e_cell_text_new (NULL, GTK_JUSTIFY_LEFT));
-	e_table_extras_add_cell(extras, "tree-string", e_cell_tree_new (NULL, NULL, TRUE, e_cell_text_new (NULL, GTK_JUSTIFY_LEFT)));
-}
-
-E_MAKE_TYPE(e_table_extras, "ETableExtras", ETableExtras, ete_class_init, ete_init, G_TYPE_OBJECT)
-
-ETableExtras *
-e_table_extras_new (void)
-{
-	ETableExtras *ete = g_object_new (E_TABLE_EXTRAS_TYPE, NULL);
-
-	return (ETableExtras *) ete;
-}
-
-void
-e_table_extras_add_cell     (ETableExtras *extras,
-			     char         *id,
-			     ECell        *cell)
-{
-	gchar *old_key;
-	ECell *old_cell;
-
-	if (g_hash_table_lookup_extended (extras->cells, id, (gpointer *)&old_key, (gpointer *)&old_cell)) {
-		g_hash_table_remove (extras->cells, old_key);
-		g_free (old_key);
-		if (old_cell)
-			g_object_unref (old_cell);
-	}
-
-	if (cell) {
-		g_object_ref (cell);
-		gtk_object_sink (GTK_OBJECT (cell));
-	}
-	g_hash_table_insert (extras->cells, g_strdup(id), cell);
-}
-
-ECell *
-e_table_extras_get_cell     (ETableExtras *extras,
-			     char         *id)
-{
-	return g_hash_table_lookup(extras->cells, id);
-}
-
-void
-e_table_extras_add_compare  (ETableExtras *extras,
-			     char         *id,
-			     GCompareFunc  compare)
-{
-	gchar *old_key;
-	GCompareFunc old_compare;
-
-	if (g_hash_table_lookup_extended (extras->compares, id, (gpointer *)&old_key, (gpointer *)&old_compare)) {
-		g_hash_table_remove (extras->compares, old_key);
-		g_free (old_key);
-	}
-
-	g_hash_table_insert(extras->compares, g_strdup(id), (gpointer) compare);
-}
-
-GCompareFunc
-e_table_extras_get_compare  (ETableExtras *extras,
-			     char         *id)
-{
-	return (GCompareFunc) g_hash_table_lookup(extras->compares, id);
-}
-
-void
-e_table_extras_add_search  (ETableExtras     *extras,
-			    char             *id,
-			    ETableSearchFunc  search)
-{
-	gchar *old_key;
-	ETableSearchFunc old_search;
-
-	if (g_hash_table_lookup_extended (extras->searches, id, (gpointer *)&old_key, (gpointer *)&old_search)) {
-		g_hash_table_remove (extras->searches, old_key);
-		g_free (old_key);
-	}
-
-	g_hash_table_insert(extras->searches, g_strdup(id), search);
-}
-
-ETableSearchFunc
-e_table_extras_get_search  (ETableExtras *extras,
-			    char         *id)
-{
-	return g_hash_table_lookup(extras->searches, id);
-}
-
-void
-e_table_extras_add_pixbuf     (ETableExtras *extras,
-			       char         *id,
-			       GdkPixbuf    *pixbuf)
-{
-	gchar *old_key;
-	GdkPixbuf *old_pixbuf;
-
-	if (g_hash_table_lookup_extended (extras->pixbufs, id, (gpointer *)&old_key, (gpointer *)&old_pixbuf)) {
-		g_hash_table_remove (extras->cells, old_key);
-		g_free (old_key);
-		if (old_pixbuf)
-			gdk_pixbuf_unref (old_pixbuf);
-	}
-
-	if (pixbuf)
-		gdk_pixbuf_ref(pixbuf);
-	g_hash_table_insert (extras->pixbufs, g_strdup(id), pixbuf);
-}
-
-GdkPixbuf *
-e_table_extras_get_pixbuf     (ETableExtras *extras,
-			       char         *id)
-{
-	return g_hash_table_lookup(extras->pixbufs, id);
-}
diff --git a/widgets/table/e-table-extras.h b/widgets/table/e-table-extras.h
deleted file mode 100644
index bd478e0bd8..0000000000
--- a/widgets/table/e-table-extras.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-extras.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_EXTRAS_H_
-#define _E_TABLE_EXTRAS_H_
-
-#include <glib-object.h>
-#include <gal/e-table/e-cell.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_EXTRAS_TYPE        (e_table_extras_get_type ())
-#define E_TABLE_EXTRAS(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_EXTRAS_TYPE, ETableExtras))
-#define E_TABLE_EXTRAS_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_EXTRAS_TYPE, ETableExtrasClass))
-#define E_IS_TABLE_EXTRAS(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_EXTRAS_TYPE))
-#define E_IS_TABLE_EXTRAS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_EXTRAS_TYPE))
-#define E_TABLE_EXTRAS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), E_TABLE_EXTRAS_TYPE, ETableExtrasClass))
-
-typedef struct {
-	GObject base;
-
-	GHashTable *cells;
-	GHashTable *compares;
-	GHashTable *pixbufs;
-	GHashTable *searches;
-} ETableExtras;
-
-typedef struct {
-	GObjectClass parent_class;
-} ETableExtrasClass;
-
-GType             e_table_extras_get_type     (void);
-ETableExtras     *e_table_extras_new          (void);
-
-void              e_table_extras_add_cell     (ETableExtras     *extras,
-					       char             *id,
-					       ECell            *cell);
-ECell            *e_table_extras_get_cell     (ETableExtras     *extras,
-					       char             *id);
-
-void              e_table_extras_add_compare  (ETableExtras     *extras,
-					       char             *id,
-					       GCompareFunc      compare);
-GCompareFunc      e_table_extras_get_compare  (ETableExtras     *extras,
-					       char             *id);
-
-void              e_table_extras_add_search   (ETableExtras     *extras,
-					       char             *id,
-					       ETableSearchFunc  search);
-ETableSearchFunc  e_table_extras_get_search   (ETableExtras     *extras,
-					       char             *id);
-
-void              e_table_extras_add_pixbuf   (ETableExtras     *extras,
-					       char             *id,
-					       GdkPixbuf        *pixbuf);
-GdkPixbuf        *e_table_extras_get_pixbuf   (ETableExtras     *extras,
-					       char             *id);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_EXTRAS_H_ */
diff --git a/widgets/table/e-table-field-chooser-dialog.c b/widgets/table/e-table-field-chooser-dialog.c
deleted file mode 100644
index d7e725fd12..0000000000
--- a/widgets/table/e-table-field-chooser-dialog.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-field-chooser-dialog.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include "e-table-field-chooser-dialog.h"
-#include "gal/util/e-i18n.h"
-#include "gal/util/e-util.h"
-#include <gtk/gtkstock.h>
-
-static void e_table_field_chooser_dialog_init		(ETableFieldChooserDialog		 *card);
-static void e_table_field_chooser_dialog_class_init	(ETableFieldChooserDialogClass	 *klass);
-static void e_table_field_chooser_dialog_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
-static void e_table_field_chooser_dialog_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
-static void e_table_field_chooser_dialog_dispose (GObject *object);
-static void e_table_field_chooser_dialog_response (GtkDialog *dialog, gint id);
-
-#define PARENT_TYPE GTK_TYPE_DIALOG
-static GtkDialogClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
-	PROP_0,
-	PROP_DND_CODE,
-	PROP_FULL_HEADER,
-	PROP_HEADER
-};
-
-E_MAKE_TYPE (e_table_field_chooser_dialog,
-	     "ETableFieldChooserDialog",
-	     ETableFieldChooserDialog,
-	     e_table_field_chooser_dialog_class_init,
-	     e_table_field_chooser_dialog_init,
-	     PARENT_TYPE);
-
-static void
-e_table_field_chooser_dialog_class_init (ETableFieldChooserDialogClass *klass)
-{
-	GObjectClass *object_class;
-	GtkDialogClass *dialog_class;
-
-	object_class = (GObjectClass*) klass;
-	dialog_class = GTK_DIALOG_CLASS (klass);
-
-	parent_class = g_type_class_ref (PARENT_TYPE);
-
-	object_class->dispose      = e_table_field_chooser_dialog_dispose;
-	object_class->set_property = e_table_field_chooser_dialog_set_property;
-	object_class->get_property = e_table_field_chooser_dialog_get_property;
-
-	dialog_class->response = e_table_field_chooser_dialog_response;
-
-	g_object_class_install_property (object_class, PROP_DND_CODE,
-					 g_param_spec_string ("dnd_code",
-							      _("DnD code"),
-							      /*_( */"XXX blurb" /*)*/,
-							      NULL,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_FULL_HEADER,
-					 g_param_spec_object ("full_header",
-							      _("Full Header"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_HEADER_TYPE,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_HEADER,
-					 g_param_spec_object ("header",
-							      _("Header"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_HEADER_TYPE,
-							      G_PARAM_READWRITE));
-}
-
-static void
-e_table_field_chooser_dialog_init (ETableFieldChooserDialog *e_table_field_chooser_dialog)
-{
-	GtkWidget *widget;
-
-	e_table_field_chooser_dialog->etfc = NULL;
-	e_table_field_chooser_dialog->dnd_code = g_strdup("");
-	e_table_field_chooser_dialog->full_header = NULL;
-	e_table_field_chooser_dialog->header = NULL;
-
-	gtk_dialog_add_button(GTK_DIALOG(e_table_field_chooser_dialog),
-			      GTK_STOCK_CLOSE, GTK_RESPONSE_OK);
-
-	gtk_window_set_policy(GTK_WINDOW(e_table_field_chooser_dialog), FALSE, TRUE, FALSE);
-
-	widget = e_table_field_chooser_new();
-	e_table_field_chooser_dialog->etfc = E_TABLE_FIELD_CHOOSER(widget);
-	
-	g_object_set(widget,
-		     "dnd_code", e_table_field_chooser_dialog->dnd_code,
-		     "full_header", e_table_field_chooser_dialog->full_header,
-		     "header", e_table_field_chooser_dialog->header,
-		     NULL);
-	
-	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(e_table_field_chooser_dialog)->vbox),
-			   widget, TRUE, TRUE, 0);
-
-	gtk_widget_show(GTK_WIDGET(widget));
-
-	gtk_window_set_title (GTK_WINDOW (e_table_field_chooser_dialog), _("Add a column..."));
-}
-
-GtkWidget*
-e_table_field_chooser_dialog_new (void)
-{
-	GtkWidget *widget = g_object_new (E_TABLE_FIELD_CHOOSER_DIALOG_TYPE, NULL);
-	return widget;
-}
-
-static void
-e_table_field_chooser_dialog_dispose (GObject *object)
-{
-	ETableFieldChooserDialog *etfcd = E_TABLE_FIELD_CHOOSER_DIALOG (object);
-
-	if (etfcd->dnd_code)
-		g_free (etfcd->dnd_code);
-	etfcd->dnd_code = NULL;
-
-	if (etfcd->full_header)
-		g_object_unref (etfcd->full_header);
-	etfcd->full_header = NULL;
-
-	if (etfcd->header)
-		g_object_unref (etfcd->header);
-	etfcd->header = NULL;
-
-	G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static void
-e_table_field_chooser_dialog_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
-	ETableFieldChooserDialog *etfcd = E_TABLE_FIELD_CHOOSER_DIALOG(object);
-	switch (prop_id){
-	case PROP_DND_CODE:
-		g_free(etfcd->dnd_code);
-		etfcd->dnd_code = g_strdup(g_value_get_string (value));
-		if (etfcd->etfc)
-			g_object_set(etfcd->etfc,
-				     "dnd_code", etfcd->dnd_code,
-				     NULL);
-		break;
-	case PROP_FULL_HEADER:
-		if (etfcd->full_header)
-			g_object_unref (etfcd->full_header);
-		if (g_value_get_object (value))
-			etfcd->full_header = E_TABLE_HEADER(g_value_get_object (value));
-		else
-			etfcd->full_header = NULL;
-		if (etfcd->full_header)
-			g_object_ref (etfcd->full_header);
-		if (etfcd->etfc)
-			g_object_set(etfcd->etfc,
-				     "full_header", etfcd->full_header,
-				     NULL);
-		break;
-	case PROP_HEADER:
-		if (etfcd->header)
-			g_object_unref (etfcd->header);
-		if (g_value_get_object (value))
-			etfcd->header = E_TABLE_HEADER(g_value_get_object (value));
-		else
-			etfcd->header = NULL;
-		if (etfcd->header)
-			g_object_ref (etfcd->header);
-		if (etfcd->etfc)
-			g_object_set(etfcd->etfc,
-				     "header", etfcd->header,
-				     NULL);
-		break;
-	default:
-		break;
-	}
-}
-
-static void
-e_table_field_chooser_dialog_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
-	ETableFieldChooserDialog *etfcd = E_TABLE_FIELD_CHOOSER_DIALOG(object);
-	switch (prop_id) {
-	case PROP_DND_CODE:
-		g_value_set_string (value, g_strdup (etfcd->dnd_code));
-		break;
-	case PROP_FULL_HEADER:
-		g_value_set_object (value, etfcd->full_header);
-		break;
-	case PROP_HEADER:
-		g_value_set_object (value, etfcd->header);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-e_table_field_chooser_dialog_response (GtkDialog *dialog, int id)
-{
-	if (id == GTK_RESPONSE_OK)
-		gtk_widget_destroy (GTK_WIDGET (dialog));
-}
diff --git a/widgets/table/e-table-field-chooser-dialog.h b/widgets/table/e-table-field-chooser-dialog.h
deleted file mode 100644
index 83fd5d3738..0000000000
--- a/widgets/table/e-table-field-chooser-dialog.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-field-chooser-dialog.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef __E_TABLE_FIELD_CHOOSER_DIALOG_H__
-#define __E_TABLE_FIELD_CHOOSER_DIALOG_H__
-
-#include <gtk/gtkdialog.h>
-#include <gal/e-table/e-table-field-chooser.h>
-#include <gal/e-table/e-table-header.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-/* ETableFieldChooserDialog - A dialog displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name		type		read/write	description
- * --------------------------------------------------------------------------------
- */
-
-#define E_TABLE_FIELD_CHOOSER_DIALOG_TYPE			(e_table_field_chooser_dialog_get_type ())
-#define E_TABLE_FIELD_CHOOSER_DIALOG(obj)			(G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TABLE_FIELD_CHOOSER_DIALOG_TYPE, ETableFieldChooserDialog))
-#define E_TABLE_FIELD_CHOOSER_DIALOG_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST ((klass), E_TABLE_FIELD_CHOOSER_DIALOG_TYPE, ETableFieldChooserDialogClass))
-#define E_IS_TABLE_FIELD_CHOOSER_DIALOG(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TABLE_FIELD_CHOOSER_DIALOG_TYPE))
-#define E_IS_TABLE_FIELD_CHOOSER_DIALOG_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((obj), E_TABLE_FIELD_CHOOSER_DIALOG_TYPE))
-
-
-typedef struct _ETableFieldChooserDialog       ETableFieldChooserDialog;
-typedef struct _ETableFieldChooserDialogClass  ETableFieldChooserDialogClass;
-
-struct _ETableFieldChooserDialog
-{
-	GtkDialog parent;
-	
-	/* item specific fields */
-	ETableFieldChooser *etfc;
-	gchar              *dnd_code;
-	ETableHeader       *full_header;
-	ETableHeader       *header;
-};
-
-struct _ETableFieldChooserDialogClass
-{
-	GtkDialogClass parent_class;
-};
-
-
-GtkWidget *e_table_field_chooser_dialog_new(void);
-GType      e_table_field_chooser_dialog_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __E_TABLE_FIELD_CHOOSER_DIALOG_H__ */
diff --git a/widgets/table/e-table-field-chooser-item.c b/widgets/table/e-table-field-chooser-item.c
deleted file mode 100644
index cfc73fc102..0000000000
--- a/widgets/table/e-table-field-chooser-item.c
+++ /dev/null
@@ -1,711 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-field-chooser-item.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <string.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkdnd.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include <libgnomecanvas/gnome-canvas-util.h>
-#include <libgnomecanvas/gnome-canvas-polygon.h>
-#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "gal/util/e-i18n.h"
-#include "gal/util/e-util.h"
-#include "gal/util/e-xml-utils.h"
-#include "gal/widgets/e-canvas.h"
-
-#include "e-table-header.h"
-#include "e-table-col-dnd.h"
-#include "e-table-defines.h"
-#include "e-table-header-utils.h"
-
-#include "e-table-field-chooser-item.h"
-
-#define d(x)
-
-#if 0
-enum {
-	BUTTON_PRESSED,
-	LAST_SIGNAL
-};
-
-static guint etfci_signals [LAST_SIGNAL] = { 0, };
-#endif
-
-#define PARENT_OBJECT_TYPE gnome_canvas_item_get_type ()
-
-#define ELEMENTS(x) (sizeof (x) / sizeof (x[0]))
-
-static GnomeCanvasItemClass *etfci_parent_class;
-
-static void etfci_drop_table_header (ETableFieldChooserItem *etfci);
-static void etfci_drop_full_header (ETableFieldChooserItem *etfci);
-
-enum {
-	PROP_0,
-	PROP_FULL_HEADER,
-	PROP_HEADER,
-	PROP_DND_CODE,
-	PROP_WIDTH,
-	PROP_HEIGHT
-};
-
-static void
-etfci_dispose (GObject *object)
-{
-	ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (object);
-
-	etfci_drop_table_header (etfci);
-	etfci_drop_full_header (etfci);
-
-	if (etfci->combined_header)
-		g_object_unref (etfci->combined_header);
-	etfci->combined_header = NULL;
-
-	if (etfci->font)
-		gdk_font_unref(etfci->font);
-	etfci->font = NULL;
-
-	if (G_OBJECT_CLASS (etfci_parent_class)->dispose)
-		(*G_OBJECT_CLASS (etfci_parent_class)->dispose) (object);
-}
-
-static gint
-etfci_find_button (ETableFieldChooserItem *etfci, double loc)
-{
-	int i;
-	int count;
-	double height = 0;
-	GtkStyle *style;
-
-	style = GTK_WIDGET (GNOME_CANVAS_ITEM (etfci)->canvas)->style;
-
-	count = e_table_header_count(etfci->combined_header);
-	for (i = 0; i < count; i++) {
-		ETableCol *ecol;
-
-		ecol = e_table_header_get_column (etfci->combined_header, i);
-		if (ecol->disabled)
-			continue;
-		height += e_table_header_compute_height (ecol, GTK_WIDGET (GNOME_CANVAS_ITEM (etfci)->canvas));
-		if (height > loc)
-			return i;
-	}
-	return MAX(0, count - 1);
-}
-
-static void
-etfci_rebuild_combined (ETableFieldChooserItem *etfci)
-{
-	int count;
-	GHashTable *hash;
-	int i;
-
-	if (etfci->combined_header != NULL)
-		g_object_unref (etfci->combined_header);
-
-	etfci->combined_header = e_table_header_new ();
-
-	hash = g_hash_table_new (NULL, NULL);
-
-	count = e_table_header_count (etfci->header);
-	for (i = 0; i < count; i++) {
-		ETableCol *ecol = e_table_header_get_column (etfci->header, i);
-		if (ecol->disabled)
-			continue;
-		g_hash_table_insert (hash, GINT_TO_POINTER (ecol->col_idx), GINT_TO_POINTER (1));
-	}
-
-	count = e_table_header_count (etfci->full_header);
-	for (i = 0; i < count; i++) {
-		ETableCol *ecol = e_table_header_get_column (etfci->full_header, i);
-		if (ecol->disabled)
-			continue;
-		if (! (GPOINTER_TO_INT (g_hash_table_lookup (hash, GINT_TO_POINTER (ecol->col_idx)))))
-			e_table_header_add_column (etfci->combined_header, ecol, -1);
-	}
-
-	g_hash_table_destroy (hash);
-}
-
-static void
-etfci_reflow (GnomeCanvasItem *item, gint flags)
-{
-	ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
-	double old_height;
-	int i;
-	int count;
-	double height = 0;
-	GtkStyle *style;
-
-	etfci_rebuild_combined (etfci);
-
-	style = GTK_WIDGET (GNOME_CANVAS_ITEM (etfci)->canvas)->style;
-
-	old_height = etfci->height;
-
-	count = e_table_header_count(etfci->combined_header);
-	for (i = 0; i < count; i++) {
-		ETableCol *ecol;
-
-		ecol = e_table_header_get_column (etfci->combined_header, i);
-		if (ecol->disabled)
-			continue;
-		height += e_table_header_compute_height (ecol, GTK_WIDGET (GNOME_CANVAS_ITEM (etfci)->canvas));
-	}
-
-	etfci->height = height;
-	
-	if (old_height != etfci->height)
-		e_canvas_item_request_parent_reflow(item);
-	
-	gnome_canvas_item_request_update(item);
-}
-
-static void
-etfci_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
-	ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
-	double   i2c [6];
-	ArtPoint c1, c2, i1, i2;
-	
-	if (GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)->update)
-		(*GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)->update)(item, affine, clip_path, flags);
-
-	i1.x = i1.y = 0;
-	i2.x = etfci->width;
-	i2.y = etfci->height;
-
-	gnome_canvas_item_i2c_affine (item, i2c);
-	art_affine_point (&c1, &i1, i2c);
-	art_affine_point (&c2, &i2, i2c);
-
-	if (item->x1 != c1.x ||
-	     item->y1 != c1.y ||
-	     item->x2 != c2.x ||
-	     item->y2 != c2.y)
-		{
-			gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
-			item->x1 = c1.x;
-			item->y1 = c1.y;
-			item->x2 = c2.x;
-			item->y2 = c2.y;
-#ifndef NO_WARNINGS
-#warning Group Child bounds !?
-#endif
-#if 0
-			gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item);
-#endif
-		}
-	gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
-}
-
-static void
-etfci_font_load (ETableFieldChooserItem *etfci)
-{
-	if (etfci->font)
-		gdk_font_unref (etfci->font);
-
-	etfci->font = gtk_style_get_font (GTK_WIDGET(GNOME_CANVAS_ITEM(etfci)->canvas)->style);
-	gdk_font_ref(etfci->font);
-}
-
-static void
-etfci_drop_full_header (ETableFieldChooserItem *etfci)
-{
-	GObject *header;
-	
-	if (!etfci->full_header)
-		return;
-
-	header = G_OBJECT (etfci->full_header);
-	if (etfci->full_header_structure_change_id)
-		g_signal_handler_disconnect (header, etfci->full_header_structure_change_id);
-	if (etfci->full_header_dimension_change_id)
-		g_signal_handler_disconnect (header, etfci->full_header_dimension_change_id);
-	etfci->full_header_structure_change_id = 0;
-	etfci->full_header_dimension_change_id = 0;
-
-	if (header)
-		g_object_unref (header);
-	etfci->full_header = NULL;
-	etfci->height = 0;
-	e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void 
-full_header_structure_changed (ETableHeader *header, ETableFieldChooserItem *etfci)
-{
-	e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-full_header_dimension_changed (ETableHeader *header, int col, ETableFieldChooserItem *etfci)
-{
-	e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-etfci_add_full_header (ETableFieldChooserItem *etfci, ETableHeader *header)
-{
-	etfci->full_header = header;
-	g_object_ref (etfci->full_header);
-
-	etfci->full_header_structure_change_id = g_signal_connect (
-		header, "structure_change",
-		G_CALLBACK(full_header_structure_changed), etfci);
-	etfci->full_header_dimension_change_id = g_signal_connect (
-		header, "dimension_change",
-		G_CALLBACK(full_header_dimension_changed), etfci);
-	e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-etfci_drop_table_header (ETableFieldChooserItem *etfci)
-{
-	GObject *header;
-	
-	if (!etfci->header)
-		return;
-
-	header = G_OBJECT (etfci->header);
-	if (etfci->table_header_structure_change_id)
-		g_signal_handler_disconnect (header, etfci->table_header_structure_change_id);
-	if (etfci->table_header_dimension_change_id)
-		g_signal_handler_disconnect (header, etfci->table_header_dimension_change_id);
-	etfci->table_header_structure_change_id = 0;
-	etfci->table_header_dimension_change_id = 0;
-
-	if (header)
-		g_object_unref (header);
-	etfci->header = NULL;
-	etfci->height = 0;
-	e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void 
-table_header_structure_changed (ETableHeader *header, ETableFieldChooserItem *etfci)
-{
-	e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-table_header_dimension_changed (ETableHeader *header, int col, ETableFieldChooserItem *etfci)
-{
-	e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-etfci_add_table_header (ETableFieldChooserItem *etfci, ETableHeader *header)
-{
-	etfci->header = header;
-	g_object_ref (etfci->header);
-
-	etfci->table_header_structure_change_id = g_signal_connect (
-		header, "structure_change",
-		G_CALLBACK(table_header_structure_changed), etfci);
-	etfci->table_header_dimension_change_id = g_signal_connect (
-		header, "dimension_change",
-		G_CALLBACK(table_header_dimension_changed), etfci);
-	e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-etfci_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
-	GnomeCanvasItem *item;
-	ETableFieldChooserItem *etfci;
-
-	item = GNOME_CANVAS_ITEM (object);
-	etfci = E_TABLE_FIELD_CHOOSER_ITEM (object);
-
-	switch (prop_id){
-	case PROP_FULL_HEADER:
-		etfci_drop_full_header (etfci);
-		if (g_value_get_object (value))
-			etfci_add_full_header (etfci, E_TABLE_HEADER(g_value_get_object (value)));
-		break;
-
-	case PROP_HEADER:
-		etfci_drop_table_header (etfci);
-		if (g_value_get_object (value))
-			etfci_add_table_header (etfci, E_TABLE_HEADER(g_value_get_object (value)));
-		break;
-
-	case PROP_DND_CODE:
-		g_free(etfci->dnd_code);
-		etfci->dnd_code = g_strdup(g_value_get_string (value));
-		break;
-
-	case PROP_WIDTH:
-		etfci->width = g_value_get_double (value);
-		gnome_canvas_item_request_update(item);
-		break;
-	}
-}
-
-static void
-etfci_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
-	GnomeCanvasItem *item;
-	ETableFieldChooserItem *etfci;
-
-	item = GNOME_CANVAS_ITEM (object);
-	etfci = E_TABLE_FIELD_CHOOSER_ITEM (object);
-
-	switch (prop_id){
-
-	case PROP_DND_CODE:
-		g_value_set_string (value, g_strdup (etfci->dnd_code));
-		break;
-	case PROP_WIDTH:
-		g_value_set_double (value, etfci->width);
-		break;
-	case PROP_HEIGHT:
-		g_value_set_double (value, etfci->height);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-etfci_drag_data_get (GtkWidget          *widget,
-		     GdkDragContext     *context,
-		     GtkSelectionData   *selection_data,
-		     guint               info,
-		     guint               time,
-		     ETableFieldChooserItem *etfci)
-{
-	if (etfci->drag_col != -1) {
-		gchar *string = g_strdup_printf("%d", etfci->drag_col);
-		gtk_selection_data_set(selection_data,
-				       GDK_SELECTION_TYPE_STRING,
-				       sizeof(string[0]),
-				       string,
-				       strlen(string));
-		g_free(string);
-	}
-}
-
-static void
-etfci_drag_end (GtkWidget      *canvas, 
-		GdkDragContext *context,
-		ETableFieldChooserItem *etfci)
-{
-	etfci->drag_col = -1;
-}
-
-static void
-etfci_realize (GnomeCanvasItem *item)
-{
-	ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
-	GdkWindow *window;
-
-	if (GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)-> realize)
-		(*GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)->realize)(item);
-
-	window = GTK_WIDGET (item->canvas)->window;
-
-	if (!etfci->font)
-		etfci_font_load (etfci);
-
-	etfci->drag_end_id = g_signal_connect (
-		item->canvas, "drag_end",
-		G_CALLBACK (etfci_drag_end), etfci);
-	etfci->drag_data_get_id = g_signal_connect (
-		item->canvas, "drag_data_get",
-		G_CALLBACK (etfci_drag_data_get), etfci);
-	e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(etfci));
-}
-
-static void
-etfci_unrealize (GnomeCanvasItem *item)
-{
-	ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
-
-	if (etfci->font)
-		gdk_font_unref (etfci->font);
-	etfci->font = NULL;
-
-	g_signal_handler_disconnect (item->canvas, etfci->drag_end_id);
-	etfci->drag_end_id = 0;
-	g_signal_handler_disconnect (item->canvas, etfci->drag_data_get_id);
-	etfci->drag_data_get_id = 0;
-	
-	if (GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)->unrealize)
-		(*GNOME_CANVAS_ITEM_CLASS (etfci_parent_class)->unrealize)(item);
-}
-
-static void
-etfci_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height)
-{
-	ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
-	GnomeCanvas *canvas = item->canvas;
-	int rows;
-	int y1, y2;
-	int row;
-	GtkStyle *style;
-	GtkStateType state;
-
-	if (etfci->combined_header == NULL)
-		return;
-
-	rows = e_table_header_count (etfci->combined_header);
-
-	style = GTK_WIDGET (canvas)->style;
-	state = GTK_WIDGET_STATE (canvas);
-
-	y1 = y2 = 0;
-	for (row = 0; row < rows; row++, y1 = y2){
-		ETableCol *ecol;
-
-		ecol = e_table_header_get_column (etfci->combined_header, row);
-
-		if (ecol->disabled)
-			continue;
-
-		y2 += e_table_header_compute_height (ecol, GTK_WIDGET (canvas));
-		
-		if (y1 > (y + height))
-			break;
-
-		if (y2 < y)
-			continue;
-
-		e_table_header_draw_button (drawable, ecol,
-					    style, state,
-					    GTK_WIDGET (canvas),
-					    -x, y1 - y,
-					    width, height,
-					    etfci->width, y2 - y1,
-					    E_TABLE_COL_ARROW_NONE);
-	}
-}
-
-static double
-etfci_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
-	    GnomeCanvasItem **actual_item)
-{
-	*actual_item = item;
-	return 0.0;
-}
-
-static gboolean
-etfci_maybe_start_drag (ETableFieldChooserItem *etfci, int x, int y)
-{
-	if (!etfci->maybe_drag)
-		return FALSE;
-
-	if (MAX (abs (etfci->click_x - x),
-		 abs (etfci->click_y - y)) <= 3)
-		return FALSE;
-
-	return TRUE;
-}
-
-static void
-etfci_start_drag (ETableFieldChooserItem *etfci, GdkEvent *event, double x, double y)
-{
-	GtkWidget *widget = GTK_WIDGET (GNOME_CANVAS_ITEM (etfci)->canvas);
-	GtkTargetList *list;
-	GdkDragContext *context;
-	ETableCol *ecol;
-	GdkPixmap *pixmap;
-	int drag_col;
-	int button_height;
-
-	GtkTargetEntry  etfci_drag_types [] = {
-		{ TARGET_ETABLE_COL_TYPE, 0, TARGET_ETABLE_COL_HEADER },
-	};
-
-	if (etfci->combined_header == NULL)
-		return;
-
-	drag_col = etfci_find_button(etfci, y);
-
-	if (drag_col < 0 || drag_col > e_table_header_count(etfci->combined_header))
-		return;
-
-	ecol = e_table_header_get_column (etfci->combined_header, drag_col);
-
-	if (ecol->disabled)
-		return;
-
-	etfci->drag_col = ecol->col_idx;
-
-	etfci_drag_types[0].target = g_strdup_printf("%s-%s", etfci_drag_types[0].target, etfci->dnd_code);
-	d(g_print ("etfci - %s\n", etfci_drag_types[0].target));
-	list = gtk_target_list_new (etfci_drag_types, ELEMENTS (etfci_drag_types));
-	context = gtk_drag_begin (widget, list, GDK_ACTION_MOVE, 1, event);
-	g_free(etfci_drag_types[0].target);
-
-	button_height = e_table_header_compute_height (ecol, widget);
-	pixmap = gdk_pixmap_new (widget->window, etfci->width, button_height, -1);
-
-	e_table_header_draw_button (pixmap, ecol,
-				    widget->style, GTK_WIDGET_STATE (widget),
-				    widget,
-				    0, 0,
-				    etfci->width, button_height,
-				    etfci->width, button_height,
-				    E_TABLE_COL_ARROW_NONE);
-
-	gtk_drag_set_icon_pixmap        (context,
-					 gdk_window_get_colormap (widget->window),
-					 pixmap,
-					 NULL,
-					 etfci->width / 2,
-					 button_height / 2);
-	gdk_pixmap_unref (pixmap);
-	etfci->maybe_drag = FALSE;
-}
-
-/*
- * Handles the events on the ETableFieldChooserItem
- */
-static int
-etfci_event (GnomeCanvasItem *item, GdkEvent *e)
-{
-	ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
-	GnomeCanvas *canvas = item->canvas;
-	int x, y;
-	
-	switch (e->type){
-	case GDK_MOTION_NOTIFY:
-		gnome_canvas_w2c (canvas, e->motion.x, e->motion.y, &x, &y);
-
-		if (etfci_maybe_start_drag (etfci, x, y))
-			etfci_start_drag (etfci, e, x, y);
-		break;
-		
-	case GDK_BUTTON_PRESS:
-		gnome_canvas_w2c (canvas, e->button.x, e->button.y, &x, &y);
-		
-		if (e->button.button == 1){
-			etfci->click_x = x;
-			etfci->click_y = y;
-			etfci->maybe_drag = TRUE;
-		}
-		break;
-		
-	case GDK_BUTTON_RELEASE: {
-		etfci->maybe_drag = FALSE;
-		break;
-	}
-	
-	default:
-		return FALSE;
-	}
-	return TRUE;
-}
-
-static void
-etfci_class_init (GObjectClass *object_class)
-{
-	GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
-
-	etfci_parent_class = g_type_class_ref (PARENT_OBJECT_TYPE);
-	
-	object_class->dispose = etfci_dispose;
-	object_class->set_property = etfci_set_property;
-	object_class->get_property = etfci_get_property;
-
-	item_class->update      = etfci_update;
-	item_class->realize     = etfci_realize;
-	item_class->unrealize   = etfci_unrealize;
-	item_class->draw        = etfci_draw;
-	item_class->point       = etfci_point;
-	item_class->event       = etfci_event;
-
-	g_object_class_install_property (object_class, PROP_DND_CODE,
-					 g_param_spec_string ("dnd_code",
-							      _("DnD code"),
-							      /*_( */"XXX blurb" /*)*/,
-							      NULL,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_FULL_HEADER,
-					 g_param_spec_object ("full_header",
-							      _("Full Header"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_HEADER_TYPE,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_HEADER,
-					 g_param_spec_object ("header",
-							      _("Header"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_HEADER_TYPE,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_WIDTH,
-					 g_param_spec_double ("width",
-							      _("Width"),
-							      /*_( */"XXX blurb" /*)*/,
-							      0, G_MAXDOUBLE, 0,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_HEIGHT,
-					 g_param_spec_double ("height",
-							      _("Height"),
-							      /*_( */"XXX blurb" /*)*/,
-							      0, G_MAXDOUBLE, 0,
-							      G_PARAM_READABLE));
-}
-
-static void
-etfci_init (GnomeCanvasItem *item)
-{
-	ETableFieldChooserItem *etfci = E_TABLE_FIELD_CHOOSER_ITEM (item);
-
-	etfci->full_header = NULL;
-	etfci->header = NULL;
-	etfci->combined_header = NULL;
-	
-	etfci->height = etfci->width = 0;
-
-	etfci->font = NULL;
-
-	etfci->full_header_structure_change_id = 0;
-	etfci->full_header_dimension_change_id = 0;
-	etfci->table_header_structure_change_id = 0;
-	etfci->table_header_dimension_change_id = 0;
-
-	etfci->dnd_code = NULL;
-
-	etfci->maybe_drag = 0;
-	etfci->drag_end_id = 0;
-
-	e_canvas_item_set_reflow_callback(item, etfci_reflow);
-}
-
-E_MAKE_TYPE (e_table_field_chooser_item,
-	     "ETableFieldChooserItem",
-	     ETableFieldChooserItem,
-	     etfci_class_init,
-	     etfci_init,
-	     PARENT_OBJECT_TYPE);
diff --git a/widgets/table/e-table-field-chooser-item.h b/widgets/table/e-table-field-chooser-item.h
deleted file mode 100644
index 2ed37d37f1..0000000000
--- a/widgets/table/e-table-field-chooser-item.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-field-chooser-item.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_FIELD_CHOOSER_ITEM_H_
-#define _E_TABLE_FIELD_CHOOSER_ITEM_H_
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <libxml/tree.h>
-#include <gal/e-table/e-table-header.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_FIELD_CHOOSER_ITEM_TYPE        (e_table_field_chooser_item_get_type ())
-#define E_TABLE_FIELD_CHOOSER_ITEM(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_FIELD_CHOOSER_ITEM_TYPE, ETableFieldChooserItem))
-#define E_TABLE_FIELD_CHOOSER_ITEM_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_FIELD_CHOOSER_ITEM_TYPE, ETableFieldChooserItemClass))
-#define E_IS_TABLE_FIELD_CHOOSER_ITEM(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_FIELD_CHOOSER_ITEM_TYPE))
-#define E_IS_TABLE_FIELD_CHOOSER_ITEM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_FIELD_CHOOSER_ITEM_TYPE))
-
-typedef struct {
-	GnomeCanvasItem  parent;
-	ETableHeader    *full_header;
-	ETableHeader    *header;
-	ETableHeader    *combined_header;
-
-	double           height, width;
-
-	GdkFont         *font;
-
-	/*
-	 * Ids
-	 */
-	int full_header_structure_change_id, full_header_dimension_change_id;
-	int table_header_structure_change_id, table_header_dimension_change_id;
-
-	gchar           *dnd_code;
-
-	/*
-	 * For dragging columns
-	 */
-	guint            maybe_drag:1;
-	int              click_x, click_y;
-	int              drag_col;
-	guint            drag_data_get_id;
-        guint            drag_end_id;
-} ETableFieldChooserItem;
-
-typedef struct {
-	GnomeCanvasItemClass parent_class;
-} ETableFieldChooserItemClass;
-
-GType      e_table_field_chooser_item_get_type (void);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_FIELD_CHOOSER_ITEM_H_ */
diff --git a/widgets/table/e-table-field-chooser.c b/widgets/table/e-table-field-chooser.c
deleted file mode 100644
index 25b94b2aca..0000000000
--- a/widgets/table/e-table-field-chooser.c
+++ /dev/null
@@ -1,302 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-field-chooser.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtk.h>
-#include <gtk/gtkbox.h>
-#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include "e-table-field-chooser.h"
-#include "e-table-field-chooser-item.h"
-#include <gal/util/e-i18n.h>
-#include <gal/util/e-util.h>
-
-static void e_table_field_chooser_init		(ETableFieldChooser		 *card);
-static void e_table_field_chooser_class_init	(ETableFieldChooserClass	 *klass);
-static void e_table_field_chooser_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
-static void e_table_field_chooser_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
-static void e_table_field_chooser_dispose (GObject *object);
-
-#define PARENT_TYPE GTK_TYPE_VBOX
-static GtkVBoxClass *parent_class = NULL;
-
-/* The arguments we take */
-enum {
-	PROP_0,
-	PROP_FULL_HEADER,
-	PROP_HEADER,
-	PROP_DND_CODE
-};
-
-E_MAKE_TYPE (e_table_field_chooser,
-	     "ETableFieldChooser",
-	     ETableFieldChooser,
-	     e_table_field_chooser_class_init,
-	     e_table_field_chooser_init,
-	     PARENT_TYPE);
-
-static void
-e_table_field_chooser_class_init (ETableFieldChooserClass *klass)
-{
-	GObjectClass *object_class;
-	GtkVBoxClass *vbox_class;
-
-	object_class = (GObjectClass*) klass;
-	vbox_class = (GtkVBoxClass *) klass;
-
-	glade_init();
-
-	parent_class = g_type_class_ref (GTK_TYPE_VBOX);
-
-	object_class->set_property = e_table_field_chooser_set_property;
-	object_class->get_property = e_table_field_chooser_get_property;
-	object_class->dispose      = e_table_field_chooser_dispose;
-
-	g_object_class_install_property (object_class, PROP_DND_CODE,
-					 g_param_spec_string ("dnd_code",
-							      _("DnD code"),
-							      /*_( */"XXX blurb" /*)*/,
-							      NULL,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_FULL_HEADER,
-					 g_param_spec_object ("full_header",
-							      _("Full Header"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_HEADER_TYPE,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_HEADER,
-					 g_param_spec_object ("header",
-							      _("Header"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_HEADER_TYPE,
-							      G_PARAM_READWRITE));
-}
-
-static void
-ensure_nonzero_step_increments (ETableFieldChooser *etfc)
-{
-	GtkAdjustment *va, *ha;
-
-	va = gtk_layout_get_vadjustment (GTK_LAYOUT (etfc->canvas));
-	ha = gtk_layout_get_hadjustment (GTK_LAYOUT (etfc->canvas));
-
-	/*
-	  it looks pretty complicated to get height of column header
-	  so use 16 pixels which should be OK
-	*/ 
-	if (va)
-		va->step_increment = 16.0;
-	if (ha)
-		ha->step_increment = 16.0;
-}
-
-static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, ETableFieldChooser *etfc)
-{
-	double height;
-	etfc->last_alloc = *allocation;
-	gnome_canvas_item_set( etfc->item,
-			       "width", (double) allocation->width,
-			       NULL );
-	g_object_get(etfc->item,
-		     "height", &height,
-		     NULL);
-	height = MAX(height, allocation->height);
-	gnome_canvas_set_scroll_region(GNOME_CANVAS( etfc->canvas ), 0, 0, allocation->width - 1, height - 1);
-	gnome_canvas_item_set( etfc->rect,
-			       "x2", (double) allocation->width,
-			       "y2", (double) height,
-			       NULL );
-	ensure_nonzero_step_increments (etfc);
-}
-
-static void resize(GnomeCanvas *canvas, ETableFieldChooser *etfc)
-{
-	double height;
-	g_object_get(etfc->item,
-		     "height", &height,
-		     NULL);
-
-	height = MAX(height, etfc->last_alloc.height);
-
-	gnome_canvas_set_scroll_region (GNOME_CANVAS(etfc->canvas), 0, 0, etfc->last_alloc.width - 1, height - 1);
-	gnome_canvas_item_set( etfc->rect,
-			       "x2", (double) etfc->last_alloc.width,
-			       "y2", (double) height,
-			       NULL );	
-	ensure_nonzero_step_increments (etfc);
-}
-
-static void
-e_table_field_chooser_init (ETableFieldChooser *etfc)
-{
-	GladeXML *gui;
-	GtkWidget *widget;
-
-	gui = glade_xml_new (ETABLE_GLADEDIR "/e-table-field-chooser.glade", NULL, E_I18N_DOMAIN);
-	etfc->gui = gui;
-
-	widget = glade_xml_get_widget(gui, "vbox-top");
-	if (!widget) {
-		return;
-	}
-	gtk_widget_reparent(widget,
-			    GTK_WIDGET(etfc));
-
-	gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
-	etfc->canvas = GNOME_CANVAS(glade_xml_get_widget(gui, "canvas-buttons"));
-
-	etfc->rect = gnome_canvas_item_new(gnome_canvas_root( GNOME_CANVAS( etfc->canvas ) ),
-					   gnome_canvas_rect_get_type(),
-					   "x1", (double) 0,
-					   "y1", (double) 0,
-					   "x2", (double) 100,
-					   "y2", (double) 100,
-					   "fill_color", "white",
-					   NULL );
-
-	etfc->item = gnome_canvas_item_new(gnome_canvas_root(etfc->canvas),
-					   e_table_field_chooser_item_get_type(),
-					   "width", (double) 100,
-					   "full_header", etfc->full_header,
-					   "header", etfc->header,
-					   "dnd_code", etfc->dnd_code,
-					   NULL );
-
-	g_signal_connect( etfc->canvas, "reflow",
-			  G_CALLBACK ( resize ),
-			  etfc);
-
-	gnome_canvas_set_scroll_region ( GNOME_CANVAS( etfc->canvas ),
-					 0, 0,
-					 100, 100 );
-
-	/* Connect the signals */
-	g_signal_connect (etfc->canvas, "size_allocate",
-			  G_CALLBACK (allocate_callback),
-			  etfc);
-
-	gtk_widget_pop_colormap ();
-	gtk_widget_show_all(widget);
-}
-
-static void
-e_table_field_chooser_dispose (GObject *object)
-{
-	ETableFieldChooser *etfc = E_TABLE_FIELD_CHOOSER(object);
-
-	g_free (etfc->dnd_code);
-	etfc->dnd_code = NULL;
-
-	if (etfc->full_header)
-		g_object_unref (etfc->full_header);
-	etfc->full_header = NULL;
-	
-	if (etfc->header)
-		g_object_unref (etfc->header);
-	etfc->header = NULL;
-
-	if (etfc->gui)
-		g_object_unref (etfc->gui);
-	etfc->gui = NULL;
-
-	if (G_OBJECT_CLASS (parent_class)->dispose)
-		(* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-GtkWidget*
-e_table_field_chooser_new (void)
-{
-	GtkWidget *widget = GTK_WIDGET (g_object_new (E_TABLE_FIELD_CHOOSER_TYPE, NULL));
-	return widget;
-}
-
-static void
-e_table_field_chooser_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
-	ETableFieldChooser *etfc = E_TABLE_FIELD_CHOOSER(object);
-
-	switch (prop_id){
-	case PROP_DND_CODE:
-		g_free(etfc->dnd_code);
-		etfc->dnd_code = g_strdup(g_value_get_string(value));
-		if (etfc->item)
-			g_object_set(etfc->item,
-				     "dnd_code", etfc->dnd_code,
-				     NULL);
-		break;
-	case PROP_FULL_HEADER:
-		if (etfc->full_header)
-			g_object_unref (etfc->full_header);
-		if (g_value_get_object (value))
-			etfc->full_header = E_TABLE_HEADER(g_value_get_object (value));
-		else
-			etfc->full_header = NULL;
-		if (etfc->full_header)
-			g_object_ref (etfc->full_header);
-		if (etfc->item)
-			g_object_set(etfc->item,
-				     "full_header", etfc->full_header,
-				     NULL);
-		break;
-	case PROP_HEADER:
-		if (etfc->header)
-			g_object_unref (etfc->header);
-		if (g_value_get_object (value))
-			etfc->header = E_TABLE_HEADER(g_value_get_object (value));
-		else
-			etfc->header = NULL;
-		if (etfc->header)
-			g_object_ref (etfc->header);
-		if (etfc->item)
-			g_object_set(etfc->item,
-				     "header", etfc->header,
-				     NULL);
-		break;
-	default:
-		break;
-	}
-}
-
-static void
-e_table_field_chooser_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
-	ETableFieldChooser *etfc = E_TABLE_FIELD_CHOOSER(object);
-
-	switch (prop_id) {
-	case PROP_DND_CODE:
-		g_value_set_string (value, g_strdup (etfc->dnd_code));
-		break;
-	case PROP_FULL_HEADER:
-		g_value_set_object (value, etfc->full_header);
-		break;
-	case PROP_HEADER:
-		g_value_set_object (value, etfc->header);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
diff --git a/widgets/table/e-table-field-chooser.glade b/widgets/table/e-table-field-chooser.glade
deleted file mode 100644
index f46a8dbd52..0000000000
--- a/widgets/table/e-table-field-chooser.glade
+++ /dev/null
@@ -1,123 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd" >
-
-<glade-interface>
-  <widget class="GtkDialog" id="dialog-field-chooser">
-    <property name="visible">no</property>
-    <property name="title" translatable="yes">Field Chooser</property>
-    <property name="type">GTK_WINDOW_TOPLEVEL</property>
-    <property name="modal">no</property>
-    <property name="allow_shrink">no</property>
-    <property name="allow_grow">yes</property>
-    <property name="window-position">GTK_WIN_POS_NONE</property>
-
-    <child internal-child="vbox">
-      <widget class="GtkVBox" id="dialog-vbox1">
-        <property name="homogeneous">no</property>
-        <property name="spacing">8</property>
-        <property name="visible">yes</property>
-
-        <child internal-child="action_area">
-          <widget class="GtkHButtonBox" id="dialog-action_area1">
-            <property name="layout_style">GTK_BUTTONBOX_END</property>
-            <property name="spacing">8</property>
-            <property name="visible">yes</property>
-
-            <child>
-              <widget class="GtkButton" id="button3">
-                <property name="can_default">yes</property>
-                <property name="can_focus">yes</property>
-                <property name="visible">yes</property>
-                <property name="label">gtk-close</property>
-                <property name="use_stock">yes</property>
-                <property name="use_underline">yes</property>
-              </widget>
-            </child>
-          </widget>
-          <packing>
-            <property name="padding">0</property>
-            <property name="expand">no</property>
-            <property name="fill">yes</property>
-            <property name="pack_type">GTK_PACK_END</property>
-          </packing>
-        </child>
-
-        <child>
-          <widget class="GtkVBox" id="vbox-top">
-            <property name="homogeneous">no</property>
-            <property name="spacing">4</property>
-            <property name="visible">yes</property>
-
-            <child>
-              <widget class="GtkLabel" id="label1">
-                <property name="label" translatable="yes">To add a column to your table, drag it into
-the location in which you want it to appear.</property>
-                <property name="justify">GTK_JUSTIFY_CENTER</property>
-                <property name="wrap">no</property>
-                <property name="xalign">0.5</property>
-                <property name="yalign">0.5</property>
-                <property name="xpad">0</property>
-                <property name="ypad">0</property>
-                <property name="visible">yes</property>
-              </widget>
-              <packing>
-                <property name="padding">0</property>
-                <property name="expand">no</property>
-                <property name="fill">no</property>
-              </packing>
-            </child>
-
-            <child>
-              <widget class="GtkScrolledWindow" id="scrolledwindow1">
-                <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                <property name="width-request">200</property>
-                <property name="height-request">200</property>
-                <property name="visible">yes</property>
-
-                <child>
-                  <widget class="Custom" id="canvas-buttons">
-                    <property name="creation_function">e_canvas_new</property>
-                    <property name="int1">0</property>
-                    <property name="int2">0</property>
-                    <property name="last_modification_time">Thu, 08 Jun 2000 07:27:33 GMT</property>
-                    <property name="visible">yes</property>
-                  </widget>
-                </child>
-
-                <child internal-child="hscrollbar">
-                  <widget class="GtkHScrollbar" id="convertwidget1">
-                    <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
-                    <property name="visible">yes</property>
-                  </widget>
-                </child>
-
-                <child internal-child="vscrollbar">
-                  <widget class="GtkVScrollbar" id="convertwidget2">
-                    <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
-                    <property name="visible">yes</property>
-                  </widget>
-                </child>
-              </widget>
-              <packing>
-                <property name="padding">0</property>
-                <property name="expand">yes</property>
-                <property name="fill">yes</property>
-              </packing>
-            </child>
-          </widget>
-          <packing>
-            <property name="padding">0</property>
-            <property name="expand">yes</property>
-            <property name="fill">yes</property>
-          </packing>
-        </child>
-      </widget>
-      <packing>
-        <property name="padding">4</property>
-        <property name="expand">yes</property>
-        <property name="fill">yes</property>
-      </packing>
-    </child>
-  </widget>
-</glade-interface>
diff --git a/widgets/table/e-table-field-chooser.h b/widgets/table/e-table-field-chooser.h
deleted file mode 100644
index 65efeeedbe..0000000000
--- a/widgets/table/e-table-field-chooser.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-field-chooser.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef __E_TABLE_FIELD_CHOOSER_H__
-#define __E_TABLE_FIELD_CHOOSER_H__
-
-#include <glade/glade.h>
-#include <gtk/gtkvbox.h>
-#include <gal/e-table/e-table-header.h>
-
-G_BEGIN_DECLS
-
-/* ETableFieldChooser - A dialog displaying information about a contact.
- *
- * The following arguments are available:
- *
- * name		type		read/write	description
- * --------------------------------------------------------------------------------
- */
-
-#define E_TABLE_FIELD_CHOOSER_TYPE			(e_table_field_chooser_get_type ())
-#define E_TABLE_FIELD_CHOOSER(obj)			(G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TABLE_FIELD_CHOOSER_TYPE, ETableFieldChooser))
-#define E_TABLE_FIELD_CHOOSER_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST ((klass), E_TABLE_FIELD_CHOOSER_TYPE, ETableFieldChooserClass))
-#define E_IS_TABLE_FIELD_CHOOSER(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TABLE_FIELD_CHOOSER_TYPE))
-#define E_IS_TABLE_FIELD_CHOOSER_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((obj), E_TABLE_FIELD_CHOOSER_TYPE))
-
-
-typedef struct _ETableFieldChooser       ETableFieldChooser;
-typedef struct _ETableFieldChooserClass  ETableFieldChooserClass;
-
-struct _ETableFieldChooser
-{
-	GtkVBox parent;
-	
-	/* item specific fields */
-	GladeXML *gui;
-	GnomeCanvas *canvas;
-	GnomeCanvasItem *item;
-
-	GnomeCanvasItem *rect;
-	GtkAllocation last_alloc;
-
-	gchar *dnd_code;
-	ETableHeader *full_header;
-	ETableHeader *header;
-};
-
-struct _ETableFieldChooserClass
-{
-	GtkVBoxClass parent_class;
-};
-
-
-GtkWidget *e_table_field_chooser_new(void);
-GType      e_table_field_chooser_get_type (void);
-
-G_END_DECLS
-
-#endif /* __E_TABLE_FIELD_CHOOSER_H__ */
diff --git a/widgets/table/e-table-group-container.c b/widgets/table/e-table-group-container.c
deleted file mode 100644
index 2fc0617e8f..0000000000
--- a/widgets/table/e-table-group-container.c
+++ /dev/null
@@ -1,1503 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-group-container.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtksignal.h>
-#include <libgnome/libgnome.h>
-#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include "e-table-group-container.h"
-#include "e-table-group-leaf.h"
-#include "e-table-item.h"
-#include "gal/util/e-util.h"
-#include "gal/widgets/e-canvas.h"
-#include "gal/widgets/e-canvas-utils.h"
-#include "gal/widgets/e-unicode.h"
-#include "gal/e-text/e-text.h"
-#include "e-table-defines.h"
-
-#define TITLE_HEIGHT         16
-
-#define PARENT_TYPE e_table_group_get_type ()
-
-static GnomeCanvasGroupClass *etgc_parent_class;
-
-/* The arguments we take */
-enum {
-	PROP_0,
-	PROP_HEIGHT,
-	PROP_WIDTH,
-	PROP_MINIMUM_WIDTH,
-	PROP_FROZEN,
-	PROP_TABLE_ALTERNATING_ROW_COLORS,
-	PROP_TABLE_HORIZONTAL_DRAW_GRID,
-	PROP_TABLE_VERTICAL_DRAW_GRID,
-	PROP_TABLE_DRAW_FOCUS,
-	PROP_CURSOR_MODE,
-	PROP_SELECTION_MODEL,
-	PROP_LENGTH_THRESHOLD,
-	PROP_UNIFORM_ROW_HEIGHT
-};
-
-static EPrintable *
-etgc_get_printable (ETableGroup *etg);
-
-
-static void
-e_table_group_container_child_node_free (ETableGroupContainer          *etgc,
-					ETableGroupContainerChildNode *child_node)
-{
-	ETableGroup *etg = E_TABLE_GROUP (etgc);
-	ETableGroup *child = child_node->child;
-
-	gtk_object_destroy (GTK_OBJECT (child));
-	e_table_model_free_value (etg->model, etgc->ecol->col_idx,
-				  child_node->key);
-	g_free(child_node->string);
-	gtk_object_destroy (GTK_OBJECT (child_node->text));
-	gtk_object_destroy (GTK_OBJECT (child_node->rect));
-}
-
-static void
-e_table_group_container_list_free (ETableGroupContainer *etgc)
-{
-	ETableGroupContainerChildNode *child_node;
-	GList *list;
-
-	for (list = etgc->children; list; list = g_list_next (list)) {
-		child_node = (ETableGroupContainerChildNode *) list->data;
-		e_table_group_container_child_node_free (etgc, child_node);
-	}
-
-	g_list_free (etgc->children);
-	etgc->children = NULL;
-}
-
-static void
-etgc_dispose (GObject *object)
-{
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (object);
-
-	if (etgc->children)
-		e_table_group_container_list_free (etgc);
-
-	if (etgc->font)
-		gdk_font_unref (etgc->font);
-	etgc->font = NULL;
-
-	if (etgc->ecol)
-		g_object_unref (etgc->ecol);
-	etgc->ecol = NULL;
-
-	if (etgc->sort_info)
-		g_object_unref (etgc->sort_info);
-	etgc->sort_info = NULL;
-
-	if (etgc->selection_model)
-		g_object_unref (etgc->selection_model);
-	etgc->selection_model = NULL;
-
-	if (etgc->rect)
-		gtk_object_destroy (GTK_OBJECT(etgc->rect));
-	etgc->rect = NULL;
-
-	G_OBJECT_CLASS (etgc_parent_class)->dispose (object);
-}
-
-/** 
- * e_table_group_container_construct
- * @parent: The %GnomeCanvasGroup to create a child of.
- * @etgc: The %ETableGroupContainer.
- * @full_header: The full header of the %ETable.
- * @header: The current header of the %ETable.
- * @model: The %ETableModel of the %ETable.
- * @sort_info: The %ETableSortInfo of the %ETable.
- * @n: Which grouping level this is (Starts at 0 and sends n + 1 to any child %ETableGroups.
- *
- * This routine constructs the new %ETableGroupContainer.
- */
-void
-e_table_group_container_construct (GnomeCanvasGroup *parent, ETableGroupContainer *etgc,
-				   ETableHeader *full_header,
-				   ETableHeader     *header,
-				   ETableModel *model, ETableSortInfo *sort_info, int n)
-{
-	ETableCol *col;
-	ETableSortColumn column = e_table_sort_info_grouping_get_nth(sort_info, n);
-
-	col = e_table_header_get_column_by_col_idx(full_header, column.column);
-	if (col == NULL)
-		col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
-
-	e_table_group_construct (parent, E_TABLE_GROUP (etgc), full_header, header, model);
-	etgc->ecol = col;
-	g_object_ref (etgc->ecol);
-	etgc->sort_info = sort_info;
-	g_object_ref (etgc->sort_info);
-	etgc->n = n;
-	etgc->ascending = column.ascending;
-
-	etgc->font = gtk_style_get_font (GTK_WIDGET (GNOME_CANVAS_ITEM (etgc)->canvas)->style);
-	
-	gdk_font_ref (etgc->font);
-
-	etgc->open = TRUE;
-}
-
-/** 
- * e_table_group_container_new
- * @parent: The %GnomeCanvasGroup to create a child of.
- * @full_header: The full header of the %ETable.
- * @header: The current header of the %ETable.
- * @model: The %ETableModel of the %ETable.
- * @sort_info: The %ETableSortInfo of the %ETable.
- * @n: Which grouping level this is (Starts at 0 and sends n + 1 to any child %ETableGroups.
- *
- * %ETableGroupContainer is an %ETableGroup which groups by the nth
- * grouping of the %ETableSortInfo.  It creates %ETableGroups as
- * children.
- *
- * Returns: The new %ETableGroupContainer.
- */
-ETableGroup *
-e_table_group_container_new (GnomeCanvasGroup *parent, ETableHeader *full_header,
-			     ETableHeader     *header,
-			     ETableModel *model, ETableSortInfo *sort_info, int n)
-{
-	ETableGroupContainer *etgc;
-
-	g_return_val_if_fail (parent != NULL, NULL);
-	
-	etgc = g_object_new (E_TABLE_GROUP_CONTAINER_TYPE, NULL);
-
-	e_table_group_container_construct (parent, etgc, full_header, header,
-					   model, sort_info, n);
-	return E_TABLE_GROUP (etgc);
-}
-
-
-static int
-etgc_event (GnomeCanvasItem *item, GdkEvent *event)
-{
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(item);
-	gboolean return_val = TRUE;
-	gboolean change_focus = FALSE;
-	gboolean use_col = FALSE;
-	gint start_col = 0;
-	gint old_col;
-	EFocus direction = E_FOCUS_START;
-
-	switch (event->type) {
-	case GDK_KEY_PRESS:
-		if (event->key.keyval == GDK_Tab || 
-		    event->key.keyval == GDK_KP_Tab || 
-		    event->key.keyval == GDK_ISO_Left_Tab) {
-			change_focus = TRUE;
-			use_col      = TRUE;
-			start_col    = (event->key.state & GDK_SHIFT_MASK) ? -1 : 0;
-			direction    = (event->key.state & GDK_SHIFT_MASK) ? E_FOCUS_END : E_FOCUS_START;
-		} else if (event->key.keyval == GDK_Left ||
-			   event->key.keyval == GDK_KP_Left) {
-			change_focus = TRUE;
-			use_col      = TRUE;
-			start_col    = -1;
-			direction    = E_FOCUS_END;
-		} else if (event->key.keyval == GDK_Right ||
-			   event->key.keyval == GDK_KP_Right) {
-			change_focus = TRUE;
-			use_col   = TRUE;
-			start_col = 0;
-			direction = E_FOCUS_START;
-		} else if (event->key.keyval == GDK_Down ||
-			   event->key.keyval == GDK_KP_Down) {
-			change_focus = TRUE;
-			use_col      = FALSE;
-			direction    = E_FOCUS_START;
-		} else if (event->key.keyval == GDK_Up ||
-			   event->key.keyval == GDK_KP_Up) {
-			change_focus = TRUE;
-			use_col      = FALSE;
-			direction    = E_FOCUS_END;
-		} else if (event->key.keyval == GDK_Return ||
-			   event->key.keyval == GDK_KP_Enter) {
-			change_focus = TRUE;
-			use_col      = FALSE;
-			direction    = E_FOCUS_START;
-		}
-		if (change_focus){		
-			GList *list;
-			for (list = etgc->children; list; list = list->next) {
-				ETableGroupContainerChildNode *child_node;
-				ETableGroup                   *child;
-
-				child_node = (ETableGroupContainerChildNode *)list->data;
-				child      = child_node->child;
-
-				if (e_table_group_get_focus (child)) {
-					old_col = e_table_group_get_focus_column (child);
-					if (old_col == -1)
-						old_col = 0;
-					if (start_col == -1)
-						start_col = e_table_header_count (e_table_group_get_header (child)) - 1;
-					
-					if (direction == E_FOCUS_END)
-						list = list->prev;
-					else
-						list = list->next;
-					
-					if (list) {
-						child_node = (ETableGroupContainerChildNode *)list->data;
-						child = child_node->child;
-						if (use_col)
-							e_table_group_set_focus (child, direction, start_col);
-						else
-							e_table_group_set_focus (child, direction, old_col);
-						return 1;
-					} else {
-						return 0;
-					}
-				}
-			}
-			if (direction == E_FOCUS_END)
-				list = g_list_last(etgc->children);
-			else
-				list = etgc->children;
-			if (list) {
-				ETableGroupContainerChildNode *child_node;
-				ETableGroup                   *child;
-
-				child_node = (ETableGroupContainerChildNode *)list->data;
-				child = child_node->child;
-
-				if (start_col == -1)
-					start_col = e_table_header_count (e_table_group_get_header (child)) - 1;
-
-				e_table_group_set_focus (child, direction, start_col);
-				return 1;
-			}
-		}
-		return_val = FALSE;
-		break;
-	default:
-		return_val = FALSE;
-		break;
-	}
-	if (return_val == FALSE) {
-		if (GNOME_CANVAS_ITEM_CLASS(etgc_parent_class)->event)
-			return GNOME_CANVAS_ITEM_CLASS (etgc_parent_class)->event (item, event);
-	}
-	return return_val;
-	
-}
-
-/* Realize handler for the text item */
-static void
-etgc_realize (GnomeCanvasItem *item)
-{
-	ETableGroupContainer *etgc;
-
-	if (GNOME_CANVAS_ITEM_CLASS (etgc_parent_class)->realize)
-		(* GNOME_CANVAS_ITEM_CLASS (etgc_parent_class)->realize) (item);
-
-	etgc = E_TABLE_GROUP_CONTAINER (item);
-
-	e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (etgc));
-}
-
-/* Unrealize handler for the etgc item */
-static void
-etgc_unrealize (GnomeCanvasItem *item)
-{
-	ETableGroupContainer *etgc;
-
-	etgc = E_TABLE_GROUP_CONTAINER (item);
-	
-	if (GNOME_CANVAS_ITEM_CLASS (etgc_parent_class)->unrealize)
-		(* GNOME_CANVAS_ITEM_CLASS (etgc_parent_class)->unrealize) (item);
-}
-
-static void
-compute_text (ETableGroupContainer *etgc, ETableGroupContainerChildNode *child_node)
-{
-	gchar *text;
-
-	if (etgc->ecol->text) {
-		text = g_strdup_printf ((child_node->count == 1)
-					? _("%s : %s (%d item)")
-					: _("%s : %s (%d items)"),
-					etgc->ecol->text, child_node->string,
-					(gint) child_node->count);
-	} else {
-		text = g_strdup_printf ((child_node->count == 1)
-					? _("%s (%d item)")
-					: _("%s (%d items)"),
-					child_node->string,
-					(gint) child_node->count);
-	}
-	gnome_canvas_item_set (child_node->text, 
-			       "text", text,
-			       NULL);
-	g_free (text);
-}
-
-static void
-child_cursor_change (ETableGroup *etg, int row,
-		    ETableGroupContainer *etgc)
-{
-	e_table_group_cursor_change (E_TABLE_GROUP (etgc), row);
-}
-
-static void
-child_cursor_activated (ETableGroup *etg, int row,
-		    ETableGroupContainer *etgc)
-{
-	e_table_group_cursor_activated (E_TABLE_GROUP (etgc), row);
-}
-
-static void
-child_double_click (ETableGroup *etg, int row, int col, GdkEvent *event,
-		    ETableGroupContainer *etgc)
-{
-	e_table_group_double_click (E_TABLE_GROUP (etgc), row, col, event);
-}
-
-static gint
-child_right_click (ETableGroup *etg, int row, int col, GdkEvent *event,
-		   ETableGroupContainer *etgc)
-{
-	return e_table_group_right_click (E_TABLE_GROUP (etgc), row, col, event);
-}
-
-static gint
-child_click (ETableGroup *etg, int row, int col, GdkEvent *event,
-		   ETableGroupContainer *etgc)
-{
-	return e_table_group_click (E_TABLE_GROUP (etgc), row, col, event);
-}
-
-static gint
-child_key_press (ETableGroup *etg, int row, int col, GdkEvent *event,
-		 ETableGroupContainer *etgc)
-{
-	return e_table_group_key_press (E_TABLE_GROUP (etgc), row, col, event);
-}
-
-static gint
-child_start_drag (ETableGroup *etg, int row, int col, GdkEvent *event,
-		 ETableGroupContainer *etgc)
-{
-	return e_table_group_start_drag (E_TABLE_GROUP (etgc), row, col, event);
-}
-
-static ETableGroupContainerChildNode *
-create_child_node (ETableGroupContainer *etgc, void *val)
-{
-	ETableGroup *child;
-	ETableGroupContainerChildNode *child_node;
-	ETableGroup *etg = E_TABLE_GROUP(etgc);
-
-	child_node = g_new (ETableGroupContainerChildNode, 1);
-	child_node->rect = gnome_canvas_item_new (GNOME_CANVAS_GROUP (etgc),
-						  gnome_canvas_rect_get_type (),
-						  "fill_color", "grey70",
-						  "outline_color", "grey50",
-						  NULL);
-	child_node->text = gnome_canvas_item_new (GNOME_CANVAS_GROUP (etgc),
-						  e_text_get_type (),
-						  "anchor", GTK_ANCHOR_SW,
-						  "fill_color", "black",
-						  "draw_background", FALSE,
-						  NULL);
-	child = e_table_group_new (GNOME_CANVAS_GROUP (etgc), etg->full_header,
-				   etg->header, etg->model, etgc->sort_info, etgc->n + 1);
-	gnome_canvas_item_set(GNOME_CANVAS_ITEM(child),
-			      "alternating_row_colors", etgc->alternating_row_colors,
-			      "horizontal_draw_grid", etgc->horizontal_draw_grid,
-			      "vertical_draw_grid", etgc->vertical_draw_grid,
-			      "drawfocus", etgc->draw_focus,
-			      "cursor_mode", etgc->cursor_mode,
-			      "selection_model", etgc->selection_model,
-			      "length_threshold", etgc->length_threshold,
-			      "uniform_row_height", etgc->uniform_row_height,
-			      "minimum_width", etgc->minimum_width - GROUP_INDENT,
-			      NULL);
-
-	g_signal_connect (child, "cursor_change",
-			  G_CALLBACK (child_cursor_change), etgc);
-	g_signal_connect (child, "cursor_activated",
-			  G_CALLBACK (child_cursor_activated), etgc);
-	g_signal_connect (child, "double_click",
-			  G_CALLBACK (child_double_click), etgc);
-	g_signal_connect (child, "right_click",
-			  G_CALLBACK (child_right_click), etgc);
-	g_signal_connect (child, "click",
-			  G_CALLBACK (child_click), etgc);
-	g_signal_connect (child, "key_press",
-			  G_CALLBACK (child_key_press), etgc);
-	g_signal_connect (child, "start_drag",
-			  G_CALLBACK (child_start_drag), etgc);
-	child_node->child = child;
-	child_node->key = e_table_model_duplicate_value (etg->model, etgc->ecol->col_idx, val);
-	child_node->string = e_table_model_value_to_string (etg->model, etgc->ecol->col_idx, val);
-	child_node->count = 0;
-
-	return child_node;
-}
-
-static void
-etgc_add (ETableGroup *etg, gint row)
-{
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (etg);
-	void *val = e_table_model_value_at (etg->model, etgc->ecol->col_idx, row);
-	GCompareFunc comp = etgc->ecol->compare;
-	GList *list = etgc->children;
-	ETableGroup *child;
-	ETableGroupContainerChildNode *child_node;
-	int i = 0;
-
-	for (; list; list = g_list_next (list), i++){
-		int comp_val;
-
-		child_node = list->data;
-		comp_val = (*comp)(child_node->key, val);
-		if (comp_val == 0) {
-			child = child_node->child;
-			child_node->count ++;
-			e_table_group_add (child, row);
-			compute_text (etgc, child_node);
-			return;
-		}
-		if ((comp_val > 0 && etgc->ascending) ||
-		    (comp_val < 0 && (!etgc->ascending)))
-			break;
-	}
-	child_node = create_child_node (etgc, val);
-	child = child_node->child;
-	child_node->count = 1;
-	e_table_group_add (child, row);
-
-	if (list)
-		etgc->children = g_list_insert (etgc->children, child_node, i);
-	else
-		etgc->children = g_list_append (etgc->children, child_node);
-
-	compute_text (etgc, child_node);
-	e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (etgc));
-}
-
-static void
-etgc_add_array (ETableGroup *etg, const int *array, int count)
-{
-	int i;
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (etg);
-	void *lastval = 0;
-	int laststart = 0;
-	GCompareFunc comp = etgc->ecol->compare;
-	ETableGroupContainerChildNode *child_node;
-	ETableGroup *child;
-
-	if (count <= 0)
-		return;
-
-	e_table_group_container_list_free (etgc);
-	etgc->children = NULL;
-
-	lastval = e_table_model_value_at (etg->model, etgc->ecol->col_idx, array[0]);
-
-	for (i = 1; i < count; i++) {
-		void *val = e_table_model_value_at (etg->model, etgc->ecol->col_idx, array[i]);
-		int comp_val;
-
-		comp_val = (*comp)(lastval, val);
-		if (comp_val != 0) {
-			child_node = create_child_node(etgc, lastval);
-			child = child_node->child;
-
-			e_table_group_add_array(child, array + laststart, i - laststart);
-			child_node->count = i - laststart;
-
-			etgc->children = g_list_append (etgc->children, child_node);
-			compute_text (etgc, child_node);
-			laststart = i;
-			lastval = val;
-		}
-	}
-
-	child_node = create_child_node(etgc, lastval);
-	child = child_node->child;
-
-	e_table_group_add_array(child, array + laststart, i - laststart);
-	child_node->count = i - laststart;
-
-	etgc->children = g_list_append (etgc->children, child_node);
-	compute_text (etgc, child_node);
-
-	e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (etgc));
-}
-
-static void
-etgc_add_all (ETableGroup *etg)
-{
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (etg);
-	ESorter *sorter = etgc->selection_model->sorter;
-	int *array;
-	int count;
-
-	e_sorter_get_sorted_to_model_array(sorter, &array, &count);
-
-	etgc_add_array(etg, array, count);
-}
-
-static gboolean
-etgc_remove (ETableGroup *etg, gint row)
-{
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
-	GList *list;
-
-	for (list = etgc->children ; list; list = g_list_next (list)) {
-		ETableGroupContainerChildNode *child_node = list->data;
-		ETableGroup                   *child = child_node->child;
-
-		if (e_table_group_remove (child, row)) {
-			child_node->count --;
-			if (child_node->count == 0) {
-				e_table_group_container_child_node_free (etgc, child_node);
-				etgc->children = g_list_remove (etgc->children, child_node);
-				g_free (child_node);
-			} else
-				compute_text (etgc, child_node);
-
-			e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (etgc));
-
-			return TRUE;
-		}
-	}
-	return FALSE;
-}
-
-static int
-etgc_row_count (ETableGroup *etg)
-{
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
-	GList *list;
-	gint count = 0;
-	for (list = etgc->children; list; list = g_list_next(list)) {
-		ETableGroup *group = ((ETableGroupContainerChildNode *)list->data)->child;
-		gint this_count = e_table_group_row_count(group);
-		count += this_count;
-	}
-	return count;
-}
-
-static void
-etgc_increment (ETableGroup *etg, gint position, gint amount)
-{
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
-	GList *list = etgc->children;
-
-	for (list = etgc->children ; list; list = g_list_next (list))
-		e_table_group_increment (((ETableGroupContainerChildNode *)list->data)->child,
-					 position, amount);
-}
-
-static void
-etgc_decrement (ETableGroup *etg, gint position, gint amount)
-{
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
-	GList *list = etgc->children;
-
-	for (list = etgc->children ; list; list = g_list_next (list))
-		e_table_group_decrement (((ETableGroupContainerChildNode *)list->data)->child,
-					 position, amount);
-}
-
-static void
-etgc_set_focus (ETableGroup *etg, EFocus direction, gint view_col)
-{
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
-	if (etgc->children) {
-		if (direction == E_FOCUS_END)
-			e_table_group_set_focus (((ETableGroupContainerChildNode *)g_list_last (etgc->children)->data)->child,
-						 direction, view_col);
-		else
-			e_table_group_set_focus (((ETableGroupContainerChildNode *)etgc->children->data)->child,
-						 direction, view_col);
-	}
-}
-
-static gint
-etgc_get_focus_column (ETableGroup *etg)
-{
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
-	if (etgc->children) {
-		GList *list;
-		for (list = etgc->children; list; list = list->next) {
-			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
-			ETableGroup *child = child_node->child;
-			if (e_table_group_get_focus (child)) {
-				return e_table_group_get_focus_column (child);
-			}
-		}
-	}
-	return 0;
-}
-
-static void
-etgc_compute_location (ETableGroup *etg, int *x, int *y, int *row, int *col)
-{
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
-
-	if (row)
-		*row = -1;
-	if (col)
-		*col = -1;
-
-	*x -= GROUP_INDENT;
-	*y -= TITLE_HEIGHT;
-
-	if (*x >= 0 && *y >= 0 && etgc->children) {
-		GList *list;
-		for (list = etgc->children; list; list = list->next) {
-			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
-			ETableGroup *child = child_node->child;
-
-			e_table_group_compute_location (child, x, y, row, col);
-			if ((*row != -1) && (*col != -1))
-				return;
-		}
-	}
-}
-
-static void
-etgc_get_cell_geometry (ETableGroup *etg, int *row, int *col, int *x, int *y, int *width, int *height)
-{
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
-
-	int ypos;
-
-	ypos = 0;
-
-	if (etgc->children) {
-		GList *list;
-		for (list = etgc->children; list; list = list->next) {
-			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
-			ETableGroup *child = child_node->child;
-			int thisy;
-
-			e_table_group_get_cell_geometry (child, row, col, x, &thisy, width, height);
-			ypos += thisy;
-			if ((*row == -1) || (*col == -1)) {
-				ypos += TITLE_HEIGHT;
-				*x += GROUP_INDENT;
-				*y = ypos;
-				return;
-			}
-		}
-	}
-}
-
-static void etgc_thaw (ETableGroup *etg)
-{
-	e_canvas_item_request_reflow (GNOME_CANVAS_ITEM(etg));
-}
-
-static void
-etgc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
-	ETableGroup *etg = E_TABLE_GROUP (object);
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (object);
-	GList *list;
-
-	switch (prop_id) {
-	case PROP_FROZEN:
-		if (g_value_get_boolean (value))
-			etg->frozen = TRUE;
-		else {
-			etg->frozen = FALSE;
-			etgc_thaw (etg);
-		}
-		break;
-	case PROP_MINIMUM_WIDTH:
-	case PROP_WIDTH:
-		etgc->minimum_width = g_value_get_double (value);
-
-		for (list = etgc->children; list; list = g_list_next (list)) {
-			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
-			g_object_set (child_node->child,
-				      "minimum_width", etgc->minimum_width - GROUP_INDENT,
-				      NULL);
-		}
-		break;
-	case PROP_LENGTH_THRESHOLD:
-		etgc->length_threshold = g_value_get_int (value);
-		for (list = etgc->children; list; list = g_list_next (list)) {
-			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
-			g_object_set (child_node->child,
-				      "length_threshold", etgc->length_threshold,
-				      NULL);
-		}
-		break;
-	case PROP_UNIFORM_ROW_HEIGHT:
-		etgc->uniform_row_height = g_value_get_boolean (value);
-		for (list = etgc->children; list; list = g_list_next (list)) {
-			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
-			g_object_set (child_node->child,
-				      "uniform_row_height", etgc->uniform_row_height,
-				      NULL);
-		}
-		break;
-
-	case PROP_SELECTION_MODEL:
-		if (etgc->selection_model)
-			g_object_unref (etgc->selection_model);
-		etgc->selection_model = E_SELECTION_MODEL(g_value_get_object (value));
-		if (etgc->selection_model)
-			g_object_ref (etgc->selection_model);
-		for (list = etgc->children; list; list = g_list_next (list)) {
-			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
-			g_object_set (child_node->child,
-				      "selection_model", etgc->selection_model,
-				      NULL);
-		}
-		break;
-
-	case PROP_TABLE_ALTERNATING_ROW_COLORS:
-		etgc->alternating_row_colors = g_value_get_boolean (value);
-		for (list = etgc->children; list; list = g_list_next (list)) {
-			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
-			g_object_set (child_node->child,
-				      "alternating_row_colors", etgc->alternating_row_colors,
-				      NULL);
-		}
-		break;
-
-	case PROP_TABLE_HORIZONTAL_DRAW_GRID:
-		etgc->horizontal_draw_grid = g_value_get_boolean (value);
-		for (list = etgc->children; list; list = g_list_next (list)) {
-			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
-			g_object_set (child_node->child,
-				      "horizontal_draw_grid", etgc->horizontal_draw_grid,
-				      NULL);
-		}
-		break;
-
-	case PROP_TABLE_VERTICAL_DRAW_GRID:
-		etgc->vertical_draw_grid = g_value_get_boolean (value);
-		for (list = etgc->children; list; list = g_list_next (list)) {
-			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
-			g_object_set (child_node->child,
-				      "vertical_draw_grid", etgc->vertical_draw_grid,
-				      NULL);
-		}
-		break;
-
-	case PROP_TABLE_DRAW_FOCUS:
-		etgc->draw_focus = g_value_get_boolean (value);
-		for (list = etgc->children; list; list = g_list_next (list)) {
-			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
-			g_object_set (child_node->child,
-				      "drawfocus", etgc->draw_focus,
-				      NULL);
-		}
-		break;
-
-	case PROP_CURSOR_MODE:
-		etgc->cursor_mode = g_value_get_int (value);
-		for (list = etgc->children; list; list = g_list_next (list)) {
-			ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *)list->data;
-			g_object_set (child_node->child,
-				      "cursor_mode", etgc->cursor_mode,
-				      NULL);
-		}
-		break;
-	default:
-		break;
-	}
-}
-
-static void
-etgc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
-	ETableGroup *etg = E_TABLE_GROUP (object);
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (object);
-
-	switch (prop_id) {
-	case PROP_FROZEN:
-		g_value_set_boolean (value, etg->frozen);
-		break;
-	case PROP_HEIGHT:
-		g_value_set_double (value, etgc->height);
-		break;
-	case PROP_WIDTH:	
-		g_value_set_double (value, etgc->width);
-		break;
-	case PROP_MINIMUM_WIDTH:
-		g_value_set_double (value, etgc->minimum_width);
-		break;
-	case PROP_UNIFORM_ROW_HEIGHT:
-		g_value_set_boolean (value, etgc->uniform_row_height);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-etgc_class_init (GObjectClass *object_class)
-{
-	GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
-	ETableGroupClass *e_group_class = E_TABLE_GROUP_CLASS(object_class);
-
-	object_class->dispose = etgc_dispose;
-	object_class->set_property = etgc_set_property;
-	object_class->get_property = etgc_get_property;
-
-	item_class->event = etgc_event;
-	item_class->realize = etgc_realize;
-	item_class->unrealize = etgc_unrealize;
-
-	etgc_parent_class = g_type_class_ref (PARENT_TYPE);
-
-	e_group_class->add = etgc_add;
-	e_group_class->add_array = etgc_add_array;
-	e_group_class->add_all = etgc_add_all;
-	e_group_class->remove = etgc_remove;
-	e_group_class->increment  = etgc_increment;
-	e_group_class->decrement  = etgc_decrement;
-	e_group_class->row_count  = etgc_row_count;
-	e_group_class->set_focus  = etgc_set_focus;
-	e_group_class->get_focus_column = etgc_get_focus_column;
-	e_group_class->get_printable = etgc_get_printable;
-	e_group_class->compute_location = etgc_compute_location;
-	e_group_class->get_cell_geometry = etgc_get_cell_geometry;
-
-	g_object_class_install_property (object_class, PROP_TABLE_ALTERNATING_ROW_COLORS,
-					 g_param_spec_boolean ("alternating_row_colors",
-							       _( "Alternating Row Colors" ),
-							       _( "Alternating Row Colors" ), 
-							       FALSE,
-							       G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_TABLE_HORIZONTAL_DRAW_GRID,
-					 g_param_spec_boolean ("horizontal_draw_grid",
-							       _( "Horizontal Draw Grid" ),
-							       _( "Horizontal Draw Grid" ),
-							       FALSE,
-							       G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_TABLE_VERTICAL_DRAW_GRID,
-					 g_param_spec_boolean ("vertical_draw_grid",
-							       _( "Vertical Draw Grid" ),
-							       _( "Vertical Draw Grid" ),
-							       FALSE,
-							       G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_TABLE_DRAW_FOCUS,
-					 g_param_spec_boolean ("drawfocus",
-							       _( "Draw focus" ),
-							       _( "Draw focus" ),
-							       FALSE,
-							       G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_CURSOR_MODE,
-					 g_param_spec_int ("cursor_mode",
-							   _( "Cursor mode" ),
-							   _( "Cursor mode" ),
-							   E_CURSOR_LINE, E_CURSOR_SPREADSHEET, E_CURSOR_LINE,
-							   G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_SELECTION_MODEL,
-					 g_param_spec_object ("selection_model",
-							      _( "Selection model" ),
-							      _( "Selection model" ),
-							      E_SELECTION_MODEL_TYPE,
-							      G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_LENGTH_THRESHOLD,
-					 g_param_spec_int ("length_threshold",
-							   _( "Length Threshold" ),
-							   _( "Length Threshold" ),
-							   -1, G_MAXINT, 0,
-							   G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_UNIFORM_ROW_HEIGHT,
-					 g_param_spec_boolean ("uniform_row_height",
-							       _( "Uniform row height" ),
-							       _( "Uniform row height" ),
-							       FALSE,
-							       G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_FROZEN,
-					 g_param_spec_boolean ("frozen",
-							       _( "Frozen" ),
-							       _( "Frozen" ),
-							       FALSE,
-							       G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_HEIGHT,
-					 g_param_spec_double ("height",
-							      _( "Height" ),
-							      _( "Height" ),
-							      0.0, G_MAXDOUBLE, 0.0,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_WIDTH,
-					 g_param_spec_double ("width",
-							      _( "Width" ),
-							      _( "Width" ),
-							      0.0, G_MAXDOUBLE, 0.0,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_MINIMUM_WIDTH,
-					 g_param_spec_double ("minimum_width",
-							      _( "Minimum width" ),
-							      _( "Minimum Width" ),
-							      0.0, G_MAXDOUBLE, 0.0,
-							      G_PARAM_READWRITE));
-}
-
-static void
-etgc_reflow (GnomeCanvasItem *item, gint flags)
-{
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(item);
-	gboolean frozen;
-
-        g_object_get (etgc,
-		      "frozen", &frozen,
-		      NULL);
-
-	if (frozen)
-		return;
-	
-
-	if (GTK_OBJECT_FLAGS(etgc)& GNOME_CANVAS_ITEM_REALIZED){
-		gdouble running_height = 0;
-		gdouble running_width = 0;
-		gdouble old_height;
-		gdouble old_width;
-		
-		old_height = etgc->height;
-		old_width = etgc->width;
-		if (etgc->children == NULL){
-		} else {
-			GList *list;
-			gdouble extra_height = 0;
-			gdouble item_height = 0;
-			gdouble item_width = 0;
-			
-			if (etgc->font)
-				extra_height += etgc->font->ascent + etgc->font->descent + BUTTON_PADDING * 2;
-			
-			extra_height = MAX(extra_height, BUTTON_HEIGHT + BUTTON_PADDING * 2);
-				
-			running_height = extra_height;
-			
-			for ( list = etgc->children; list; list = g_list_next (list)){
-				ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *) list->data;
-				ETableGroup *child = child_node->child;
-				
-				g_object_get (child,
-					      "width", &item_width,
-					      NULL);
-
-				if (item_width > running_width)
-					running_width = item_width;
-			}
-			for ( list = etgc->children; list; list = g_list_next (list)){
-				ETableGroupContainerChildNode *child_node = (ETableGroupContainerChildNode *) list->data;
-				ETableGroup *child = child_node->child;
-				g_object_get (child,
-					      "height", &item_height,
-					      NULL);
-				
-				e_canvas_item_move_absolute (GNOME_CANVAS_ITEM(child_node->text),
-							    GROUP_INDENT,
-							    running_height - BUTTON_PADDING);
-				
-				e_canvas_item_move_absolute (GNOME_CANVAS_ITEM(child),
-							    GROUP_INDENT,
-							    running_height);
-				
-				gnome_canvas_item_set (GNOME_CANVAS_ITEM(child_node->rect),
-						      "x1", (double) 0,
-						      "x2", (double) running_width + GROUP_INDENT,
-						      "y1", (double) running_height - extra_height,
-						      "y2", (double) running_height + item_height,
-						      NULL);
-				
-				running_height += item_height + extra_height;
-			}
-			running_height -= extra_height;
-		}
-		if (running_height != old_height || running_width != old_width) {
-			etgc->height = running_height;
-			etgc->width = running_width;
-			e_canvas_item_request_parent_reflow (item);
-		}
-	}
-}
-
-static void
-etgc_init (GtkObject *object)
-{
-	ETableGroupContainer *container = E_TABLE_GROUP_CONTAINER(object);
-	container->children = FALSE;
-	
-	e_canvas_item_set_reflow_callback (GNOME_CANVAS_ITEM(object), etgc_reflow);
-
-	container->alternating_row_colors = 1;
-	container->horizontal_draw_grid = 1;
-	container->vertical_draw_grid = 1;
-	container->draw_focus = 1;
-	container->cursor_mode = E_CURSOR_SIMPLE;
-	container->length_threshold = -1;
-	container->selection_model = NULL;
-	container->uniform_row_height = FALSE;
-}
-
-E_MAKE_TYPE (e_table_group_container, "ETableGroupContainer", ETableGroupContainer, etgc_class_init, etgc_init, PARENT_TYPE)
-
-void
-e_table_group_apply_to_leafs (ETableGroup *etg, ETableGroupLeafFn fn, void *closure)
-{
-	if (E_IS_TABLE_GROUP_CONTAINER (etg)){
-		ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (etg);
-		GList *list = etgc->children;
-
-		/* Protect from unrefs in the callback functions */
-		g_object_ref (etg);
-
-		for (list = etgc->children; list; list = list->next){
-			ETableGroupContainerChildNode *child_node = list->data;
-
-			e_table_group_apply_to_leafs (child_node->child, fn, closure);
-		}
-
-		g_object_unref (etg);
-	} else if (E_IS_TABLE_GROUP_LEAF (etg)){
-		(*fn) (E_TABLE_GROUP_LEAF (etg)->item, closure);
-	} else {
-		g_error ("Unknown ETableGroup found: %s",
-			 g_type_name (G_TYPE_FROM_INSTANCE (etg)));
-	}
-}
-
-
-typedef struct {
-	ETableGroupContainer *etgc;
-	GList *child;
-	EPrintable *child_printable;
-} ETGCPrintContext;
-
-#if 0
-#define CHECK(x) if((x) == -1) return -1;
-
-static gint
-gp_draw_rect (GnomePrintContext *context, gdouble x, gdouble y, gdouble width, gdouble height, gdouble r, gdouble g, gdouble b)
-{
-	CHECK(gnome_print_moveto(context, x, y));
-	CHECK(gnome_print_lineto(context, x + width, y));
-	CHECK(gnome_print_lineto(context, x + width, y - height));
-	CHECK(gnome_print_lineto(context, x, y - height));
-	CHECK(gnome_print_lineto(context, x, y));
-	return gnome_print_fill(context);
-}
-#endif
-
-#define CHECK(x) if((x) == -1) return -1;
-
-static gint
-gp_draw_rect (GnomePrintContext *context, gdouble x, gdouble y, gdouble width, gdouble height)
-{
-	CHECK(gnome_print_moveto(context, x, y));
-	CHECK(gnome_print_lineto(context, x + width, y));
-	CHECK(gnome_print_lineto(context, x + width, y - height));
-	CHECK(gnome_print_lineto(context, x, y - height));
-	CHECK(gnome_print_lineto(context, x, y));
-	return gnome_print_fill(context);
-}
-
-#define TEXT_HEIGHT (12)
-#define TEXT_AREA_HEIGHT (TEXT_HEIGHT + 4)
-
-static void
-e_table_group_container_print_page  (EPrintable *ep,
-				     GnomePrintContext *context,
-				     gdouble width,
-				     gdouble height,
-				     gboolean quantize,
-				     ETGCPrintContext *groupcontext)
-{
-	gdouble yd = height;
-	gdouble child_height;
-	ETableGroupContainerChildNode *child_node;
-	GList *child;
-	EPrintable *child_printable;
-	gchar *string;
-	GnomeFont *font = gnome_font_find ("Helvetica", TEXT_HEIGHT);
-
-	child_printable = groupcontext->child_printable;
-	child = groupcontext->child;
-
-	if (child_printable) {
-		if (child)
-			child_node = child->data;
-		else
-			child_node = NULL;
-		g_object_ref (child_printable);
-	} else {
-		if (!child) {
-			return;
-		} else {
-			child_node = child->data;
-			child_printable = e_table_group_get_printable(child_node->child);
-			if (child_printable)
-				g_object_ref (child_printable);
-			e_printable_reset(child_printable);
-		}
-	}
-
-	while (1) {
-		child_height = e_printable_height(child_printable, context, width - 36, yd - TEXT_AREA_HEIGHT, quantize);
-
-		if (gnome_print_gsave(context) == -1)
-			/* FIXME */;
-		if (gnome_print_moveto(context, 0, yd - child_height - TEXT_AREA_HEIGHT) == -1)
-			/* FIXME */;
-		if (gnome_print_lineto(context, 36, yd - child_height - TEXT_AREA_HEIGHT) == -1)
-			/* FIXME */;
-		if (gnome_print_lineto(context, 36, yd - TEXT_AREA_HEIGHT) == -1)
-			/* FIXME */;
-		if (gnome_print_lineto(context, width, yd - TEXT_AREA_HEIGHT) == -1)
-			/* FIXME */;
-		if (gnome_print_lineto(context, width, yd) == -1)
-			/* FIXME */;
-		if (gnome_print_lineto(context, 0, yd) == -1)
-			/* FIXME */;
-		if (gnome_print_lineto(context, 0, yd - child_height - TEXT_AREA_HEIGHT) == -1)
-			/* FIXME */;
-		if (gnome_print_setrgbcolor(context, .7, .7, .7) == -1)
-			/* FIXME */;
-		if (gnome_print_fill(context) == -1)
-			/* FIXME */;
-		if (gnome_print_grestore(context) == -1)
-			/* FIXME */;
-
-		if (gnome_print_gsave(context) == -1)
-			/* FIXME */;
-		if (gnome_print_moveto(context, 0, yd - TEXT_AREA_HEIGHT) == -1)
-			/* FIXME */;
-		if (gnome_print_lineto(context, width, yd - TEXT_AREA_HEIGHT) == -1)
-			/* FIXME */;
-		if (gnome_print_lineto(context, width, yd) == -1)
-			/* FIXME */;
-		if (gnome_print_lineto(context, 0, yd) == -1)
-			/* FIXME */;
-		if (gnome_print_lineto(context, 0, yd - TEXT_AREA_HEIGHT) == -1)
-			/* FIXME */;
-		if (gnome_print_clip(context) == -1)
-			/* FIXME */;
-
-		if (gnome_print_moveto(context, 2, yd - (TEXT_AREA_HEIGHT + gnome_font_get_ascender(font) - gnome_font_get_descender(font)) / 2) == -1)
-			/* FIXME */;
-		if (gnome_print_setfont(context, font))
-			/* FIXME */;
-		if (groupcontext->etgc->ecol->text)
-			string = g_strdup_printf ("%s : %s (%d item%s)",
-						  groupcontext->etgc->ecol->text,
-						  child_node->string,
-						  (gint) child_node->count,
-						  child_node->count == 1 ? "" : "s");
-		else
-			string = g_strdup_printf ("%s (%d item%s)",
-						  child_node->string,
-						  (gint) child_node->count,
-						  child_node->count == 1 ? "" : "s");
-		if (gnome_print_show(context, string))
-			/* FIXME */;
-		g_free(string);
-		if (gnome_print_grestore(context) == -1)
-			/* FIXME */;
-
-		if (gnome_print_gsave(context) == -1)
-			/* FIXME */;
-		if (gnome_print_translate(context, 36, yd - TEXT_AREA_HEIGHT - child_height) == -1)
-			/* FIXME */;
-		if (gnome_print_moveto(context, 0, 0) == -1)
-			/* FIXME */;
-		if (gnome_print_lineto(context, width - 36, 0) == -1)
-			/* FIXME */;
-		if (gnome_print_lineto(context, width - 36, child_height) == -1)
-			/* FIXME */;
-		if (gnome_print_lineto(context, 0, child_height) == -1)
-			/* FIXME */;
-		if (gnome_print_lineto(context, 0, 0) == -1)
-			/* FIXME */;
-		if (gnome_print_clip(context) == -1)
-			/* FIXME */;
-		e_printable_print_page(child_printable, context, width - 36, child_height, quantize);
-		if (gnome_print_grestore(context) == -1)
-			/* FIXME */;
-
-		gp_draw_rect(context, 0, yd - child_height - TEXT_AREA_HEIGHT + 1, width, 1);
-		gp_draw_rect(context, width - 1, yd, 1, yd - child_height - TEXT_AREA_HEIGHT);
-		gp_draw_rect(context, 0, yd, 1, yd - child_height - TEXT_AREA_HEIGHT);
-
-		yd -= child_height + TEXT_AREA_HEIGHT;
-
-		if (e_printable_data_left(child_printable))
-			break;
-
-		child = child->next;
-		if (!child) {
-			child_printable = NULL;
-			break;
-		}
-
-		child_node = child->data;
-		if (child_printable)
-			g_object_unref (child_printable);
-		child_printable = e_table_group_get_printable(child_node->child);
-		if (child_printable)
-			g_object_ref (child_printable);
-		e_printable_reset(child_printable);
-	}
-
-	gp_draw_rect(context, 0, height, width, 1);
-
-	if (groupcontext->child_printable)
-		g_object_unref (groupcontext->child_printable);
-	groupcontext->child_printable = child_printable;
-	groupcontext->child = child;
-			
-}
-
-static gboolean
-e_table_group_container_data_left   (EPrintable *ep,
-				     ETGCPrintContext *groupcontext)
-{
-	g_signal_stop_emission_by_name(ep, "data_left");
-	return groupcontext->child != NULL;
-}
-
-static void
-e_table_group_container_reset       (EPrintable *ep,
-				     ETGCPrintContext *groupcontext)
-{
-	groupcontext->child = groupcontext->etgc->children;
-	if (groupcontext->child_printable)
-		g_object_unref (groupcontext->child_printable);
-	groupcontext->child_printable = NULL;
-}
-
-static gdouble
-e_table_group_container_height      (EPrintable *ep,
-				     GnomePrintContext *context,
-				     gdouble width,
-				     gdouble max_height,
-				     gboolean quantize,
-				     ETGCPrintContext *groupcontext)
-{
-	gdouble height = 0;
-	gdouble child_height;
-	gdouble yd = max_height;
-	ETableGroupContainerChildNode *child_node;
-	GList *child;
-	EPrintable *child_printable;
-
-	child_printable = groupcontext->child_printable;
-	child = groupcontext->child;
-
-	if (child_printable)
-		g_object_ref (child_printable);
-	else {
-		if (!child) {
-			g_signal_stop_emission_by_name(ep, "height");
-			return 0;
-		} else {
-			child_node = child->data;
-			child_printable = e_table_group_get_printable(child_node->child);
-			if (child_printable)
-				g_object_ref (child_printable);
-			e_printable_reset(child_printable);
-		}
-	}
-
-	if (yd != -1 && yd < TEXT_AREA_HEIGHT)
-		return 0;
-	
-	while (1) {
-		child_height = e_printable_height(child_printable, context, width - 36, yd - (yd == -1 ? 0 : TEXT_AREA_HEIGHT), quantize);
-
-		height += child_height + TEXT_AREA_HEIGHT;
-
-		if (yd != -1) {
-			if (!e_printable_will_fit(child_printable, context, width - 36, yd - (yd == -1 ? 0 : TEXT_AREA_HEIGHT), quantize)) {
-				break;
-			}
-
-			yd -= child_height + TEXT_AREA_HEIGHT;
-		}
-
-		child = child->next;
-		if (!child) {
-			break;
-		}
-		
-		child_node = child->data;
-		if (child_printable)
-			g_object_unref (child_printable);
-		child_printable = e_table_group_get_printable(child_node->child);
-		if (child_printable)
-			g_object_ref (child_printable);
-		e_printable_reset(child_printable);
-	}
-	if (child_printable)
-		g_object_unref (child_printable);
-	g_signal_stop_emission_by_name(ep, "height");
-	return height;
-}
-
-static gboolean
-e_table_group_container_will_fit      (EPrintable *ep,
-				       GnomePrintContext *context,
-				       gdouble width,
-				       gdouble max_height,
-				       gboolean quantize,
-				       ETGCPrintContext *groupcontext)
-{
-	gboolean will_fit = TRUE;
-	gdouble child_height;
-	gdouble yd = max_height;
-	ETableGroupContainerChildNode *child_node;
-	GList *child;
-	EPrintable *child_printable;
-
-	child_printable = groupcontext->child_printable;
-	child = groupcontext->child;
-
-	if (child_printable)
-		g_object_ref (child_printable);
-	else {
-		if (!child) {
-			g_signal_stop_emission_by_name(ep, "will_fit");
-			return will_fit;
-		} else {
-			child_node = child->data;
-			child_printable = e_table_group_get_printable(child_node->child);
-			if (child_printable)
-				g_object_ref (child_printable);
-			e_printable_reset(child_printable);
-		}
-	}
-	
-	if (yd != -1 && yd < TEXT_AREA_HEIGHT)
-		will_fit = FALSE;
-	else {
-		while (1) {
-			child_height = e_printable_height(child_printable, context, width - 36, yd - (yd == -1 ? 0 : TEXT_AREA_HEIGHT), quantize);
-			
-			if (yd != -1) {
-				if (!e_printable_will_fit(child_printable, context, width - 36, yd - (yd == -1 ? 0 : TEXT_AREA_HEIGHT), quantize)) {
-					will_fit = FALSE;
-					break;
-				}
-				
-				yd -= child_height + TEXT_AREA_HEIGHT;
-			}
-			
-			child = child->next;
-			if (!child) {
-				break;
-			}
-			
-			child_node = child->data;
-			if (child_printable)
-				g_object_unref (child_printable);
-			child_printable = e_table_group_get_printable(child_node->child);
-			if (child_printable)
-				g_object_ref (child_printable);
-			e_printable_reset(child_printable);
-		}
-	}
-
-	if (child_printable)
-		g_object_unref (child_printable);
-
-	g_signal_stop_emission_by_name(ep, "will_fit");
-	return will_fit;
-}
-
-static void
-e_table_group_container_printable_destroy (gpointer data,
-					   GObject *where_object_was)
-					   
-{
-	ETGCPrintContext *groupcontext = data;
-
-	g_object_unref (groupcontext->etgc);
-	if (groupcontext->child_printable)
-		g_object_ref (groupcontext->child_printable);
-	g_free(groupcontext);
-}
-
-static EPrintable *
-etgc_get_printable (ETableGroup *etg)
-{
-	ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg);
-	EPrintable *printable = e_printable_new();
-	ETGCPrintContext *groupcontext;
-
-	groupcontext = g_new(ETGCPrintContext, 1);
-	groupcontext->etgc = etgc;
-	g_object_ref (etgc);
-	groupcontext->child = etgc->children;
-	groupcontext->child_printable = NULL;
-
-	g_signal_connect (printable,
-			  "print_page",
-			  G_CALLBACK(e_table_group_container_print_page),
-			  groupcontext);
-	g_signal_connect (printable,
-			  "data_left",
-			  G_CALLBACK(e_table_group_container_data_left),
-			  groupcontext);
-	g_signal_connect (printable,
-			  "reset",
-			  G_CALLBACK(e_table_group_container_reset),
-			  groupcontext);
-	g_signal_connect (printable,
-			  "height",
-			  G_CALLBACK(e_table_group_container_height),
-			  groupcontext);
-	g_signal_connect (printable,
-			  "will_fit",
-			  G_CALLBACK(e_table_group_container_will_fit),
-			  groupcontext);
-	g_object_weak_ref (G_OBJECT (printable),
-			   e_table_group_container_printable_destroy,
-			   groupcontext);
-
-	return printable;
-}
diff --git a/widgets/table/e-table-group-container.h b/widgets/table/e-table-group-container.h
deleted file mode 100644
index d1809e48fd..0000000000
--- a/widgets/table/e-table-group-container.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-group-container.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_GROUP_CONTAINER_H_
-#define _E_TABLE_GROUP_CONTAINER_H_
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gal/e-table/e-table-model.h>
-#include <gal/e-table/e-table-header.h>
-#include <gal/e-table/e-table-group.h>
-#include <gal/e-table/e-table-item.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_GROUP_CONTAINER_TYPE        (e_table_group_container_get_type ())
-#define E_TABLE_GROUP_CONTAINER(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_GROUP_CONTAINER_TYPE, ETableGroupContainer))
-#define E_TABLE_GROUP_CONTAINER_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_GROUP_CONTAINER_TYPE, ETableGroupContainerClass))
-#define E_IS_TABLE_GROUP_CONTAINER(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_GROUP_CONTAINER_TYPE))
-#define E_IS_TABLE_GROUP_CONTAINER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_GROUP_CONTAINER_TYPE))
-
-typedef struct {
-	ETableGroup group;
-
-	/*
-	 * The ETableCol used to group this set
-	 */
-	ETableCol    *ecol;
-	gint          ascending;
-
-	/*
-	 * List of ETableGroups we stack
-	 */
-	GList *children;
-
-	/*
-	 * The canvas rectangle that contains the children
-	 */
-	GnomeCanvasItem *rect;
-
-	GdkFont *font;
-
-	gdouble width, height, minimum_width;
-
-	ETableSortInfo *sort_info;
-	int n;
-	int length_threshold;
-
-	ESelectionModel *selection_model;
-
-	guint alternating_row_colors : 1;
-	guint horizontal_draw_grid : 1;
-	guint vertical_draw_grid : 1;
-	guint draw_focus : 1;
-	guint uniform_row_height : 1;
-	ECursorMode cursor_mode;
-
-	/*
-	 * State: the ETableGroup is open or closed
-	 */
-	guint open:1;
-} ETableGroupContainer;
-
-typedef struct {
-	ETableGroupClass parent_class;
-} ETableGroupContainerClass;
-
-typedef struct {
-        ETableGroup *child;
-        void *key;
-        char *string;
-        GnomeCanvasItem *text;
-        GnomeCanvasItem *rect;
-        gint count;
-} ETableGroupContainerChildNode;
-
-
-ETableGroup *e_table_group_container_new       (GnomeCanvasGroup *parent, ETableHeader *full_header, ETableHeader     *header,
-						ETableModel *model, ETableSortInfo *sort_info, int n);
-void         e_table_group_container_construct (GnomeCanvasGroup *parent, ETableGroupContainer *etgc,
-						ETableHeader *full_header,
-						ETableHeader     *header,
-						ETableModel *model, ETableSortInfo *sort_info, int n);
-
-GType        e_table_group_container_get_type  (void);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_GROUP_CONTAINER_H_ */
diff --git a/widgets/table/e-table-group-leaf.c b/widgets/table/e-table-group-leaf.c
deleted file mode 100644
index 083345ed74..0000000000
--- a/widgets/table/e-table-group-leaf.c
+++ /dev/null
@@ -1,686 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-group-leaf.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include "e-table-group-leaf.h"
-#include "e-table-item.h"
-#include "e-table-sorted-variable.h"
-#include "e-table-sorted.h"
-#include "gal/util/e-util.h"
-#include "gal/util/e-i18n.h"
-#include "gal/widgets/e-canvas.h"
-
-#define PARENT_TYPE e_table_group_get_type ()
-
-static GnomeCanvasGroupClass *etgl_parent_class;
-
-/* The arguments we take */
-enum {
-	PROP_0,
-	PROP_HEIGHT,
-	PROP_WIDTH,
-	PROP_MINIMUM_WIDTH,
-	PROP_FROZEN,
-	PROP_TABLE_ALTERNATING_ROW_COLORS,
-	PROP_TABLE_HORIZONTAL_DRAW_GRID,
-	PROP_TABLE_VERTICAL_DRAW_GRID,
-	PROP_TABLE_DRAW_FOCUS,
-	PROP_CURSOR_MODE,
-	PROP_LENGTH_THRESHOLD,
-	PROP_SELECTION_MODEL,
-	PROP_UNIFORM_ROW_HEIGHT
-};
-
-static void
-etgl_dispose (GObject *object)
-{
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF(object);
-
-	if (etgl->ets) {
-		g_object_unref (etgl->ets);
-		etgl->ets = NULL;
-	}
-
-	if (etgl->item) {
-		if (etgl->etgl_cursor_change_id != 0)
-			g_signal_handler_disconnect (etgl->item,
-						     etgl->etgl_cursor_change_id);
-		if (etgl->etgl_cursor_activated_id != 0)
-			g_signal_handler_disconnect (etgl->item,
-						     etgl->etgl_cursor_activated_id);
-		if (etgl->etgl_double_click_id != 0)
-			g_signal_handler_disconnect (etgl->item,
-						     etgl->etgl_double_click_id);
-		if (etgl->etgl_right_click_id != 0)
-			g_signal_handler_disconnect (etgl->item,
-						     etgl->etgl_right_click_id);
-		if (etgl->etgl_click_id != 0)
-			g_signal_handler_disconnect (etgl->item,
-						     etgl->etgl_click_id);
-		if (etgl->etgl_key_press_id != 0)
-			g_signal_handler_disconnect (etgl->item,
-						     etgl->etgl_key_press_id);
-		if (etgl->etgl_start_drag_id != 0)
-			g_signal_handler_disconnect (etgl->item,
-						     etgl->etgl_start_drag_id);
-
-		etgl->etgl_cursor_change_id = 0;
-		etgl->etgl_cursor_activated_id = 0;
-		etgl->etgl_double_click_id = 0;
-		etgl->etgl_right_click_id = 0;
-		etgl->etgl_click_id = 0;
-		etgl->etgl_key_press_id = 0;
-		etgl->etgl_start_drag_id = 0;
-
-		gtk_object_destroy (GTK_OBJECT(etgl->item));
-		etgl->item = NULL;
-	}
-
-	if (etgl->selection_model) {
-		g_object_unref (etgl->selection_model);
-		etgl->selection_model = NULL;
-	}
-
-	if (G_OBJECT_CLASS (etgl_parent_class)->dispose)
-		G_OBJECT_CLASS (etgl_parent_class)->dispose (object);
-}
-
-static void
-e_table_group_leaf_construct (GnomeCanvasGroup *parent,
-			      ETableGroupLeaf  *etgl,
-			      ETableHeader     *full_header,
-			      ETableHeader     *header,
-			      ETableModel      *model,
-			      ETableSortInfo   *sort_info)
-{
-	etgl->is_grouped = e_table_sort_info_grouping_get_count(sort_info) > 0 ? TRUE : FALSE;
-
-	if (etgl->is_grouped)
-		etgl->ets = E_TABLE_SUBSET(e_table_sorted_variable_new (model,
-									full_header,
-									sort_info));
-	else
-		etgl->ets = E_TABLE_SUBSET(e_table_sorted_new (model,
-							       full_header,
-							       sort_info));
-
-	e_table_group_construct (parent, E_TABLE_GROUP (etgl), full_header, header, model);
-}
-
-/**
- * e_table_group_leaf_new
- * @parent: The %GnomeCanvasGroup to create a child of.
- * @full_header: The full header of the %ETable.
- * @header: The current header of the %ETable.
- * @model: The %ETableModel of the %ETable.
- * @sort_info: The %ETableSortInfo of the %ETable.
- *
- * %ETableGroupLeaf is an %ETableGroup which simply contains an
- * %ETableItem.
- *
- * Returns: The new %ETableGroupLeaf.
- */
-ETableGroup *
-e_table_group_leaf_new       (GnomeCanvasGroup *parent,
-			      ETableHeader     *full_header,
-			      ETableHeader     *header,
-			      ETableModel      *model,
-			      ETableSortInfo   *sort_info)
-{
-	ETableGroupLeaf *etgl;
-
-	g_return_val_if_fail (parent != NULL, NULL);
-
-	etgl = g_object_new (E_TABLE_GROUP_LEAF_TYPE, NULL);
-
-	e_table_group_leaf_construct (parent, etgl, full_header,
-				      header, model, sort_info);
-	return E_TABLE_GROUP (etgl);
-}
-
-static void
-etgl_cursor_change (GtkObject *object, gint row, ETableGroupLeaf *etgl)
-{
-	if (row < E_TABLE_SUBSET(etgl->ets)->n_map)
-		e_table_group_cursor_change (E_TABLE_GROUP(etgl),
-					     E_TABLE_SUBSET(etgl->ets)->map_table[row]);
-}
-
-static void
-etgl_cursor_activated (GtkObject *object, gint view_row, ETableGroupLeaf *etgl)
-{
-	if (view_row < E_TABLE_SUBSET(etgl->ets)->n_map)
-		e_table_group_cursor_activated (E_TABLE_GROUP(etgl),
-						E_TABLE_SUBSET(etgl->ets)->map_table[view_row]);
-}
-
-static void
-etgl_double_click (GtkObject *object, gint model_row, gint model_col, GdkEvent *event,
-		   ETableGroupLeaf *etgl)
-{
-	e_table_group_double_click (E_TABLE_GROUP(etgl), model_row, model_col, event);
-}
-
-static gint
-etgl_key_press (GtkObject *object, gint row, gint col, GdkEvent *event, ETableGroupLeaf *etgl)
-{
-	if (row < E_TABLE_SUBSET(etgl->ets)->n_map && row >= 0)
-		return e_table_group_key_press (E_TABLE_GROUP(etgl),
-						E_TABLE_SUBSET(etgl->ets)->map_table[row],
-						col,
-						event);
-	else
-		return 0;
-}
-
-static gint
-etgl_start_drag (GtkObject *object, gint model_row, gint model_col, GdkEvent *event,
-		 ETableGroupLeaf *etgl)
-{
-	return e_table_group_start_drag (E_TABLE_GROUP(etgl), model_row, model_col, event);
-}
-
-static gint
-etgl_right_click (GtkObject *object, gint view_row, gint model_col, GdkEvent *event,
-		  ETableGroupLeaf *etgl)
-{
-	if (view_row < E_TABLE_SUBSET(etgl->ets)->n_map)
-		return e_table_group_right_click (E_TABLE_GROUP(etgl),
-						  E_TABLE_SUBSET(etgl->ets)->map_table[view_row],
-						  model_col,
-						  event);
-	else
-		return 0;
-}
-
-static gint
-etgl_click (GtkObject *object, gint row, gint col, GdkEvent *event, ETableGroupLeaf *etgl)
-{
-	if (row < E_TABLE_SUBSET(etgl->ets)->n_map)
-		return e_table_group_click (E_TABLE_GROUP(etgl),
-					    E_TABLE_SUBSET(etgl->ets)->map_table[row],
-					    col,
-					    event);
-	else
-		return 0;
-}
-
-static void
-etgl_reflow (GnomeCanvasItem *item, gint flags)
-{
-	ETableGroupLeaf *leaf = E_TABLE_GROUP_LEAF(item);
-
-	g_object_get(leaf->item,
-		     "height", &leaf->height,
-		     NULL);
-	g_object_get(leaf->item,
-		     "width", &leaf->width,
-		     NULL);
-
-	e_canvas_item_request_parent_reflow (item);
-}
-
-static void
-etgl_realize (GnomeCanvasItem *item)
-{
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF(item);
-
-	if (GNOME_CANVAS_ITEM_CLASS (etgl_parent_class)->realize)
-		GNOME_CANVAS_ITEM_CLASS (etgl_parent_class)->realize (item);
-
-	etgl->item = E_TABLE_ITEM(gnome_canvas_item_new (
-		GNOME_CANVAS_GROUP(etgl),
-		e_table_item_get_type (),
-		"ETableHeader", E_TABLE_GROUP(etgl)->header,
-		"ETableModel", etgl->ets,
-		"alternating_row_colors", etgl->alternating_row_colors,
-		"horizontal_draw_grid", etgl->horizontal_draw_grid,
-		"vertical_draw_grid", etgl->vertical_draw_grid,
-		"drawfocus", etgl->draw_focus,
-		"cursor_mode", etgl->cursor_mode,
-		"minimum_width", etgl->minimum_width,
-		"length_threshold", etgl->length_threshold,
-		"selection_model", etgl->selection_model,
-		"uniform_row_height", etgl->uniform_row_height,
-		NULL));
-
-	etgl->etgl_cursor_change_id    = g_signal_connect (etgl->item,
-							   "cursor_change",
-							   G_CALLBACK(etgl_cursor_change),
-							   etgl);
-	etgl->etgl_cursor_activated_id = g_signal_connect (etgl->item,
-							   "cursor_activated",
-							   G_CALLBACK(etgl_cursor_activated),
-							   etgl);
-	etgl->etgl_double_click_id     = g_signal_connect (etgl->item,
-							   "double_click",
-							   G_CALLBACK(etgl_double_click),
-							   etgl);
-
-	etgl->etgl_right_click_id      = g_signal_connect (etgl->item,
-							   "right_click",
-							   G_CALLBACK(etgl_right_click),
-							   etgl);
-	etgl->etgl_click_id            = g_signal_connect (etgl->item,
-							   "click",
-							   G_CALLBACK(etgl_click),
-							   etgl);
-	etgl->etgl_key_press_id        = g_signal_connect (etgl->item,
-							   "key_press",
-							   G_CALLBACK(etgl_key_press),
-							   etgl);
-	etgl->etgl_start_drag_id       = g_signal_connect (etgl->item,
-							   "start_drag",
-							   G_CALLBACK(etgl_start_drag),
-							   etgl);
-
-	e_canvas_item_request_reflow(item);
-}
-
-static void
-etgl_add (ETableGroup *etg, gint row)
-{
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
-
-	if (E_IS_TABLE_SUBSET_VARIABLE(etgl->ets)) {
-		e_table_subset_variable_add (E_TABLE_SUBSET_VARIABLE(etgl->ets), row);
-	}
-}
-
-static void
-etgl_add_array (ETableGroup *etg, const gint *array, gint count)
-{
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
-
-	if (E_IS_TABLE_SUBSET_VARIABLE(etgl->ets)) {
-		e_table_subset_variable_add_array (E_TABLE_SUBSET_VARIABLE(etgl->ets), array, count);
-	}
-}
-
-static void
-etgl_add_all (ETableGroup *etg)
-{
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
-
-	if (E_IS_TABLE_SUBSET_VARIABLE(etgl->ets)) {
-		e_table_subset_variable_add_all (E_TABLE_SUBSET_VARIABLE(etgl->ets));
-	}
-}
-
-static gboolean
-etgl_remove (ETableGroup *etg, gint row)
-{
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
-
-	if (E_IS_TABLE_SUBSET_VARIABLE(etgl->ets)) {
-		return e_table_subset_variable_remove (E_TABLE_SUBSET_VARIABLE(etgl->ets), row);
-	}
-	return FALSE;
-}
-
-static void
-etgl_increment (ETableGroup *etg, gint position, gint amount)
-{
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
-
-	if (E_IS_TABLE_SUBSET_VARIABLE(etgl->ets)) {
-		e_table_subset_variable_increment (E_TABLE_SUBSET_VARIABLE(etgl->ets), position, amount);
-	}
-}
-
-static void
-etgl_decrement (ETableGroup *etg, gint position, gint amount)
-{
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
-
-	if (E_IS_TABLE_SUBSET_VARIABLE(etgl->ets)) {
-		e_table_subset_variable_decrement (E_TABLE_SUBSET_VARIABLE(etgl->ets), position, amount);
-	}
-}
-
-static int
-etgl_row_count (ETableGroup *etg)
-{
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
-
-	return e_table_model_row_count(E_TABLE_MODEL(etgl->ets));
-}
-
-static void
-etgl_set_focus (ETableGroup *etg, EFocus direction, gint view_col)
-{
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
-
-	if (direction == E_FOCUS_END) {
-		e_table_item_set_cursor (etgl->item, view_col, e_table_model_row_count(E_TABLE_MODEL(etgl->ets)) - 1);
-	} else {
-		e_table_item_set_cursor (etgl->item, view_col, 0);
-	}
-}
-
-static gint
-etgl_get_focus_column (ETableGroup *etg)
-{
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
-
-	return e_table_item_get_focused_column (etgl->item);
-}
-
-static EPrintable *
-etgl_get_printable (ETableGroup *etg)
-{
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
-
-	return e_table_item_get_printable (etgl->item);
-}
-
-static void
-etgl_compute_location (ETableGroup *etg, int *x, int *y, int *row, int *col)
-{
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
-
-	e_table_item_compute_location (etgl->item, x, y, row, col);
-}
-
-static void
-etgl_get_cell_geometry (ETableGroup *etg, int *row, int *col, int *x, int *y, int *width, int *height)
-{
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (etg);
-
-	e_table_item_get_cell_geometry (etgl->item, row, col, x, y, width, height);
-}
-
-static void
-etgl_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
-	ETableGroup *etg = E_TABLE_GROUP (object);
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (object);
-
-	switch (prop_id) {
-	case PROP_FROZEN:
-		etg->frozen = g_value_get_boolean (value);
-		break;
-	case PROP_MINIMUM_WIDTH:
-	case PROP_WIDTH:
-		etgl->minimum_width = g_value_get_double (value);
-		if (etgl->item) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
-					       "minimum_width", etgl->minimum_width,
-					       NULL);
-		}
-		break;
-	case PROP_LENGTH_THRESHOLD:
-		etgl->length_threshold = g_value_get_int (value);
-		if (etgl->item) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
-					       "length_threshold", etgl->length_threshold,
-					       NULL);
-		}
-		break;
-	case PROP_SELECTION_MODEL:
-		if (etgl->selection_model)
-			g_object_unref(etgl->selection_model);
-		etgl->selection_model = E_SELECTION_MODEL(g_value_get_object (value));
-		if (etgl->selection_model) {
-			g_object_ref(etgl->selection_model);
-		}
-		if (etgl->item) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
-					       "selection_model", etgl->selection_model,
-					       NULL);
-		}
-		break;
-
-	case PROP_UNIFORM_ROW_HEIGHT:
-		etgl->uniform_row_height = g_value_get_boolean (value);
-		if (etgl->item) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
-					       "uniform_row_height", etgl->uniform_row_height,
-					       NULL);
-		}
-		break;
-
-	case PROP_TABLE_ALTERNATING_ROW_COLORS:
-		etgl->alternating_row_colors = g_value_get_boolean (value);
-		if (etgl->item) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
-					       "alternating_row_colors", etgl->alternating_row_colors,
-					       NULL);
-		}
-		break;
-
-	case PROP_TABLE_HORIZONTAL_DRAW_GRID:
-		etgl->horizontal_draw_grid = g_value_get_boolean (value);
-		if (etgl->item) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
-					       "horizontal_draw_grid", etgl->horizontal_draw_grid,
-					       NULL);
-		}
-		break;
-
-	case PROP_TABLE_VERTICAL_DRAW_GRID:
-		etgl->vertical_draw_grid = g_value_get_boolean (value);
-		if (etgl->item) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
-					       "vertical_draw_grid", etgl->vertical_draw_grid,
-					       NULL);
-		}
-		break;
-
-	case PROP_TABLE_DRAW_FOCUS:
-		etgl->draw_focus = g_value_get_boolean (value);
-		if (etgl->item) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
-					       "drawfocus", etgl->draw_focus,
-					       NULL);
-		}
-		break;
-
-	case PROP_CURSOR_MODE:
-		etgl->cursor_mode = g_value_get_int (value);
-		if (etgl->item) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etgl->item),
-					       "cursor_mode", etgl->cursor_mode,
-					       NULL);
-		}
-		break;
-	default:
-		break;
-	}
-}
-
-static void
-etgl_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
-	ETableGroup *etg = E_TABLE_GROUP (object);
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (object);
-
-	switch (prop_id) {
-	case PROP_FROZEN:
-		g_value_set_boolean (value, etg->frozen);
-		break;
-	case PROP_HEIGHT:
-		g_value_set_double (value, etgl->height);
-		break;
-	case PROP_WIDTH:
-		g_value_set_double (value, etgl->width);
-		break;
-	case PROP_MINIMUM_WIDTH:
-		g_value_set_double (value, etgl->minimum_width);
-		break;
-	case PROP_UNIFORM_ROW_HEIGHT:
-		g_value_set_boolean (value, etgl->uniform_row_height);
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-etgl_class_init (GObjectClass *object_class)
-{
-	GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
-	ETableGroupClass *e_group_class = E_TABLE_GROUP_CLASS(object_class);
-
-	object_class->dispose = etgl_dispose;
-	object_class->set_property = etgl_set_property;
-	object_class->get_property = etgl_get_property;
-
-	item_class->realize = etgl_realize;
-
-	etgl_parent_class = g_type_class_ref (PARENT_TYPE);
-
-	e_group_class->add = etgl_add;
-	e_group_class->add_array = etgl_add_array;
-	e_group_class->add_all = etgl_add_all;
-	e_group_class->remove = etgl_remove;
-	e_group_class->increment  = etgl_increment;
-	e_group_class->decrement  = etgl_decrement;
-	e_group_class->row_count  = etgl_row_count;
-	e_group_class->set_focus  = etgl_set_focus;
-	e_group_class->get_focus_column = etgl_get_focus_column;
-	e_group_class->get_printable = etgl_get_printable;
-	e_group_class->compute_location = etgl_compute_location;
-	e_group_class->get_cell_geometry = etgl_get_cell_geometry;
-
-	g_object_class_install_property (object_class, PROP_TABLE_ALTERNATING_ROW_COLORS,
-					 g_param_spec_boolean ("alternating_row_colors",
-							       _( "Alternating Row Colors" ),
-							       _( "Alternating Row Colors" ), 
-							       FALSE,
-							       G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_TABLE_HORIZONTAL_DRAW_GRID,
-					 g_param_spec_boolean ("horizontal_draw_grid",
-							       _( "Horizontal Draw Grid" ),
-							       _( "Horizontal Draw Grid" ),
-							       FALSE,
-							       G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_TABLE_VERTICAL_DRAW_GRID,
-					 g_param_spec_boolean ("vertical_draw_grid",
-							       _( "Vertical Draw Grid" ),
-							       _( "Vertical Draw Grid" ),
-							       FALSE,
-							       G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_TABLE_DRAW_FOCUS,
-					 g_param_spec_boolean ("drawfocus",
-							       _( "Draw focus" ),
-							       _( "Draw focus" ),
-							       FALSE,
-							       G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_CURSOR_MODE,
-					 g_param_spec_int ("cursor_mode",
-							   _( "Cursor mode" ),
-							   _( "Cursor mode" ),
-							   E_CURSOR_LINE, E_CURSOR_SPREADSHEET, E_CURSOR_LINE,
-							   G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_LENGTH_THRESHOLD,
-					 g_param_spec_int ("length_threshold",
-							   _( "Length Threshold" ),
-							   _( "Length Threshold" ),
-							   -1, G_MAXINT, 0,
-							   G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_SELECTION_MODEL,
-					 g_param_spec_object ("selection_model",
-							      _( "Selection model" ),
-							      _( "Selection model" ),
-							      E_SELECTION_MODEL_TYPE,
-							      G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_HEIGHT,
-					 g_param_spec_double ("height",
-							      _( "Height" ),
-							      _( "Height" ),
-							      0.0, G_MAXDOUBLE, 0.0,
-							      G_PARAM_READABLE));
-
-	g_object_class_install_property (object_class, PROP_WIDTH,
-					 g_param_spec_double ("width",
-							      _( "Width" ),
-							      _( "Width" ),
-							      0.0, G_MAXDOUBLE, 0.0,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_MINIMUM_WIDTH,
-					 g_param_spec_double ("minimum_width",
-							      _( "Minimum width" ),
-							      _( "Minimum Width" ),
-							      0.0, G_MAXDOUBLE, 0.0,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_FROZEN,
-					 g_param_spec_boolean ("frozen",
-							       _( "Frozen" ),
-							       _( "Frozen" ),
-							       FALSE,
-							       G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_UNIFORM_ROW_HEIGHT,
-					 g_param_spec_boolean ("uniform_row_height",
-							       _( "Uniform row height" ),
-							       _( "Uniform row height" ),
-							       FALSE,
-							       G_PARAM_READWRITE));
-}
-
-static void
-etgl_init (GtkObject *object)
-{
-	ETableGroupLeaf *etgl = E_TABLE_GROUP_LEAF (object);
-
-	etgl->width = 1;
-	etgl->height = 1;
-	etgl->minimum_width = 0;
-
-	etgl->ets = NULL;
-	etgl->item = NULL;
-
-	etgl->etgl_cursor_change_id = 0;
-	etgl->etgl_cursor_activated_id = 0;
-	etgl->etgl_double_click_id = 0;
-	etgl->etgl_right_click_id = 0;
-	etgl->etgl_click_id = 0;
-	etgl->etgl_key_press_id = 0;
-	etgl->etgl_start_drag_id = 0;
-
-	etgl->alternating_row_colors = 1;
-	etgl->horizontal_draw_grid = 1;
-	etgl->vertical_draw_grid = 1;
-	etgl->draw_focus = 1;
-	etgl->cursor_mode = E_CURSOR_SIMPLE;
-	etgl->length_threshold = -1;
-
-	etgl->selection_model = NULL;
-	etgl->uniform_row_height = FALSE;
-
-	e_canvas_item_set_reflow_callback (GNOME_CANVAS_ITEM(object), etgl_reflow);
-}
-
-E_MAKE_TYPE (e_table_group_leaf, "ETableGroupLeaf", ETableGroupLeaf, etgl_class_init, etgl_init, PARENT_TYPE)
diff --git a/widgets/table/e-table-group-leaf.h b/widgets/table/e-table-group-leaf.h
deleted file mode 100644
index 74fdfd8c03..0000000000
--- a/widgets/table/e-table-group-leaf.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-group-leaf.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_GROUP_LEAF_H_
-#define _E_TABLE_GROUP_LEAF_H_
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gal/e-table/e-table-group.h>
-#include <gal/e-table/e-table-subset.h>
-#include <gal/e-table/e-table-item.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_GROUP_LEAF_TYPE        (e_table_group_leaf_get_type ())
-#define E_TABLE_GROUP_LEAF(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_GROUP_LEAF_TYPE, ETableGroupLeaf))
-#define E_TABLE_GROUP_LEAF_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_GROUP_LEAF_TYPE, ETableGroupLeafClass))
-#define E_IS_TABLE_GROUP_LEAF(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_GROUP_LEAF_TYPE))
-#define E_IS_TABLE_GROUP_LEAF_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_GROUP_LEAF_TYPE))
-
-typedef struct {
-	ETableGroup group;
-
-	/* 
-	 * Item.
-	 */
-	ETableItem *item;
-
-	gdouble height;
-	gdouble width;
-	gdouble minimum_width;
-
-	int length_threshold;
-
-	ETableSubset *ets;
-	guint is_grouped : 1;
-
-	guint alternating_row_colors : 1;
-	guint horizontal_draw_grid : 1;
-	guint vertical_draw_grid : 1;
-	guint draw_focus : 1;
-	guint uniform_row_height : 1;
-	ECursorMode cursor_mode;
-
-	int etgl_cursor_change_id;
-	int etgl_cursor_activated_id;
-	int etgl_double_click_id;
-	int etgl_right_click_id;
-	int etgl_click_id;
-	int etgl_key_press_id;
-	int etgl_start_drag_id;
-
-	ESelectionModel *selection_model;
-} ETableGroupLeaf;
-
-typedef struct {
-	ETableGroupClass parent_class;
-} ETableGroupLeafClass;
-
-ETableGroup *e_table_group_leaf_new       (GnomeCanvasGroup *parent,
-					   ETableHeader *full_header,
-					   ETableHeader     *header,
-					   ETableModel *model,
-					   ETableSortInfo *sort_info);
-GType        e_table_group_leaf_get_type  (void);
-
-
-G_END_DECLS
-
-#endif /* _E_TABLE_GROUP_LEAF_H_ */
-
diff --git a/widgets/table/e-table-group.c b/widgets/table/e-table-group.c
deleted file mode 100644
index 5bc8841cb4..0000000000
--- a/widgets/table/e-table-group.c
+++ /dev/null
@@ -1,712 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-group.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include "e-table-group.h"
-#include "e-table-group-container.h"
-#include "e-table-group-leaf.h"
-#include "e-table-item.h"
-#include "gal/util/e-util.h"
-
-#define PARENT_TYPE gnome_canvas_group_get_type ()
-
-#define ETG_CLASS(e) (E_TABLE_GROUP_CLASS(GTK_OBJECT_GET_CLASS(e)))
-
-static GnomeCanvasGroupClass *etg_parent_class;
-
-enum {
-	CURSOR_CHANGE,
-	CURSOR_ACTIVATED,
-	DOUBLE_CLICK,
-	RIGHT_CLICK,
-	CLICK,
-	KEY_PRESS,
-	START_DRAG,
-	LAST_SIGNAL
-};
-
-static guint etg_signals [LAST_SIGNAL] = { 0, };
-
-static gboolean etg_get_focus (ETableGroup      *etg);
-
-static void
-etg_dispose (GObject *object)
-{
-	ETableGroup *etg = E_TABLE_GROUP(object);
-
-	if (etg->header) {
-		g_object_unref (etg->header);
-		etg->header = NULL;
-	}
-
-	if (etg->full_header) {
-		g_object_unref (etg->full_header);
-		etg->full_header = NULL;
-	}
-
-	if (etg->model) {
-		g_object_unref (etg->model);
-		etg->model = NULL;
-	}
-
-	if (G_OBJECT_CLASS (etg_parent_class)->dispose)
-		G_OBJECT_CLASS (etg_parent_class)->dispose (object);
-}
-
-/**
- * e_table_group_new
- * @parent: The %GnomeCanvasGroup to create a child of.
- * @full_header: The full header of the %ETable.
- * @header: The current header of the %ETable.
- * @model: The %ETableModel of the %ETable.
- * @sort_info: The %ETableSortInfo of the %ETable.
- * @n: The grouping information object to group by.
- *
- * %ETableGroup is a collection of rows of an %ETable.  It's a
- * %GnomeCanvasItem.  There are two different forms.  If n < the
- * number of groupings in the given %ETableSortInfo, then the
- * %ETableGroup will need to contain other %ETableGroups, thus it
- * creates an %ETableGroupContainer.  Otherwise, it will just contain
- * an %ETableItem, and thus it creates an %ETableGroupLeaf.
- *
- * Returns: The new %ETableGroup.
- */
-ETableGroup *
-e_table_group_new (GnomeCanvasGroup *parent,
-		   ETableHeader     *full_header,
-		   ETableHeader     *header,
-		   ETableModel      *model,
-		   ETableSortInfo   *sort_info,
-		   int               n)
-{
-	g_return_val_if_fail (model != NULL, NULL);
-
-	if (n < e_table_sort_info_grouping_get_count(sort_info)) {
-		return e_table_group_container_new (parent, full_header, header, model, sort_info, n);
-	} else {
-		return e_table_group_leaf_new (parent, full_header, header, model, sort_info);
-	}
-	return NULL;
-}
-
-/**
- * e_table_group_construct
- * @parent: The %GnomeCanvasGroup to create a child of.
- * @etg: The %ETableGroup to construct.
- * @full_header: The full header of the %ETable.
- * @header: The current header of the %ETable.
- * @model: The %ETableModel of the %ETable.
- *
- * This routine does the base construction of the %ETableGroup.
- */
-void
-e_table_group_construct (GnomeCanvasGroup *parent,
-			 ETableGroup      *etg,
-			 ETableHeader     *full_header,
-			 ETableHeader     *header,
-			 ETableModel      *model)
-{
-	etg->full_header = full_header;
-	g_object_ref (etg->full_header);
-	etg->header = header;
-	g_object_ref (etg->header);
-	etg->model = model;
-	g_object_ref (etg->model);
-	g_object_set (G_OBJECT (etg),
-		"parent", parent,
-		NULL);
-}
-
-/**
- * e_table_group_add
- * @etg: The %ETableGroup to add a row to
- * @row: The row to add.
- *
- * This routine adds the given row from the %ETableModel to this set
- * of rows.
- */
-void
-e_table_group_add (ETableGroup *etg,
-		   gint row)
-{
-	g_return_if_fail (etg != NULL);
-	g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
-	g_assert (ETG_CLASS (etg)->add != NULL);
-	ETG_CLASS (etg)->add (etg, row);
-}
-
-/**
- * e_table_group_add_array
- * @etg: The %ETableGroup to add to
- * @array: The array to add.
- * @count: The number of times to add
- *
- * This routine adds all the rows in the array to this set of rows.
- * It assumes that the array is already sorted properly.
- */
-void
-e_table_group_add_array (ETableGroup *etg,
-			 const int *array,
-			 int count)
-{
-	g_return_if_fail (etg != NULL);
-	g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
-	g_assert (ETG_CLASS (etg)->add_array != NULL);
-	ETG_CLASS (etg)->add_array (etg, array, count);
-}
-
-/**
- * e_table_group_add_all
- * @etg: The %ETableGroup to add to
- *
- * This routine adds all the rows from the %ETableModel to this set
- * of rows.
- */
-void
-e_table_group_add_all (ETableGroup *etg)
-{
-	g_return_if_fail (etg != NULL);
-	g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
-	g_assert (ETG_CLASS (etg)->add_all != NULL);
-	ETG_CLASS (etg)->add_all (etg);
-}
-
-/**
- * e_table_group_remove
- * @etg: The %ETableGroup to remove a row from
- * @row: The row to remove.
- *
- * This routine removes the given row from the %ETableModel from this
- * set of rows.
- *
- * Returns: TRUE if the row was deleted and FALSE if the row was not
- * found.
- */
-gboolean
-e_table_group_remove (ETableGroup *etg,
-		      gint row)
-{
-	g_return_val_if_fail (etg != NULL, FALSE);
-	g_return_val_if_fail (E_IS_TABLE_GROUP (etg), FALSE);
-
-	g_assert (ETG_CLASS (etg)->remove != NULL);
-	return ETG_CLASS (etg)->remove (etg, row);
-}
-
-/**
- * e_table_group_increment
- * @etg: The %ETableGroup to increment
- * @position: The position to increment from
- * @amount: The amount to increment.
- *
- * This routine adds amount to all rows greater than or equal to
- * position.  This is to handle when a row gets inserted into the
- * model.
- */
-void
-e_table_group_increment (ETableGroup *etg,
-			 gint position,
-			 gint amount)
-{
-	g_return_if_fail (etg != NULL);
-	g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
-	g_assert (ETG_CLASS (etg)->increment != NULL);
-	ETG_CLASS (etg)->increment (etg, position, amount);
-}
-
-/**
- * e_table_group_increment
- * @etg: The %ETableGroup to decrement
- * @position: The position to decrement from
- * @amount: The amount to decrement
- *
- * This routine removes amount from all rows greater than or equal to
- * position.  This is to handle when a row gets deleted from the
- * model.
- */
-void
-e_table_group_decrement (ETableGroup *etg,
-			 gint position,
-			 gint amount)
-{
-	g_return_if_fail (etg != NULL);
-	g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
-	g_assert (ETG_CLASS (etg)->decrement != NULL);
-	ETG_CLASS (etg)->decrement (etg, position, amount);
-}
-
-/**
- * e_table_group_increment
- * @etg: The %ETableGroup to count
- *
- * This routine calculates the number of rows shown in this group.
- *
- * Returns: The number of rows.
- */
-gint
-e_table_group_row_count (ETableGroup *etg)
-{
-	g_return_val_if_fail (etg != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_GROUP (etg), -1);
-
-	g_assert (ETG_CLASS (etg)->row_count != NULL);
-	return ETG_CLASS (etg)->row_count (etg);
-}
-
-/**
- * e_table_group_set_focus
- * @etg: The %ETableGroup to set
- * @direction: The direction the focus is coming from.
- * @view_col: The column to set the focus in.
- *
- * Sets the focus to this widget.  Places the focus in the view column
- * coming from direction direction.
- */
-void
-e_table_group_set_focus (ETableGroup *etg,
-			 EFocus direction,
-			 gint view_col)
-{
-	g_return_if_fail (etg != NULL);
-	g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
-	g_assert (ETG_CLASS (etg)->set_focus != NULL);
-	ETG_CLASS (etg)->set_focus (etg, direction, view_col);
-}
-
-/**
- * e_table_group_get_focus
- * @etg: The %ETableGroup to check
- *
- * Calculates if this group has the focus.
- *
- * Returns: TRUE if this group has the focus.
- */
-gboolean
-e_table_group_get_focus (ETableGroup *etg)
-{
-	g_return_val_if_fail (etg != NULL, FALSE);
-	g_return_val_if_fail (E_IS_TABLE_GROUP (etg), FALSE);
-
-	g_assert (ETG_CLASS (etg)->get_focus != NULL);
-	return ETG_CLASS (etg)->get_focus (etg);
-}
-
-/**
- * e_table_group_get_focus_column
- * @etg: The %ETableGroup to check
- *
- * Calculates which column in this group has the focus.
- *
- * Returns: The column index (view column).
- */
-gint
-e_table_group_get_focus_column (ETableGroup *etg)
-{
-	g_return_val_if_fail (etg != NULL, FALSE);
-	g_return_val_if_fail (E_IS_TABLE_GROUP (etg), -1);
-
-	g_assert (ETG_CLASS (etg)->get_focus_column != NULL);
-	return ETG_CLASS (etg)->get_focus_column (etg);
-}
-
-/**
- * e_table_group_get_printable
- * @etg: %ETableGroup which will be printed
- *
- * This routine creates and returns an %EPrintable that can be used to
- * print the given %ETableGroup.
- *
- * Returns: The %EPrintable.
- */
-EPrintable *
-e_table_group_get_printable (ETableGroup *etg)
-{
-	g_return_val_if_fail (etg != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE_GROUP (etg), NULL);
-
-	g_assert (ETG_CLASS (etg)->get_printable != NULL);
-	return ETG_CLASS (etg)->get_printable (etg);
-}
-
-/**
- * e_table_group_compute_location
- * @eti: %ETableGroup to look in.
- * @x: A pointer to the x location to find in the %ETableGroup.
- * @y: A pointer to the y location to find in the %ETableGroup.
- * @row: A pointer to the location to store the found row in.
- * @col: A pointer to the location to store the found col in.
- *
- * This routine locates the pixel location (*x, *y) in the
- * %ETableGroup.  If that location is in the %ETableGroup, *row and
- * *col are set to the view row and column where it was found.  If
- * that location is not in the %ETableGroup, the height of the
- * %ETableGroup is removed from the value y points to.
- */
-void
-e_table_group_compute_location (ETableGroup *etg, int *x, int *y, int *row, int *col)
-{
-	g_return_if_fail (etg != NULL);
-	g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
-	g_assert (ETG_CLASS (etg)->compute_location != NULL);
-	ETG_CLASS (etg)->compute_location (etg, x, y, row, col);
-}
-
-/**
- * e_table_group_get_position
- * @eti: %ETableGroup to look in.
- * @x: A pointer to the location to store the found x location in.
- * @y: A pointer to the location to store the found y location in.
- * @row: A pointer to the row number to find.
- * @col: A pointer to the col number to find.
- *
- * This routine finds the view cell (row, col) in the #ETableGroup.
- * If that location is in the #ETableGroup *@x and *@y are set to the
- * upper left hand corner of the cell found.  If that location is not
- * in the #ETableGroup, the number of rows in the #ETableGroup is
- * removed from the value row points to.
- */
-void
-e_table_group_get_cell_geometry  (ETableGroup *etg,
-				  int         *row,
-				  int         *col,
-				  int         *x,
-				  int         *y,
-				  int         *width,
-				  int         *height)
-{
-	g_return_if_fail (etg != NULL);
-	g_return_if_fail (E_IS_TABLE_GROUP (etg));
-
-	g_assert (ETG_CLASS (etg)->get_cell_geometry != NULL);
-	ETG_CLASS (etg)->get_cell_geometry (etg, row, col, x, y, width, height);
-}
-
-/**
- * e_table_group_cursor_change
- * @eti: %ETableGroup to emit the signal on
- * @row: The new cursor row (model row)
- *
- * This routine emits the "cursor_change" signal.
- */
-void
-e_table_group_cursor_change (ETableGroup *e_table_group, gint row)
-{
-	g_return_if_fail (e_table_group != NULL);
-	g_return_if_fail (E_IS_TABLE_GROUP (e_table_group));
-
-	g_signal_emit (e_table_group,
-		       etg_signals [CURSOR_CHANGE], 0,
-		       row);
-}
-
-/**
- * e_table_group_cursor_activated
- * @eti: %ETableGroup to emit the signal on
- * @row: The cursor row (model row)
- *
- * This routine emits the "cursor_activated" signal.
- */
-void
-e_table_group_cursor_activated (ETableGroup *e_table_group, gint row)
-{
-	g_return_if_fail (e_table_group != NULL);
-	g_return_if_fail (E_IS_TABLE_GROUP (e_table_group));
-
-	g_signal_emit (e_table_group,
-		       etg_signals [CURSOR_ACTIVATED], 0,
-		       row);
-}
-
-/**
- * e_table_group_double_click
- * @eti: %ETableGroup to emit the signal on
- * @row: The row clicked on (model row)
- * @col: The col clicked on (model col)
- * @event: The event that caused this signal
- *
- * This routine emits the "double_click" signal.
- */
-void
-e_table_group_double_click (ETableGroup *e_table_group, gint row, gint col, GdkEvent *event)
-{
-	g_return_if_fail (e_table_group != NULL);
-	g_return_if_fail (E_IS_TABLE_GROUP (e_table_group));
-
-	g_signal_emit (e_table_group,
-		       etg_signals [DOUBLE_CLICK], 0,
-		       row, col, event);
-}
-
-/**
- * e_table_group_right_click
- * @eti: %ETableGroup to emit the signal on
- * @row: The row clicked on (model row)
- * @col: The col clicked on (model col)
- * @event: The event that caused this signal
- *
- * This routine emits the "right_click" signal.
- */
-gint
-e_table_group_right_click (ETableGroup *e_table_group, gint row, gint col, GdkEvent *event)
-{
-	gint return_val = 0;
-
-	g_return_val_if_fail (e_table_group != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_GROUP (e_table_group), 0);
-
-	g_signal_emit (e_table_group,
-		       etg_signals [RIGHT_CLICK], 0,
-		       row, col, event, &return_val);
-
-	return return_val;
-}
-
-/**
- * e_table_group_click
- * @eti: %ETableGroup to emit the signal on
- * @row: The row clicked on (model row)
- * @col: The col clicked on (model col)
- * @event: The event that caused this signal
- *
- * This routine emits the "click" signal.
- */
-gint
-e_table_group_click (ETableGroup *e_table_group, gint row, gint col, GdkEvent *event)
-{
-	gint return_val = 0;
-
-	g_return_val_if_fail (e_table_group != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_GROUP (e_table_group), 0);
-
-	g_signal_emit (e_table_group,
-		       etg_signals [CLICK], 0,
-		       row, col, event, &return_val);
-
-	return return_val;
-}
-
-/**
- * e_table_group_key_press
- * @eti: %ETableGroup to emit the signal on
- * @row: The cursor row (model row)
- * @col: The cursor col (model col)
- * @event: The event that caused this signal
- *
- * This routine emits the "key_press" signal.
- */
-gint
-e_table_group_key_press (ETableGroup *e_table_group, gint row, gint col, GdkEvent *event)
-{
-	gint return_val = 0;
-
-	g_return_val_if_fail (e_table_group != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_GROUP (e_table_group), 0);
-
-	g_signal_emit (e_table_group,
-		       etg_signals [KEY_PRESS], 0,
-		       row, col, event, &return_val);
-
-	return return_val;
-}
-
-/**
- * e_table_group_start_drag
- * @eti: %ETableGroup to emit the signal on
- * @row: The cursor row (model row)
- * @col: The cursor col (model col)
- * @event: The event that caused this signal
- *
- * This routine emits the "start_drag" signal.
- */
-gint
-e_table_group_start_drag (ETableGroup *e_table_group, gint row, gint col, GdkEvent *event)
-{
-	gint return_val = 0;
-
-	g_return_val_if_fail (e_table_group != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_GROUP (e_table_group), 0);
-
-	g_signal_emit (e_table_group,
-		       etg_signals [START_DRAG], 0,
-		       row, col, event, &return_val);
-
-	return return_val;
-}
-
-/**
- * e_table_group_get_header
- * @eti: %ETableGroup to check
- *
- * This routine returns the %ETableGroup's header.
- *
- * Returns: The %ETableHeader.
- */
-ETableHeader *
-e_table_group_get_header (ETableGroup *etg)
-{
-	g_return_val_if_fail (etg != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE_GROUP (etg), NULL);
-
-	return etg->header;
-}
-
-static int
-etg_event (GnomeCanvasItem *item, GdkEvent *event)
-{
-	ETableGroup *etg = E_TABLE_GROUP (item);
-	gboolean return_val = TRUE;
-
-	switch (event->type) {
-
-	case GDK_FOCUS_CHANGE:
-		etg->has_focus = event->focus_change.in;
-		return_val = FALSE;
-
-	default:
-		return_val = FALSE;
-	}
-	if (return_val == FALSE){
-		if (GNOME_CANVAS_ITEM_CLASS(etg_parent_class)->event)
-			return GNOME_CANVAS_ITEM_CLASS(etg_parent_class)->event (item, event);
-	}
-	return return_val;
-
-}
-
-static gboolean
-etg_get_focus (ETableGroup      *etg)
-{
-	return etg->has_focus;
-}
-
-static void
-etg_class_init (GObjectClass *object_class)
-{
-	GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
-	ETableGroupClass *klass = (ETableGroupClass *) object_class;
-
-	object_class->dispose = etg_dispose;
-
-	item_class->event = etg_event;
-
-	klass->cursor_change = NULL;
-	klass->cursor_activated = NULL;
-	klass->double_click = NULL;
-	klass->right_click = NULL;
-	klass->click = NULL;
-	klass->key_press = NULL;
-	klass->start_drag = NULL;
-
-	klass->add = NULL;
-	klass->add_array = NULL;
-	klass->add_all = NULL;
-	klass->remove = NULL;
-	klass->row_count  = NULL;
-	klass->increment  = NULL;
-	klass->decrement  = NULL;
-	klass->set_focus  = NULL;
-	klass->get_focus = etg_get_focus;
-	klass->get_printable = NULL;
-	klass->compute_location = NULL;
-	klass->get_cell_geometry = NULL;
-
-	etg_parent_class = g_type_class_ref (PARENT_TYPE);
-
-	etg_signals [CURSOR_CHANGE] =
-		g_signal_new ("cursor_change",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableGroupClass, cursor_change),
-			      NULL, NULL,
-			      e_marshal_NONE__INT,
-			      G_TYPE_NONE, 1, G_TYPE_INT);
-
-	etg_signals [CURSOR_ACTIVATED] =
-		g_signal_new ("cursor_activated",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableGroupClass, cursor_activated),
-			      NULL, NULL,
-			      e_marshal_NONE__INT,
-			      G_TYPE_NONE, 1, G_TYPE_INT);
-
-	etg_signals [DOUBLE_CLICK] =
-		g_signal_new ("double_click",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableGroupClass, double_click),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_INT_BOXED,
-			      G_TYPE_NONE, 3, G_TYPE_INT,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	etg_signals [RIGHT_CLICK] =
-		g_signal_new ("right_click",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableGroupClass, right_click),
-			      NULL, NULL,
-			      e_marshal_INT__INT_INT_BOXED,
-			      G_TYPE_INT, 3, G_TYPE_INT, G_TYPE_INT, GDK_TYPE_EVENT);
-
-	etg_signals [CLICK] =
-		g_signal_new ("click",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableGroupClass, click),
-			      NULL, NULL,
-			      e_marshal_INT__INT_INT_BOXED,
-			      G_TYPE_INT, 3, G_TYPE_INT,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	etg_signals [KEY_PRESS] =
-		g_signal_new ("key_press",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableGroupClass, key_press),
-			      NULL, NULL,
-			      e_marshal_INT__INT_INT_BOXED,
-			      G_TYPE_INT, 3, G_TYPE_INT,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	etg_signals [START_DRAG] =
-		g_signal_new ("start_drag",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableGroupClass, start_drag),
-			      NULL, NULL,
-			      e_marshal_INT__INT_INT_BOXED,
-			      G_TYPE_INT, 3, G_TYPE_INT,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-}
-
-E_MAKE_TYPE (e_table_group, "ETableGroup", ETableGroup, etg_class_init, NULL, PARENT_TYPE)
diff --git a/widgets/table/e-table-group.h b/widgets/table/e-table-group.h
deleted file mode 100644
index 2ecd34efe1..0000000000
--- a/widgets/table/e-table-group.h
+++ /dev/null
@@ -1,178 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-group.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_GROUP_H_
-#define _E_TABLE_GROUP_H_
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gal/e-table/e-table-model.h>
-#include <gal/e-table/e-table-header.h>
-#include <gal/e-table/e-table-sort-info.h>
-#include <gal/e-table/e-table-defines.h>
-#include <gal/util/e-util.h>
-#include <gal/widgets/e-printable.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_GROUP_TYPE        (e_table_group_get_type ())
-#define E_TABLE_GROUP(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_GROUP_TYPE, ETableGroup))
-#define E_TABLE_GROUP_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_GROUP_TYPE, ETableGroupClass))
-#define E_IS_TABLE_GROUP(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_GROUP_TYPE))
-#define E_IS_TABLE_GROUP_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_GROUP_TYPE))
-
-typedef struct {
-	GnomeCanvasGroup group;
-
-	/*
-	 * The full header.
-	 */
-	ETableHeader *full_header;
-	ETableHeader *header;
-	
-	/*
-	 * The model we pull data from.
-	 */
-	ETableModel *model;
-
-	/*
-	 * Whether we should add indentation and open/close markers,
-	 * or if we just act as containers of subtables.
-	 */
-	guint transparent : 1;
-
-	guint has_focus : 1;
-	
-	guint frozen : 1;
-} ETableGroup;
-
-typedef struct {
-	GnomeCanvasGroupClass parent_class;
-
-	/* Signals */
-	void        (*cursor_change)         (ETableGroup *etg, int row);
-	void        (*cursor_activated)      (ETableGroup *etg, int row);
-	void        (*double_click)          (ETableGroup *etg, int row, int col, GdkEvent *event);
-	gint        (*right_click)           (ETableGroup *etg, int row, int col, GdkEvent *event);
-	gint        (*click)                 (ETableGroup *etg, int row, int col, GdkEvent *event);
-	gint        (*key_press)             (ETableGroup *etg, int row, int col, GdkEvent *event);
-	gint        (*start_drag)            (ETableGroup *etg, int row, int col, GdkEvent *event);
-
-	/* Virtual functions. */
-	void        (*add)                   (ETableGroup *etg, gint row);
-	void        (*add_array)             (ETableGroup *etg, const int *array, int count);
-	void        (*add_all)               (ETableGroup *etg);
-	gboolean    (*remove)                (ETableGroup *etg, gint row);
-	gint        (*row_count)             (ETableGroup *etg);
-	void        (*increment)             (ETableGroup *etg, gint position, gint amount);
-	void        (*decrement)             (ETableGroup *etg, gint position, gint amount);
-	void        (*set_focus)             (ETableGroup *etg, EFocus direction, gint view_col);
-	gboolean    (*get_focus)             (ETableGroup *etg);
-	gint        (*get_focus_column)      (ETableGroup *etg);
-	EPrintable *(*get_printable)         (ETableGroup *etg);
-	void        (*compute_location)      (ETableGroup *etg, int *x, int *y, int *row, int *col);
-	void        (*get_cell_geometry)     (ETableGroup *etg, int *row, int *col, int *x, int *y, int *width, int *height);
-
-} ETableGroupClass;
-
-/* Virtual functions */
-void          e_table_group_add               (ETableGroup       *etg,
-					       gint               row);
-void          e_table_group_add_array         (ETableGroup       *etg,
-					       const int         *array,
-					       int                count);
-void          e_table_group_add_all           (ETableGroup       *etg);
-gboolean      e_table_group_remove            (ETableGroup       *etg,
-					       gint               row);
-void          e_table_group_increment         (ETableGroup       *etg,
-					       gint               position,
-					       gint               amount);
-void          e_table_group_decrement         (ETableGroup       *etg,
-					       gint               position,
-					       gint               amount);
-gint          e_table_group_row_count         (ETableGroup       *etg);
-void          e_table_group_set_focus         (ETableGroup       *etg,
-					       EFocus             direction,
-					       gint               view_col);
-gboolean      e_table_group_get_focus         (ETableGroup       *etg);
-gint          e_table_group_get_focus_column  (ETableGroup       *etg);
-ETableHeader *e_table_group_get_header        (ETableGroup       *etg);
-EPrintable   *e_table_group_get_printable     (ETableGroup       *etg);
-void          e_table_group_compute_location  (ETableGroup       *etg,
-					       int               *x,
-					       int               *y,
-					       int               *row,
-					       int               *col);
-void          e_table_group_get_cell_geometry (ETableGroup       *etg,
-					       int               *row,
-					       int               *col,
-					       int               *x,
-					       int               *y,
-					       int               *width,
-					       int               *height);
-ETableGroup  *e_table_group_new               (GnomeCanvasGroup  *parent,
-					       ETableHeader      *full_header,
-					       ETableHeader      *header,
-					       ETableModel       *model,
-					       ETableSortInfo    *sort_info,
-					       int                n);
-void          e_table_group_construct         (GnomeCanvasGroup  *parent,
-					       ETableGroup       *etg,
-					       ETableHeader      *full_header,
-					       ETableHeader      *header,
-					       ETableModel       *model);
-
-/* For emitting the signals */
-void          e_table_group_cursor_change     (ETableGroup       *etg,
-					       gint               row);
-void          e_table_group_cursor_activated  (ETableGroup       *etg,
-					       gint               row);
-void          e_table_group_double_click      (ETableGroup       *etg,
-					       gint               row,
-					       gint               col,
-					       GdkEvent          *event);
-gint          e_table_group_right_click       (ETableGroup       *etg,
-					       gint               row,
-					       gint               col,
-					       GdkEvent          *event);
-gint          e_table_group_click             (ETableGroup       *etg,
-					       gint               row,
-					       gint               col,
-					       GdkEvent          *event);
-gint          e_table_group_key_press         (ETableGroup       *etg,
-					       gint               row,
-					       gint               col,
-					       GdkEvent          *event);
-gint          e_table_group_start_drag        (ETableGroup       *etg,
-					       gint               row,
-					       gint               col,
-					       GdkEvent          *event);
-GType         e_table_group_get_type          (void);
-
-typedef void (*ETableGroupLeafFn) (void *e_table_item, void *closure);
-void          e_table_group_apply_to_leafs    (ETableGroup       *etg,
-					       ETableGroupLeafFn  fn,
-					       void              *closure);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_GROUP_H_ */
diff --git a/widgets/table/e-table-header-item.c b/widgets/table/e-table-header-item.c
deleted file mode 100644
index 265d29fed0..0000000000
--- a/widgets/table/e-table-header-item.c
+++ /dev/null
@@ -1,1910 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-header-item.c
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Miguel de Icaza (miguel@gnu.org)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include "e-table-header-item.h"
-
-#include <string.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkdnd.h>
-#include <gtk/gtkimage.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include <libgnomecanvas/gnome-canvas-util.h>
-#include <libgnomecanvas/gnome-canvas-polygon.h>
-#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gdk/gdkkeysyms.h>
-#include "gal/widgets/e-cursors.h"
-#include "gal/util/e-i18n.h"
-#include "gal/util/e-util.h"
-#include "gal/util/e-xml-utils.h"
-#include "gal/util/e-marshal.h"
-#include "gal/widgets/e-canvas.h"
-#include "gal/widgets/e-popup-menu.h"
-#include "gal/widgets/e-gui-utils.h"
-#include "e-table-header.h"
-#include "e-table-header-utils.h"
-#include "e-table-col-dnd.h"
-#include "e-table-defines.h"
-#include "e-table-field-chooser-dialog.h"
-#include "e-table-config.h"
-#include "e-table.h"
-
-#include "add-col.xpm"
-#include "remove-col.xpm"
-#include "arrow-up.xpm"
-#include "arrow-down.xpm"
-
-enum {
-	BUTTON_PRESSED,
-	LAST_SIGNAL
-};
-
-static guint ethi_signals [LAST_SIGNAL] = { 0, };
-
-#define ARROW_DOWN_HEIGHT 16
-#define ARROW_PTR          7
-
-/* Defines the tolerance for proximity of the column division to the cursor position */
-#define TOLERANCE 4
-
-#define ETHI_RESIZING(x) ((x)->resize_col != -1)
-
-#define PARENT_OBJECT_TYPE gnome_canvas_item_get_type ()
-
-#define ELEMENTS(x) (sizeof (x) / sizeof (x[0]))
-#define d(x)
-
-static GnomeCanvasItemClass *ethi_parent_class;
-
-static void ethi_drop_table_header (ETableHeaderItem *ethi);
-
-/*
- * They display the arrows for the drop location.
- */
-	
-static GtkWidget *arrow_up, *arrow_down;
-
-/*
- * DnD icons
- */
-static GdkColormap *dnd_colormap;
-static GdkPixmap *remove_col_pixmap, *remove_col_mask;
-static GdkPixmap *add_col_pixmap, *add_col_mask;
-
-enum {
-	PROP_0,
-	PROP_TABLE_HEADER,
-	PROP_FULL_HEADER,
-	PROP_DND_CODE,
-	PROP_TABLE_FONTSET,
-	PROP_SORT_INFO,
-	PROP_TABLE,
-	PROP_TREE
-};
-
-enum {
-	ET_SCROLL_UP = 1 << 0,
-	ET_SCROLL_DOWN = 1 << 1,
-	ET_SCROLL_LEFT = 1 << 2,
-	ET_SCROLL_RIGHT = 1 << 3
-};
-
-static void scroll_off (ETableHeaderItem *ethi);
-static void scroll_on (ETableHeaderItem *ethi, guint scroll_direction);
-
-static void
-ethi_dispose (GObject *object){
-	ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (object);
-
-	ethi_drop_table_header (ethi);
-
-	scroll_off (ethi);
-
-	if (ethi->dnd_code) {
-		g_free (ethi->dnd_code);
-		ethi->dnd_code = NULL;
-	}
-
-	if (ethi->sort_info) {
-		if (ethi->sort_info_changed_id)
-			g_signal_handler_disconnect (ethi->sort_info, ethi->sort_info_changed_id);
-		if (ethi->group_info_changed_id)
-			g_signal_handler_disconnect (ethi->sort_info, ethi->group_info_changed_id);
-		g_object_unref (ethi->sort_info);
-		ethi->sort_info = NULL;
-	}
-
-	if (ethi->full_header)
-		g_object_unref (ethi->full_header);
-	ethi->full_header = NULL;
-
-	
-	if (ethi->etfcd)
-		g_object_remove_weak_pointer (G_OBJECT (ethi->etfcd), (gpointer *)&ethi->etfcd);
-	
-
-	if (ethi->config)
-		g_object_unref (ethi->config);
-	ethi->config = NULL;
-	
-	if (G_OBJECT_CLASS (ethi_parent_class)->dispose)
-		(*G_OBJECT_CLASS (ethi_parent_class)->dispose) (object);
-}
-
-static int
-e_table_header_item_get_height (ETableHeaderItem *ethi)
-{
-	ETableHeader *eth;
-	int numcols, col;
-	int maxheight;
-	GtkStyle *style;
-
-	g_return_val_if_fail (ethi != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_HEADER_ITEM (ethi), 0);
-       
-	eth = ethi->eth;
-	numcols = e_table_header_count (eth);
-
-	maxheight = 0;
-
-	style = GTK_WIDGET (GNOME_CANVAS_ITEM (ethi)->canvas)->style;
-
-	for (col = 0; col < numcols; col++) {
-		ETableCol *ecol = e_table_header_get_column (eth, col);
-		int height;
-
-		height = e_table_header_compute_height (ecol,
-							GTK_WIDGET (GNOME_CANVAS_ITEM (ethi)->canvas));
-
-		if (height > maxheight)
-			maxheight = height;
-	}
-
-	return maxheight;
-}
-
-static void
-ethi_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
-	ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
-	
-	double   i2c [6];
-	ArtPoint c1, c2, i1, i2;
-	
-	if (GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->update)
-		(*GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->update)(item, affine, clip_path, flags);
-
-	if (ethi->sort_info)
-		ethi->group_indent_width = e_table_sort_info_grouping_get_count(ethi->sort_info) * GROUP_INDENT;
-	else
-		ethi->group_indent_width = 0;
-
-	ethi->width = e_table_header_total_width (ethi->eth) + ethi->group_indent_width;
-
-	i1.x = i1.y = 0;
-	i2.x = ethi->width;
-	i2.y = ethi->height;
-
-	gnome_canvas_item_i2c_affine (item, i2c);
-	art_affine_point (&c1, &i1, i2c);
-	art_affine_point (&c2, &i2, i2c);
-
-	if (item->x1 != c1.x ||
-	    item->y1 != c1.y ||
-	    item->x2 != c2.x ||
-	    item->y2 != c2.y)
-		{
-			gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
-			item->x1 = c1.x;
-			item->y1 = c1.y;
-			item->x2 = c2.x;
-			item->y2 = c2.y;
-#ifndef NO_WARNINGS
-#warning FOO BAA
-#endif
-#if 0
-			gnome_canvas_group_child_bounds (GNOME_CANVAS_GROUP (item->parent), item);
-#endif
-		}
-	gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
-}
-
-static void
-ethi_font_set (ETableHeaderItem *ethi, GdkFont *font)
-{
-	if (ethi->font)
-		gdk_font_unref (ethi->font);
-
-	ethi->font = font;
-	gdk_font_ref (font);
-	
-	ethi->height = e_table_header_item_get_height (ethi);
-	e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-ethi_font_load (ETableHeaderItem *ethi, const char *fontname)
-{
-	GdkFont *font = NULL;
-
-	if (fontname != NULL)
-		font = gdk_fontset_load (fontname);
-
-	if (font == NULL) {
-		font = gtk_style_get_font (GTK_WIDGET (GNOME_CANVAS_ITEM (ethi)->canvas)->style);
-		gdk_font_ref (font);
-	}
-	
-	ethi_font_set (ethi, font);
-	gdk_font_unref (font);
-}
-
-static void
-ethi_drop_table_header (ETableHeaderItem *ethi)
-{
-	GObject *header;
-	
-	if (!ethi->eth)
-		return;
-
-	header = G_OBJECT (ethi->eth);
-	g_signal_handler_disconnect (header, ethi->structure_change_id);
-	g_signal_handler_disconnect (header, ethi->dimension_change_id);
-
-	g_object_unref (header);
-	ethi->eth = NULL;
-	ethi->width = 0;
-}
-
-static void 
-structure_changed (ETableHeader *header, ETableHeaderItem *ethi)
-{
-	gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-dimension_changed (ETableHeader *header, int col, ETableHeaderItem *ethi)
-{
-	gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-ethi_add_table_header (ETableHeaderItem *ethi, ETableHeader *header)
-{
-	ethi->eth = header;
-	g_object_ref (ethi->eth);
-
-	ethi->height = e_table_header_item_get_height (ethi);
-
-	ethi->structure_change_id = g_signal_connect (
-		header, "structure_change",
-		G_CALLBACK (structure_changed), ethi);
-	ethi->dimension_change_id = g_signal_connect (
-		header, "dimension_change",
-		G_CALLBACK (dimension_changed), ethi);
-	e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(ethi));
-	gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-ethi_sort_info_changed (ETableSortInfo *sort_info, ETableHeaderItem *ethi)
-{
-	gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-ethi_set_property (GObject *object,
-		   guint prop_id,
-		   const GValue *value,
-		   GParamSpec *pspec)
-{
-	GnomeCanvasItem *item;
-	ETableHeaderItem *ethi;
-
-	item = GNOME_CANVAS_ITEM (object);
-	ethi = E_TABLE_HEADER_ITEM (object);
-
-	switch (prop_id){
-	case PROP_TABLE_HEADER:
-		ethi_drop_table_header (ethi);
-		ethi_add_table_header (ethi, E_TABLE_HEADER(g_value_get_object (value)));
-		break;
-
-	case PROP_FULL_HEADER:
-		if (ethi->full_header)
-			g_object_unref(ethi->full_header);
-		ethi->full_header = E_TABLE_HEADER(g_value_get_object (value));
-		if (ethi->full_header)
-			g_object_ref(ethi->full_header);
-		break;
-
-	case PROP_DND_CODE:
-		g_free(ethi->dnd_code);
-		ethi->dnd_code = g_strdup (g_value_get_string (value));
-		break;
-
-	case PROP_TABLE_FONTSET:
-		ethi_font_load (ethi, g_value_get_string (value));
-		break;
-
-	case PROP_SORT_INFO:
-		if (ethi->sort_info){
-			if (ethi->sort_info_changed_id)
-				g_signal_handler_disconnect (
-					ethi->sort_info,
-					ethi->sort_info_changed_id);
-
-			if (ethi->group_info_changed_id)
-				g_signal_handler_disconnect (
-					ethi->sort_info,
-					ethi->group_info_changed_id);
-			g_object_unref (ethi->sort_info);
-		}
-		ethi->sort_info = g_value_get_object (value);
-		g_object_ref (ethi->sort_info);
-		ethi->sort_info_changed_id =
-			g_signal_connect (
-				ethi->sort_info, "sort_info_changed",
-				G_CALLBACK (ethi_sort_info_changed), ethi);
-		ethi->group_info_changed_id =
-			g_signal_connect (
-				ethi->sort_info, "group_info_changed",
-				G_CALLBACK(ethi_sort_info_changed), ethi);
-		break;
-	case PROP_TABLE:
-		if (g_value_get_object (value))
-			ethi->table = E_TABLE(g_value_get_object (value));
-		else
-			ethi->table = NULL;
-		break;
-	case PROP_TREE:
-		if (g_value_get_object (value))
-			ethi->tree = E_TREE(g_value_get_object (value));
-		else
-			ethi->tree = NULL;
-		break;
-	}
-	gnome_canvas_item_request_update(item);
-}
-
-static void
-ethi_get_property (GObject *object,
-		   guint prop_id,
-		   GValue *value,
-		   GParamSpec *pspec)
-{
-	ETableHeaderItem *ethi;
-
-	ethi = E_TABLE_HEADER_ITEM (object);
-
-	switch (prop_id){
-	case PROP_FULL_HEADER:
-		g_value_set_object (value, ethi->full_header);
-		break;
-	case PROP_DND_CODE:
-		g_value_set_string (value, g_strdup (ethi->dnd_code));
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static int
-ethi_find_col_by_x (ETableHeaderItem *ethi, int x)
-{
-	const int cols = e_table_header_count (ethi->eth);
-	int x1 = 0;
-	int col;
-	
-	d(g_print ("%s:%d: x = %d, x1 = %d\n", __FUNCTION__, __LINE__, x, x1));
-
-	x1 += ethi->group_indent_width;
-	
-	if (x < x1) {
-		d(g_print ("%s:%d: Returning 0\n", __FUNCTION__, __LINE__));
-		return 0;
-	}
-
-	for (col = 0; col < cols; col++){
-		ETableCol *ecol = e_table_header_get_column (ethi->eth, col);
-
-		if ((x >= x1) && (x <= x1 + ecol->width)) {
-			d(g_print ("%s:%d: Returning %d\n", __FUNCTION__, __LINE__, col));
-			return col;
-		}
-
-		x1 += ecol->width;
-	}
-	d(g_print ("%s:%d: Returning %d\n", __FUNCTION__, __LINE__, cols - 1));
-	return cols - 1;
-}
-
-static int
-ethi_find_col_by_x_nearest (ETableHeaderItem *ethi, int x)
-{
-	const int cols = e_table_header_count (ethi->eth);
-	int x1 = 0;
-	int col;
-
-	x1 += ethi->group_indent_width;
-	
-	if (x < x1)
-		return 0;
-
-	for (col = 0; col < cols; col++){
-		ETableCol *ecol = e_table_header_get_column (ethi->eth, col);
-
-		x1 += (ecol->width / 2);
-
-		if (x <= x1)
-			return col;
-
-		x1 += (ecol->width + 1) / 2;
-	}
-	return col;
-}
-
-static void
-ethi_remove_drop_marker (ETableHeaderItem *ethi)
-{
-	if (ethi->drag_mark == -1)
-		return;
-
-	gtk_widget_hide (arrow_up);
-	gtk_widget_hide (arrow_down);
-	
-	ethi->drag_mark = -1;
-}
-
-static GtkWidget *
-make_shaped_window_from_xpm (const char **xpm)
-{
-	GdkPixbuf *pixbuf;
-	GdkPixmap *pixmap;
-	GdkBitmap *bitmap;
-	GtkWidget *win, *pix;
-	
-	pixbuf = gdk_pixbuf_new_from_xpm_data (xpm);
-	gdk_pixbuf_render_pixmap_and_mask (pixbuf, &pixmap, &bitmap, 128);
-	gdk_pixbuf_unref (pixbuf);
-
-	gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-	win = gtk_window_new (GTK_WINDOW_POPUP);
-
-	pix = gtk_image_new_from_pixmap (pixmap, bitmap);
-	gtk_widget_realize (win);
-	gtk_container_add (GTK_CONTAINER (win), pix);
-	gtk_widget_shape_combine_mask (win, bitmap, 0, 0);
-	gtk_widget_pop_colormap ();
-	
-	gdk_pixmap_unref (pixmap);
-	gdk_bitmap_unref (bitmap);
-	
-	return win;
-}
-
-static void
-ethi_add_drop_marker (ETableHeaderItem *ethi, int col, gboolean recreate)
-{
-	int rx, ry;
-	int x;
-	
-	if (!recreate && ethi->drag_mark == col)
-		return;
-
-	ethi->drag_mark = col;
-
-	x = e_table_header_col_diff (ethi->eth, 0, col);
-	if (col > 0)
-		x += ethi->group_indent_width;
-	
-	if (!arrow_up){
-		arrow_up   = make_shaped_window_from_xpm (arrow_up_xpm);
-		arrow_down = make_shaped_window_from_xpm (arrow_down_xpm);
-	}
-
-	gdk_window_get_origin (
-		GTK_WIDGET (GNOME_CANVAS_ITEM (ethi)->canvas)->window,
-		&rx, &ry);
-
-	rx -= gtk_layout_get_hadjustment (GTK_LAYOUT (GNOME_CANVAS_ITEM (ethi)->canvas))->value;
-	ry -= gtk_layout_get_vadjustment (GTK_LAYOUT (GNOME_CANVAS_ITEM (ethi)->canvas))->value;
-
-	gtk_widget_set_uposition (arrow_down, rx + x - ARROW_PTR, ry - ARROW_DOWN_HEIGHT);
-	gtk_widget_show_all (arrow_down);
-
-	gtk_widget_set_uposition (arrow_up, rx + x - ARROW_PTR, ry + ethi->height);
-	gtk_widget_show_all (arrow_up);
-}
-
-#define gray50_width    2
-#define gray50_height   2
-static char gray50_bits [] = {
-  0x02, 0x01, };
-
-static void
-ethi_add_destroy_marker (ETableHeaderItem *ethi)
-{
-	double x1;
-	
-	if (ethi->remove_item)
-		gtk_object_destroy (GTK_OBJECT (ethi->remove_item));
-
-	if (!ethi->stipple)
-		ethi->stipple = gdk_bitmap_create_from_data  (
-			NULL, gray50_bits, gray50_width, gray50_height);
-	
-	x1 = (double) e_table_header_col_diff (ethi->eth, 0, ethi->drag_col);
-	if (ethi->drag_col > 0)
-		x1 += ethi->group_indent_width;
-	
-	ethi->remove_item = gnome_canvas_item_new (
-		GNOME_CANVAS_GROUP (GNOME_CANVAS_ITEM (ethi)->canvas->root),
-		gnome_canvas_rect_get_type (),
-		"x1", x1 + 1,
-		"y1", (double) 1,
-		"x2", (double) x1 + e_table_header_col_diff (
-			ethi->eth, ethi->drag_col, ethi->drag_col+1) - 2,
-
-		"y2", (double) ethi->height - 2,
-		"fill_color", "red",
-		"fill_stipple", ethi->stipple,
-		NULL);
-}
-
-static void
-ethi_remove_destroy_marker (ETableHeaderItem *ethi)
-{
-	if (!ethi->remove_item)
-		return;
-	
-	gtk_object_destroy (GTK_OBJECT (ethi->remove_item));
-	ethi->remove_item = NULL;
-}
-
-#if 0
-static gboolean
-moved (ETableHeaderItem *ethi, guint col, guint model_col)
-{
-	if (col == -1)
-		return TRUE;
-	ecol = e_table_header_get_column (ethi->eth, col);
-	if (ecol->col_idx == model_col)
-		return FALSE;
-	if (col > 0) {
-		ecol = e_table_header_get_column (ethi->eth, col - 1);
-		if (ecol->col_idx == model_col)
-			return FALSE;
-	}
-	return TRUE;
-}
-#endif
-
-static void
-do_drag_motion(ETableHeaderItem *ethi,
-	       GdkDragContext *context,
-	       gint x,
-	       gint y,
-	       guint time,
-	       gboolean recreate)
-{
-	d(g_print("In do_drag_motion\n"));
-	d(g_print("x = %d, y = %d, ethi->width = %d, ethi->height = %d\n", x, y, ethi->width, ethi->height));
-
-	if ((x >= 0) && (x <= (ethi->width)) &&
-	    (y >= 0) && (y <= (ethi->height))){
-		int col;
-		d(g_print("In header\n"));
-		
-		col = ethi_find_col_by_x_nearest (ethi, x);
-
-		if (ethi->drag_col != -1 && (col == ethi->drag_col || col == ethi->drag_col + 1)) {
-			if (ethi->drag_col != -1)
-				ethi_remove_destroy_marker (ethi);
-			
-			ethi_remove_drop_marker (ethi);
-			gdk_drag_status (context, context->suggested_action, time);
-		} 
-		else if (col != -1){
-			if (ethi->drag_col != -1)
-				ethi_remove_destroy_marker (ethi);
-
-			ethi_add_drop_marker (ethi, col, recreate);
-			gdk_drag_status (context, context->suggested_action, time);
-		} else {
-			ethi_remove_drop_marker (ethi);
-			if (ethi->drag_col != -1)
-				ethi_add_destroy_marker (ethi);
-		}
-	} else {
-		ethi_remove_drop_marker (ethi);
-		if (ethi->drag_col != -1)
-			ethi_add_destroy_marker (ethi);
-	}
-}
-
-static gboolean
-scroll_timeout (gpointer data)
-{
-	ETableHeaderItem *ethi = data;
-	int dx = 0;
-	GtkAdjustment *h, *v;
-	double value;
-
-	if (ethi->scroll_direction & ET_SCROLL_RIGHT)
-		dx += 20;
-	if (ethi->scroll_direction & ET_SCROLL_LEFT)
-		dx -= 20;
-
-	h = GTK_LAYOUT(GNOME_CANVAS_ITEM (ethi)->canvas)->hadjustment;
-	v = GTK_LAYOUT(GNOME_CANVAS_ITEM (ethi)->canvas)->vadjustment;
-
-	value = h->value;
-
-	gtk_adjustment_set_value(h, CLAMP(h->value + dx, h->lower, h->upper - h->page_size));
-
-	if (h->value != value)
-		do_drag_motion(ethi,
-			       ethi->last_drop_context,
-			       ethi->last_drop_x + h->value,
-			       ethi->last_drop_y + v->value,
-			       ethi->last_drop_time,
-			       TRUE);
-
-	return TRUE;
-}
-
-static void
-scroll_on (ETableHeaderItem *ethi, guint scroll_direction)
-{
-	if (ethi->scroll_idle_id == 0 || scroll_direction != ethi->scroll_direction) {
-		if (ethi->scroll_idle_id != 0)
-			g_source_remove (ethi->scroll_idle_id);
-		ethi->scroll_direction = scroll_direction;
-		ethi->scroll_idle_id = g_timeout_add (100, scroll_timeout, ethi);
-	}
-}
-
-static void
-scroll_off (ETableHeaderItem *ethi)
-{
-	if (ethi->scroll_idle_id) {
-		g_source_remove (ethi->scroll_idle_id);
-		ethi->scroll_idle_id = 0;
-	}
-}
-
-static void
-context_destroyed (gpointer data)
-{
-	ETableHeaderItem *ethi = data;
-
-	ethi->last_drop_x       = 0;
-	ethi->last_drop_y       = 0;
-	ethi->last_drop_time    = 0;
-	ethi->last_drop_context = NULL;
-	scroll_off (ethi);
-
-	g_object_unref (ethi);
-}
-
-static void
-context_connect (ETableHeaderItem *ethi, GdkDragContext *context)
-{
-	if (g_dataset_get_data (context, "e-table-header-item") == NULL) {
-		g_object_ref (ethi);
-		g_dataset_set_data_full (context, "e-table-header-item", ethi, context_destroyed);
-	}
-}
-
-static gboolean
-ethi_drag_motion (GtkWidget *widget, GdkDragContext *context,
-		  gint x, gint y, guint time,
-		  ETableHeaderItem *ethi)
-{
-	char *droptype, *headertype;
-	guint direction = 0;
-
-	gdk_drag_status (context, 0, time);
-
-	droptype = gdk_atom_name (GDK_POINTER_TO_ATOM (context->targets->data));
-	headertype = g_strdup_printf ("%s-%s", TARGET_ETABLE_COL_TYPE,
-				      ethi->dnd_code);
-
-	if (strcmp (droptype, headertype) != 0) {
-		g_free (headertype);
-		return FALSE;
-	}
-
-	g_free (headertype);
-
-	d(g_print ("y = %d, widget->allocation.y = %d, GTK_LAYOUT (widget)->vadjustment->value = %f\n", y, widget->allocation.y, GTK_LAYOUT (widget)->vadjustment->value));
-
-	if (x < 20)
-		direction |= ET_SCROLL_LEFT;
-	if (x > widget->allocation.width - 20)
-		direction |= ET_SCROLL_RIGHT;
-
-	ethi->last_drop_x = x;
-	ethi->last_drop_y = y;
-	ethi->last_drop_time = time;
-	ethi->last_drop_context = context;
-	context_connect (ethi, context);
-
-	do_drag_motion (ethi,
-			context,
-			x + GTK_LAYOUT(widget)->hadjustment->value,
-			y + GTK_LAYOUT(widget)->vadjustment->value,
-			time,
-			FALSE);
-
-	if (direction != 0)
-		scroll_on (ethi, direction);
-	else
-		scroll_off (ethi);
-
-	return TRUE;
-}
-
-static void
-ethi_drag_end (GtkWidget *canvas, GdkDragContext *context, ETableHeaderItem *ethi)
-{
-	if (context->action == 0) {
-		e_table_header_remove (ethi->eth, ethi->drag_col);
-		gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
-	}
-	ethi_remove_drop_marker (ethi);
-	ethi_remove_destroy_marker (ethi);
-	ethi->drag_col = -1;
-	scroll_off (ethi);
-}
-
-static void
-ethi_drag_data_received (GtkWidget *canvas,
-			 GdkDragContext *drag_context,
-			 gint x,
-			 gint y,
-			 GtkSelectionData *data,
-			 guint info,
-			 guint time,
-			 ETableHeaderItem *ethi)
-{
-	int found = FALSE;
-	int count;
-	int column;
-	int drop_col;
-	int i;
-
-	if (data->data) {
-		count = e_table_header_count(ethi->eth);
-		column = atoi(data->data);
-		drop_col = ethi->drop_col;
-		ethi->drop_col = -1;
-
-		if (column >= 0) {
-			for (i = 0; i < count; i++) {
-				ETableCol *ecol = e_table_header_get_column (ethi->eth, i);
-				if (ecol->col_idx == column) {
-					e_table_header_move(ethi->eth, i, drop_col);
-					found = TRUE;
-					break;
-				}
-			}
-			if (!found) {
-				count = e_table_header_count(ethi->full_header);
-				for (i = 0; i < count; i++) {
-					ETableCol *ecol = e_table_header_get_column (ethi->full_header, i);
-					if (ecol->col_idx == column) {
-						e_table_header_add_column (ethi->eth, ecol, drop_col);
-						break;
-					}
-				}
-			}
-		}
-	}
-	ethi_remove_drop_marker (ethi);
-	gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(ethi));
-}
-
-static void
-ethi_drag_data_get (GtkWidget *canvas,
-		    GdkDragContext     *context,
-		    GtkSelectionData   *selection_data,
-		    guint               info,
-		    guint               time,
-		    ETableHeaderItem *ethi)
-{
-	if (ethi->drag_col != -1) {
-		ETableCol *ecol = e_table_header_get_column (ethi->eth, ethi->drag_col);
-		
-		gchar *string = g_strdup_printf("%d", ecol->col_idx);
-		gtk_selection_data_set(selection_data,
-				       GDK_SELECTION_TYPE_STRING,
-				       sizeof(string[0]),
-				       string,
-				       strlen(string));
-		g_free(string);
-	}
-}
-
-static gboolean
-ethi_drag_drop (GtkWidget *canvas,
-		GdkDragContext *context,
-		gint x,
-		gint y,
-		guint time,
-		ETableHeaderItem *ethi)
-{
-	gboolean successful = FALSE;
-
-	if ((x >= 0) && (x <= (ethi->width)) &&
-	    (y >= 0) && (y <= (ethi->height))){
-		int col;
-		
-		col = ethi_find_col_by_x_nearest (ethi, x);
-		
-		ethi_add_drop_marker (ethi, col, FALSE);
-
-		ethi->drop_col = col;
-		
-		if (col != -1) {
-			char *target = g_strdup_printf ("%s-%s", TARGET_ETABLE_COL_TYPE, ethi->dnd_code);
-			d(g_print ("ethi -  %s\n", target));
-			gtk_drag_get_data (canvas, context, gdk_atom_intern(target, FALSE), time);
-			g_free (target);
-		}
-	}
-	gtk_drag_finish (context, successful, successful, time);
-	scroll_off (ethi);
-	return successful;
-}
-
-static void
-ethi_drag_leave (GtkWidget *widget, GdkDragContext *context, guint time, ETableHeaderItem *ethi)
-{
-	ethi_remove_drop_marker (ethi);
-	if (ethi->drag_col != -1)
-		ethi_add_destroy_marker (ethi);
-}
-
-static void
-ethi_realize (GnomeCanvasItem *item)
-{
-	ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
-	GdkWindow *window;
-	GtkTargetEntry  ethi_drop_types [] = {
-		{ TARGET_ETABLE_COL_TYPE, 0, TARGET_ETABLE_COL_HEADER },
-	};
-
-	
-	if (GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)-> realize)
-		(*GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->realize)(item);
-
-	window = GTK_WIDGET (item->canvas)->window;
-
-	if (!ethi->font)
-		ethi_font_set (ethi, gtk_style_get_font (GTK_WIDGET (item->canvas)->style));
-
-	/*
-	 * Now, configure DnD
-	 */
-	ethi_drop_types[0].target = g_strdup_printf("%s-%s", ethi_drop_types[0].target, ethi->dnd_code);
-	gtk_drag_dest_set (GTK_WIDGET (item->canvas), 0,
-			   ethi_drop_types, ELEMENTS (ethi_drop_types),
-			   GDK_ACTION_MOVE);
-  	g_free(ethi_drop_types[0].target); 
-
-	/* Drop signals */
-	ethi->drag_motion_id = g_signal_connect (item->canvas, "drag_motion",
-						 G_CALLBACK (ethi_drag_motion), ethi);
-	ethi->drag_leave_id = g_signal_connect (item->canvas, "drag_leave",
-						G_CALLBACK (ethi_drag_leave), ethi);
-	ethi->drag_drop_id = g_signal_connect (item->canvas, "drag_drop",
-					       G_CALLBACK (ethi_drag_drop), ethi);
-	ethi->drag_data_received_id = g_signal_connect (item->canvas, "drag_data_received",
-							G_CALLBACK (ethi_drag_data_received), ethi);
-
-	/* Drag signals */
-	ethi->drag_end_id = g_signal_connect (item->canvas, "drag_end",
-					      G_CALLBACK (ethi_drag_end), ethi);
-	ethi->drag_data_get_id = g_signal_connect (item->canvas, "drag_data_get",
-						   G_CALLBACK (ethi_drag_data_get), ethi);
-
-}
-
-static void
-ethi_unrealize (GnomeCanvasItem *item)
-{
-	ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
-
-	gdk_font_unref (ethi->font);
-
-	g_signal_handler_disconnect (item->canvas, ethi->drag_motion_id);
-	g_signal_handler_disconnect (item->canvas, ethi->drag_leave_id);
-	g_signal_handler_disconnect (item->canvas, ethi->drag_drop_id);
-	g_signal_handler_disconnect (item->canvas, ethi->drag_data_received_id);
-
-	g_signal_handler_disconnect (item->canvas, ethi->drag_end_id);
-	g_signal_handler_disconnect (item->canvas, ethi->drag_data_get_id);
-
-	gtk_drag_dest_unset (GTK_WIDGET (item->canvas));
-
-	if (ethi->stipple){
-		gdk_bitmap_unref (ethi->stipple);
-		ethi->stipple = NULL;
-	}
-	
-	if (GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->unrealize)
-		(*GNOME_CANVAS_ITEM_CLASS (ethi_parent_class)->unrealize)(item);
-}
-
-static void
-ethi_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height)
-{
-	ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
-	GnomeCanvas *canvas = item->canvas;
-	const int cols = e_table_header_count (ethi->eth);
-	int x1, x2;
-	int col;
-	GHashTable *arrows = g_hash_table_new (NULL, NULL);
-
-
-	if (ethi->sort_info) {
-		int length = e_table_sort_info_grouping_get_count(ethi->sort_info);
-		int i;
-		for (i = 0; i < length; i++) {
-			ETableSortColumn column = e_table_sort_info_grouping_get_nth(ethi->sort_info, i);
-			g_hash_table_insert (arrows, 
-					     GINT_TO_POINTER (column.column),
-					     GINT_TO_POINTER (column.ascending ?
-							      E_TABLE_COL_ARROW_DOWN : 
-							      E_TABLE_COL_ARROW_UP));
-		}
-		length = e_table_sort_info_sorting_get_count(ethi->sort_info);
-		for (i = 0; i < length; i++) {
-			ETableSortColumn column = e_table_sort_info_sorting_get_nth(ethi->sort_info, i);
-			g_hash_table_insert (arrows, 
-					     GINT_TO_POINTER (column.column),
-					     GINT_TO_POINTER (column.ascending ?
-							      E_TABLE_COL_ARROW_DOWN : 
-							      E_TABLE_COL_ARROW_UP));
-		}
-	}
-
-	ethi->width = e_table_header_total_width (ethi->eth) + ethi->group_indent_width;
-	x1 = x2 = 0;
-	x2 += ethi->group_indent_width;
-	for (col = 0; col < cols; col++, x1 = x2){
-		ETableCol *ecol = e_table_header_get_column (ethi->eth, col);
-		int col_width;
-
-		col_width = ecol->width;
-				
-		x2 += col_width;
-		
-		if (x1 > (x + width))
-			break;
-
-		if (x2 < x)
-			continue;
-
-		if (x2 <= x1)
-			continue;
-
-		e_table_header_draw_button (drawable, ecol,
-					    GTK_WIDGET (canvas)->style,
-					    GTK_WIDGET_STATE (canvas),
-					    GTK_WIDGET (canvas),
-					    x1 - x, -y,
-					    width, height,
-					    x2 - x1, ethi->height,
-					    (ETableColArrow) g_hash_table_lookup (
-						    arrows, GINT_TO_POINTER (ecol->col_idx)));
-	}
-
-	g_hash_table_destroy (arrows);
-}
-
-static double
-ethi_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
-	    GnomeCanvasItem **actual_item)
-{
-	*actual_item = item;
-	return 0.0;
-}
-
-/*
- * is_pointer_on_division:
- *
- * Returns whether @pos is a column header division;  If @the_total is not NULL,
- * then the actual position is returned here.  If @return_ecol is not NULL,
- * then the ETableCol that actually contains this point is returned here
- */
-static gboolean
-is_pointer_on_division (ETableHeaderItem *ethi, int pos, int *the_total, int *return_col)
-{
-	const int cols = e_table_header_count (ethi->eth);
-	int col, total;
-
-	total = 0;
-	for (col = 0; col < cols; col++){
-		ETableCol *ecol = e_table_header_get_column (ethi->eth, col);
-
-		if (col == 0)
-			total += ethi->group_indent_width;
-		
-		total += ecol->width;
-
-		if ((total - TOLERANCE < pos)&& (pos < total + TOLERANCE)){
-			if (return_col)
-				*return_col = col;
-			if (the_total)
-				*the_total = total;
-
-			return TRUE;
-		}
-		if (return_col)
-			*return_col = col;
-
-		if (total > pos + TOLERANCE)
-			return FALSE;
-	}
-
-	return FALSE;
-}
-
-#define convert(c,sx,sy,x,y) gnome_canvas_w2c (c,sx,sy,x,y)
-
-static void
-set_cursor (ETableHeaderItem *ethi, int pos)
-{
-	int col;
-	GtkWidget *canvas = GTK_WIDGET (GNOME_CANVAS_ITEM (ethi)->canvas);
-	gboolean resizable = FALSE;
-		
-	/* We might be invoked before we are realized */
-	if (!canvas->window)
-		return;
-
-	if (is_pointer_on_division (ethi, pos, NULL, &col)) {
-		int last_col = ethi->eth->col_count - 1;
-		ETableCol *ecol = e_table_header_get_column (ethi->eth, col);
-
-		/* Last column is not resizable */
-		if (ecol->resizable && col != last_col) {
-			int c = col + 1;
-
-			/* Column is not resizable if all columns after it
-			   are also not resizable */
-			for (; c <= last_col; c++){
-				ETableCol *ecol2;
-
-				ecol2 = e_table_header_get_column (ethi->eth, c);
-				if (ecol2->resizable) {
-					resizable = TRUE;
-					break;
-				}
-			}
-		}
-	}
-	
-	if (resizable)
-		e_cursor_set (canvas->window, E_CURSOR_SIZE_X);
-	else
-		gdk_window_set_cursor (canvas->window, NULL);
-	/*		e_cursor_set (canvas->window, E_CURSOR_ARROW);*/
-}
-
-static void
-ethi_end_resize (ETableHeaderItem *ethi)
-{
-	ethi->resize_col = -1;
-	ethi->resize_guide = GINT_TO_POINTER (0);
-
-	gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(ethi));
-}
-
-static gboolean
-ethi_maybe_start_drag (ETableHeaderItem *ethi, GdkEventMotion *event)
-{
-	if (!ethi->maybe_drag)
-		return FALSE;
-
-	if (ethi->eth->col_count < 2) {
-		ethi->maybe_drag = FALSE;
-		return FALSE;
-	}
-		
-	if (MAX (abs (ethi->click_x - event->x),
-		 abs (ethi->click_y - event->y)) <= 3)
-		return FALSE;
-
-	return TRUE;
-}
-
-static void
-ethi_start_drag (ETableHeaderItem *ethi, GdkEvent *event)
-{
-	GtkWidget *widget = GTK_WIDGET (GNOME_CANVAS_ITEM (ethi)->canvas);
-	GtkTargetList *list;
-	GdkDragContext *context;
-	ETableCol *ecol;
-	int col_width;
-	GdkPixmap *pixmap;
-	int group_indent = 0;
-	GHashTable *arrows = g_hash_table_new (NULL, NULL);
-
-	GtkTargetEntry  ethi_drag_types [] = {
-		{ TARGET_ETABLE_COL_TYPE, 0, TARGET_ETABLE_COL_HEADER },
-	};
-
-	ethi->drag_col = ethi_find_col_by_x (ethi, event->motion.x);
-
-	if (ethi->drag_col == -1)
-		return;
-
-	if (ethi->sort_info) {
-		int length = e_table_sort_info_grouping_get_count(ethi->sort_info);
-		int i;
-		for (i = 0; i < length; i++) {
-			ETableSortColumn column =
-				e_table_sort_info_grouping_get_nth(
-					ethi->sort_info, i);
-			group_indent ++;
-			g_hash_table_insert (
-				arrows, 
-				GINT_TO_POINTER (column.column),
-				GINT_TO_POINTER (column.ascending ?
-						 E_TABLE_COL_ARROW_DOWN : 
-						 E_TABLE_COL_ARROW_UP));
-		}
-		length = e_table_sort_info_sorting_get_count(ethi->sort_info);
-		for (i = 0; i < length; i++) {
-			ETableSortColumn column =
-				e_table_sort_info_sorting_get_nth (
-					ethi->sort_info, i);
-
-			g_hash_table_insert (
-				arrows, 
-				GINT_TO_POINTER (column.column),
-				GINT_TO_POINTER (column.ascending ?
-						 E_TABLE_COL_ARROW_DOWN : 
-						 E_TABLE_COL_ARROW_UP));
-		}
-	}
-
-	ethi_drag_types[0].target = g_strdup_printf(
-		"%s-%s", ethi_drag_types[0].target, ethi->dnd_code);
-	list = gtk_target_list_new (
-		ethi_drag_types, ELEMENTS (ethi_drag_types));
-	context = gtk_drag_begin (widget, list, GDK_ACTION_MOVE, 1, event);
-	g_free(ethi_drag_types[0].target);
-
-	ecol = e_table_header_get_column (ethi->eth, ethi->drag_col);
-	col_width = ecol->width;
-	pixmap = gdk_pixmap_new (widget->window, col_width, ethi->height, -1);
-
-	e_table_header_draw_button (
-		pixmap, ecol,
-		widget->style,
-		GTK_WIDGET_STATE (widget),
-		widget,
-		0, 0,
-		col_width, ethi->height,
-		col_width, ethi->height,
-		(ETableColArrow) g_hash_table_lookup (
-			arrows, GINT_TO_POINTER (ecol->col_idx)));
-	gtk_drag_set_icon_pixmap (
-		context,
-		gdk_window_get_colormap (widget->window),
-		pixmap,
-		NULL,
-		col_width / 2,
-		ethi->height / 2);
-	gdk_pixmap_unref (pixmap);
-
-	ethi->maybe_drag = FALSE;
-	g_hash_table_destroy (arrows);
-}
-
-typedef struct {
-	ETableHeaderItem *ethi;
-	int col;
-} EthiHeaderInfo;
-
-static void
-ethi_popup_sort_ascending(GtkWidget *widget, EthiHeaderInfo *info)
-{
-	ETableCol *col;
-	int model_col;
-	int length;
-	int i;
-	int found = FALSE;
-	ETableHeaderItem *ethi = info->ethi;
-
-	col = e_table_header_get_column (ethi->eth, info->col);
-	model_col = col->col_idx;
-
-	length = e_table_sort_info_grouping_get_count(ethi->sort_info);
-	for (i = 0; i < length; i++) {
-		ETableSortColumn column = e_table_sort_info_grouping_get_nth (
-			ethi->sort_info, i);
-
-		if (model_col == column.column){
-			column.ascending = 1;
-			e_table_sort_info_grouping_set_nth (
-				ethi->sort_info, i, column);
-			found = 1;
-			break;
-		}
-	}
-	if (!found) {
-		length = e_table_sort_info_sorting_get_count (
-			ethi->sort_info);
-		for (i = 0; i < length; i++) {
-			ETableSortColumn column =
-				e_table_sort_info_sorting_get_nth(
-					ethi->sort_info, i);
-			if (model_col == column.column){
-				column.ascending = 1;
-				e_table_sort_info_sorting_set_nth (
-					ethi->sort_info, i, column);
-				found = 1;
-				break;
-			}
-		}
-	}
-	if (!found) {
-		ETableSortColumn column;
-		column.column = model_col;
-		column.ascending =  1;
-		length = e_table_sort_info_sorting_get_count(ethi->sort_info);
-		if (length == 0)
-			length++;
-		e_table_sort_info_sorting_set_nth(ethi->sort_info, length - 1, column);
-	}
-}
-
-static void
-ethi_popup_sort_descending(GtkWidget *widget, EthiHeaderInfo *info)
-{
-	ETableCol *col;
-	int model_col;
-	int length;
-	int i;
-	int found = FALSE;
-	ETableHeaderItem *ethi = info->ethi;
-
-	col = e_table_header_get_column (ethi->eth, info->col);
-	model_col = col->col_idx;
-
-	length = e_table_sort_info_grouping_get_count(ethi->sort_info);
-	for (i = 0; i < length; i++) {
-		ETableSortColumn column = e_table_sort_info_grouping_get_nth(
-			ethi->sort_info, i);
-		if (model_col == column.column){
-			column.ascending = 0;
-			e_table_sort_info_grouping_set_nth(
-				ethi->sort_info, i, column);
-			found = 1;
-			break;
-		}
-	}
-	if (!found) {
-		length = e_table_sort_info_sorting_get_count (ethi->sort_info);
-		for (i = 0; i < length; i++) {
-			ETableSortColumn column =
-				e_table_sort_info_sorting_get_nth(
-					ethi->sort_info, i);
-
-			if (model_col == column.column){
-				column.ascending = 0;
-				e_table_sort_info_sorting_set_nth (
-					ethi->sort_info, i, column);
-				found = 1;
-				break;
-			}
-		}
-	}
-	if (!found) {
-		ETableSortColumn column;
-		column.column = model_col;
-		column.ascending = 0;
-		length = e_table_sort_info_sorting_get_count (ethi->sort_info);
-		if (length == 0)
-			length++;
-		e_table_sort_info_sorting_set_nth (
-			ethi->sort_info, length - 1, column);
-	}
-}
-
-static void
-ethi_popup_unsort(GtkWidget *widget, EthiHeaderInfo *info)
-{
-	ETableHeaderItem *ethi = info->ethi;
-
-	e_table_sort_info_grouping_truncate(ethi->sort_info, 0);
-	e_table_sort_info_sorting_truncate(ethi->sort_info, 0);
-}
-
-static void
-ethi_popup_group_field(GtkWidget *widget, EthiHeaderInfo *info)
-{
-	ETableCol *col;
-	int model_col;
-	ETableHeaderItem *ethi = info->ethi;
-	ETableSortColumn column;
-
-	col = e_table_header_get_column (ethi->eth, info->col);
-	model_col = col->col_idx;
-
-	column.column = model_col;
-	column.ascending = 1;
-	e_table_sort_info_grouping_set_nth(ethi->sort_info, 0, column);
-	e_table_sort_info_grouping_truncate(ethi->sort_info, 1);
-}
-
-static void
-ethi_popup_group_box(GtkWidget *widget, EthiHeaderInfo *info)
-{
-}
-
-static void
-ethi_popup_remove_column(GtkWidget *widget, EthiHeaderInfo *info)
-{
-	e_table_header_remove(info->ethi->eth, info->col);
-}
-
-static void
-ethi_popup_field_chooser(GtkWidget *widget, EthiHeaderInfo *info)
-{
-	if (info->ethi->etfcd) {
-		gtk_window_present (GTK_WINDOW (info->ethi->etfcd));
-		
-		return;
-	}
-	
-	info->ethi->etfcd = e_table_field_chooser_dialog_new();	
-	g_object_add_weak_pointer (G_OBJECT (info->ethi->etfcd), (gpointer *)&info->ethi->etfcd);
-	
-	g_object_set(info->ethi->etfcd,
-		     "full_header", info->ethi->full_header,
-		     "header", info->ethi->eth,
-		     "dnd_code", info->ethi->dnd_code,
-		     NULL);
-
-	gtk_widget_show(info->ethi->etfcd);
-}
-
-static void
-ethi_popup_alignment(GtkWidget *widget, EthiHeaderInfo *info)
-{
-}
-
-static void
-ethi_popup_best_fit(GtkWidget *widget, EthiHeaderInfo *info)
-{
-	ETableHeaderItem *ethi = info->ethi;
-	int width;
-
-	g_signal_emit_by_name (ethi->eth,
-			       "request_width",
-			       info->col, &width);
-	/* Add 10 to stop it from "..."ing */
-	e_table_header_set_size (ethi->eth, info->col, width + 10);
-	
-	gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(ethi));
-
-}
-
-static void
-ethi_popup_format_columns(GtkWidget *widget, EthiHeaderInfo *info)
-{
-}
-
-static void
-config_destroyed (gpointer data, GObject *where_object_was)
-{
-	ETableHeaderItem *ethi = data;
-	ethi->config = NULL;
-}
-
-static void
-apply_changes (ETableConfig *config, ETableHeaderItem *ethi)
-{
-	char *state = e_table_state_save_to_string (config->state);
-
-	if (ethi->table)
-		e_table_set_state (ethi->table, state);
-	if (ethi->tree)
-		e_tree_set_state (ethi->tree, state);
-	g_free (state);
-
-	gtk_dialog_set_response_sensitive (GTK_DIALOG (config->dialog_toplevel),
-					   GTK_RESPONSE_APPLY, FALSE);
-}
-
-static void
-ethi_popup_customize_view(GtkWidget *widget, EthiHeaderInfo *info)
-{
-	ETableHeaderItem *ethi = info->ethi;
-	ETableState *state;
-	ETableSpecification *spec;
-
-	if (ethi->config)
-		e_table_config_raise (E_TABLE_CONFIG (ethi->config));
-	else {
-		if (ethi->table) {
-			state = e_table_get_state_object(ethi->table);
-			spec = ethi->table->spec;
-		} else if (ethi->tree) {
-			state = e_tree_get_state_object(ethi->tree);
-			spec = e_tree_get_spec (ethi->tree);
-		} else
-			return;
-
-		ethi->config = e_table_config_new (
-				_("Customize Current View"),
-				spec, state, GTK_WINDOW (gtk_widget_get_toplevel (widget)));
-		g_object_weak_ref (G_OBJECT (ethi->config),
-				   config_destroyed, ethi);
-		g_signal_connect (
-			ethi->config, "changed",
-			G_CALLBACK (apply_changes), ethi);
-	}
-}
-
-static void
-free_popup_info (GtkWidget *w, EthiHeaderInfo *info)
-{
-	g_free (info);
-}
-
-/* Bit 1 is always disabled. */
-/* Bit 2 is disabled if not "sortable". */
-/* Bit 4 is disabled if we don't have a pointer to our table object. */
-static EPopupMenu ethi_context_menu [] = {
-	E_POPUP_ITEM (N_("Sort Ascending"),            G_CALLBACK(ethi_popup_sort_ascending),  2),
-	E_POPUP_ITEM (N_("Sort Descending"),           G_CALLBACK(ethi_popup_sort_descending), 2),
-	E_POPUP_ITEM (N_("Unsort"),                    G_CALLBACK(ethi_popup_unsort),          0),
-	E_POPUP_SEPARATOR,
-	E_POPUP_ITEM (N_("Group By This Field"),       G_CALLBACK(ethi_popup_group_field),     16),
-	E_POPUP_ITEM (N_("Group By Box"),              G_CALLBACK(ethi_popup_group_box),       128),
-	E_POPUP_SEPARATOR,
-	E_POPUP_ITEM (N_("Remove This Column"),        G_CALLBACK(ethi_popup_remove_column),   8),
-	E_POPUP_ITEM (N_("Add a Column..."),           G_CALLBACK(ethi_popup_field_chooser),   0),
-	E_POPUP_SEPARATOR,
-	E_POPUP_ITEM (N_("Alignment"),                 G_CALLBACK(ethi_popup_alignment),       128),
-	E_POPUP_ITEM (N_("Best Fit"),                  G_CALLBACK(ethi_popup_best_fit),        2),
-	E_POPUP_ITEM (N_("Format Columns..."),         G_CALLBACK(ethi_popup_format_columns),  128),
-	E_POPUP_SEPARATOR,
-	E_POPUP_ITEM (N_("Customize Current View..."), G_CALLBACK(ethi_popup_customize_view),  4),
-	E_POPUP_TERMINATOR
-};
-
-static void
-ethi_header_context_menu (ETableHeaderItem *ethi, GdkEventButton *event)
-{
-	EthiHeaderInfo *info = g_new(EthiHeaderInfo, 1);
-	ETableCol *col;
-	GtkMenu *popup;
-	info->ethi = ethi;
-	info->col = ethi_find_col_by_x (ethi, event->x);
-	col = e_table_header_get_column (ethi->eth, info->col);
-
-	popup = e_popup_menu_create_with_domain (ethi_context_menu,
-						 1 +
-						 (col->sortable ? 0 : 2) +
-						 ((ethi->table || ethi->tree) ? 0 : 4) + 
-						 ((e_table_header_count (ethi->eth) > 1) ? 0 : 8),
-						 ((e_table_sort_info_get_can_group (ethi->sort_info)) ? 0 : 16) +
-						 128, info, E_I18N_DOMAIN);
-	g_object_ref (popup);
-	gtk_object_sink (GTK_OBJECT (popup));
-	g_signal_connect (popup, "selection-done",
-			  G_CALLBACK (free_popup_info), info);
-	e_popup_menu (popup, (GdkEvent *) event);
-}
-
-static void
-ethi_button_pressed (ETableHeaderItem *ethi, GdkEventButton *event)
-{
-	g_signal_emit (ethi,
-		       ethi_signals [BUTTON_PRESSED], 0, event);
-}
-
-static void
-ethi_change_sort_state (ETableHeaderItem *ethi, ETableCol *col)
-{
-	int model_col;
-	int length;
-	int i;
-	int found = FALSE;
-	
-	if (col == NULL)
-		return;
-
-	model_col = col->col_idx;
-	
-	length = e_table_sort_info_grouping_get_count(ethi->sort_info);
-	for (i = 0; i < length; i++) {
-		ETableSortColumn column = e_table_sort_info_grouping_get_nth(ethi->sort_info, i);
-		if (model_col == column.column){
-			int ascending = column.ascending;
-			ascending = ! ascending;
-			column.ascending = ascending;
-			e_table_sort_info_grouping_set_nth(ethi->sort_info, i, column);
-			found = 1;
-			break;
-		}
-	}
-	
-	if (!col->sortable)
-		return;
-	
-	if (!found) {
-		length = e_table_sort_info_sorting_get_count(ethi->sort_info);
-		for (i = 0; i < length; i++) {
-			ETableSortColumn column = e_table_sort_info_sorting_get_nth(ethi->sort_info, i);
-
-			if (model_col == column.column){
-				int ascending = column.ascending;
-				
-				if (ascending == 0){
-					/*
-					 * This means the user has clicked twice
-					 * already, lets kill sorting now.
-					 */
-					e_table_sort_info_sorting_truncate (ethi->sort_info, i);
-				} else {
-					ascending = !ascending;
-					column.ascending = ascending;
-					e_table_sort_info_sorting_set_nth(ethi->sort_info, i, column);
-				}
-				found = 1;
-				break;
-			}
-		}
-	}
-
-	if (!found) {
-		ETableSortColumn column;
-		column.column = model_col;
-		column.ascending = 1;
-		length = e_table_sort_info_sorting_get_count(ethi->sort_info);
-		if (length == 0)
-			length++;
-		e_table_sort_info_sorting_set_nth(ethi->sort_info, length - 1, column);
-	}
-}
-
-/*
- * Handles the events on the ETableHeaderItem, particularly it handles resizing
- */
-static int
-ethi_event (GnomeCanvasItem *item, GdkEvent *e)
-{
-	ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
-	GnomeCanvas *canvas = item->canvas;
-	const gboolean resizing = ETHI_RESIZING (ethi);
-	int x, y, start, col;
-	int was_maybe_drag = 0;
-	
-	switch (e->type){
-	case GDK_ENTER_NOTIFY:
-		convert (canvas, e->crossing.x, e->crossing.y, &x, &y);
-		set_cursor (ethi, x);
-		break;
-
-	case GDK_LEAVE_NOTIFY:
-		gdk_window_set_cursor (GTK_WIDGET (canvas)->window, NULL);
-		/*		e_cursor_set (GTK_WIDGET (canvas)->window, E_CURSOR_ARROW);*/
-		break;
-			    
-	case GDK_MOTION_NOTIFY:
-
-		convert (canvas, e->motion.x, e->motion.y, &x, &y);
-		if (resizing){
-			int new_width;
-			
-			if (ethi->resize_guide == NULL){
-				/* Quick hack until I actually bind the views */
-				ethi->resize_guide = GINT_TO_POINTER (1);
-				
-				gnome_canvas_item_grab (item,
-							GDK_POINTER_MOTION_MASK |
-							GDK_BUTTON_RELEASE_MASK,
-							e_cursor_get (E_CURSOR_SIZE_X),
-							e->button.time);
-			}
-
-			new_width = x - ethi->resize_start_pos;
-
-			e_table_header_set_size (ethi->eth, ethi->resize_col, new_width);
-
-			gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(ethi));
-		} else if (ethi_maybe_start_drag (ethi, &e->motion)){
-			ethi_start_drag (ethi, e);
-		} else
-			set_cursor (ethi, x);
-		break;
-		
-	case GDK_BUTTON_PRESS:
-		if (e->button.button > 3)
-			return FALSE;
-
-		convert (canvas, e->button.x, e->button.y, &x, &y);
-		    
-		if (is_pointer_on_division (ethi, x, &start, &col) && e->button.button == 1){
-			ETableCol *ecol;
-				
-				/*
-				 * Record the important bits.
-				 *
-				 * By setting resize_pos to a non -1 value,
-				 * we know that we are being resized (used in the
-				 * other event handlers).
-				 */
-			ecol = e_table_header_get_column (ethi->eth, col);
-			
-			if (!ecol->resizable)
-				break;
-			ethi->resize_col = col;
-			ethi->resize_start_pos = start - ecol->width;
-			ethi->resize_min_width = ecol->min_width;
-		} else {
-			if (e->button.button == 1){
-				ethi->click_x = e->button.x;
-				ethi->click_y = e->button.y;
-				ethi->maybe_drag = TRUE;
-				is_pointer_on_division (ethi, x, &start, &col);
-				ethi->selected_col = col;
-				e_canvas_item_grab_focus (item, TRUE);
-			} else if (e->button.button == 3){
-				ethi_header_context_menu (ethi, &e->button);
-			} else
-				ethi_button_pressed (ethi, &e->button);
-		}
-		break;
-		
-	case GDK_2BUTTON_PRESS:
-		if (!resizing)
-			break;
-		
-		if (e->button.button != 1)
-			break;
-		else {
-			int width = 0;
-			g_signal_emit_by_name (ethi->eth,
-					       "request_width",
-					       (int)ethi->resize_col, &width);
-			/* Add 10 to stop it from "..."ing */
-			e_table_header_set_size (ethi->eth, ethi->resize_col, width + 10);
-
-			gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(ethi));
-			ethi->maybe_drag = FALSE;
-		}
-		break;
-		
-	case GDK_BUTTON_RELEASE: {
-		gboolean needs_ungrab = FALSE;
-		
-		was_maybe_drag = ethi->maybe_drag;
-		
-		ethi->maybe_drag = FALSE;
-
-		if (ethi->resize_col != -1){
-			needs_ungrab = (ethi->resize_guide != NULL);
-			ethi_end_resize (ethi);
-		} else if (was_maybe_drag && ethi->sort_info) {
-			ETableCol *col;
-		
-			col = e_table_header_get_column (ethi->eth, ethi_find_col_by_x (ethi, e->button.x));
-			ethi_change_sort_state (ethi, col);
-		}
-		
-		if (needs_ungrab)
-			gnome_canvas_item_ungrab (item, e->button.time);
-
-		break;
-	}
-	case GDK_KEY_PRESS:
-		if ((e->key.keyval == GDK_F10) && (e->key.state & GDK_SHIFT_MASK)) {
-			EthiHeaderInfo *info = g_new(EthiHeaderInfo, 1);
-			ETableCol *col;
-			GtkMenu *popup;
- 
-			info->ethi = ethi;
-			info->col = ethi->selected_col;
-			col = e_table_header_get_column (ethi->eth, info->col);
-			
-			popup = e_popup_menu_create_with_domain (ethi_context_menu,
-								 1 +
-								 (col->sortable ? 0 : 2) +
-								 ((ethi->table || ethi->tree) ? 0 : 4) + 
-								 ((e_table_header_count (ethi->eth) > 1) ? 0 : 8),
-								 ((e_table_sort_info_get_can_group (ethi->sort_info)) ? 0 : 16) +
-								 128, info, E_I18N_DOMAIN);
-			g_object_ref (popup);
-			gtk_object_sink (GTK_OBJECT (popup));
-			g_signal_connect (popup, "selection-done",
-					  G_CALLBACK (free_popup_info), info);
-			e_popup_menu (popup, NULL);
-		} else if (e->key.keyval == GDK_space) {
-			ETableCol *col;
-			
-			col = e_table_header_get_column (ethi->eth, ethi->selected_col);
-			ethi_change_sort_state (ethi, col);
-		} else if ((e->key.keyval == GDK_Right) || (e->key.keyval == GDK_KP_Right)) {
-			ETableCol *col;
-
-			if ((ethi->selected_col < 0) || (ethi->selected_col >= ethi->eth->col_count - 1))
-				ethi->selected_col = 0;
-			else 
-				ethi->selected_col++;
-			col = e_table_header_get_column (ethi->eth, ethi->selected_col);
-			ethi_change_sort_state (ethi, col);
-		} else if ((e->key.keyval == GDK_Left) || (e->key.keyval == GDK_KP_Left)) {
-			ETableCol *col;
-
-			if ((ethi->selected_col <= 0) || (ethi->selected_col >= ethi->eth->col_count))
-				ethi->selected_col = ethi->eth->col_count - 1;
-			else 
-				ethi->selected_col--;
-			col = e_table_header_get_column (ethi->eth, ethi->selected_col);
-			ethi_change_sort_state (ethi, col);
-		}
-		break;
-	
-	default:
-		return FALSE;
-	}
-	return TRUE;
-}
-
-static void
-ethi_class_init (GObjectClass *object_class)
-{
-	GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
-
-	ethi_parent_class = g_type_class_ref (PARENT_OBJECT_TYPE);
-	
-	object_class->dispose = ethi_dispose;
-	object_class->set_property = ethi_set_property;
-	object_class->get_property = ethi_get_property;
-
-	item_class->update      = ethi_update;
-	item_class->realize     = ethi_realize;
-	item_class->unrealize   = ethi_unrealize;
-	item_class->draw        = ethi_draw;
-	item_class->point       = ethi_point;
-	item_class->event       = ethi_event;
-
-	g_object_class_install_property (object_class, PROP_DND_CODE,
-					 g_param_spec_string ("dnd_code",
-							      _("DnD code"),
-							      /*_( */"XXX blurb" /*)*/,
-							      NULL,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_TABLE_FONTSET,
-					 g_param_spec_string ("fontset",
-							      _("Fontset"),
-							      /*_( */"XXX blurb" /*)*/,
-							      NULL,
-							      G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_FULL_HEADER,
-					 g_param_spec_object ("full_header",
-							      _("Full Header"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_HEADER_TYPE,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_TABLE_HEADER,
-					 g_param_spec_object ("ETableHeader",
-							      _("Header"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_HEADER_TYPE,
-							      G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_SORT_INFO,
-					 g_param_spec_object ("sort_info",
-							      _("Sort Info"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_SORT_INFO_TYPE,
-							      G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_TABLE,
-					 g_param_spec_object ("table",
-							      _("Table"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_TYPE,
-							      G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_TREE,
-					 g_param_spec_object ("tree",
-							      _("Tree"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TREE_TYPE,
-							      G_PARAM_WRITABLE));
-
-	/*
-	 * Create our pixmaps for DnD
-	 */
-	dnd_colormap = gtk_widget_get_default_colormap ();
-	remove_col_pixmap = gdk_pixmap_colormap_create_from_xpm_d (
-		NULL, dnd_colormap,
-		&remove_col_mask, NULL, remove_col_xpm);
-
-	add_col_pixmap = gdk_pixmap_colormap_create_from_xpm_d (
-		NULL, dnd_colormap,
-		&add_col_mask, NULL, add_col_xpm);
-
-	ethi_signals [BUTTON_PRESSED] =
-		g_signal_new ("button_pressed",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableHeaderItemClass, button_pressed),
-			      NULL, NULL,
-			      e_marshal_NONE__BOXED,
-			      G_TYPE_NONE, 1, GDK_TYPE_EVENT);
-}
-
-static void
-ethi_init (GnomeCanvasItem *item)
-{
-	ETableHeaderItem *ethi = E_TABLE_HEADER_ITEM (item);
-
-	ethi->resize_col = -1;
-
-	item->x1 = 0;
-	item->y1 = 0;
-	item->x2 = 0;
-	item->y2 = 0;
-
-	ethi->drag_col = -1;
-	ethi->drag_mark = -1;
-	
-	ethi->sort_info = NULL;
-
-	ethi->sort_info_changed_id = 0;
-	ethi->group_info_changed_id = 0;
-
-	ethi->group_indent_width = 0;
-	ethi->table = NULL;
-	ethi->tree = NULL;
-
-	ethi->selected_col = 0;
-}
-
-E_MAKE_TYPE (e_table_header_item,
-	     "ETableHeaderItem",
-	     ETableHeaderItem,
-	     ethi_class_init,
-	     ethi_init,
-	     PARENT_OBJECT_TYPE)
diff --git a/widgets/table/e-table-header-item.h b/widgets/table/e-table-header-item.h
deleted file mode 100644
index d1e539888c..0000000000
--- a/widgets/table/e-table-header-item.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-header-item.h
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Miguel de Icaza (miguel@gnu.org)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_HEADER_ITEM_H_
-#define _E_TABLE_HEADER_ITEM_H_
-
-#include <gal/e-table/e-table.h>
-#include <gal/e-table/e-tree.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include <libxml/tree.h>
-#include <gal/e-table/e-table-header.h>
-#include <gal/e-table/e-table-sort-info.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_HEADER_ITEM_TYPE        (e_table_header_item_get_type ())
-#define E_TABLE_HEADER_ITEM(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_HEADER_ITEM_TYPE, ETableHeaderItem))
-#define E_TABLE_HEADER_ITEM_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_HEADER_ITEM_TYPE, ETableHeaderItemClass))
-#define E_IS_TABLE_HEADER_ITEM(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_HEADER_ITEM_TYPE))
-#define E_IS_TABLE_HEADER_ITEM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_HEADER_ITEM_TYPE))
-
-typedef struct {
-	GnomeCanvasItem  parent;
-	ETableHeader    *eth;
-
-	GdkCursor       *change_cursor;
-
-	short            height, width;
-	GdkFont         *font;
-
-	/*
-	 * Used during resizing;  Could be shorts
-	 */
-	int              resize_col;
-	int              resize_start_pos;
-	int              resize_min_width;
-	
-	GtkObject       *resize_guide;
-
-	int              group_indent_width;
-
-	/*
-	 * Ids
-	 */
-	int structure_change_id, dimension_change_id;
-
-	/*
-	 * For dragging columns
-	 */
-	guint            maybe_drag:1;
-	guint            dnd_ready:1;
-	int              click_x, click_y;
-	int              drag_col, drop_col, drag_mark;
-        guint            drag_motion_id, drag_end_id, drag_leave_id, drag_drop_id, drag_data_received_id, drag_data_get_id;
-	guint            sort_info_changed_id, group_info_changed_id;
-	GnomeCanvasItem *remove_item;
-	GdkBitmap       *stipple;
-
-	gchar           *dnd_code;
-
-	/*
-	 * For column sorting info
-	 */
-	ETableSortInfo  *sort_info;
-	
-	guint scroll_direction : 4;
-	int last_drop_x;
-	int last_drop_y;
-	int last_drop_time;
-	GdkDragContext *last_drop_context;
-	int scroll_idle_id;
-
-	/* For adding fields. */
-	ETableHeader    *full_header;
-	ETable          *table;
-	ETree           *tree;
-	GtkWidget       *etfcd;
-	void            *config;
-
-	/* For keyboard navigation*/
-	int selected_col;
-
-} ETableHeaderItem;
-
-typedef struct {
-	GnomeCanvasItemClass parent_class;
-
-	/*
-	 * signals
-	 */
-	void (*button_pressed) (ETableHeaderItem *ethi, GdkEventButton *button);
-} ETableHeaderItemClass;
-
-GType      e_table_header_item_get_type (void);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_HEADER_ITEM_H_ */
diff --git a/widgets/table/e-table-header-utils.c b/widgets/table/e-table-header-utils.c
deleted file mode 100644
index cf99e8ecba..0000000000
--- a/widgets/table/e-table-header-utils.c
+++ /dev/null
@@ -1,480 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-header-utils.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *          Miguel de Icaza <miguel@ximian.com>
- *          Federico Mena-Quintero <federico@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-table-header-utils.h"
-
-#include <string.h> /* strlen() */
-#include <glib.h>
-#include <gtk/gtkbutton.h>
-#include <gtk/gtkwindow.h>
-#include "e-table-defines.h"
-#include <gal/widgets/e-unicode.h>
-
-
-
-static PangoLayout*
-build_header_layout (GtkWidget *widget, const char *str)
-{
-	PangoLayout *layout;
-
-	layout = gtk_widget_create_pango_layout (widget, str);
-
-#ifdef FROB_FONT_DESC
-	{
-		PangoFontDescription *desc;
-		desc = pango_font_description_copy (gtk_widget_get_style (widget)->font_desc);
-		pango_font_description_set_size (desc,
-						 pango_font_description_get_size (desc) * 1.2);
-
-		pango_font_description_set_weight (desc, PANGO_WEIGHT_BOLD);
-		pango_layout_set_font_description (layout, desc);
-
-		pango_font_description_free (desc);
-	}
-#endif
-
-	return layout;
-}
-
-/**
- * e_table_header_compute_height:
- * @ecol: Table column description.
- * @widget: The widget from which to build the PangoLayout.
- *
- * Computes the minimum height required for a table header button.
- *
- * Return value: The height of the button, in pixels.
- **/
-double
-e_table_header_compute_height (ETableCol *ecol, GtkWidget *widget)
-{
-	int ythick;
-	int height;
-	PangoLayout *layout;
-
-	g_return_val_if_fail (ecol != NULL, -1);
-	g_return_val_if_fail (E_IS_TABLE_COL (ecol), -1);
-	g_return_val_if_fail (GTK_IS_WIDGET (widget), -1);
-
-	ythick = gtk_widget_get_style (widget)->ythickness;
-
-	layout = build_header_layout (widget, ecol->text);
-
-	pango_layout_get_pixel_size (layout, NULL, &height);
-
-	if (ecol->is_pixbuf) {
-		g_assert (ecol->pixbuf != NULL);
-		height = MAX (height, gdk_pixbuf_get_height (ecol->pixbuf));
-	}
-
-	height = MAX (height, MIN_ARROW_SIZE);
-
-	height += 2 * (ythick + HEADER_PADDING);
-
-	g_object_unref (layout);
-
-	return height;
-}
-
-double
-e_table_header_width_extras (GtkStyle *style)
-{
-	g_return_val_if_fail (style != NULL, -1);
-
-	return 2 * (style->xthickness + HEADER_PADDING);
-}
-
-/* Creates a pixmap that is a composite of a background color and the upper-left
- * corner rectangle of a pixbuf.
- */
-static GdkPixmap *
-make_composite_pixmap (GdkDrawable *drawable, GdkGC *gc,
-		       GdkPixbuf *pixbuf, GdkColor *bg, int width, int height,
-		       int dither_xofs, int dither_yofs)
-{
-	int pwidth, pheight;
-	GdkPixmap *pixmap;
-	GdkPixbuf *tmp;
-	int color;
-
-	pwidth = gdk_pixbuf_get_width (pixbuf);
-	pheight = gdk_pixbuf_get_height (pixbuf);
-	g_assert (width <= pwidth && height <= pheight);
-
-	color = ((bg->red & 0xff00) << 8) | (bg->green & 0xff00) | ((bg->blue & 0xff00) >> 8);
-
-	if (width >= pwidth && height >= pheight) {
-		tmp = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, width, height);
-		if (!tmp)
-			return NULL;
-
-		gdk_pixbuf_composite_color (pixbuf, tmp,
-					    0, 0,
-					    width, height,
-					    0, 0,
-					    1.0, 1.0,
-					    GDK_INTERP_NEAREST,
-					    255,
-					    0, 0,
-					    16,
-					    color, color);
-	} else {
-		int x, y, rowstride;
-		GdkPixbuf *fade;
-		guchar *pixels;
-
-		/* Do a nice fade of the pixbuf down and to the right */
-
-		fade = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width, height);
-		if (!fade)
-			return NULL;
-
-		gdk_pixbuf_copy_area (pixbuf,
-				      0, 0,
-				      width, height,
-				      fade,
-				      0, 0);
-
-		rowstride = gdk_pixbuf_get_rowstride (fade);
-		pixels = gdk_pixbuf_get_pixels (fade);
-
-		for (y = 0; y < height; y++) {
-			guchar *p;
-			int yfactor;
-
-			p = pixels + y * rowstride;
-
-			if (height < pheight)
-				yfactor = height - y;
-			else
-				yfactor = height;
-
-			for (x = 0; x < width; x++) {
-				int xfactor;
-
-				if (width < pwidth)
-					xfactor = width - x;
-				else
-					xfactor = width;
-
-				p[3] = ((int) p[3] * xfactor * yfactor / (width * height));
-				p += 4;
-			}
-		}
-
-		tmp = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, width, height);
-		if (!tmp) {
-			gdk_pixbuf_unref (fade);
-			return NULL;
-		}
-
-		gdk_pixbuf_composite_color (fade, tmp,
-					    0, 0,
-					    width, height,
-					    0, 0,
-					    1.0, 1.0,
-					    GDK_INTERP_NEAREST,
-					    255,
-					    0, 0,
-					    16,
-					    color, color);
-
-		gdk_pixbuf_unref (fade);
-	}
-
-	pixmap = gdk_pixmap_new (drawable, width, height, gdk_rgb_get_visual ()->depth);
-	gdk_draw_rgb_image_dithalign (pixmap, gc,
-				      0, 0,
-				      width, height,
-				      GDK_RGB_DITHER_NORMAL,
-				      gdk_pixbuf_get_pixels (tmp),
-				      gdk_pixbuf_get_rowstride (tmp),
-				      dither_xofs, dither_yofs);
-	gdk_pixbuf_unref (tmp);
-
-	return pixmap;
-}
-
-/* Default width of the elision arrow in pixels */
-#define ARROW_WIDTH 4
-
-/**
- * e_table_draw_elided_string:
- * @drawable: Destination drawable.
- * @font: Font for the text.
- * @gc: GC to use for drawing.
- * @x: X insertion point for the string.
- * @y: Y insertion point for the string's baseline.
- * @layout: the PangoLayout to draw.
- * @str: the string we're drawing, passed in so we can change the layout if it needs eliding.
- * @max_width: Maximum width in which the string must fit.
- * @center: Whether to center the string in the available area if it does fit.
- * 
- * Draws a string, possibly trimming it so that it fits inside the specified
- * maximum width.  If it does not fit, an elision indicator is drawn after the
- * last character that does fit.
- **/
-static void
-e_table_draw_elided_string (GdkDrawable *drawable, GdkGC *gc, GtkWidget *widget, 
-			    int x, int y, PangoLayout *layout, char *str,
-			    int max_width, gboolean center)
-{
- 	int width;
-	int height;
-	int index;
-	GSList *lines;
-	PangoLayoutLine *line;
-
-	g_return_if_fail (drawable != NULL);
-	g_return_if_fail (gc != NULL);
-	g_return_if_fail (layout != NULL);
-	g_return_if_fail (max_width >= 0);
-
-	pango_layout_get_pixel_size (layout, &width, &height);
-
-	gdk_gc_set_clip_rectangle (gc, NULL);
-
-	if (width <= max_width) {
-		int xpos;
-
-		if (center)
-			xpos = x + (max_width - width) / 2;
-		else
-			xpos = x;
-
-		gdk_draw_layout (drawable, gc,
-				 xpos, y,
-				 layout);
-	} else {
-		int arrow_width;
-		int i;
-
-		if (max_width < ARROW_WIDTH + 1)
-			arrow_width = max_width - 1;
-		else
-			arrow_width = ARROW_WIDTH;
-
-
-		lines = pango_layout_get_lines (layout);
-		line = lines->data;
-
-		if (!pango_layout_line_x_to_index (line,
-						   (max_width - arrow_width) * PANGO_SCALE,
-						   &index,
-						   NULL)) {
-			g_warning ("pango_layout_line_x_to_index returned false");
-			return;
-		}
-
-		pango_layout_set_text (layout, str, index);
-
-		gdk_draw_layout (drawable, gc, x, y, layout);
-
-		for (i = 0; i < arrow_width; i++) {
-			int h;
-
-			h = 2 * i + 1;
-
-			gdk_draw_line (drawable, gc,
-				       x + max_width - i,
-				       y + height / 2 - i,
-				       x + max_width - i,
-				       y + height / 2 + i + 1);
-		}
-	}
-}
-
-static GtkWidget *g_label;
-
-/**
- * e_table_header_draw_button:
- * @drawable: Destination drawable.
- * @ecol: Table column for the header information.
- * @style: Style to use for drawing the button.
- * @state: State of the table widget.
- * @widget: The table widget.
- * @x: Leftmost coordinate of the button.
- * @y: Topmost coordinate of the button.
- * @width: Width of the region to draw.
- * @height: Height of the region to draw.
- * @button_width: Width for the complete button.
- * @button_height: Height for the complete button.
- * @arrow: Arrow type to use as a sort indicator.
- * 
- * Draws a button suitable for a table header.
- **/
-void
-e_table_header_draw_button (GdkDrawable *drawable, ETableCol *ecol,
-			    GtkStyle *style, GtkStateType state,
-			    GtkWidget *widget,
-			    int x, int y, int width, int height,
-			    int button_width, int button_height,
-			    ETableColArrow arrow)
-{
-	int xthick, ythick;
-	int inner_x, inner_y;
-	int inner_width, inner_height;
-	GdkGC *gc;
-	PangoLayout *layout;
-
-	g_return_if_fail (drawable != NULL);
-	g_return_if_fail (ecol != NULL);
-	g_return_if_fail (E_IS_TABLE_COL (ecol));
-	g_return_if_fail (style != NULL);
-	g_return_if_fail (widget != NULL);
-	g_return_if_fail (GTK_IS_WIDGET (widget));
-	g_return_if_fail (button_width > 0 && button_height > 0);
-
-	if (g_label == NULL) {
-		GtkWidget *button = gtk_button_new_with_label("Hi");
-		GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-		g_label = GTK_BIN(button)->child;
-		gtk_container_add (GTK_CONTAINER (window), button);
-		gtk_widget_ensure_style (window);
-		gtk_widget_ensure_style (button);
-		gtk_widget_ensure_style (g_label);
-	}
-
-	gc = g_label->style->fg_gc[state];
-
-	gdk_gc_set_clip_rectangle (gc, NULL);
-
-	xthick = style->xthickness;
-	ythick = style->ythickness;
-
-	/* Button bevel */
-
-	gtk_paint_box (style, drawable, state, GTK_SHADOW_OUT,
-		       NULL, widget, "button",
-		       x, y, button_width, button_height);
-
-	/* Inside area */
-
-	inner_width = button_width - 2 * (xthick + HEADER_PADDING);
-	inner_height = button_height - 2 * (ythick + HEADER_PADDING);
-
-	if (inner_width < 1 || inner_height < 1)
-		return; /* nothing fits */
-
-	inner_x = x + xthick + HEADER_PADDING;
-	inner_y = y + ythick + HEADER_PADDING;
-
-	/* Arrow */
-
-	switch (arrow) {
-	case E_TABLE_COL_ARROW_NONE:
-		break;
-
-	case E_TABLE_COL_ARROW_UP:
-	case E_TABLE_COL_ARROW_DOWN: {
-		int arrow_width, arrow_height;
-
-		arrow_width = MIN (MIN_ARROW_SIZE, inner_width);
-		arrow_height = MIN (MIN_ARROW_SIZE, inner_height);
-
-		gtk_paint_arrow (style, drawable, state,
-				 GTK_SHADOW_NONE, NULL, widget, "header",
-				 (arrow == E_TABLE_COL_ARROW_UP) ? GTK_ARROW_UP : GTK_ARROW_DOWN,
-				 TRUE,
-				 inner_x + inner_width - arrow_width,
-				 inner_y + (inner_height - arrow_height) / 2,
-				 arrow_width, arrow_height);
-
-		inner_width -= arrow_width + HEADER_PADDING;
-		break;
-	}
-
-	default:
-		g_assert_not_reached ();
-		return;
-	}
-
-	if (inner_width < 1)
-		return; /* nothing else fits */
-
-	layout = build_header_layout (widget, ecol->text);
-
-	/* Pixbuf or label */
-	if (ecol->is_pixbuf) {
-		int pwidth, pheight;
-		int clip_width, clip_height;
-		int xpos;
-		GdkPixmap *pixmap;
-
-		g_assert (ecol->pixbuf != NULL);
-
-		pwidth = gdk_pixbuf_get_width (ecol->pixbuf);
-		pheight = gdk_pixbuf_get_height (ecol->pixbuf);
-
-		clip_width = MIN (pwidth, inner_width);
-		clip_height = MIN (pheight, inner_height);
-
-		xpos = inner_x;
-
-		if (inner_width - pwidth > 11) {
-			int width;
-			int ypos;
-
-			pango_layout_get_pixel_size (layout, &width, NULL);
-
-			if (width < inner_width - (pwidth + 1)) {
-				xpos = inner_x + (inner_width - width - (pwidth + 1)) / 2;
-			}
-
-			ypos = inner_y;
-
-			e_table_draw_elided_string (drawable, gc, widget,
-						    xpos + pwidth + 1, ypos,
-						    layout, ecol->text, inner_width - (xpos - inner_x), FALSE);
-		}
-
-		pixmap = make_composite_pixmap (drawable, gc,
-						ecol->pixbuf, &style->bg[state],
-						clip_width, clip_height,
-						xpos,
-						inner_y + (inner_height - clip_height) / 2);
-
-		gdk_gc_set_clip_rectangle (gc, NULL);
-
-		if (pixmap) {
-			gdk_draw_pixmap (drawable, gc, pixmap,
-					 0, 0,
-					 xpos,
-					 inner_y + (inner_height - clip_height) / 2,
-					 clip_width, clip_height);
-			gdk_pixmap_unref (pixmap);
-		}
-	} else {
-		e_table_draw_elided_string (drawable, gc, widget, 
-					    inner_x, inner_y,
-					    layout, ecol->text, inner_width, TRUE);
-	}
-
-	g_object_unref (layout);
-}
diff --git a/widgets/table/e-table-header-utils.h b/widgets/table/e-table-header-utils.h
deleted file mode 100644
index 38defa9261..0000000000
--- a/widgets/table/e-table-header-utils.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-header-utils.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *          Miguel de Icaza <miguel@ximian.com>
- *          Federico Mena-Quintero <federico@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef E_TABLE_HEADER_UTILS_H
-#define E_TABLE_HEADER_UTILS_H
-
-#include <gal/e-table/e-table-col.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-double  e_table_header_compute_height (ETableCol *ecol,
-				       GtkWidget *widget);
-double  e_table_header_width_extras    (GtkStyle       *style);
-void    e_table_header_draw_button     (GdkDrawable    *drawable,
-					ETableCol      *ecol,
-					GtkStyle       *style,
-					GtkStateType    state,
-					GtkWidget      *widget,
-					int             x,
-					int             y,
-					int             width,
-					int             height,
-					int             button_width,
-					int             button_height,
-					ETableColArrow  arrow);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif
diff --git a/widgets/table/e-table-header.c b/widgets/table/e-table-header.c
deleted file mode 100644
index d810d61bd1..0000000000
--- a/widgets/table/e-table-header.c
+++ /dev/null
@@ -1,952 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-header.c
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Miguel de Icaza <miguel@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <string.h>
-#include <glib-object.h>
-#include <gtk/gtkimage.h>
-#include <gal/util/e-util.h>
-#include "e-table-header.h"
-#include "e-table-defines.h"
-#include "gal/util/e-util.h"
-
-/* The arguments we take */
-enum {
-	PROP_0,
-	PROP_SORT_INFO,
-	PROP_WIDTH,
-	PROP_WIDTH_EXTRAS
-};
-
-enum {
-	STRUCTURE_CHANGE,
-	DIMENSION_CHANGE,
-	EXPANSION_CHANGE,
-	REQUEST_WIDTH,
-	LAST_SIGNAL
-};
-
-static void eth_set_size (ETableHeader *eth, int idx, int size);
-static void eth_calc_widths (ETableHeader *eth);
-
-static guint eth_signals [LAST_SIGNAL] = { 0, };
-
-static GObjectClass *e_table_header_parent_class;
-
-struct two_ints {
-	int column;
-	int width;
-};
-
-static void
-eth_set_width (ETableHeader *eth, int width)
-{
-	eth->width = width;
-}
-
-static void
-dequeue (ETableHeader *eth, int *column, int *width)
-{
-	GSList *head;
-	struct two_ints *store;
-	head = eth->change_queue;
-	eth->change_queue = eth->change_queue->next;
-	if (!eth->change_queue)
-		eth->change_tail = NULL;
-	store = head->data;
-	g_slist_free_1(head);
-	if (column)
-		*column = store->column;
-	if (width)
-		*width = store->width;
-	g_free(store);
-}
-
-static gboolean
-dequeue_idle (ETableHeader *eth)
-{
-	int column, width;
-
-	dequeue (eth, &column, &width);
-	while (eth->change_queue && ((struct two_ints *) eth->change_queue->data)->column == column)
-		dequeue (eth, &column, &width);
-
-	if (column == -1)
-		eth_set_width (eth, width);
-	else if (column < eth->col_count)
-		eth_set_size (eth, column, width);
-	if (eth->change_queue)
-		return TRUE;
-	else {
-		eth_calc_widths (eth);
-		eth->idle = 0;
-		return FALSE;
-	}
-}
-
-static void
-enqueue (ETableHeader *eth, int column, int width)
-{
-	struct two_ints *store;
-	store = g_new(struct two_ints, 1);
-	store->column = column;
-	store->width = width;
-	
-	eth->change_tail = g_slist_last(g_slist_append(eth->change_tail, store));
-	if (!eth->change_queue)
-		eth->change_queue = eth->change_tail;
-
-	if (!eth->idle) {
-		eth->idle = g_idle_add_full(G_PRIORITY_LOW, (GSourceFunc) dequeue_idle, eth, NULL);
-	}
-}
-
-void
-e_table_header_set_size (ETableHeader *eth, int idx, int size)
-{
-	g_return_if_fail (eth != NULL);
-	g_return_if_fail (E_IS_TABLE_HEADER (eth));
-
-	enqueue (eth, idx, size);
-}
-
-static void
-eth_do_remove (ETableHeader *eth, int idx, gboolean do_unref)
-{
-	if (do_unref)
-		g_object_unref (eth->columns [idx]);
-	
-	memmove (&eth->columns [idx], &eth->columns [idx+1],
-		 sizeof (ETableCol *) * (eth->col_count - idx - 1));
-	eth->col_count--;
-}
-
-static void
-eth_finalize (GObject *object)
-{
-	ETableHeader *eth = E_TABLE_HEADER (object);
-	const int cols = eth->col_count;
-	int i;
-	
-	if (eth->sort_info) {
-		if (eth->sort_info_group_change_id)
-			g_signal_handler_disconnect(G_OBJECT(eth->sort_info),
-					            eth->sort_info_group_change_id);
-		g_object_unref(eth->sort_info);
-		eth->sort_info = NULL;
-	}
-
-	if (eth->idle)
-		g_source_remove(eth->idle);
-	eth->idle = 0;
-
-	if (eth->change_queue) {
-		g_slist_foreach(eth->change_queue, (GFunc) g_free, NULL);
-		g_slist_free(eth->change_queue);
-		eth->change_queue = NULL;
-	}
-	
-	/*
-	 * Destroy columns
-	 */
-	for (i = cols - 1; i >= 0; i--){
-		eth_do_remove (eth, i, TRUE);
-	}
-	g_free (eth->columns);
-
-	eth->col_count = 0;
-	eth->columns = NULL;
-
-	if (e_table_header_parent_class->finalize)
-		e_table_header_parent_class->finalize (object);
-}
-
-static void
-eth_group_info_changed(ETableSortInfo *info, ETableHeader *eth)
-{
-	enqueue(eth, -1, eth->nominal_width);
-}
-
-static void
-eth_set_property (GObject *object, guint prop_id, const GValue *val, GParamSpec *pspec)
-{
-	ETableHeader *eth = E_TABLE_HEADER (object);
-
-	switch (prop_id) {
-	case PROP_WIDTH:
-		eth->nominal_width = g_value_get_double (val);
-		enqueue(eth, -1, eth->nominal_width);
-		break;
-	case PROP_WIDTH_EXTRAS:
-		eth->width_extras = g_value_get_double (val);
-		enqueue(eth, -1, eth->nominal_width);
-		break;
-	case PROP_SORT_INFO:
-		if (eth->sort_info) {
-			if (eth->sort_info_group_change_id)
-				g_signal_handler_disconnect(G_OBJECT(eth->sort_info), eth->sort_info_group_change_id);
-			g_object_unref (eth->sort_info);
-		}
-		eth->sort_info = E_TABLE_SORT_INFO(g_value_get_object (val));
-		if (eth->sort_info) {
-			g_object_ref(eth->sort_info);
-			eth->sort_info_group_change_id 
-				= g_signal_connect(G_OBJECT(eth->sort_info), "group_info_changed",
-						   G_CALLBACK(eth_group_info_changed), eth);
-		}
-		enqueue(eth, -1, eth->nominal_width);
-		break;
-	default:
-		break;
-	}
-}
-
-static void
-eth_get_property (GObject *object, guint prop_id, GValue *val, GParamSpec *pspec)
-{
-	ETableHeader *eth = E_TABLE_HEADER (object);
-
-	switch (prop_id) {
-	case PROP_SORT_INFO:
-		g_value_set_object (val, G_OBJECT(eth->sort_info));
-		break;
-	case PROP_WIDTH:
-		g_value_set_double (val, eth->nominal_width);
-		break;
-	case PROP_WIDTH_EXTRAS:
-		g_value_set_double (val, eth->width_extras);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-e_table_header_class_init (GObjectClass *object_class)
-{
-	ETableHeaderClass *klass = E_TABLE_HEADER_CLASS (object_class);
-
-	object_class->finalize = eth_finalize;
-	object_class->set_property = eth_set_property;
-	object_class->get_property = eth_get_property;
-
-	e_table_header_parent_class = g_type_class_peek_parent (object_class);
-
-	g_object_class_install_property (
-		object_class, PROP_WIDTH,
-		g_param_spec_double ("width", "Width", "Width", 
-				     0.0, G_MAXDOUBLE, 0.0, 
-				     G_PARAM_READWRITE)); 
-
-	g_object_class_install_property (
-		object_class, PROP_WIDTH_EXTRAS,
-		g_param_spec_double ("width_extras", "Width of Extras", "Width of Extras", 
-				     0.0, G_MAXDOUBLE, 0.0, 
-				     G_PARAM_READWRITE)); 
-
-	g_object_class_install_property (
-		object_class, PROP_SORT_INFO,
-		g_param_spec_object ("sort_info", "Sort Info", "Sort Info", 
-				     E_TABLE_SORT_INFO_TYPE,
-				     G_PARAM_READWRITE)); 
-
-	eth_signals [STRUCTURE_CHANGE] =
-		g_signal_new ("structure_change",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableHeaderClass, structure_change),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
-	eth_signals [DIMENSION_CHANGE] = 
-		g_signal_new ("dimension_change", 
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableHeaderClass, dimension_change),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__INT,
-			      G_TYPE_NONE, 1, G_TYPE_INT);
-	eth_signals [EXPANSION_CHANGE] = 
-		g_signal_new ("expansion_change", 
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableHeaderClass, expansion_change),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
-	eth_signals [REQUEST_WIDTH] = 
-		g_signal_new ("request_width",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableHeaderClass, request_width),
-			      (GSignalAccumulator) NULL, NULL,
-			      e_marshal_INT__INT,
-			      G_TYPE_INT, 1, G_TYPE_INT);
-
-	klass->structure_change = NULL;
-	klass->dimension_change = NULL;
-	klass->expansion_change = NULL;
-	klass->request_width = NULL;
-}
-
-static void
-e_table_header_init (ETableHeader *eth)
-{
-	eth->col_count                 = 0;
-	eth->width                     = 0;
-
-	eth->sort_info                 = NULL;
-	eth->sort_info_group_change_id = 0;
-
-	eth->columns                   = NULL;
-	
-	eth->change_queue              = NULL;
-	eth->change_tail               = NULL;
-
-	eth->width_extras              = 0;
-}
-
-/**
- * e_table_header_new:
- *
- * Returns: A new @ETableHeader object.
- */
-ETableHeader *
-e_table_header_new (void)
-{
-
-	return (ETableHeader *) g_object_new (E_TABLE_HEADER_TYPE, NULL);
-}
-
-static void
-eth_update_offsets (ETableHeader *eth)
-{
-	int i;
-	int x = 0;
-	
-	for (i = 0; i < eth->col_count; i++){
-		ETableCol *etc = eth->columns [i];
-
-		etc->x = x;
-		x += etc->width;
-	}
-}
-
-static void
-eth_do_insert (ETableHeader *eth, int pos, ETableCol *val)
-{
-	memmove (&eth->columns [pos+1], &eth->columns [pos],
-		sizeof (ETableCol *) * (eth->col_count - pos));
-	eth->columns [pos] = val;
-	eth->col_count ++;
-}
-
-/**
- * e_table_header_add_column:
- * @eth: the table header to add the column to.
- * @tc: the ETableCol definition
- * @pos: position where the ETableCol will go.
- *
- * This function adds the @tc ETableCol definition into the @eth ETableHeader
- * at position @pos.  This is the way you add new ETableCols to the
- * ETableHeader.  The header will assume ownership of the @tc; you should not
- * unref it after you add it.
- *
- * This function will emit the "structure_change" signal on the @eth object.
- * The ETableCol is assumed 
- */
-void
-e_table_header_add_column (ETableHeader *eth, ETableCol *tc, int pos)
-{
-	g_return_if_fail (eth != NULL);
-	g_return_if_fail (E_IS_TABLE_HEADER (eth));
-	g_return_if_fail (tc != NULL);
-	g_return_if_fail (E_IS_TABLE_COL (tc));
-	g_return_if_fail (pos >= -1 && pos <= eth->col_count);
-
-	if (pos == -1)
-		pos = eth->col_count;
-	eth->columns = g_realloc (eth->columns, sizeof (ETableCol *) * (eth->col_count + 1));
-
-	/*
-	 * We are the primary owners of the column
-	 */
-	g_object_ref (tc);
-	
-	eth_do_insert (eth, pos, tc);
-
-	enqueue(eth, -1, eth->nominal_width);
-	g_signal_emit (G_OBJECT (eth), eth_signals [STRUCTURE_CHANGE], 0);
-}
-
-/**
- * e_table_header_get_column:
- * @eth: the ETableHeader to query
- * @column: the column inside the @eth.
- *
- * Returns: The ETableCol at @column in the @eth object
- */
-ETableCol *
-e_table_header_get_column (ETableHeader *eth, int column)
-{
-	g_return_val_if_fail (eth != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE_HEADER (eth), NULL);
-
-	if (column < 0)
-		return NULL;
-
-	if (column >= eth->col_count)
-		return NULL;
-
-	return eth->columns [column];
-}
-
-/**
- * e_table_header_get_column_by_col_id:
- * @eth: the ETableHeader to query
- * @col_id: the col_id to search for.
- *
- * Returns: The ETableCol with col_idx = @col_idx in the @eth object
- */
-ETableCol *
-e_table_header_get_column_by_col_idx (ETableHeader *eth, int col_idx)
-{
-	int i;
-	g_return_val_if_fail (eth != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE_HEADER (eth), NULL);
-
-	for (i = 0; i < eth->col_count; i++) {
-		if (eth->columns[i]->col_idx == col_idx) {
-			return eth->columns [i];
-		}
-	}
-
-	return NULL;
-}
-
-/**
- * e_table_header_count:
- * @eth: the ETableHeader to query
- *
- * Returns: the number of columns in this ETableHeader.
- */
-int
-e_table_header_count (ETableHeader *eth)
-{
-	g_return_val_if_fail (eth != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
-	return eth->col_count;
-}
-
-/** 
- * e_table_header_index:
- * @eth: the ETableHeader to query
- * @col: the column to fetch.
- *
- * ETableHeaders contain the visual list of columns that the user will
- * view.  The visible columns will typically map to different columns
- * in the ETableModel (because the user reordered the data for
- * example).
- *
- * Returns: the column in the model that the @col column
- * in the ETableHeader points to.  */
-int
-e_table_header_index (ETableHeader *eth, int col)
-{
-	g_return_val_if_fail (eth != NULL, -1);
-	g_return_val_if_fail (E_IS_TABLE_HEADER (eth), -1);
-	g_return_val_if_fail (col >= 0 && col < eth->col_count, -1);
-
-	return eth->columns [col]->col_idx;
-}
-
-/**
- * e_table_header_get_index_at:
- * @eth: the ETableHeader to query
- * @x_offset: a pixel count from the beginning of the ETableHeader
- *
- * This will return the ETableHeader column that would contain
- * the @x_offset pixel.
- *
- * Returns: the column that contains pixel @x_offset, or -1
- * if no column inside this ETableHeader contains that pixel.
- */
-int
-e_table_header_get_index_at (ETableHeader *eth, int x_offset)
-{
-	int i, total;
-	
-	g_return_val_if_fail (eth != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
-	total = 0;
-	for (i = 0; i < eth->col_count; i++){
-		total += eth->columns [i]->width;
-
-		if (x_offset < total)
-			return i;
-	}
-
-	return -1;
-}
-
-/**
- * e_table_header_get_columns:
- * @eth: The ETableHeader to query
- *
- * Returns: A NULL terminated array of the ETableCols
- * contained in the ETableHeader @eth.  Note that every
- * returned ETableCol in the array has been referenced, to release
- * this information you need to g_free the buffer returned
- * and you need to g_object_unref every element returned
- */
-ETableCol **
-e_table_header_get_columns (ETableHeader *eth)
-{
-	ETableCol **ret;
-	int i;
-	
-	g_return_val_if_fail (eth != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
-	ret = g_new (ETableCol *, eth->col_count + 1);
-	memcpy (ret, eth->columns, sizeof (ETableCol *) * eth->col_count);
-	ret [eth->col_count] = NULL;
-
-	for (i = 0; i < eth->col_count; i++) {
-		g_object_ref(ret[i]);
-	}
-
-	return ret;
-}
-
-/**
- * e_table_header_get_selected:
- * @eth: The ETableHeader to query
- *
- * Returns: The number of selected columns in the @eth object.
- */
-int
-e_table_header_get_selected (ETableHeader *eth)
-{
-	int i;
-	int selected = 0;
-	
-	g_return_val_if_fail (eth != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
-	for (i = 0; i < eth->col_count; i++){
-		if (eth->columns [i]->selected)
-			selected++;
-	}
-
-	return selected;
-}
-
-/**
- * e_table_header_total_width:
- * @eth: The ETableHeader to query
- *
- * Returns: the number of pixels used by the @eth object
- * when rendered on screen
- */
-int
-e_table_header_total_width (ETableHeader *eth)
-{
-	int total, i;
-	
-	g_return_val_if_fail (eth != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
-	total = 0;
-	for (i = 0; i < eth->col_count; i++)
-		total += eth->columns [i]->width;
-
-	return total;
-}
-
-/**
- * e_table_header_min_width:
- * @eth: The ETableHeader to query
- *
- * Returns: the minimum number of pixels required by the @eth object.
- **/
-int
-e_table_header_min_width (ETableHeader *eth)
-{
-	int total, i;
-	
-	g_return_val_if_fail (eth != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
-	total = 0;
-	for (i = 0; i < eth->col_count; i++)
-		total += eth->columns [i]->min_width;
-
-	return total;
-}
-
-/**
- * e_table_header_move:
- * @eth: The ETableHeader to operate on.
- * @source_index: the source column to move.
- * @target_index: the target location for the column
- *
- * This function moves the column @source_index to @target_index
- * inside the @eth ETableHeader.  The signals "dimension_change"
- * and "structure_change" will be emmited
- */
-void
-e_table_header_move (ETableHeader *eth, int source_index, int target_index)
-{
-	ETableCol *old;
-	
-	g_return_if_fail (eth != NULL);
-	g_return_if_fail (E_IS_TABLE_HEADER (eth));
-	g_return_if_fail (source_index >= 0);
-	g_return_if_fail (target_index >= 0);
-	g_return_if_fail (source_index < eth->col_count);
-	g_return_if_fail (target_index < eth->col_count + 1); /* Can be moved beyond the last item. */
-
-	if (source_index < target_index)
-		target_index --;
-
-	old = eth->columns [source_index];
-	eth_do_remove (eth, source_index, FALSE);
-	eth_do_insert (eth, target_index, old);
-	eth_update_offsets (eth);
-	
-	g_signal_emit (G_OBJECT (eth), eth_signals [DIMENSION_CHANGE], 0, eth->width);
-	g_signal_emit (G_OBJECT (eth), eth_signals [STRUCTURE_CHANGE], 0);
-}
-
-/**
- * e_table_header_remove:
- * @eth: The ETableHeader to operate on.
- * @idx: the index to the column to be removed.
- *
- * Removes the column at @idx position in the ETableHeader @eth.
- * This emmits the "structure_change" signal on the @eth object.
- */
-void
-e_table_header_remove (ETableHeader *eth, int idx)
-{
-	g_return_if_fail (eth != NULL);
-	g_return_if_fail (E_IS_TABLE_HEADER (eth));
-	g_return_if_fail (idx >= 0);
-	g_return_if_fail (idx < eth->col_count);
-
-	eth_do_remove (eth, idx, TRUE);
-	enqueue(eth, -1, eth->nominal_width);
-	g_signal_emit (G_OBJECT (eth), eth_signals [STRUCTURE_CHANGE], 0);
-}
-
-/*
- * FIXME: deprecated?
- */
-void
-e_table_header_set_selection (ETableHeader *eth, gboolean allow_selection)
-{
-	g_return_if_fail (eth != NULL);
-	g_return_if_fail (E_IS_TABLE_HEADER (eth));
-}
-
-static void
-eth_set_size (ETableHeader *eth, int idx, int size)
-{
-	double expansion;
-	double old_expansion;
-	int min_width;
-	int left_width;
-	int total_extra;
-	int expandable_count;
-	int usable_width;
-	int i;
-	g_return_if_fail (eth != NULL);
-	g_return_if_fail (E_IS_TABLE_HEADER (eth));
-	g_return_if_fail (idx >= 0);
-	g_return_if_fail (idx < eth->col_count);
-	
-	/* If this column is not resizable, don't do anything. */
-	if (!eth->columns[idx]->resizable)
-		return;
-
-	expansion = 0;
-	min_width = 0;
-	left_width = 0;
-	expandable_count = -1;
-
-	/* Calculate usable area. */
-	for (i = 0; i < idx; i++) {
-		left_width += eth->columns[i]->width;
-	}
-	/* - 1 to account for the last pixel border. */
-	usable_width = eth->width - left_width - 1;
-
-	if (eth->sort_info)
-		usable_width -= e_table_sort_info_grouping_get_count(eth->sort_info) * GROUP_INDENT;
-
-	/* Calculate minimum_width of stuff on the right as well as
-	 * total usable expansion on the right. 
-	 */
-	for (; i < eth->col_count; i++) {
-		min_width += eth->columns[i]->min_width + eth->width_extras;
-		if (eth->columns[i]->resizable) {
-			expansion += eth->columns[i]->expansion;
-			expandable_count ++;
-		}
-	}
-	/* If there's no room for anything, don't change. */
-	if (expansion == 0)
-		return;
-
-	/* (1) If none of the columns to the right are expandable, use
-	 * all the expansion space in this column.
-	 */
-	if(expandable_count == 0) {
-		eth->columns[idx]->expansion = expansion;
-		for (i = idx + 1; i < eth->col_count; i++) {
-			eth->columns[i]->expansion = 0;
-		}
-
-		g_signal_emit (G_OBJECT (eth), eth_signals [EXPANSION_CHANGE], 0);
-		return;
-	}
-
-	total_extra = usable_width - min_width;
-	/* If there's no extra space, set all expansions to 0. */
-	if (total_extra <= 0) {
-		for (i = idx; i < eth->col_count; i++) {
-			eth->columns[i]->expansion = 0;
-		}
-		g_signal_emit (G_OBJECT (eth), eth_signals [EXPANSION_CHANGE], 0);
-		return;
-	}
-
-	/* If you try to resize smaller than the minimum width, it
-	 * uses the minimum. */
-	if (size < eth->columns[idx]->min_width + eth->width_extras)
-		size = eth->columns[idx]->min_width + eth->width_extras;
-
-	/* If all the extra space will be used up in this column, use
-	 * all the expansion and set all others to 0.
-	 */
-	if (size >= total_extra + eth->columns[idx]->min_width + eth->width_extras) {
-		eth->columns[idx]->expansion = expansion;
-		for (i = idx + 1; i < eth->col_count; i++) {
-			eth->columns[i]->expansion = 0;
-		}
-		g_signal_emit (G_OBJECT (eth), eth_signals [EXPANSION_CHANGE], 0);
-		return;
-	}
-	
-	/* The old_expansion used by columns to the right. */
-	old_expansion = expansion;
-	old_expansion -= eth->columns[idx]->expansion;
-	/* Set the new expansion so that it will generate the desired size. */
-	eth->columns[idx]->expansion = expansion * (((double)(size - (eth->columns[idx]->min_width + eth->width_extras)))/((double)total_extra));
-	/* The expansion left for the columns on the right. */
-	expansion -= eth->columns[idx]->expansion;
-
-	/* (2) If the old columns to the right didn't have any
-	 * expansion before, expand them evenly.  old_expansion > 0 by
-	 * expansion = SUM(i=idx to col_count -1,
-	 * columns[i]->min_width) - columns[idx]->min_width) =
-	 * SUM(non-negatives).
-	 */
-	if (old_expansion == 0) {
-		for (i = idx + 1; i < eth->col_count; i++) {
-			if (eth->columns[idx]->resizable) {
-				/* expandable_count != 0 by (1) */
-				eth->columns[i]->expansion = expansion / expandable_count;
-			}
-		}
-		g_signal_emit (G_OBJECT (eth), eth_signals [EXPANSION_CHANGE], 0);
-		return;
-	}
-
-	/* Remove from total_extra the amount used for this column. */
-	total_extra -= size - (eth->columns[idx]->min_width + eth->width_extras);
-	for (i = idx + 1; i < eth->col_count; i++) {
-		if (eth->columns[idx]->resizable) {
-			/* old_expansion != 0 by (2) */
-			eth->columns[i]->expansion *= expansion / old_expansion;
-		}
-	}
-	g_signal_emit (G_OBJECT (eth), eth_signals [EXPANSION_CHANGE], 0);
-}
-
-/**
- * e_table_header_col_diff:
- * @eth: the ETableHeader to query.
- * @start_col: the starting column
- * @end_col: the ending column.
- *
- * Computes the number of pixels between the columns @start_col and
- * @end_col.
- *
- * Returns: the number of pixels between @start_col and @end_col on the
- * @eth ETableHeader object
- */
-int
-e_table_header_col_diff (ETableHeader *eth, int start_col, int end_col)
-{
-	int total, col;
-
-	g_return_val_if_fail (eth != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_HEADER (eth), 0);
-
-	if (start_col < 0)
-		start_col = 0;
-	if (end_col > eth->col_count)
-		end_col = eth->col_count;
-
-	total = 0;
-	for (col = start_col; col < end_col; col++){
-		
-		total += eth->columns [col]->width;
-	}
-
-	return total;
-}
-
-static void
-eth_calc_widths (ETableHeader *eth)
-{
-	int i;
-	int extra;
-	double expansion;
-	int last_position = 0;
-	double next_position = 0;
-	int last_resizable = -1;
-	int *widths;
-	gboolean changed;
-
-	widths = g_new (int, eth->col_count);
-
-	/* - 1 to account for the last pixel border. */
-	extra = eth->width - 1;
-	expansion = 0;
-	for (i = 0; i < eth->col_count; i++) {
-		extra -= eth->columns[i]->min_width + eth->width_extras;
-		if (eth->columns[i]->resizable && eth->columns[i]->expansion > 0)
-			last_resizable = i;
-		expansion += eth->columns[i]->resizable ? eth->columns[i]->expansion : 0;
-		widths[i] = eth->columns[i]->min_width + eth->width_extras;
-	}
-	if (eth->sort_info)
-		extra -= e_table_sort_info_grouping_get_count(eth->sort_info) * GROUP_INDENT;
-	if (expansion != 0 && extra > 0) {
-		for (i = 0; i < last_resizable; i++) {
-			next_position += extra * (eth->columns[i]->resizable ? eth->columns[i]->expansion : 0)/expansion;
-			widths[i] += next_position - last_position;
-			last_position = next_position;
-		}
-		widths[i] += extra - last_position;
-	}
-
-	changed = FALSE;
-
-	for (i = 0; i < eth->col_count; i++) {
-		if (eth->columns[i]->width != widths[i]) {
-			changed = TRUE;
-			eth->columns[i]->width = widths[i];
-		}
-	}
-	g_free (widths);
-	if (changed)
-		g_signal_emit (G_OBJECT (eth), eth_signals [DIMENSION_CHANGE], 0, eth->width);
-	eth_update_offsets (eth);
-}
-
-void
-e_table_header_update_horizontal (ETableHeader *eth)
-{
-	int i;
-	int cols;
-
-	cols = eth->col_count;
-
-	for (i = 0; i < cols; i++) {
-		int width = 0;
-		
-		g_signal_emit_by_name (G_OBJECT (eth),
-					 "request_width",
-					 i, &width);
-		eth->columns[i]->min_width = width + 10;
-		eth->columns[i]->expansion = 1;
-	}
-	enqueue(eth, -1, eth->nominal_width);
-	g_signal_emit (G_OBJECT (eth), eth_signals [EXPANSION_CHANGE], 0);
-}
-
-E_MAKE_TYPE(e_table_header, "ETableHeader", ETableHeader, e_table_header_class_init, e_table_header_init, G_TYPE_OBJECT)
-
-int
-e_table_header_prioritized_column (ETableHeader *eth)
-{
-	int best_model_col = 0;
-	int best_priority;
-	int i;
-	int count;
-
-	count = e_table_header_count (eth);
-	if (count == 0)
-		return -1;
-	best_priority = e_table_header_get_column (eth, 0)->priority;
-	best_model_col = e_table_header_get_column (eth, 0)->col_idx;
-	for (i = 1; i < count; i++) {
-		int priority = e_table_header_get_column (eth, i)->priority;
-		if (priority > best_priority) {
-			best_priority = priority;
-			best_model_col = e_table_header_get_column (eth, i)->col_idx;
-		}
-	}
-	return best_model_col;
-}
-
-ETableCol *
-e_table_header_prioritized_column_selected (ETableHeader *eth, ETableColCheckFunc check_func, gpointer user_data)
-{
-	ETableCol *best_col = NULL;
-	int best_priority = G_MININT;
-	int i;
-	int count;
-
-	count = e_table_header_count (eth);
-	if (count == 0)
-		return NULL;
-	for (i = 1; i < count; i++) {
-		ETableCol *col = e_table_header_get_column (eth, i);
-		if (col) {
-			if ((best_col == NULL || col->priority > best_priority) && check_func (col, user_data)) {
-				best_priority = col->priority;
-				best_col = col;
-			}
-		}
-	}
-	return best_col;
-}
diff --git a/widgets/table/e-table-header.h b/widgets/table/e-table-header.h
deleted file mode 100644
index 3a9ae6a0bf..0000000000
--- a/widgets/table/e-table-header.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-header.h
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Miguel de Icaza <miguel@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_COLUMN_H_
-#define _E_TABLE_COLUMN_H_
-
-#include <glib-object.h>
-#include <gdk/gdk.h>
-#include <gal/e-table/e-table-sort-info.h>
-#include <gal/e-table/e-table-col.h>
-
-G_BEGIN_DECLS
-
-typedef struct _ETableHeader ETableHeader;
-
-#define E_TABLE_HEADER_TYPE        (e_table_header_get_type ())
-#define E_TABLE_HEADER(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_HEADER_TYPE, ETableHeader))
-#define E_TABLE_HEADER_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_HEADER_TYPE, ETableHeaderClass))
-#define E_IS_TABLE_HEADER(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_HEADER_TYPE))
-#define E_IS_TABLE_HEADER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_HEADER_TYPE))
-#define E_TABLE_HEADER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TABLE_HEADER_TYPE, ETableHeaderClass))
-
-typedef gboolean (*ETableColCheckFunc) (ETableCol *col, gpointer user_data);
-
-/*
- * A Columnar header.
- */
-struct _ETableHeader {
-	GObject base;
-
-	int col_count;
-	int width;
-	int nominal_width;
-	int width_extras;
-
-	ETableSortInfo *sort_info;
-	int sort_info_group_change_id;
-
-	ETableCol **columns;
-	
-	GSList *change_queue, *change_tail;
-	gint idle;
-};
-
-typedef struct {
-	GObjectClass parent_class;
-
-	void (*structure_change) (ETableHeader *eth);
-	void (*dimension_change) (ETableHeader *eth, int width);
-	void (*expansion_change) (ETableHeader *eth);
-	int (*request_width) (ETableHeader *eth, int col);
-} ETableHeaderClass;
-
-GType         e_table_header_get_type                     (void);
-ETableHeader *e_table_header_new                          (void);
-
-void          e_table_header_add_column                   (ETableHeader       *eth,
-							   ETableCol          *tc,
-							   int                 pos);
-ETableCol    *e_table_header_get_column                   (ETableHeader       *eth,
-							   int                 column);
-ETableCol    *e_table_header_get_column_by_col_idx        (ETableHeader       *eth,
-							   int                 col_idx);
-int           e_table_header_count                        (ETableHeader       *eth);
-int           e_table_header_index                        (ETableHeader       *eth,
-							   int                 col);
-int           e_table_header_get_index_at                 (ETableHeader       *eth,
-							   int                 x_offset);
-ETableCol   **e_table_header_get_columns            (ETableHeader *eth);
-int           e_table_header_get_selected                 (ETableHeader       *eth);
-
-int           e_table_header_total_width                  (ETableHeader       *eth);
-int           e_table_header_min_width                    (ETableHeader       *eth);
-void          e_table_header_move                         (ETableHeader       *eth,
-							   int                 source_index,
-							   int                 target_index);
-void          e_table_header_remove                       (ETableHeader       *eth,
-							   int                 idx);
-void          e_table_header_set_size                     (ETableHeader       *eth,
-							   int                 idx,
-							   int                 size);
-void          e_table_header_set_selection                (ETableHeader       *eth,
-							   gboolean            allow_selection);
-int           e_table_header_col_diff                     (ETableHeader       *eth,
-							   int                 start_col,
-							   int                 end_col);
-
-void          e_table_header_calc_widths                  (ETableHeader       *eth);
-GList        *e_table_header_get_selected_indexes         (ETableHeader       *eth);
-void          e_table_header_update_horizontal            (ETableHeader       *eth);
-int           e_table_header_prioritized_column           (ETableHeader       *eth);
-ETableCol    *e_table_header_prioritized_column_selected  (ETableHeader       *eth,
-							   ETableColCheckFunc  check_func,
-							   gpointer            user_data);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_HEADER_H_ */
-
diff --git a/widgets/table/e-table-item.c b/widgets/table/e-table-item.c
deleted file mode 100644
index 33798cc716..0000000000
--- a/widgets/table/e-table-item.c
+++ /dev/null
@@ -1,3735 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-item.c
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Miguel de Icaza <miguel@gnu.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-/*
- * TODO:
- *   Add a border to the thing, so that focusing works properly.
- */
-#include <config.h>
-
-#include "e-table-item.h"
-
-#include <X11/Xlib.h>
-
-#include <math.h>
-#include <stdio.h>
-#include <gtk/gtksignal.h>
-#include <gtk/gtkmain.h>
-#include <gdk/gdkkeysyms.h>
-#include "e-table-subset.h"
-#include "e-cell.h"
-#include "gal/a11y/e-table/gal-a11y-e-table-item-factory.h"
-#include "gal/widgets/e-hsv-utils.h"
-#include "gal/widgets/e-canvas.h"
-#include "gal/widgets/e-canvas-utils.h"
-#include "gal/util/e-util.h"
-#include "gal/a11y/e-table/gal-a11y-e-table-item.h"
-#include "gal/util/e-i18n.h"
-#include <string.h>
-#include <stdlib.h>
-#include <atk/atk.h>
-
-#define PARENT_OBJECT_TYPE gnome_canvas_item_get_type ()
-
-#define FOCUSED_BORDER 2
-
-#define d(x)
-
-#if d(!)0
-#define e_table_item_leave_edit_(x) (e_table_item_leave_edit((x)), g_print ("%s: e_table_item_leave_edit\n", __FUNCTION__))
-#else
-#define e_table_item_leave_edit_(x) (e_table_item_leave_edit((x)))
-#endif
-
-static void eti_check_cursor_bounds (ETableItem *eti);
-static void eti_cancel_drag_due_to_model_change (ETableItem *eti);
-
-/* FIXME: Do an analysis of which cell functions are needed before
-   realize and make sure that all of them are doable by all the cells
-   and that all of the others are only done after realization. */
-
-static GnomeCanvasItemClass *eti_parent_class;
-
-enum {
-	CURSOR_CHANGE,
-	CURSOR_ACTIVATED,
-	DOUBLE_CLICK,
-	RIGHT_CLICK,
-	CLICK,
-	KEY_PRESS,
-	START_DRAG,
-	STYLE_SET,
-	SELECTION_MODEL_REMOVED,
-	SELECTION_MODEL_ADDED,
-	LAST_SIGNAL
-};
-
-static guint eti_signals [LAST_SIGNAL] = { 0, };
-
-enum {
-	PROP_0,
-	PROP_TABLE_HEADER,
-	PROP_TABLE_MODEL,
-	PROP_SELECTION_MODEL,
-	PROP_TABLE_ALTERNATING_ROW_COLORS,
-	PROP_TABLE_HORIZONTAL_DRAW_GRID,
-	PROP_TABLE_VERTICAL_DRAW_GRID,
-	PROP_TABLE_DRAW_FOCUS,
-	PROP_CURSOR_MODE,
-	PROP_LENGTH_THRESHOLD,
-	PROP_CURSOR_ROW,
-	PROP_UNIFORM_ROW_HEIGHT,
-	
-	PROP_MINIMUM_WIDTH,
-	PROP_WIDTH,
-	PROP_HEIGHT
-};
-
-#define DOUBLE_CLICK_TIME      250
-#define TRIPLE_CLICK_TIME      500
-
-
-static int eti_get_height (ETableItem *eti);
-static int eti_row_height (ETableItem *eti, int row);
-static void e_table_item_focus (ETableItem *eti, int col, int row, GdkModifierType state);
-static void eti_cursor_change (ESelectionModel *selection, int row, int col, ETableItem *eti);
-static void eti_cursor_activated (ESelectionModel *selection, int row, int col, ETableItem *eti);
-static void eti_selection_change (ESelectionModel *selection, ETableItem *eti);
-static void eti_selection_row_change (ESelectionModel *selection, int row, ETableItem *eti);
-static void e_table_item_redraw_row (ETableItem *eti, int row);
-
-#define ETI_SINGLE_ROW_HEIGHT(eti) ((eti)->uniform_row_height_cache != -1 ? (eti)->uniform_row_height_cache : eti_row_height((eti), -1))
-#define ETI_MULTIPLE_ROW_HEIGHT(eti,row) ((eti)->height_cache && (eti)->height_cache[(row)] != -1 ? (eti)->height_cache[(row)] : eti_row_height((eti),(row)))
-#define ETI_ROW_HEIGHT(eti,row) ((eti)->uniform_row_height ? ETI_SINGLE_ROW_HEIGHT ((eti)) : ETI_MULTIPLE_ROW_HEIGHT((eti),(row)))
-
-inline static gint
-model_to_view_row(ETableItem *eti, int row)
-{
-	int i;
-	if (row == -1)
-		return -1;
-	if (eti->uses_source_model) {
-		ETableSubset *etss = E_TABLE_SUBSET(eti->table_model);
-		if (eti->row_guess >= 0 && eti->row_guess < etss->n_map) {
-			if (etss->map_table[eti->row_guess] == row) {
-				return eti->row_guess;
-			}
-		}
-		for (i = 0; i < etss->n_map; i++) {
-			if (etss->map_table[i] == row)
-				return i;
-		}
-		return -1;
-	} else
-		return row;
-}
-
-inline static gint
-view_to_model_row(ETableItem *eti, int row)
-{
-	if (eti->uses_source_model) {
-		ETableSubset *etss = E_TABLE_SUBSET(eti->table_model);
-		if (row >= 0 && row < etss->n_map) {
-			eti->row_guess = row;
-			return etss->map_table[row];
-		} else
-			return -1;
-	} else
-		return row;
-}
-
-inline static gint
-model_to_view_col(ETableItem *eti, int col)
-{
-	int i;
-	if (col == -1)
-		return -1;
-	for (i = 0; i < eti->cols; i++) {
-		ETableCol *ecol = e_table_header_get_column (eti->header, i);
-		if (ecol->col_idx == col)
-			return i;
-	}
-	return -1;
-}
-
-inline static gint
-view_to_model_col(ETableItem *eti, int col)
-{
-	ETableCol *ecol = e_table_header_get_column (eti->header, col);
-	return ecol ? ecol->col_idx : -1;
-}
-
-static void
-grab_cancelled (ECanvas *canvas, GnomeCanvasItem *item, gpointer data)
-{
-	ETableItem *eti = data;
-
-	eti->grab_cancelled = TRUE;
-}
-
-inline static void
-eti_grab (ETableItem *eti, guint32 time)
-{
-	GnomeCanvasItem *item = GNOME_CANVAS_ITEM (eti);
-	d(g_print ("%s: time: %d\n", __FUNCTION__, time));
-	if (eti->grabbed_count == 0) {
-		eti->gtk_grabbed = FALSE;
-		eti->grab_cancelled = FALSE;
-		if (e_canvas_item_grab(E_CANVAS (item->canvas),
-				       item,
-				       GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK
-				       | GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK,
-				       NULL, time,
-				       grab_cancelled,
-				       eti) != GrabSuccess) {
-			d(g_print ("%s: gtk_grab_add\n", __FUNCTION__));
-			gtk_grab_add (GTK_WIDGET (item->canvas));
-			eti->gtk_grabbed = TRUE;
-		}
-	}
-	eti->grabbed_count ++;
-}
-
-inline static void
-eti_ungrab (ETableItem *eti, guint32 time)
-{
-	GnomeCanvasItem *item = GNOME_CANVAS_ITEM (eti);
-	d(g_print ("%s: time: %d\n", __FUNCTION__, time));
-	eti->grabbed_count --;
-	if (eti->grabbed_count == 0) {
-		if (eti->grab_cancelled) {
-			eti->grab_cancelled = FALSE;
-		} else {
-			if (eti->gtk_grabbed) {
-				d(g_print ("%s: gtk_grab_remove\n", __FUNCTION__));
-				gtk_grab_remove (GTK_WIDGET (item->canvas));
-				eti->gtk_grabbed = FALSE;
-			}
-			gnome_canvas_item_ungrab(item, time);
-			eti->grabbed_col = -1;
-			eti->grabbed_row = -1;
-		}
-	}
-}
-
-inline static gboolean
-eti_editing (ETableItem *eti)
-{
-	d(g_print("%s: %s\n", __FUNCTION__, (eti->editing_col == -1) ? "false":"true"));
-	
-	if (eti->editing_col == -1)
-		return FALSE;
-	else
-		return TRUE;
-}
-
-inline static GdkColor *
-eti_get_cell_background_color (ETableItem *eti, int row, int col, gboolean selected, gboolean *allocatedp)
-{
-  	ECellView *ecell_view = eti->cell_views [col];
-	GtkWidget *canvas = GTK_WIDGET(GNOME_CANVAS_ITEM(eti)->canvas);
-	GdkColor *background, bg;
-	gchar *color_spec = NULL;
-	gboolean allocated = FALSE;
-
-	if (selected){
-		if (GTK_WIDGET_HAS_FOCUS(canvas))
-			background = &canvas->style->bg [GTK_STATE_SELECTED];
-		else
-			background = &canvas->style->bg [GTK_STATE_ACTIVE];
-	} else {
-		background = &canvas->style->base [GTK_STATE_NORMAL];
-	}
-
-	color_spec = e_cell_get_bg_color (ecell_view, row);
-
-	if (color_spec != NULL) {
-		if (gdk_color_parse (color_spec, &bg)) {
-			background = gdk_color_copy (&bg);
-			gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (canvas)), background,
-						  FALSE, TRUE);
-			allocated = TRUE;
-		}
-	}
-
-	if (eti->alternating_row_colors) {
-		if (row % 2) {
-		
-		} else {
-			if (!allocated) {
-				background = gdk_color_copy (background);
-				allocated = TRUE;
-			}
-			e_hsv_tweak (background, 0.0f, 0.0f, -0.07f);
-			gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (canvas)), background,
-						  FALSE, TRUE);
-		}
-	}
-	if (allocatedp)
-		*allocatedp = allocated;
-
-	return background;
-}
-
-inline static GdkColor *
-eti_get_cell_foreground_color (ETableItem *eti, int row, int col, gboolean selected, gboolean *allocated)
-{
-	GtkWidget *canvas = GTK_WIDGET(GNOME_CANVAS_ITEM(eti)->canvas);
-	GdkColor *foreground;
-
-	if (allocated)
-		*allocated = FALSE;
-
-	if (selected){
-		if (GTK_WIDGET_HAS_FOCUS (canvas))
-			foreground = &canvas->style->fg [GTK_STATE_SELECTED];
-		else
-			foreground = &canvas->style->fg [GTK_STATE_ACTIVE];
-	} else {
-		foreground = &canvas->style->text [GTK_STATE_NORMAL];
-	}
-
-	return foreground;
-}
-
-static void
-eti_free_save_state (ETableItem *eti)
-{
-	if (eti->save_row == -1 ||
-	    !eti->cell_views_realized)
-		return;
-
-	e_cell_free_state (eti->cell_views [eti->save_col], view_to_model_col(eti, eti->save_col),
-			   eti->save_col, eti->save_row, eti->save_state);
-	eti->save_row = -1;
-	eti->save_col = -1;
-	eti->save_state = NULL;
-}
-
-/*
- * During realization, we have to invoke the per-ecell realize routine
- * (On our current setup, we have one e-cell per column.
- *
- * We might want to optimize this to only realize the unique e-cells:
- * ie, a strings-only table, uses the same e-cell for every column, and
- * we might want to avoid realizing each e-cell.
- */
-static void
-eti_realize_cell_views (ETableItem *eti)
-{
-	int i;
-
-	if (eti->cell_views_realized)
-		return;
-
-	if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED))
-		return;
-	
-	for (i = 0; i < eti->n_cells; i++)
-		e_cell_realize (eti->cell_views [i]);
-	eti->cell_views_realized = 1;
-}
-
-static void
-eti_attach_cell_views (ETableItem *eti)
-{
-	int i;
-
-	g_assert (eti->header);
-	g_assert (eti->table_model);
-
-	/* this is just c&p from model pre change, but it fixes things */
-	eti_cancel_drag_due_to_model_change (eti);
-	eti_check_cursor_bounds (eti);
-	if (eti_editing (eti))
-		e_table_item_leave_edit_(eti);
-	eti->motion_row = -1;
-	eti->motion_col = -1;
-
-	/*
-	 * Now realize the various ECells
-	 */
-	eti->n_cells = eti->cols;
-	eti->cell_views = g_new (ECellView *, eti->n_cells);
-
-	for (i = 0; i < eti->n_cells; i++){
-		ETableCol *ecol = e_table_header_get_column (eti->header, i);
-		
-		eti->cell_views [i] = e_cell_new_view (ecol->ecell, eti->table_model, eti);
-	}
-
-	eti->needs_compute_height = 1;
-	e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
-	eti->needs_redraw = 1;
-	gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-}
-
-/*
- * During unrealization: we invoke every e-cell (one per column in the current
- * setup) to dispose all X resources allocated
- */
-static void
-eti_unrealize_cell_views (ETableItem *eti)
-{
-	int i;
-
-	if (eti->cell_views_realized == 0)
-		return;
-	
-	eti_free_save_state (eti);
-
-	for (i = 0; i < eti->n_cells; i++)
-		e_cell_unrealize (eti->cell_views [i]);
-	eti->cell_views_realized = 0;
-}
-
-static void
-eti_detach_cell_views (ETableItem *eti)
-{
-	int i;
-	
-	eti_free_save_state (eti);
-
-	for (i = 0; i < eti->n_cells; i++){
-		e_cell_kill_view (eti->cell_views [i]);
-		eti->cell_views [i] = NULL;
-	}
-		
-	g_free (eti->cell_views);
-	eti->cell_views = NULL;
-	eti->n_cells = 0;
-}
-
-static void
-eti_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
-{
-	double   i2c [6];
-	ArtPoint c1, c2, i1, i2;
-	ETableItem *eti = E_TABLE_ITEM (item);
-
-	/* Wrong BBox's are the source of redraw nightmares */
-
-	gnome_canvas_item_i2c_affine (GNOME_CANVAS_ITEM (eti), i2c);
-	
-	i1.x = eti->x1;
-	i1.y = eti->y1;
-	i2.x = eti->x1 + eti->width;
-	i2.y = eti->y1 + eti->height;
-	art_affine_point (&c1, &i1, i2c);
-	art_affine_point (&c2, &i2, i2c);
-	
-	*x1 = c1.x;
-	*y1 = c1.y;
-	*x2 = c2.x + 1;
-	*y2 = c2.y + 1;
-}
-
-static void
-eti_reflow (GnomeCanvasItem *item, gint flags)
-{
-	ETableItem *eti = E_TABLE_ITEM (item);
-
-	if (eti->needs_compute_height) {
-		int new_height = eti_get_height (eti);
-
-		if (new_height != eti->height) {
-			eti->height = new_height;
-			e_canvas_item_request_parent_reflow (GNOME_CANVAS_ITEM (eti));
-			eti->needs_redraw = 1;
-			gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-		}
-		eti->needs_compute_height = 0;
-	}
-	if (eti->needs_compute_width) {
-		int new_width = e_table_header_total_width(eti->header);
-		if (new_width != eti->width) {
-			eti->width = new_width;
-			e_canvas_item_request_parent_reflow (GNOME_CANVAS_ITEM (eti));
-			eti->needs_redraw = 1;
-			gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-		}
-		eti->needs_compute_width = 0;
-	}
-}
-
-/*
- * GnomeCanvasItem::update method
- */
-static void
-eti_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
-{
-	ArtPoint o1, o2;
-	ETableItem *eti = E_TABLE_ITEM (item);
-
-	if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)
-		(*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->update)(item, affine, clip_path, flags);
-
-	o1.x = item->x1;
-	o1.y = item->y1;
-	o2.x = item->x2;
-	o2.y = item->y2;
-
-	eti_bounds (item, &item->x1, &item->y1, &item->x2, &item->y2);
-	if (item->x1 != o1.x ||
-	    item->y1 != o1.y ||
-	    item->x2 != o2.x ||
-	    item->y2 != o2.y) {
-		gnome_canvas_request_redraw (item->canvas, o1.x, o1.y, o2.x, o2.y);
-		eti->needs_redraw = 1;
-	}
-
-	if (eti->needs_redraw) {
-		gnome_canvas_request_redraw (item->canvas, item->x1, item->y1,
-					     item->x2, item->y2);
-		eti->needs_redraw = 0;
-	}
-}
-
-/*
- * eti_remove_table_model:
- *
- * Invoked to release the table model associated with this ETableItem
- */
-static void
-eti_remove_table_model (ETableItem *eti)
-{
-	if (!eti->table_model)
-		return;
-
-	g_signal_handler_disconnect (G_OBJECT (eti->table_model),
-			       eti->table_model_pre_change_id);
-	g_signal_handler_disconnect (G_OBJECT (eti->table_model),
-			       eti->table_model_no_change_id);
-	g_signal_handler_disconnect (G_OBJECT (eti->table_model),
-			       eti->table_model_change_id);
-	g_signal_handler_disconnect (G_OBJECT (eti->table_model),
-			       eti->table_model_row_change_id);
-	g_signal_handler_disconnect (G_OBJECT (eti->table_model),
-			       eti->table_model_cell_change_id);
-	g_signal_handler_disconnect (G_OBJECT (eti->table_model),
-			       eti->table_model_rows_inserted_id);
-	g_signal_handler_disconnect (G_OBJECT (eti->table_model),
-			       eti->table_model_rows_deleted_id);
-	g_object_unref (eti->table_model);
-	if (eti->source_model)
-		g_object_unref (eti->source_model);
-
-	eti->table_model_pre_change_id = 0;
-	eti->table_model_no_change_id = 0;
-	eti->table_model_change_id = 0;
-	eti->table_model_row_change_id = 0;
-	eti->table_model_cell_change_id = 0;
-	eti->table_model_rows_inserted_id = 0;
-	eti->table_model_rows_deleted_id = 0;
-	eti->table_model = NULL;
-	eti->source_model = NULL;
-	eti->uses_source_model = 0;
-}
-
-/*
- * eti_remove_table_model:
- *
- * Invoked to release the table model associated with this ETableItem
- */
-static void
-eti_remove_selection_model (ETableItem *eti)
-{
-	if (!eti->selection)
-		return;
-
-	g_signal_handler_disconnect (eti->selection,
-				     eti->selection_change_id);
-	g_signal_handler_disconnect (eti->selection,
-				     eti->selection_row_change_id);
-	g_signal_handler_disconnect (eti->selection,
-				     eti->cursor_change_id);
-	g_signal_handler_disconnect (eti->selection,
-				     eti->cursor_activated_id);
-	g_object_unref (eti->selection);
-
-	eti->selection_change_id = 0;
-	eti->selection_row_change_id = 0;
-	eti->cursor_activated_id = 0;
-	eti->selection = NULL;
-}
-
-/*
- * eti_remove_header_model:
- *
- * Invoked to release the header model associated with this ETableItem
- */
-static void
-eti_remove_header_model (ETableItem *eti)
-{
-	if (!eti->header)
-		return;
-
-	g_signal_handler_disconnect (G_OBJECT (eti->header),
-			       	     eti->header_structure_change_id);
-	g_signal_handler_disconnect (G_OBJECT (eti->header),
-			       	     eti->header_dim_change_id);
-	g_signal_handler_disconnect (G_OBJECT (eti->header),
-			       	     eti->header_request_width_id);
-	
-	if (eti->cell_views){
-		eti_unrealize_cell_views (eti);
-		eti_detach_cell_views (eti);
-	}
-	g_object_unref (eti->header);
-
-
-	eti->header_structure_change_id = 0;
-	eti->header_dim_change_id = 0;
-	eti->header_request_width_id = 0;
-	eti->header = NULL;
-}
-
-/*
- * eti_row_height_real:
- *
- * Returns the height used by row @row.  This does not include the one-pixel
- * used as a separator between rows
- */
-static int
-eti_row_height_real (ETableItem *eti, int row)
-{
-	const int cols = e_table_header_count (eti->header);
-	int col;
-	int h, max_h;
-
-	g_assert (cols == 0 || eti->cell_views);
-	
-	max_h = 0;
-	
-	for (col = 0; col < cols; col++){
-		h = e_cell_height (eti->cell_views [col], view_to_model_col(eti, col), col, row);
-
-		if (h > max_h)
-			max_h = h;
-	}
-	return max_h;
-}
-
-static void
-confirm_height_cache (ETableItem *eti)
-{
-	int i;
-
-	if (eti->uniform_row_height || eti->height_cache)
-		return;
-	eti->height_cache = g_new(int, eti->rows);
-	for (i = 0; i < eti->rows; i++) {
-		eti->height_cache[i] = -1;
-	}
-}
-
-static gboolean
-height_cache_idle(ETableItem *eti)
-{
-	int changed = 0;
-	int i;
-	confirm_height_cache(eti);
-	for (i = eti->height_cache_idle_count; i < eti->rows; i++) {
-		if (eti->height_cache[i] == -1) {
-			eti_row_height(eti, i);
-			changed ++;
-			if (changed >= 20)
-				break;
-		}
-	}
-	if (changed >= 20) {
-		eti->height_cache_idle_count = i;
-		return TRUE;
-	}
-	eti->height_cache_idle_id = 0;
-	return FALSE;	
-}
-
-static void
-free_height_cache (ETableItem *eti)
-{
-	if (GNOME_CANVAS_ITEM_REALIZED & GTK_OBJECT_FLAGS (eti)) {
-		if (eti->height_cache)
-			g_free (eti->height_cache);
-		eti->height_cache = NULL;
-		eti->height_cache_idle_count = 0;
-		eti->uniform_row_height_cache = -1;
-
-		if (eti->uniform_row_height && eti->height_cache_idle_id != 0) {
-			g_source_remove(eti->height_cache_idle_id);
-			eti->height_cache_idle_id = 0;
-		}
-
-		if ((!eti->uniform_row_height) && eti->height_cache_idle_id == 0)
-			eti->height_cache_idle_id = g_idle_add_full(G_PRIORITY_LOW, (GSourceFunc) height_cache_idle, eti, NULL);
-	}
-}
-
-static void
-calculate_height_cache (ETableItem *eti)
-{
-	free_height_cache(eti);
-	confirm_height_cache(eti);
-}
-
-
-/*
- * eti_row_height:
- *
- * Returns the height used by row @row.  This does not include the one-pixel
- * used as a separator between rows
- */
-static int
-eti_row_height (ETableItem *eti, int row)
-{
-	if (eti->uniform_row_height) {
-		eti->uniform_row_height_cache = eti_row_height_real (eti, -1);
-		return eti->uniform_row_height_cache;
-	} else {
-		if (!eti->height_cache) {
-			calculate_height_cache (eti);
-		}
-		if (eti->height_cache[row] == -1) {
-			eti->height_cache[row] = eti_row_height_real(eti, row);
-			if (row > 0 && 
-			    eti->length_threshold != -1 && 
-			    eti->rows > eti->length_threshold &&
-			    eti->height_cache[row] != eti_row_height(eti, 0)) {
-				eti->needs_compute_height = 1;
-				e_canvas_item_request_reflow(GNOME_CANVAS_ITEM(eti));
-			}
-		}
-		return eti->height_cache[row];
-	}
-}
-
-/*
- * eti_get_height:
- *
- * Returns the height of the ETableItem.
- *
- * The ETableItem might compute the whole height by asking every row its
- * size.  There is a special mode (designed to work when there are too
- * many rows in the table that performing the previous step could take 
- * too long) set by the ETableItem->length_threshold that would determine
- * when the height is computed by using the first row as the size for
- * every other row in the ETableItem.
- */
-static int
-eti_get_height (ETableItem *eti)
-{
-	const int rows = eti->rows;
-	int height_extra = eti->horizontal_draw_grid ? 1 : 0;
-
-	if (rows == 0)
-		return 0;
-
-	if (eti->uniform_row_height) {
-		int row_height = eti_row_height(eti, -1);
-		return ((row_height + height_extra) * rows + height_extra);
-	} else {
-		int height;
-		int row;
-		if (eti->length_threshold != -1){
-			if (rows > eti->length_threshold){
-				int row_height = eti_row_height(eti, 0);
-				if (eti->height_cache) {
-					height = 0;
-					for (row = 0; row < rows; row++) {
-						if (eti->height_cache[row] == -1) {
-							height += (row_height + height_extra) * (rows - row);
-							break;
-						}
-						else
-							height += eti->height_cache[row] + height_extra;
-					}
-				} else
-					height = (eti_row_height (eti, 0) + height_extra) * rows;
-
-				/*
-				 * 1 pixel at the top
-				 */
-				return height + height_extra;
-			}
-		}
-
-		height = height_extra;
-		for (row = 0; row < rows; row++)
-			height += eti_row_height (eti, row) + height_extra;
-
-		return height;
-	}
-}
-
-static void
-eti_item_region_redraw (ETableItem *eti, int x0, int y0, int x1, int y1)
-{
-	GnomeCanvasItem *item = GNOME_CANVAS_ITEM (eti);
-	ArtDRect rect;
-	double i2c [6];
-	
-	rect.x0 = x0;
-	rect.y0 = y0;
-	rect.x1 = x1;
-	rect.y1 = y1;
-
-	gnome_canvas_item_i2c_affine (item, i2c);
-	art_drect_affine_transform (&rect, &rect, i2c);
-
-	gnome_canvas_request_redraw (item->canvas, rect.x0, rect.y0, rect.x1, rect.y1);
-}
-
-/*
- * Computes the distance between @start_row and @end_row in pixels
- */
-int
-e_table_item_row_diff (ETableItem *eti, int start_row, int end_row)
-{
-	int height_extra = eti->horizontal_draw_grid ? 1 : 0;
-
-	if (start_row < 0)
-		start_row = 0;
-	if (end_row > eti->rows)
-		end_row = eti->rows;
-
-	if (eti->uniform_row_height) {
-		return ((end_row - start_row) * (eti_row_height(eti, -1) + height_extra));
-	} else {
-		int row, total;
-		total = 0;
-		for (row = start_row; row < end_row; row++)
-			total += eti_row_height (eti, row) + height_extra;
-
-		return total;
-	}
-}
-
-static void
-eti_get_region (ETableItem *eti,
-		int start_col, int start_row,
-		int end_col, int end_row,
-		int *x1p, int *y1p,
-		int *x2p, int *y2p)
-{
-	int x1, y1, x2, y2;
-	
-	x1 = e_table_header_col_diff (eti->header, 0, start_col);
-	y1 = e_table_item_row_diff (eti, 0, start_row);
-	x2 = x1 + e_table_header_col_diff (eti->header, start_col, end_col + 1);
-	y2 = y1 + e_table_item_row_diff (eti, start_row, end_row + 1);
-	if (x1p)
-		*x1p = x1;
-	if (y1p)
-		*y1p = y1;
-	if (x2p)
-		*x2p = x2;
-	if (y2p)
-		*y2p = y2;
-}
-
-/*
- * eti_request_region_redraw:
- *
- * Request a canvas redraw on the range (start_col, start_row) to (end_col, end_row).
- * This is inclusive (ie, you can use: 0,0-0,0 to redraw the first cell).
- *
- * The @border argument is a number of pixels around the region that should also be queued
- * for redraw.   This is typically used by the focus routines to queue a redraw for the
- * border as well.
- */
-static void
-eti_request_region_redraw (ETableItem *eti,
-			   int start_col, int start_row,
-			   int end_col, int end_row, int border)
-{
-	int x1, y1, x2, y2;
-
-	if (eti->rows > 0) {
-
-		eti_get_region (eti,
-				start_col, start_row,
-				end_col, end_row,
-				&x1, &y1, &x2, &y2);
-		
-		eti_item_region_redraw (eti, eti->x1 + x1 - border,
-					eti->y1 + y1 - border,
-					eti->x1 + x2 + 1 + border,
-					eti->y1 + y2 + 1 + border);
-	}
-}
-
-/*
- * eti_request_region_show
- *
- * Request a canvas show on the range (start_col, start_row) to (end_col, end_row).
- * This is inclusive (ie, you can use: 0,0-0,0 to show the first cell).
- */
-static void
-eti_request_region_show (ETableItem *eti,
-			 int start_col, int start_row,
-			 int end_col, int end_row, int delay)
-{
-	int x1, y1, x2, y2;
-
-	eti_get_region (eti,
-			start_col, start_row,
-			end_col, end_row,
-			&x1, &y1, &x2, &y2);
-
-	if (delay)
-		e_canvas_item_show_area_delayed(GNOME_CANVAS_ITEM(eti), x1, y1, x2, y2, delay);
-	else
-		e_canvas_item_show_area(GNOME_CANVAS_ITEM(eti), x1, y1, x2, y2);
-}
-
-static void
-eti_show_cursor (ETableItem *eti, int delay)
-{
-	int cursor_row;
-	
-	if (!((GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED) && eti->cell_views_realized))
-		return;
-
-	if (eti->frozen_count > 0) {
-		eti->queue_show_cursor = TRUE;
-		return;
-	}
-	
-#if 0
-	g_object_get(eti->selection,
-		     "cursor_row", &cursor_row,
-		     NULL);
-#else
-	cursor_row = e_selection_model_cursor_row (eti->selection);
-#endif
-
-	d(g_print ("%s: cursor row: %d\n", __FUNCTION__, cursor_row));
-
-	if (cursor_row != -1) {
-		cursor_row = model_to_view_row (eti, cursor_row);
-		eti_request_region_show (eti,
-					 0, cursor_row, eti->cols - 1, cursor_row,
-					 delay);
-	}
-}
-
-static void
-eti_check_cursor_on_screen (ETableItem *eti)
-{
-	if (eti->cursor_x1 == -1 ||
-	    eti->cursor_y1 == -1 ||
-	    eti->cursor_x2 == -1 ||
-	    eti->cursor_y2 == -1)
-		return;
-
-	eti->cursor_on_screen = e_canvas_item_area_shown (GNOME_CANVAS_ITEM(eti),
-							  eti->cursor_x1,
-							  eti->cursor_y1,
-							  eti->cursor_x2,
-							  eti->cursor_y2);
-
-	d(g_print ("%s: cursor on screen: %s\n", __FUNCTION__, eti->cursor_on_screen ? "TRUE" : "FALSE"));
-}
-
-static void
-eti_check_cursor_bounds (ETableItem *eti)
-{
-	int x1, y1, x2, y2;
-	int cursor_row;
-
-	if (!((GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED) && eti->cell_views_realized))
-		return;
-
-	if (eti->frozen_count > 0) {
-		return;
-	}
-	
-	if (!((GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED) && eti->cell_views_realized))
-		return;
-
-	if (eti->frozen_count > 0) {
-		return;
-	}
-	
-	g_object_get(eti->selection,
-		     "cursor_row", &cursor_row,
-		     NULL);
-
-	if (cursor_row == -1) {
-		eti->cursor_x1 = -1;
-		eti->cursor_y1 = -1;
-		eti->cursor_x2 = -1;
-		eti->cursor_y2 = -1;
-		eti->cursor_on_screen = TRUE;
-		return;
-	}
-
-	d(g_print ("%s: model cursor row: %d\n", __FUNCTION__, cursor_row));
-
-	cursor_row = model_to_view_row (eti, cursor_row);
-
-	d(g_print ("%s: cursor row: %d\n", __FUNCTION__, cursor_row));
-
-	eti_get_region (eti,
-			0, cursor_row, eti->cols - 1, cursor_row,
-			&x1, &y1, &x2, &y2);
-	eti->cursor_x1 = x1;
-	eti->cursor_y1 = y1;
-	eti->cursor_x2 = x2;
-	eti->cursor_y2 = y2;
-	eti->cursor_on_screen = e_canvas_item_area_shown (GNOME_CANVAS_ITEM(eti), x1, y1, x2, y2);
-
-	d(g_print ("%s: cursor on screen: %s\n", __FUNCTION__, eti->cursor_on_screen ? "TRUE" : "FALSE"));
-}
-
-static void
-eti_maybe_show_cursor(ETableItem *eti, int delay)
-{
-	d(g_print ("%s: cursor on screen: %s\n", __FUNCTION__, eti->cursor_on_screen ? "TRUE" : "FALSE"));
-	if (eti->cursor_on_screen)
-		eti_show_cursor (eti, delay);
-	eti_check_cursor_bounds (eti);
-}
-
-static gboolean
-eti_idle_show_cursor_cb (gpointer data)
-{
-	ETableItem *eti = data;
-
-	if (eti->selection) {
-		eti_show_cursor (eti, 0);
-		eti_check_cursor_bounds (eti);
-	}
-
-	eti->cursor_idle_id = 0;
-	g_object_unref (eti);
-	return FALSE;
-}
-
-static void
-eti_idle_maybe_show_cursor(ETableItem *eti)
-{
-	d(g_print ("%s: cursor on screen: %s\n", __FUNCTION__, eti->cursor_on_screen ? "TRUE" : "FALSE"));
-	if (eti->cursor_on_screen) {
-		g_object_ref (eti);
-		if (!eti->cursor_idle_id)
-			eti->cursor_idle_id = g_idle_add (eti_idle_show_cursor_cb, eti);
-	}
-}
-
-static void
-eti_cancel_drag_due_to_model_change (ETableItem *eti)
-{
-	if (eti->maybe_in_drag) {
-		eti->maybe_in_drag = FALSE;
-		if (!eti->maybe_did_something)
-			e_selection_model_do_something(E_SELECTION_MODEL (eti->selection), eti->drag_row, eti->drag_col, eti->drag_state);
-	}
-	if (eti->in_drag) {
-		eti->in_drag = FALSE;
-	}
-}
-
-static void
-eti_freeze (ETableItem *eti)
-{
-	eti->frozen_count ++;
-	d(g_print ("%s: %d\n", __FUNCTION__, eti->frozen_count));
-}
-
-static void
-eti_unfreeze (ETableItem *eti)
-{
-	g_return_if_fail (eti->frozen_count > 0);
-	eti->frozen_count --;
-	d(g_print ("%s: %d\n", __FUNCTION__, eti->frozen_count));
-	if (eti->frozen_count == 0 && eti->queue_show_cursor) {
-		eti_show_cursor (eti, 0);
-		eti_check_cursor_bounds (eti);
-		eti->queue_show_cursor = FALSE;
-	}
-}
-
-/*
- * Callback routine: invoked before the ETableModel suffers a change
- */
-static void
-eti_table_model_pre_change (ETableModel *table_model, ETableItem *eti)
-{
-	eti_cancel_drag_due_to_model_change (eti);
-	eti_check_cursor_bounds (eti);
-	if (eti_editing (eti))
-		e_table_item_leave_edit_(eti);
-	eti->motion_row = -1;
-	eti->motion_col = -1;
-	eti_freeze (eti);
-}
-
-/*
- * Callback routine: invoked when the ETableModel has not suffered a change
- */
-static void
-eti_table_model_no_change (ETableModel *table_model, ETableItem *eti)
-{
-	eti_unfreeze (eti);
-}
-
-/*
- * Callback routine: invoked when the ETableModel has suffered a change
- */
-
-static void
-eti_table_model_changed (ETableModel *table_model, ETableItem *eti)
-{
- 	if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED)) {
-		eti_unfreeze (eti);
-		return;
-	}
-
-	eti->rows = e_table_model_row_count (eti->table_model);
-
-	free_height_cache(eti);
-
-	eti_unfreeze (eti);
-
-	eti->needs_compute_height = 1;
-	e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
-	eti->needs_redraw = 1;
-	gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-
-	eti_idle_maybe_show_cursor(eti);
-}
-
-static void
-eti_table_model_row_changed (ETableModel *table_model, int row, ETableItem *eti)
-{
- 	if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED)) {
-		eti_unfreeze (eti);
-		return;
-	}
-
-	if ((!eti->uniform_row_height) && eti->height_cache && eti->height_cache[row] != -1 && eti_row_height_real(eti, row) != eti->height_cache[row]) {
-		eti_table_model_changed (table_model, eti);
-		return;
-	}
-
-	eti_unfreeze (eti);
-
-	e_table_item_redraw_row (eti, row);
-}
-
-static void
-eti_table_model_cell_changed (ETableModel *table_model, int col, int row, ETableItem *eti)
-{
- 	if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED)) {
-		eti_unfreeze (eti);
-		return;
-	}
-
-	if ((!eti->uniform_row_height) && eti->height_cache && eti->height_cache[row] != -1 && eti_row_height_real(eti, row) != eti->height_cache[row]) {
-		eti_table_model_changed (table_model, eti);
-		return;
-	}
-
-	eti_unfreeze (eti);
-
-	e_table_item_redraw_row (eti, row);
-}
-
-static void
-eti_table_model_rows_inserted (ETableModel *table_model, int row, int count, ETableItem *eti)
-{
- 	if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED)) {
-		eti_unfreeze (eti);
-		return;
-	}
-	eti->rows = e_table_model_row_count (eti->table_model);
-
-	if (eti->height_cache) {
-		int i;
-		eti->height_cache = g_renew(int, eti->height_cache, eti->rows);
-		memmove(eti->height_cache + row + count, eti->height_cache + row, (eti->rows - count - row) * sizeof(int));
-		for (i = row; i < row + count; i++)
-			eti->height_cache[i] = -1;
-	}
-
-	eti_unfreeze (eti);
-
-	eti_idle_maybe_show_cursor(eti);
-
-	eti->needs_compute_height = 1;
-	e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
-	eti->needs_redraw = 1;
-	gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-}
-
-static void
-eti_table_model_rows_deleted (ETableModel *table_model, int row, int count, ETableItem *eti)
-{
- 	if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED)) {
-		eti_unfreeze (eti);
-		return;
-	}
-
-	eti->rows = e_table_model_row_count (eti->table_model);
-
-	if (eti->height_cache && (eti->rows > row)) {
-		memmove(eti->height_cache + row, eti->height_cache + row + count, (eti->rows - row) * sizeof(int));
-	}
-
-	eti_unfreeze (eti);
-
-	eti_idle_maybe_show_cursor(eti);
-
-	eti->needs_compute_height = 1;
-	e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
-	eti->needs_redraw = 1;
-	gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-}
-
-/** 
- * e_table_item_redraw_range
- * @eti: %ETableItem which will be redrawn
- * @start_col: The first col to redraw.
- * @start_row: The first row to redraw.
- * @end_col: The last col to redraw.
- * @end_row: The last row to redraw.
- *
- * This routine redraws the given %ETableItem in the range given.  The
- * range is inclusive at both ends.
- */
-void
-e_table_item_redraw_range (ETableItem *eti,
-			   int start_col, int start_row,
-			   int end_col, int end_row)
-{
-	int border;
-	int cursor_col, cursor_row;
-	
-	g_return_if_fail (eti != NULL);
-	g_return_if_fail (E_IS_TABLE_ITEM (eti));
-	
-	g_object_get(eti->selection,
-		     "cursor_col", &cursor_col,
-		     "cursor_row", &cursor_row,
-		     NULL);
-
-	if ((start_col == cursor_col) ||
-	    (end_col   == cursor_col) ||
-	    (view_to_model_row(eti, start_row) == cursor_row) ||
-	    (view_to_model_row(eti, end_row)   == cursor_row))
-		border = 2;
-	else
-		border = 0;
-
-	eti_request_region_redraw(eti, start_col, start_row, end_col, end_row, border);
-}
-
-static void
-e_table_item_redraw_row (ETableItem *eti,
-			 int row)
-{
-	if (row != -1)
-		e_table_item_redraw_range (eti, 0, row, eti->cols - 1, row);
-}
-
-static void
-eti_add_table_model (ETableItem *eti, ETableModel *table_model)
-{
-	g_assert (eti->table_model == NULL);
-	
-	eti->table_model = table_model;
-	g_object_ref (eti->table_model);
-
-	eti->table_model_pre_change_id = g_signal_connect (
-		G_OBJECT (table_model), "model_pre_change",
-		G_CALLBACK (eti_table_model_pre_change), eti);
-
-	eti->table_model_no_change_id = g_signal_connect (
-		G_OBJECT (table_model), "model_no_change",
-		G_CALLBACK (eti_table_model_no_change), eti);
-
-	eti->table_model_change_id = g_signal_connect (
-		G_OBJECT (table_model), "model_changed",
-		G_CALLBACK (eti_table_model_changed), eti);
-
-	eti->table_model_row_change_id = g_signal_connect (
-		G_OBJECT (table_model), "model_row_changed",
-		G_CALLBACK (eti_table_model_row_changed), eti);
-
-	eti->table_model_cell_change_id = g_signal_connect (
-		G_OBJECT (table_model), "model_cell_changed",
-		G_CALLBACK (eti_table_model_cell_changed), eti);
-
-	eti->table_model_rows_inserted_id = g_signal_connect (
-		G_OBJECT (table_model), "model_rows_inserted",
-		G_CALLBACK (eti_table_model_rows_inserted), eti);
-
-	eti->table_model_rows_deleted_id = g_signal_connect (
-		G_OBJECT (table_model), "model_rows_deleted",
-		G_CALLBACK (eti_table_model_rows_deleted), eti);
-
-	if (eti->header) {
-		eti_detach_cell_views (eti);
-		eti_attach_cell_views (eti);
-	}
-
-	if (E_IS_TABLE_SUBSET(table_model)) {
-		eti->uses_source_model = 1;
-		eti->source_model = E_TABLE_SUBSET(table_model)->source;
-		if (eti->source_model)
-			g_object_ref(eti->source_model);
-	}
-
-	eti_freeze (eti);
-	
-	eti_table_model_changed (table_model, eti);
-}
-
-static void
-eti_add_selection_model (ETableItem *eti, ESelectionModel *selection)
-{
-	g_assert (eti->selection == NULL);
-	
-	eti->selection = selection;
-	g_object_ref (eti->selection);
-
-	eti->selection_change_id = g_signal_connect (
-		selection, "selection_changed",
-		G_CALLBACK (eti_selection_change), eti);
-
-	eti->selection_row_change_id = g_signal_connect (
-		selection, "selection_row_changed",
-		G_CALLBACK (eti_selection_row_change), eti);
-
-	eti->cursor_change_id = g_signal_connect (
-		selection, "cursor_changed",
-		G_CALLBACK (eti_cursor_change), eti);
-
-	eti->cursor_activated_id = g_signal_connect (
-		selection, "cursor_activated",
-		G_CALLBACK (eti_cursor_activated), eti);
-
-	eti_selection_change(selection, eti);
-        g_signal_emit_by_name (G_OBJECT(eti),
-                               "selection_model_added", eti->selection);
-}
-
-static void
-eti_header_dim_changed (ETableHeader *eth, int col, ETableItem *eti)
-{
-	eti->needs_compute_width = 1;
-	e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
-	eti->needs_redraw = 1;
-	gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-}
-
-static void
-eti_header_structure_changed (ETableHeader *eth, ETableItem *eti)
-{
-	eti->cols = e_table_header_count (eti->header);
-
-	/*
-	 * There should be at least one column
-	 *  BUT: then you can't remove all columns from a header and add new ones.
-	 */
-	/*g_assert (eti->cols != 0);*/
-
-	if (eti->cell_views){
-		eti_unrealize_cell_views (eti);
-		eti_detach_cell_views (eti);
-		eti_attach_cell_views (eti);
-		eti_realize_cell_views (eti);
-	} else {
-		if (eti->table_model) {
-			eti_attach_cell_views (eti);
-			eti_realize_cell_views (eti);
-		}
-	}
-	eti->needs_compute_width = 1;
-	e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
-	eti->needs_redraw = 1;
-	gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-}
-
-static int
-eti_request_column_width (ETableHeader *eth, int col, ETableItem *eti)
-{
-	int width = 0;
-	
-	if (eti->cell_views && eti->cell_views_realized) {
-		width = e_cell_max_width (eti->cell_views[col], view_to_model_col(eti, col), col);
-	}
-
-	return width;
-}
-
-static void
-eti_add_header_model (ETableItem *eti, ETableHeader *header)
-{
-	g_assert (eti->header == NULL);
-	
-	eti->header = header;
-	g_object_ref (header);
-
-	eti_header_structure_changed (header, eti);
-	
-	eti->header_dim_change_id = g_signal_connect (
-		G_OBJECT (header), "dimension_change",
-		G_CALLBACK (eti_header_dim_changed), eti);
-
-	eti->header_structure_change_id = g_signal_connect (
-		G_OBJECT (header), "structure_change",
-		G_CALLBACK (eti_header_structure_changed), eti);
-
-	eti->header_request_width_id = g_signal_connect 
-		(G_OBJECT (header), "request_width",
-		 G_CALLBACK (eti_request_column_width), eti);
-}
-
-/*
- * GObject::dispose method
- */
-static void
-eti_dispose (GObject *object)
-{
-	ETableItem *eti = E_TABLE_ITEM (object);
-
-	eti_remove_header_model (eti);
-	eti_remove_table_model (eti);
-	eti_remove_selection_model (eti);
-
-	if (eti->height_cache_idle_id) {
-		g_source_remove(eti->height_cache_idle_id);
-		eti->height_cache_idle_id = 0;
-	}
-	eti->height_cache_idle_count = 0;
-
-	if (eti->cursor_idle_id) {
-		g_source_remove(eti->cursor_idle_id);
-		eti->cursor_idle_id = 0;
-	}
-
-	if (eti->height_cache)
-		g_free (eti->height_cache);
-	eti->height_cache = NULL;
-
-	e_canvas_hide_tooltip (E_CANVAS(GNOME_CANVAS_ITEM(eti)->canvas));
-	if (eti->tooltip) {
-		if (eti->tooltip->background)
-			gdk_color_free (eti->tooltip->background);
-		eti->tooltip->background = NULL;
-
-		if (eti->tooltip->foreground)
-			gdk_color_free (eti->tooltip->foreground);
-		eti->tooltip->foreground = NULL;
-
-		if (eti->tooltip->timer) {
-			gtk_timeout_remove (eti->tooltip->timer);
-			eti->tooltip->timer = 0;
-		}
-		g_free (eti->tooltip);
-		eti->tooltip = NULL;
-	}
-
-	if (G_OBJECT_CLASS (eti_parent_class)->dispose)
-		(*G_OBJECT_CLASS (eti_parent_class)->dispose) (object);
-}
-
-static void
-eti_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
-	GnomeCanvasItem *item;
-	ETableItem *eti;
-	int cursor_col;
-
-	item = GNOME_CANVAS_ITEM (object);
-	eti = E_TABLE_ITEM (object);
-
-	switch (prop_id){
-	case PROP_TABLE_HEADER:
-		eti_remove_header_model (eti);
-		eti_add_header_model (eti, E_TABLE_HEADER(g_value_get_object (value)));
-		break;
-
-	case PROP_TABLE_MODEL:
-		eti_remove_table_model (eti);
-		eti_add_table_model (eti, E_TABLE_MODEL(g_value_get_object (value)));
-		break;
-		
-	case PROP_SELECTION_MODEL:
-		g_signal_emit_by_name (G_OBJECT(eti),
-				       "selection_model_removed", eti->selection);
-		eti_remove_selection_model (eti);
-		if (g_value_get_object (value))
-			eti_add_selection_model (eti, E_SELECTION_MODEL(g_value_get_object(value)));
-		break;
-		
-	case PROP_LENGTH_THRESHOLD:
-		eti->length_threshold = g_value_get_int (value);
-		break;
-
-	case PROP_TABLE_ALTERNATING_ROW_COLORS:
-		eti->alternating_row_colors = g_value_get_boolean (value);
-		break;
-
-	case PROP_TABLE_HORIZONTAL_DRAW_GRID:
-		eti->horizontal_draw_grid = g_value_get_boolean (value);
-		break;
-
-	case PROP_TABLE_VERTICAL_DRAW_GRID:
-		eti->vertical_draw_grid = g_value_get_boolean (value);
-		break;
-
-	case PROP_TABLE_DRAW_FOCUS:
-		eti->draw_focus = g_value_get_boolean (value);
-		break;
-
-	case PROP_CURSOR_MODE:
-		eti->cursor_mode = g_value_get_int (value);
-		break;
-
-	case PROP_MINIMUM_WIDTH:
-	case PROP_WIDTH:
-		if ((eti->minimum_width == eti->width && g_value_get_double(value) > eti->width) ||
-		    g_value_get_double(value) < eti->width) {
-			eti->needs_compute_width = 1;
-			e_canvas_item_request_reflow (GNOME_CANVAS_ITEM(eti));
-		}
-		eti->minimum_width = g_value_get_double (value);
-		break;
-	case PROP_CURSOR_ROW:
-		g_object_get(eti->selection,
-			     "cursor_col", &cursor_col,
-			     NULL);
-
-		e_table_item_focus (eti, cursor_col != -1 ? cursor_col : 0, view_to_model_row(eti, g_value_get_int (value)), 0);
-		break;
-	case PROP_UNIFORM_ROW_HEIGHT:
-		if (eti->uniform_row_height != g_value_get_boolean (value)) {
-			eti->uniform_row_height = g_value_get_boolean (value);
-			if (GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED) {
-				free_height_cache(eti);
-				eti->needs_compute_height = 1;
-				e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
-				eti->needs_redraw = 1;
-				gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-			}
-		}
-		break;
-	}
-	eti->needs_redraw = 1;
-	gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(eti));
-}
-
-static void
-eti_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
-	GnomeCanvasItem *item;
-	ETableItem *eti;
-	int row;
-
-	item = GNOME_CANVAS_ITEM (object);
-	eti = E_TABLE_ITEM (object);
-
-	switch (prop_id){
-	case PROP_WIDTH:
-		g_value_set_double (value, eti->width);
-		break;
-	case PROP_HEIGHT:
-		g_value_set_double (value, eti->height);
-		break;
-	case PROP_MINIMUM_WIDTH:
-		g_value_set_double (value, eti->minimum_width);
-		break;
-	case PROP_CURSOR_ROW:
-		g_object_get(eti->selection,
-			     "cursor_row", &row,
-			     NULL);
-		g_value_set_int (value, model_to_view_row(eti, row));
-		break;
-	case PROP_UNIFORM_ROW_HEIGHT:
-		g_value_set_boolean (value, eti->uniform_row_height);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-eti_init (GnomeCanvasItem *item)
-{
-	ETableItem *eti = E_TABLE_ITEM (item);
-
-	eti->motion_row 	       = -1;
-	eti->motion_col 	       = -1;
-	eti->editing_col               = -1;
-	eti->editing_row               = -1;
-	eti->height                    = 0;
-	eti->width                     = 0;
-	eti->minimum_width             = 0;
-
-	eti->save_col                  = -1;
-	eti->save_row                  = -1;
-	eti->save_state                = NULL;
-
-	eti->click_count               = 0;
-
-	eti->height_cache              = NULL;
-	eti->height_cache_idle_id      = 0;
-	eti->height_cache_idle_count   = 0;
-	
-	eti->length_threshold          = -1;
-	eti->uniform_row_height        = FALSE;
-
-	eti->uses_source_model         = 0;
-	eti->source_model              = NULL;
-	
-	eti->row_guess                 = -1;
-	eti->cursor_mode               = E_CURSOR_SIMPLE;
-
-	eti->selection_change_id       = 0;
-	eti->selection_row_change_id   = 0;
-	eti->cursor_change_id          = 0;
-	eti->cursor_activated_id       = 0;
-	eti->selection                 = NULL;
-
-	eti->old_cursor_row            = -1;
-
-	eti->needs_redraw              = 0;
-	eti->needs_compute_height      = 0;
-
-	eti->in_key_press              = 0;
-
-	eti->tooltip                   = g_new0 (ETableTooltip, 1);
-	eti->tooltip->timer            = 0;
-	eti->tooltip->eti              = GNOME_CANVAS_ITEM (eti);
-	eti->tooltip->background       = NULL;
-	eti->tooltip->foreground       = NULL;
-
-	eti->maybe_did_something       = TRUE;
-
-	eti->grabbed_count             = 0;
-	eti->gtk_grabbed               = 0;
-
-	eti->in_drag                   = 0;
-	eti->maybe_in_drag             = 0;
-	eti->grabbed                   = 0;
-
-	eti->grabbed_col               = -1;
-	eti->grabbed_row               = -1;
-
-	eti->cursor_on_screen          = FALSE;
- 	eti->cursor_x1                 = -1;
-	eti->cursor_y1                 = -1;
-	eti->cursor_x2                 = -1;
-	eti->cursor_y2                 = -1;
-
-	eti->rows                      = -1;
-	eti->cols                      = -1;
-
-	eti->frozen_count              = 0;
-	eti->queue_show_cursor         = FALSE;
-
-	e_canvas_item_set_reflow_callback (GNOME_CANVAS_ITEM (eti), eti_reflow);
-}
-
-#define gray50_width 2
-#define gray50_height 2
-static const char gray50_bits[] = {
-	0x02, 0x01, };
-
-static void
-adjustment_changed (GtkAdjustment *adjustment, ETableItem *eti)
-{
-	eti_check_cursor_on_screen (eti);
-}
-
-static void
-eti_realize (GnomeCanvasItem *item)
-{
-	ETableItem *eti = E_TABLE_ITEM (item);
-	GtkWidget *canvas_widget = GTK_WIDGET (item->canvas);
-	GdkWindow *window;
-	
-	if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->realize)
-                (*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->realize)(item);
-
-
-	eti->rows = e_table_model_row_count (eti->table_model);
-
-	/*
-	 * Gdk Resource allocation
-	 */
-	window = canvas_widget->window;
-
-	eti->fill_gc = gdk_gc_new (window);
-
-	eti->grid_gc = gdk_gc_new (window);
-	gdk_gc_set_foreground (eti->grid_gc, &canvas_widget->style->dark [GTK_STATE_NORMAL]);
-	eti->focus_gc = gdk_gc_new (window);
-	gdk_gc_set_foreground (eti->focus_gc, &canvas_widget->style->bg [GTK_STATE_NORMAL]);
-	gdk_gc_set_background (eti->focus_gc, &canvas_widget->style->fg [GTK_STATE_NORMAL]);
-	eti->stipple = gdk_bitmap_create_from_data (NULL, gray50_bits, gray50_width, gray50_height);
-	gdk_gc_set_ts_origin (eti->focus_gc, 0, 0);
-	gdk_gc_set_stipple (eti->focus_gc, eti->stipple);
-	gdk_gc_set_fill (eti->focus_gc, GDK_OPAQUE_STIPPLED);
-
-	eti->hadjustment_change_id =
-		g_signal_connect (gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas)), "changed",
-				  G_CALLBACK (adjustment_changed), eti);
-	eti->hadjustment_value_change_id =
-		g_signal_connect (gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas)), "value_changed",
-				  G_CALLBACK (adjustment_changed), eti);
-	eti->vadjustment_change_id =
-		g_signal_connect (gtk_layout_get_vadjustment(GTK_LAYOUT(item->canvas)), "changed",
-				  G_CALLBACK (adjustment_changed), eti);
-	eti->vadjustment_value_change_id =
-		g_signal_connect (gtk_layout_get_vadjustment(GTK_LAYOUT(item->canvas)), "value_changed",
-				  G_CALLBACK (adjustment_changed), eti);
-
-	if (eti->cell_views == NULL)
-		eti_attach_cell_views (eti);
-	
-	eti_realize_cell_views (eti);
-
-	free_height_cache(eti);
-
-	if (item->canvas->focused_item == NULL && eti->selection) {
-		int row;
-
-		row = e_selection_model_cursor_row (E_SELECTION_MODEL (eti->selection));
-		row = model_to_view_row(eti, row);
-		if (row != -1) {
-			e_canvas_item_grab_focus (item, FALSE);
-			eti_show_cursor (eti, 0);
-			eti_check_cursor_bounds (eti);
-		}
-	}
-
-	eti->needs_compute_height = 1;
-	eti->needs_compute_width = 1;
-	e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
-	eti->needs_redraw = 1;
-	gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-}
-
-static void
-eti_unrealize (GnomeCanvasItem *item)
-{
-	ETableItem *eti = E_TABLE_ITEM (item);
-
-	if (eti->grabbed_count > 0) {
-		d(g_print ("%s: eti_ungrab\n", __FUNCTION__));
-		eti_ungrab (eti, -1);
-	}
-
-	if (eti_editing (eti))
-		e_table_item_leave_edit_(eti);
-
-	if (eti->height_cache_idle_id) {
-		g_source_remove(eti->height_cache_idle_id);
-		eti->height_cache_idle_id = 0;
-	}
-
-	if (eti->height_cache)
-		g_free (eti->height_cache);
-	eti->height_cache = NULL;
-	eti->height_cache_idle_count = 0;
-
-	e_canvas_hide_tooltip (E_CANVAS(GNOME_CANVAS_ITEM(eti)->canvas));
-	if (eti->tooltip) {
-		if (eti->tooltip->background) {
-			gdk_color_free (eti->tooltip->background);
-			eti->tooltip->background = NULL;
-		}
-		if (eti->tooltip->foreground) {
-			gdk_color_free (eti->tooltip->foreground);
-			eti->tooltip->foreground = NULL;
-		}
-		if (eti->tooltip->timer) {
-			gtk_timeout_remove (eti->tooltip->timer);
-			eti->tooltip->timer = 0;
-		}
-	}
-
-	gdk_gc_unref (eti->fill_gc);
-	eti->fill_gc = NULL;
-	gdk_gc_unref (eti->grid_gc);
-	eti->grid_gc = NULL;
-	gdk_gc_unref (eti->focus_gc);
-	eti->focus_gc = NULL;
-	gdk_bitmap_unref (eti->stipple);
-	eti->stipple = NULL;
-
-	eti_unrealize_cell_views (eti);
-
-	eti->height = 0;
-
-	g_signal_handler_disconnect(gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas)),
-				    eti->hadjustment_change_id);
-	g_signal_handler_disconnect(gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas)),
-				    eti->hadjustment_value_change_id);
-	g_signal_handler_disconnect(gtk_layout_get_vadjustment(GTK_LAYOUT(item->canvas)),
-				    eti->vadjustment_change_id);
-	g_signal_handler_disconnect(gtk_layout_get_vadjustment(GTK_LAYOUT(item->canvas)),
-				    eti->vadjustment_value_change_id);
-
-	if (GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->unrealize)
-                (*GNOME_CANVAS_ITEM_CLASS (eti_parent_class)->unrealize)(item);
-}
-
-
-
-static void
-eti_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height)
-{
-	ETableItem *eti = E_TABLE_ITEM (item);
-	const int rows = eti->rows;
-	const int cols = eti->cols;
-	int row, col;
-	int first_col, last_col, x_offset;
-	int first_row, last_row, y_offset, yd;
-	int x1, x2;
-	int f_x1, f_x2, f_y1, f_y2;
-	gboolean f_found;
-	double i2c [6];
-	ArtPoint eti_base, eti_base_item, lower_right;
-	GtkWidget *canvas = GTK_WIDGET(item->canvas);
-	int height_extra = eti->horizontal_draw_grid ? 1 : 0;
-
-	/*
-	 * Find out our real position after grouping
-	 */
-	gnome_canvas_item_i2c_affine (item, i2c);
-	eti_base_item.x = eti->x1;
-	eti_base_item.y = eti->y1;
-	art_affine_point (&eti_base, &eti_base_item, i2c);
-
-	eti_base_item.x = eti->x1 + eti->width;
-	eti_base_item.y = eti->y1 + eti->height;
-	art_affine_point (&lower_right, &eti_base_item, i2c);
-
-	/*
-	 * First column to draw, last column to draw
-	 */
-	first_col = -1;
-	last_col = x_offset = 0;
-	x1 = x2 = floor (eti_base.x);
-	for (col = 0; col < cols; col++, x1 = x2){
-		ETableCol *ecol = e_table_header_get_column (eti->header, col);
-
-		x2 = x1 + ecol->width;
-
-		if (x1 > (x + width))
-			break;
-		if (x2 < x)
-			continue;
-		if (first_col == -1){
-			x_offset = x1 - x;
-			first_col = col;
-		}
-	}
-	last_col = col;
-
-	/*
-	 * Nothing to paint
-	 */
-	if (first_col == -1)
-		return;
-
-	/*
-	 * Compute row span.
-	 */
-	if (eti->uniform_row_height) {
-		first_row = (y          - floor (eti_base.y) - height_extra) / (eti_row_height (eti, -1) + height_extra);
-		last_row  = (y + height - floor (eti_base.y)               ) / (eti_row_height (eti, -1) + height_extra) + 1;
-		if (first_row > last_row)
-			return;
-		y_offset = floor (eti_base.y) - y + height_extra + first_row * (eti_row_height (eti, -1) + height_extra);
-		if (first_row < 0)
-			first_row = 0;
-		if (last_row > eti->rows)
-			last_row = eti->rows;
-	} else {
-		int y1, y2;
-
-		y_offset = 0;
-		first_row = -1;
-
-		y1 = y2 = floor (eti_base.y) + height_extra;
-		for (row = 0; row < rows; row++, y1 = y2){
-
-			y2 += ETI_ROW_HEIGHT (eti, row) + height_extra;
-
-			if (y1 > y + height)
-				break;
-
-			if (y2 < y)
-				continue;
-
-			if (first_row == -1){
-				y_offset = y1 - y;
-				first_row = row;
-			}
-		}
-		last_row = row;
-
-		if (first_row == -1)
-			return;
-	}
-
-	if (first_row == -1)
-		return;
-
-	/*
-	 * Draw cells
-	 */
-	yd = y_offset;
-	f_x1 = f_x2 = f_y1 = f_y2 = -1;
-	f_found = FALSE;
-
-	if (eti->horizontal_draw_grid && first_row == 0){
-		gdk_draw_line (
-			drawable, eti->grid_gc,
-				eti_base.x - x, yd, eti_base.x + eti->width - x, yd);
-	}
-
-	yd += height_extra;
-	
-	for (row = first_row; row < last_row; row++){
-		int xd, height;
-		gboolean selected;
-		gint cursor_col, cursor_row;
-		
-		height = ETI_ROW_HEIGHT (eti, row);
-
-		xd = x_offset;
-/*		printf ("paint: %d %d\n", yd, yd + height); */
-		
-		selected = e_selection_model_is_row_selected(E_SELECTION_MODEL (eti->selection), view_to_model_row(eti,row));
-		
-		g_object_get(eti->selection,
-			     "cursor_col", &cursor_col,
-			     "cursor_row", &cursor_row,
-			     NULL);
-		
-		for (col = first_col; col < last_col; col++){
-			ETableCol *ecol = e_table_header_get_column (eti->header, col);
-			ECellView *ecell_view = eti->cell_views [col];
-			gboolean col_selected = selected;
-			gboolean cursor = FALSE;
-			ECellFlags flags;
-			gboolean free_background;
-			GdkColor *background;
-
-			switch (eti->cursor_mode) {
-			case E_CURSOR_SIMPLE:
-			case E_CURSOR_SPREADSHEET:
-				if (cursor_col == ecol->col_idx && cursor_row == view_to_model_row(eti, row)) {
-					col_selected = !col_selected;
-					cursor = TRUE;
-				}
-				break;
-			case E_CURSOR_LINE:
-				/* Nothing */
-				break;
-			}
-
-			background = eti_get_cell_background_color (eti, row, col, col_selected, &free_background);
-
-			gdk_gc_set_foreground (eti->fill_gc, background);
-			gdk_draw_rectangle (drawable, eti->fill_gc, TRUE,
-					    xd, yd, ecol->width, height);
-
-			if (free_background)
-				gdk_color_free (background);
-
-			flags = col_selected ? E_CELL_SELECTED : 0;
-			flags |= GTK_WIDGET_HAS_FOCUS(canvas) ? E_CELL_FOCUSED : 0;
-			flags |= cursor ? E_CELL_CURSOR : 0;
-
-			switch (ecol->justification) {
-			case GTK_JUSTIFY_LEFT:
-				flags |= E_CELL_JUSTIFY_LEFT;
-				break;
-			case GTK_JUSTIFY_RIGHT:
-				flags |= E_CELL_JUSTIFY_RIGHT;
-				break;
-			case GTK_JUSTIFY_CENTER:
-				flags |= E_CELL_JUSTIFY_CENTER;
-				break;
-			case GTK_JUSTIFY_FILL:
-				flags |= E_CELL_JUSTIFY_FILL;
-				break;
-			}
-
-			e_cell_draw (ecell_view, drawable, ecol->col_idx, col, row, flags,
-				     xd, yd, xd + ecol->width, yd + height);
-			
-			if (!f_found) {
-				switch (eti->cursor_mode) {
-				case E_CURSOR_LINE:
-					if (view_to_model_row(eti, row) == cursor_row) {
-						f_x1 = floor (eti_base.x) - x;
-						f_x2 = floor (lower_right.x) - x;
-						f_y1 = yd;
-						f_y2 = yd + height;
-						f_found = TRUE;
-					}
-					break;
-				case E_CURSOR_SIMPLE:
-				case E_CURSOR_SPREADSHEET:
-					if (view_to_model_col(eti, col) == cursor_col && view_to_model_row(eti, row) == cursor_row) {
-						f_x1 = xd;
-						f_x2 = xd + ecol->width;
-						f_y1 = yd;
-						f_y2 = yd + height;
-						f_found = TRUE;
-					}
-					break;
-				}
-			}
-
-			xd += ecol->width;
-		}
-		yd += height;
-
-		if (eti->horizontal_draw_grid) {
-			gdk_draw_line (
-				drawable, eti->grid_gc,
-				eti_base.x - x, yd, eti_base.x + eti->width - x, yd);
-
-			yd++;
-		}
-	}
-
-	if (eti->vertical_draw_grid){
-		int xd = x_offset;
-		
-		for (col = first_col; col <= last_col; col++){
-			ETableCol *ecol = e_table_header_get_column (eti->header, col);
-
-			gdk_draw_line (
-				drawable, eti->grid_gc,
-				xd, y_offset, xd, yd - 1);
-
-			/*
-			 * This looks wierd, but it is to draw the last line
-			 */
-			if (ecol)
-				xd += ecol->width;
-		}
-	}
-	
-	/*
-	 * Draw focus
-	 */
-	if (eti->draw_focus && f_found) {
-		gdk_gc_set_ts_origin (eti->focus_gc, f_x1, f_y1);
-		gdk_draw_rectangle (drawable, eti->focus_gc, FALSE,
-				    f_x1, f_y1, f_x2 - f_x1 - 1, f_y2 - f_y1 - 1);
-	}
-}
-
-static double
-eti_point (GnomeCanvasItem *item, double x, double y, int cx, int cy,
-	   GnomeCanvasItem **actual_item)
-{
-	*actual_item = item;
-
-	return 0.0;
-}
-
-static gboolean
-find_cell (ETableItem *eti, double x, double y, int *view_col_res, int *view_row_res, double *x1_res, double *y1_res)
-{
-	const int cols = eti->cols;
-	const int rows = eti->rows;
-	gdouble x1, y1, x2, y2;
-	int col, row;
-
-	int height_extra = eti->horizontal_draw_grid ? 1 : 0;
-	
-	/* FIXME: this routine is inneficient, fix later */
-
-	if (eti->grabbed_col >= 0 && eti->grabbed_row >= 0) {
-		*view_col_res = eti->grabbed_col;
-		*view_row_res = eti->grabbed_row;
-		*x1_res = x - eti->x1 - e_table_header_col_diff (eti->header, 0, eti->grabbed_col);
-		*y1_res = y - eti->y1 - e_table_item_row_diff (eti, 0, eti->grabbed_row);
-		return TRUE;
-	}
-	
-	if (cols == 0 || rows == 0)
-		return FALSE;
-
-	x -= eti->x1;
-	y -= eti->y1;
-	
-	x1 = 0;
-	for (col = 0; col < cols - 1; col++, x1 = x2){
-		ETableCol *ecol = e_table_header_get_column (eti->header, col);
-
-		if (x < x1)
-			return FALSE;
-		
-		x2 = x1 + ecol->width;
-
-		if (x <= x2)
-			break;
-	}
-
-	if (eti->uniform_row_height) {
-		if (y < height_extra)
-			return FALSE;
-		row = (y - height_extra) / (eti_row_height (eti, -1) + height_extra);
-		y1 = row * (eti_row_height (eti, -1) + height_extra) + height_extra;
-		if (row >= eti->rows)
-			return FALSE;
-	} else {
-		y1 = y2 = height_extra;
-		if (y < height_extra) 
-			return FALSE;
-		for (row = 0; row < rows - 1; row++, y1 = y2){
-			y2 += ETI_ROW_HEIGHT (eti, row) + height_extra;
-
-			if (y <= y2)
-				break;
-		}
-	}
-	*view_col_res = col;
-	if (x1_res)
-		*x1_res = x - x1;
-	*view_row_res = row;
-	if (y1_res)
-		*y1_res = y - y1;
-	return TRUE;
-}
-
-static void
-eti_cursor_move (ETableItem *eti, gint row, gint column)
-{
-	e_table_item_leave_edit_(eti);
-	e_table_item_focus (eti, view_to_model_col(eti, column), view_to_model_row(eti, row), 0);
-}
-
-static void
-eti_cursor_move_left (ETableItem *eti)
-{
-	int cursor_col, cursor_row;
-	g_object_get(eti->selection,
-		     "cursor_col", &cursor_col,
-		     "cursor_row", &cursor_row,
-		     NULL);
-
-	eti_cursor_move (eti, model_to_view_row(eti, cursor_row), model_to_view_col(eti, cursor_col) - 1);
-}
-
-static void
-eti_cursor_move_right (ETableItem *eti)
-{
-	int cursor_col, cursor_row;
-	g_object_get(eti->selection,
-		     "cursor_col", &cursor_col,
-		     "cursor_row", &cursor_row,
-		     NULL);
-
-	eti_cursor_move (eti, model_to_view_row(eti, cursor_row), model_to_view_col(eti, cursor_col) + 1);
-}
-
-#ifdef DO_TOOLTIPS
-static int
-_do_tooltip (ETableItem *eti)
-{
-	ECellView *ecell_view;
-	gboolean free_color;
-	ETableCol *ecol;
-	gboolean selected;
-	int cursor_row, cursor_col;
-
-	e_canvas_hide_tooltip (E_CANVAS(GNOME_CANVAS_ITEM(eti)->canvas));
-
-	if (eti_editing (eti))
-		return FALSE;
-
-	ecell_view = eti->cell_views[eti->tooltip->col];
-
-	eti->tooltip->x = e_table_header_col_diff (eti->header, 0, eti->tooltip->col);
-
-	eti->tooltip->y = e_table_item_row_diff (eti, 0, eti->tooltip->row);
-	eti->tooltip->row_height = ETI_ROW_HEIGHT (eti, eti->tooltip->row);
-
-	selected = e_selection_model_is_row_selected(E_SELECTION_MODEL (eti->selection), view_to_model_row(eti,eti->tooltip->row));
-
-	if (eti->tooltip->foreground)
-		gdk_color_free (eti->tooltip->foreground);
-	if (eti->tooltip->background)
-		gdk_color_free (eti->tooltip->background);
-
-	switch (eti->cursor_mode) {
-	case E_CURSOR_SIMPLE:
-	case E_CURSOR_SPREADSHEET:
-		ecol = e_table_header_get_column (eti->header, eti->tooltip->col);
-
-		g_object_get(eti->selection,
-			     "cursor_row", &cursor_row,
-			     "cursor_col", &cursor_col,
-			     NULL);
-
-		if (cursor_col == ecol->col_idx && cursor_row == view_to_model_row(eti, eti->tooltip->row))
-			selected = !selected;
-		break;
-	case E_CURSOR_LINE:
-				/* Nothing */
-		break;
-	}
-
-	eti->tooltip->background = eti_get_cell_background_color (eti, eti->tooltip->row, eti->tooltip->col, selected, &free_color);
-	if (!free_color)
-		eti->tooltip->background = gdk_color_copy(eti->tooltip->background);
-
-	eti->tooltip->foreground = eti_get_cell_foreground_color (eti, eti->tooltip->row, eti->tooltip->col, selected, &free_color);
-	if (!free_color)
-		eti->tooltip->foreground = gdk_color_copy(eti->tooltip->foreground);
-
-	e_cell_show_tooltip (ecell_view, 
-			     view_to_model_col (eti, eti->tooltip->col),
-			     eti->tooltip->col,
-			     eti->tooltip->row,
-			     eti->header->columns[eti->tooltip->col]->width,
-			     eti->tooltip);
-	return FALSE;
-}
-#endif
-
-static gint
-eti_e_cell_event     (ETableItem *item, ECellView *ecell_view, GdkEvent *event, int time, int model_col, int view_col, int row, ECellFlags flags)
-{
-	ECellActions actions = 0;
-	gint ret_val;
-
-	ret_val = e_cell_event (ecell_view, event, model_col, view_col, row, flags, &actions);
-
-	if (actions & E_CELL_GRAB) {
-		d(g_print ("%s: eti_grab\n", __FUNCTION__));
-		eti_grab (item, time);
-		item->grabbed_col = view_col;
-		item->grabbed_row = row;
-	}
-
-	if (actions & E_CELL_UNGRAB) {
-		d(g_print ("%s: eti_ungrab\n", __FUNCTION__));
-		eti_ungrab (item, time);
-		item->grabbed_col = -1;
-		item->grabbed_row = -1;
-	}
-
-	return ret_val;
-}
-
-/* FIXME: cursor */
-static int
-eti_event (GnomeCanvasItem *item, GdkEvent *e)
-{
-	ETableItem *eti = E_TABLE_ITEM (item);
-	ECellView *ecell_view;
-	gint return_val = TRUE;
-#if d(!)0
-	gboolean leave = FALSE;
-#endif
-
-	if (!eti->header)
-		return FALSE;
-
-	switch (e->type){
-	case GDK_BUTTON_PRESS: {
-		double x1, y1;
-		double realx, realy;
-		GdkEventButton button;
-		int col, row;
-		gint cursor_row, cursor_col;
-		gint new_cursor_row, new_cursor_col;
-		ECellFlags flags = 0;
-
-		d(g_print("%s: GDK_BUTTON_PRESS received, button %d\n", __FUNCTION__, e->button.button));
-
-		if (eti->tooltip->timer) {
-			gtk_timeout_remove (eti->tooltip->timer);
-			eti->tooltip->timer = 0;
-		}
-
-		switch (e->button.button) {
-		case 1: /* Fall through. */
-		case 2:
-			e_canvas_item_grab_focus(GNOME_CANVAS_ITEM(eti), TRUE);
-			gnome_canvas_item_w2i (item, &e->button.x, &e->button.y);
-
-			realx = e->button.x;
-			realy = e->button.y;
-
-			if (!find_cell (eti, realx, realy, &col, &row, &x1, &y1)) {
-				if (eti_editing (eti))
-					e_table_item_leave_edit_(eti);
-				return TRUE;
-			}
-
-			ecell_view = eti->cell_views [col];
-			button = *(GdkEventButton *)e;
-			button.x = x1;
-			button.y = y1;
-
-			g_object_get(eti->selection,
-				     "cursor_row", &cursor_row,
-				     "cursor_col", &cursor_col,
-				     NULL);
-
-			if (cursor_col == view_to_model_col (eti, col) && cursor_row == view_to_model_row(eti, row)) {
-				flags = E_CELL_CURSOR;
-			} else {
-				flags = 0;
-			}
-
-			return_val = eti_e_cell_event (eti, ecell_view, (GdkEvent *) &button, button.time, view_to_model_col(eti, col), col, row, flags);
-			if (return_val)
-				return TRUE;
-
-			g_signal_emit (eti, eti_signals [CLICK], 0,
-				       row, view_to_model_col(eti, col), &button, &return_val);
-
-			if (return_val) {
-				eti->click_count = 0;
-				return TRUE;
-			}
-
-			g_object_get(eti->selection,
-				     "cursor_row", &cursor_row,
-				     "cursor_col", &cursor_col,
-				     NULL);
-
-			eti->maybe_did_something = 
-				e_selection_model_maybe_do_something(E_SELECTION_MODEL (eti->selection), view_to_model_row(eti, row), view_to_model_col(eti, col), button.state);
-			g_object_get(eti->selection,
-				     "cursor_row", &new_cursor_row,
-				     "cursor_col", &new_cursor_col,
-				     NULL);
-
-			if (cursor_row != new_cursor_row || cursor_col != new_cursor_col) {
-				eti->click_count = 1;
-			} else {
-				eti->click_count ++;
-				eti->row_guess = row;
-
-				if ((!eti_editing(eti)) && e_table_model_is_cell_editable(eti->table_model, cursor_col, row)) {
-					e_table_item_enter_edit (eti, col, row);
-				}
-
-				/*
-				 * Adjust the event positions
-				 */
-
-				if (eti_editing (eti)) {
-					return_val = eti_e_cell_event (eti, ecell_view, (GdkEvent *) &button, button.time, 
-								       view_to_model_col(eti, col), col, row, E_CELL_EDITING | E_CELL_CURSOR);
-					if (return_val)
-						return TRUE;
-				}
-			}
-
-			if (e->button.button == 1) {
-				return_val = TRUE;
-
-				eti->maybe_in_drag = TRUE;
-				eti->drag_row      = new_cursor_row;
-				eti->drag_col      = new_cursor_col;
-				eti->drag_x        = realx;
-				eti->drag_y        = realy;
-				eti->drag_state    = e->button.state;
-				eti->grabbed       = TRUE;
-				d(g_print ("%s: eti_grab\n", __FUNCTION__));
-				eti_grab (eti, e->button.time);
-			}
-
-			break;
-		case 3:
-			e_canvas_item_grab_focus(GNOME_CANVAS_ITEM(eti), TRUE);
-			gnome_canvas_item_w2i (item, &e->button.x, &e->button.y);
-			if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1))
-				return TRUE;
-
-			e_selection_model_right_click_down(E_SELECTION_MODEL (eti->selection), view_to_model_row(eti, row), view_to_model_col(eti, col), 0);
-
-			g_signal_emit (eti, eti_signals [RIGHT_CLICK], 0,
-				       row, view_to_model_col(eti, col), e, &return_val);
-			if (!return_val)
-				e_selection_model_right_click_up(E_SELECTION_MODEL (eti->selection));
-			break;
-		case 4:
-		case 5:
-			return FALSE;
-			break;
-			
-		}
-		break;
-	}
-
-	case GDK_BUTTON_RELEASE: {
-		double x1, y1;
-		int col, row;
-		gint cursor_row, cursor_col;
-
-		d(g_print("%s: GDK_BUTTON_RELEASE received, button %d\n", __FUNCTION__, e->button.button));
-
-		if (eti->grabbed_count > 0) {
-			d(g_print ("%s: eti_ungrab\n", __FUNCTION__));
-			eti_ungrab (eti, e->button.time);
-		}
-
-		if (e->button.button == 1) {
-			if (eti->maybe_in_drag) {
-				eti->maybe_in_drag = FALSE;
-				if (!eti->maybe_did_something)
-					e_selection_model_do_something(E_SELECTION_MODEL (eti->selection), eti->drag_row, eti->drag_col, eti->drag_state);
-			}
-			if (eti->in_drag) {
-				eti->in_drag = FALSE;
-			}
-		}
-
-		if (eti->tooltip->timer) {
-			gtk_timeout_remove (eti->tooltip->timer);
-			eti->tooltip->timer = 0;
-		}
-		e_canvas_hide_tooltip (E_CANVAS(GNOME_CANVAS_ITEM(eti)->canvas));
-		switch (e->button.button) {
-		case 1: /* Fall through. */
-		case 2:
-
-			gnome_canvas_item_w2i (item, &e->button.x, &e->button.y);
-#if d(!)0
-			{
-				gboolean cell_found = find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1);
-				g_print("%s: find_cell(%f, %f) = %s(%d, %d, %f, %f)\n", __FUNCTION__, e->button.x, e->button.y,
-					cell_found?"true":"false", col, row, x1, y1);
-			}
-#endif
-
-			if (!find_cell (eti, e->button.x, e->button.y, &col, &row, &x1, &y1))
-				return TRUE;
-
-			g_object_get(eti->selection,
-				     "cursor_row", &cursor_row,
-				     "cursor_col", &cursor_col,
-				     NULL);
-
-
-			d(g_print("%s: GDK_BUTTON_RELEASE received, button %d, line: %d\n"
-				  "eti_editing: %s, row:%d:%d, col:%d:%d\n", __FUNCTION__, e->button.button, __LINE__,
-				  eti_editing(eti)?"true":"false", cursor_row, view_to_model_row(eti, row), cursor_col, view_to_model_col(eti, col)));
-
-			if (eti_editing (eti) && cursor_row == view_to_model_row(eti, row) && cursor_col == view_to_model_col(eti, col)){
-
-				d(g_print("%s: GDK_BUTTON_RELEASE received, button %d, line: %d\n", __FUNCTION__, e->button.button, __LINE__))
-;
-
-				ecell_view = eti->cell_views [col];
-
-				/*
-				 * Adjust the event positions
-				 */
-				e->button.x = x1;
-				e->button.y = y1;
-
-				return_val = eti_e_cell_event (eti, ecell_view, e, e->button.time,
-							       view_to_model_col(eti, col), col, row, E_CELL_EDITING | E_CELL_CURSOR);
-			}
-			break;
-		case 3:
-			e_selection_model_right_click_up(E_SELECTION_MODEL (eti->selection));
-			return_val = TRUE;
-			break;
-		case 4:
-		case 5:
-			return FALSE;
-			break;
-			
-		}
-		break;
-	}
-
-	case GDK_2BUTTON_PRESS: {
-		int model_col, model_row;
-#if 0
-		double x1, y1;
-#endif
-
-		d(g_print("%s: GDK_2BUTTON_PRESS received, button %d\n", __FUNCTION__, e->button.button));
-
-		if (e->button.button == 5 ||
-		    e->button.button == 4)
-			return FALSE;
-
-		/*
-		 * click_count is so that if you click on two
-		 * different rows we don't send a double click signal.
-		 */
-
-		if (eti->click_count >= 2) {
-
-			gnome_canvas_item_w2i (item, &e->button.x, &e->button.y);
-
-#if 0
-			if (!find_cell (eti, e->button.x, e->button.y, &current_col, &current_row, &x1, &y1))
-				return TRUE;
-#endif
-
-			g_object_get(eti->selection,
-				     "cursor_row", &model_row,
-				     "cursor_col", &model_col,
-				     NULL);
-
-			e->button.x -= e_table_header_col_diff (eti->header, 0, model_to_view_col (eti, model_col));
-			e->button.y -= e_table_item_row_diff (eti, 0, model_to_view_row (eti, model_row));
-
-			if (e->button.button == 1) {
-				if (eti->maybe_in_drag) {
-					eti->maybe_in_drag = FALSE;
-					if (!eti->maybe_did_something)
-						e_selection_model_do_something(E_SELECTION_MODEL (eti->selection), eti->drag_row, eti->drag_col, eti->drag_state);
-				}
-				if (eti->in_drag) {
-					eti->in_drag = FALSE;
-				}
-				if (eti_editing (eti))
-					e_table_item_leave_edit_ (eti);
-
-			}
-
-			if (eti->grabbed_count > 0) {
-				d(g_print ("%s: eti_ungrab\n", __FUNCTION__));
-				eti_ungrab (eti, e->button.time);
-			}
-
-			if (model_row != -1 && model_col != -1) {
-				g_signal_emit (eti, eti_signals [DOUBLE_CLICK], 0,
-					       model_row, model_col, e);
-			}
-		}
-		break;
-	}
-	case GDK_MOTION_NOTIFY: {
-		int col, row, flags;
-		double x1, y1;
-		gint cursor_col, cursor_row;
-
-		gnome_canvas_item_w2i (item, &e->motion.x, &e->motion.y);
-
-		if (eti->maybe_in_drag) {
-			if (abs (e->motion.x - eti->drag_x) >= 3 ||
-			    abs (e->motion.y - eti->drag_y) >= 3) {
-				gint drag_handled;
-
-				eti->maybe_in_drag = 0;
-				g_signal_emit (eti, eti_signals [START_DRAG], 0,
-					       eti->drag_row, eti->drag_col, e, &drag_handled);
-				if (drag_handled)
-					eti->in_drag = 1;
-				else
-					eti->in_drag = 0;
-			}
-		}
-
-		if (!find_cell (eti, e->motion.x, e->motion.y, &col, &row, &x1, &y1))
-			return TRUE;
-
-		if (eti->motion_row != -1 && eti->motion_col != -1 &&
-		    (row != eti->motion_row || col != eti->motion_col)) {
-			GdkEvent *cross = gdk_event_new (GDK_LEAVE_NOTIFY);
-			cross->crossing.time = e->motion.time;
-			return_val = eti_e_cell_event (eti, eti->cell_views [eti->motion_col],
-						       cross, cross->crossing.time,
-					               view_to_model_col(eti, eti->motion_col), 
-						       eti->motion_col, eti->motion_row, 0);
-		}
-
-		eti->motion_row = row;
-		eti->motion_col = col;
-
-		g_object_get(eti->selection,
-			     "cursor_row", &cursor_row,
-			     "cursor_col", &cursor_col,
-			     NULL);
-
-		e_canvas_hide_tooltip (E_CANVAS(GNOME_CANVAS_ITEM(eti)->canvas));
-
-#ifdef DO_TOOLTIPS
-		if (!g_getenv ("GAL_DONT_DO_TOOLTIPS")) {
-			if (eti->tooltip->timer)
-				gtk_timeout_remove (eti->tooltip->timer);
-			eti->tooltip->col = col;
-			eti->tooltip->row = row;
-			eti->tooltip->cx = e->motion.x;
-			eti->tooltip->cy = e->motion.y;
-			eti->tooltip->timer = gtk_timeout_add (100, (GSourceFunc)_do_tooltip, eti);
-		}
-#endif
-
-		flags = 0;
-		if (cursor_row == view_to_model_row(eti, row) && cursor_col == view_to_model_col(eti, col)){
-			flags = E_CELL_EDITING | E_CELL_CURSOR;
-		}
-
-		ecell_view = eti->cell_views [col];
-
-		/*
-		 * Adjust the event positions
-		 */
-		e->motion.x = x1;
-		e->motion.y = y1;
-
-		return_val = eti_e_cell_event (eti, ecell_view, e, e->motion.time,
-					       view_to_model_col(eti, col), col, row, flags);
-		break;
-	}
-
-	case GDK_KEY_PRESS: {
-		gint cursor_row, cursor_col;
-		gint handled = TRUE;
-
-		d(g_print("%s: GDK_KEY_PRESS received, keyval: %d\n", __FUNCTION__, (int) e->key.keyval));
-
-		g_object_get(eti->selection,
-			     "cursor_row", &cursor_row,
-			     "cursor_col", &cursor_col,
-			     NULL);
-
-		if (eti->tooltip->timer) {
-			gtk_timeout_remove (eti->tooltip->timer);
-			eti->tooltip->timer = 0;
-		}
-		e_canvas_hide_tooltip (E_CANVAS(GNOME_CANVAS_ITEM(eti)->canvas));
-
-		if (cursor_row == -1 && cursor_col == -1)
-			return FALSE;
-
-		eti->in_key_press = TRUE;
-
-		switch (e->key.keyval){
-		case GDK_Left:
-		case GDK_KP_Left:
-			if (eti_editing (eti)) {
-				handled = FALSE;
-				break;
-			}
-			
-			g_signal_emit (eti, eti_signals [KEY_PRESS], 0,
-				       model_to_view_row(eti, cursor_row), cursor_col, e, &return_val);
-			if ((!return_val) && eti->cursor_mode != E_CURSOR_LINE && cursor_col != view_to_model_col(eti, 0))
-				eti_cursor_move_left (eti);
-			return_val = 1;
-			break;
-
-		case GDK_Right:
-		case GDK_KP_Right:
-			if (eti_editing (eti)) {
-				handled = FALSE;
-				break;
-			}
-
-			g_signal_emit (eti, eti_signals [KEY_PRESS], 0,
-				       model_to_view_row(eti, cursor_row), cursor_col, e, &return_val);
-			if ((!return_val) && eti->cursor_mode != E_CURSOR_LINE && cursor_col != view_to_model_col(eti, eti->cols - 1))
-				eti_cursor_move_right (eti);
-			return_val = 1;
-			break;
-			
-		case GDK_Up:
-		case GDK_KP_Up:
-		case GDK_Down:
-		case GDK_KP_Down:
-			if ((e->key.state & GDK_MOD1_MASK)
-			    && ((e->key.keyval == GDK_Down ) || (e->key.keyval == GDK_KP_Down))) {
-				gint view_col = model_to_view_col(eti, cursor_col);				
-				if ((view_col >= 0) && (view_col < eti->cols))
-					if (eti_e_cell_event (eti, eti->cell_views [view_col], e, ((GdkEventKey *)e)->time, cursor_col, view_col, model_to_view_row(eti, cursor_row),  E_CELL_CURSOR))
-						return TRUE;
-			} else
-			return_val = e_selection_model_key_press(E_SELECTION_MODEL (eti->selection), (GdkEventKey *) e);
-			break;
-		case GDK_Home:
-		case GDK_KP_Home:
-			if (eti->cursor_mode != E_CURSOR_LINE) {
-				eti_cursor_move (eti, model_to_view_row(eti, cursor_row), 0);
-				return_val = TRUE;
-			} else 
-				return_val = e_selection_model_key_press(E_SELECTION_MODEL (eti->selection), (GdkEventKey *) e);
-			break;
-		case GDK_End:
-		case GDK_KP_End:
-			if (eti->cursor_mode != E_CURSOR_LINE) {
-				eti_cursor_move (eti, model_to_view_row(eti, cursor_row), eti->cols - 1);
-				return_val = TRUE;
-			} else 
-				return_val = e_selection_model_key_press(E_SELECTION_MODEL (eti->selection), (GdkEventKey *) e);
-			break;
-		case GDK_Tab:
-		case GDK_KP_Tab:
-		case GDK_ISO_Left_Tab:
-			if ((e->key.state & GDK_CONTROL_MASK) != 0) {
-				return_val = FALSE;
-				break;
-			}
-			if (eti->cursor_mode == E_CURSOR_SPREADSHEET) {
-				if ((e->key.state & GDK_SHIFT_MASK) != 0){
-				/* shift tab */
-					if (cursor_col != view_to_model_col(eti, 0))
-						eti_cursor_move_left (eti);
-					else if (cursor_row != view_to_model_row(eti, 0))
-						eti_cursor_move (eti, model_to_view_row(eti, cursor_row) - 1, eti->cols - 1);
-					else
-						return_val = FALSE;
-				} else {
-					if (cursor_col != view_to_model_col (eti, eti->cols - 1))
-						eti_cursor_move_right (eti);
-					else if (cursor_row != view_to_model_row(eti, eti->rows - 1))
-						eti_cursor_move (eti, model_to_view_row(eti, cursor_row) + 1, 0);
-					else 
-						return_val = FALSE;
-				}
-				g_object_get(eti->selection,
-					     "cursor_row", &cursor_row,
-					     "cursor_col", &cursor_col,
-					     NULL);
-
-				if (cursor_col >= 0 && cursor_row >= 0 && return_val &&
-				    (!eti_editing(eti)) && e_table_model_is_cell_editable(eti->table_model, cursor_col, model_to_view_row (eti, cursor_row))) {
-					e_table_item_enter_edit (eti, model_to_view_col(eti, cursor_col), model_to_view_row(eti, cursor_row));
-				}
-				break;
-			} else {
-			/* Let tab send you to the next widget. */
-			return_val = FALSE;
-			break;
-			}
-
-		case GDK_Return:
-		case GDK_KP_Enter:
-		case GDK_ISO_Enter:
-		case GDK_3270_Enter:
-			if (eti_editing (eti)){
-				ecell_view = eti->cell_views [eti->editing_col];
-				return_val = eti_e_cell_event (eti, ecell_view, e, e->key.time,
-							       view_to_model_col (eti, eti->editing_col),
-							       eti->editing_col, eti->editing_row, E_CELL_EDITING | E_CELL_CURSOR | E_CELL_PREEDIT);
-				if (!return_val)
-					break;
-			}
-			g_signal_emit (eti, eti_signals [KEY_PRESS], 0,
-				       model_to_view_row (eti, cursor_row), cursor_col, e, &return_val);
-			if (!return_val)
-				return_val = e_selection_model_key_press (E_SELECTION_MODEL (eti->selection), (GdkEventKey *) e);
-			break;
-			
-		default:
-			handled = FALSE;
-			break;
-		}
-
-		if (!handled) {
-			switch (e->key.keyval) {
-			case GDK_Scroll_Lock:
-			case GDK_Sys_Req:
-			case GDK_Shift_L:
-			case GDK_Shift_R:
-			case GDK_Control_L:
-			case GDK_Control_R:
-			case GDK_Caps_Lock:
-			case GDK_Shift_Lock:
-			case GDK_Meta_L:
-			case GDK_Meta_R:
-			case GDK_Alt_L:
-			case GDK_Alt_R:
-			case GDK_Super_L:
-			case GDK_Super_R:
-			case GDK_Hyper_L:
-			case GDK_Hyper_R:
-			case GDK_ISO_Lock:
-				break;
-
-			default:
-				if (!eti_editing (eti)){
-					gint col, row;
-					row = model_to_view_row(eti, cursor_row);
-					col = model_to_view_col(eti, cursor_col);
-					if (col != -1 && row != -1 && e_table_model_is_cell_editable(eti->table_model, cursor_col, row)) { 
-						e_table_item_enter_edit (eti, col, row);
-					}
-				}
-				if (!eti_editing (eti)){
-					g_signal_emit (eti, eti_signals [KEY_PRESS], 0,
-						       model_to_view_row(eti, cursor_row), cursor_col, e, &return_val);
-					if (!return_val)
-						e_selection_model_key_press(E_SELECTION_MODEL (eti->selection), (GdkEventKey *) e);
-				} else {
-					ecell_view = eti->cell_views [eti->editing_col];
-					return_val = eti_e_cell_event (eti, ecell_view, e, e->key.time,
-								       view_to_model_col(eti, eti->editing_col),
-								       eti->editing_col, eti->editing_row, E_CELL_EDITING | E_CELL_CURSOR);
-					if (!return_val)
-						e_selection_model_key_press(E_SELECTION_MODEL (eti->selection), (GdkEventKey *) e);
-				}
-				break;
-			}
-		}
-		eti->in_key_press = FALSE;
-		break;
-	}
-	
-	case GDK_KEY_RELEASE: {
-		gint cursor_row, cursor_col;
-
-		d(g_print("%s: GDK_KEY_RELEASE received, keyval: %d\n", __FUNCTION__, (int) e->key.keyval));
-
-		g_object_get(eti->selection,
-			     "cursor_row", &cursor_row,
-			     "cursor_col", &cursor_col,
-			     NULL);
-
-		if (cursor_col == -1)
-			return FALSE;
-
-		if (eti_editing (eti)){
-			ecell_view = eti->cell_views [eti->editing_col];
-			return_val = eti_e_cell_event (eti, ecell_view, e, e->key.time,
-						       view_to_model_col(eti, eti->editing_col),
-						       eti->editing_col, eti->editing_row, E_CELL_EDITING | E_CELL_CURSOR);
-		}
-		break;
-	}
-
-	case GDK_LEAVE_NOTIFY:
-		d(leave = TRUE);
-	case GDK_ENTER_NOTIFY:
-		d(g_print("%s: %s received\n", __FUNCTION__, leave ? "GDK_LEAVE_NOTIFY" : "GDK_ENTER_NOTIFY"));
-		if (eti->tooltip->timer)
-			gtk_timeout_remove (eti->tooltip->timer);
-		eti->tooltip->timer = 0;
-		if (eti->motion_row != -1 && eti->motion_col != -1)
-			return_val = eti_e_cell_event (eti, eti->cell_views [eti->motion_col],
-						       e, e->crossing.time,
-					               view_to_model_col(eti, eti->motion_col), 
-						       eti->motion_col, eti->motion_row, 0);
-		eti->motion_row = -1;
-		eti->motion_col = -1;
-
-		break;
-
-	case GDK_FOCUS_CHANGE:
-		d(g_print("%s: GDK_FOCUS_CHANGE received, %s\n", __FUNCTION__, e->focus_change.in ? "in": "out"));
-		if (e->focus_change.in) {
-			if (eti->save_row != -1 &&
-			    eti->save_col != -1 &&
-			    !eti_editing (eti) &&
-			    e_table_model_is_cell_editable(eti->table_model, view_to_model_col (eti, eti->save_col), eti->save_row)) { 
-				e_table_item_enter_edit (eti, eti->save_col, eti->save_row);
-				e_cell_load_state (eti->cell_views [eti->editing_col], view_to_model_col(eti, eti->save_col),
-						   eti->save_col, eti->save_row, eti->edit_ctx, eti->save_state);
-				eti_free_save_state (eti);
-			}
-		} else {
-			if (eti_editing (eti)) {
-				eti_free_save_state (eti);
-
-				eti->save_row   = eti->editing_row;
-				eti->save_col   = eti->editing_col;
-				eti->save_state = e_cell_save_state (eti->cell_views [eti->editing_col], view_to_model_col(eti, eti->editing_col),
-								     eti->editing_col, eti->editing_row, eti->edit_ctx);
-				e_table_item_leave_edit_(eti);
-			}
-		}
-
-	default:
-		return_val = FALSE;
-	}
-	/* d(g_print("%s: returning: %s\n", __FUNCTION__, return_val?"true":"false"));*/
-
-	return return_val;
-}
-
-static void
-eti_style_set (ETableItem *eti, GtkStyle *previous_style)
-{
- 	if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED))
-		return;
-
-	if (eti->cell_views_realized) {
-		int i;
-		int n_cells = eti->n_cells;
-
-		for (i = 0; i < n_cells; i++) {
-			e_cell_style_set (eti->cell_views[i], previous_style);
-		}
-	}
-
-	eti->needs_compute_height = 1;
-	e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (eti));
-	eti->needs_redraw = 1;
-	gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (eti));
-
-	free_height_cache (eti);
-
-	eti_idle_maybe_show_cursor(eti);
-}
-
-static void
-eti_class_init (GObjectClass *object_class)
-{
-	GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) object_class;
-	ETableItemClass *eti_class  = (ETableItemClass *) object_class;
-	
-	eti_parent_class            = g_type_class_ref (PARENT_OBJECT_TYPE);
-	
-	object_class->dispose       = eti_dispose;
-	object_class->set_property  = eti_set_property;
-	object_class->get_property  = eti_get_property;
-
-	item_class->update          = eti_update;
-	item_class->realize         = eti_realize;
-	item_class->unrealize       = eti_unrealize;
-	item_class->draw            = eti_draw;
-	item_class->point           = eti_point;
-	item_class->event           = eti_event;
-	
-	eti_class->cursor_change    = NULL;
-	eti_class->cursor_activated = NULL;
-	eti_class->double_click     = NULL;
-	eti_class->right_click      = NULL;
-	eti_class->click            = NULL;
-	eti_class->key_press        = NULL;
-	eti_class->start_drag       = NULL;
-	eti_class->style_set        = eti_style_set;
-	eti_class->selection_model_removed = NULL;
-	eti_class->selection_model_added = NULL;
-
-	g_object_class_install_property (object_class, PROP_TABLE_HEADER,
-					 g_param_spec_object ("ETableHeader",
-							      _( "Table header" ),
-							      _( "Table header" ),
-							      E_TABLE_HEADER_TYPE,
-							      G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_TABLE_MODEL,
-					 g_param_spec_object ("ETableModel",
-							      _( "Table model" ),
-							      _( "Table model" ),
-							      E_TABLE_MODEL_TYPE,
-							      G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_SELECTION_MODEL,
-					 g_param_spec_object ("selection_model",
-							      _( "Selection model" ),
-							      _( "Selection model" ),
-							      E_SELECTION_MODEL_TYPE,
-							      G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_TABLE_ALTERNATING_ROW_COLORS,
-					 g_param_spec_boolean ("alternating_row_colors",
-							       _( "Alternating Row Colors" ),
-							       _( "Alternating Row Colors" ), 
-							       FALSE,
-							       G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_TABLE_HORIZONTAL_DRAW_GRID,
-					 g_param_spec_boolean ("horizontal_draw_grid",
-							       _( "Horizontal Draw Grid" ),
-							       _( "Horizontal Draw Grid" ),
-							       FALSE,
-							       G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_TABLE_VERTICAL_DRAW_GRID,
-					 g_param_spec_boolean ("vertical_draw_grid",
-							       _( "Vertical Draw Grid" ),
-							       _( "Vertical Draw Grid" ),
-							       FALSE,
-							       G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_TABLE_DRAW_FOCUS,
-					 g_param_spec_boolean ("drawfocus",
-							       _( "Draw focus" ),
-							       _( "Draw focus" ),
-							       FALSE,
-							       G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_CURSOR_MODE,
-					 g_param_spec_int ("cursor_mode",
-							   _( "Cursor mode" ),
-							   _( "Cursor mode" ),
-							   E_CURSOR_LINE, E_CURSOR_SPREADSHEET, E_CURSOR_LINE,
-							   G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_LENGTH_THRESHOLD,
-					 g_param_spec_int ("length_threshold",
-							   _( "Length Threshold" ),
-							   _( "Length Threshold" ),
-							   -1, G_MAXINT, 0,
-							   G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_MINIMUM_WIDTH,
-					 g_param_spec_double ("minimum_width",
-							      _( "Minimum width" ),
-							      _( "Minimum Width" ),
-							      0.0, G_MAXDOUBLE, 0.0,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_WIDTH,
-					 g_param_spec_double ("width",
-							      _( "Width" ),
-							      _( "Width" ),
-							      0.0, G_MAXDOUBLE, 0.0,
-							      G_PARAM_READWRITE));
-	g_object_class_install_property (object_class, PROP_HEIGHT,
-					 g_param_spec_double ("height",
-							      _( "Height" ),
-							      _( "Height" ),
-							      0.0, G_MAXDOUBLE, 0.0,
-							      G_PARAM_READABLE));
-
-	g_object_class_install_property (object_class, PROP_CURSOR_ROW,
-					 g_param_spec_int ("cursor_row",
-							   _( "Cursor row" ),
-							   _( "Cursor row" ),
-							   0, G_MAXINT, 0,
-							   G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_UNIFORM_ROW_HEIGHT,
-					 g_param_spec_boolean ("uniform_row_height",
-							       _( "Uniform row height" ),
-							       _( "Uniform row height" ),
-							       FALSE,
-							       G_PARAM_READWRITE));
-
-	eti_signals [CURSOR_CHANGE] =
-		g_signal_new ("cursor_change",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableItemClass, cursor_change),
-			      NULL, NULL,
-			      e_marshal_NONE__INT,
-			      G_TYPE_NONE, 1, G_TYPE_INT);
-
-	eti_signals [CURSOR_ACTIVATED] =
-		g_signal_new ("cursor_activated",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableItemClass, cursor_activated),
-			      NULL, NULL,
-			      e_marshal_NONE__INT,
-			      G_TYPE_NONE, 1, G_TYPE_INT);
-
-	eti_signals [DOUBLE_CLICK] =
-		g_signal_new ("double_click",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableItemClass, double_click),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_INT_BOXED,
-			      G_TYPE_NONE, 3, G_TYPE_INT,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	eti_signals [START_DRAG] =
-		g_signal_new ("start_drag",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableItemClass, start_drag),
-			      NULL, NULL,
-			      e_marshal_INT__INT_INT_BOXED,
-			      G_TYPE_INT, 3, G_TYPE_INT,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	eti_signals [RIGHT_CLICK] =
-		g_signal_new ("right_click",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableItemClass, right_click),
-			      NULL, NULL,
-			      e_marshal_INT__INT_INT_BOXED,
-			      G_TYPE_INT, 3, G_TYPE_INT,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	eti_signals [CLICK] =
-		g_signal_new ("click",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableItemClass, click),
-			      NULL, NULL,
-			      e_marshal_INT__INT_INT_BOXED,
-			      G_TYPE_INT, 3, G_TYPE_INT,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	eti_signals [KEY_PRESS] =
-		g_signal_new ("key_press",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableItemClass, key_press),
-			      NULL, NULL,
-			      e_marshal_INT__INT_INT_BOXED,
-			      G_TYPE_INT, 3, G_TYPE_INT,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	eti_signals [STYLE_SET] =
-		g_signal_new ("style_set",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableItemClass, style_set),
-			      NULL, NULL,
-			      e_marshal_NONE__OBJECT,
-			      G_TYPE_NONE, 1, GTK_TYPE_STYLE);
-
-	eti_signals[SELECTION_MODEL_REMOVED] =
-		g_signal_new ("selection_model_removed",
-			      G_TYPE_FROM_CLASS (object_class),
-			      G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
-			      G_STRUCT_OFFSET (ETableItemClass, selection_model_removed),
-			      NULL, NULL,
-			      g_cclosure_marshal_VOID__POINTER,
-			      G_TYPE_NONE, 1,
-			      G_TYPE_POINTER);
-
-	eti_signals[SELECTION_MODEL_ADDED] =
-		g_signal_new ("selection_model_added",
-			      G_TYPE_FROM_CLASS (object_class),
-			      G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
-			      G_STRUCT_OFFSET (ETableItemClass, selection_model_added),
-			      NULL, NULL,
-			      g_cclosure_marshal_VOID__POINTER,
-			      G_TYPE_NONE, 1,
-			      G_TYPE_POINTER);
-
-	/* A11y Init */
-	gal_a11y_e_table_item_init ();
-}
-
-E_MAKE_TYPE (e_table_item,
-	     "ETableItem",
-	     ETableItem,
-	     eti_class_init,
-	     eti_init,
-	     PARENT_OBJECT_TYPE)
-
-/** 
- * e_table_item_set_cursor:
- * @eti: %ETableItem which will have the cursor set.
- * @col: Column to select.  -1 means the last column.
- * @row: Row to select.  -1 means the last row.
- *
- * This routine sets the cursor of the %ETableItem canvas item.
- */
-void
-e_table_item_set_cursor    (ETableItem *eti, int col, int row)
-{
-	e_table_item_focus(eti, col, view_to_model_row(eti, row), 0);
-}
-
-static void
-e_table_item_focus (ETableItem *eti, int col, int row, GdkModifierType state)
-{
-	g_return_if_fail (eti != NULL);
-	g_return_if_fail (E_IS_TABLE_ITEM (eti));
-	
-	if (row == -1) {
-		row = view_to_model_row(eti, eti->rows - 1);
-	}
-
-	if (col == -1) {
-		col = eti->cols - 1;
-	}
-
-	if (row != -1) {
-		e_selection_model_do_something(E_SELECTION_MODEL (eti->selection),
-					       row, col,
-					       state);
-	}
-}
-
-/** 
- * e_table_item_get_focused_column:
- * @eti: %ETableItem which will have the cursor retrieved.
- *
- * This routine gets the cursor of the %ETableItem canvas item.
- *
- * Returns: The current cursor column.
- */
-gint
-e_table_item_get_focused_column (ETableItem *eti)
-{	
-	int cursor_col;
-
-	g_return_val_if_fail (eti != NULL, -1);
-	g_return_val_if_fail (E_IS_TABLE_ITEM (eti), -1);
-	
-	g_object_get(eti->selection,
-		     "cursor_col", &cursor_col,
-		     NULL);
-
-	return cursor_col;
-}
-
-static void
-eti_cursor_change (ESelectionModel *selection, int row, int col, ETableItem *eti)
-{
-	int view_row;
-	int view_col;
-
-	if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED))
-		return;
-
-	view_row = model_to_view_row(eti, row);
-	view_col = model_to_view_col(eti, col);
-	
-	if (eti->old_cursor_row != -1 && view_row != eti->old_cursor_row)
-		e_table_item_redraw_row (eti, eti->old_cursor_row);
-
-	if (view_row == -1) {
-		e_table_item_leave_edit_(eti);
-		eti->old_cursor_row = -1;
-		return;
-	}
-
-	if (! e_table_model_has_change_pending (eti->table_model)) {
-		if (!eti->in_key_press) {
-			eti_maybe_show_cursor(eti, DOUBLE_CLICK_TIME + 10);
-		} else {
-			eti_maybe_show_cursor(eti, 0);
-		}
-	}
-
-	e_canvas_item_grab_focus(GNOME_CANVAS_ITEM(eti), FALSE);
-	if (eti_editing(eti))
-		e_table_item_leave_edit_(eti);
-	g_signal_emit (eti, eti_signals [CURSOR_CHANGE], 0,
-		       view_row);
-
-	e_table_item_redraw_row (eti, view_row);
-
-	eti->old_cursor_row = view_row;
-}
-
-static void
-eti_cursor_activated (ESelectionModel *selection, int row, int col, ETableItem *eti)
-{
-	int view_row;
-	int view_col;
-
-	if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED))
-		return;
-
-	view_row = model_to_view_row(eti, row);
-	view_col = model_to_view_col(eti, col);
-	
-	if (view_row != -1 && view_col != -1) {
-		if (! e_table_model_has_change_pending (eti->table_model)) {
-			if (!eti->in_key_press) {
-				eti_show_cursor(eti, DOUBLE_CLICK_TIME + 10);
-			} else {
-				eti_show_cursor(eti, 0);
-			}
-			eti_check_cursor_bounds (eti);
-		}
-	}
-
-	if (eti_editing(eti))
-		e_table_item_leave_edit_(eti);
-
-	if (view_row != -1)
-		g_signal_emit (eti, eti_signals [CURSOR_ACTIVATED], 0,
-			       view_row);
-}
-
-static void
-eti_selection_change (ESelectionModel *selection, ETableItem *eti)
-{
-	if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED))
-		return;
-
-	eti->needs_redraw = TRUE;
-	gnome_canvas_item_request_update(GNOME_CANVAS_ITEM(eti));
-}
-
-static void
-eti_selection_row_change (ESelectionModel *selection, int row, ETableItem *eti)
-{
-	if (!(GTK_OBJECT_FLAGS(eti) & GNOME_CANVAS_ITEM_REALIZED))
-		return;
-
-	if (!eti->needs_redraw) {
-		e_table_item_redraw_row (eti, model_to_view_row(eti, row));
-	}
-}
-
-
-/** 
- * e_table_item_enter_edit
- * @eti: %ETableItem which will start being edited
- * @col: The view col to edit.
- * @row: The view row to edit.
- *
- * This routine starts the given %ETableItem editing at the given view
- * column and row.
- */
-void
-e_table_item_enter_edit (ETableItem *eti, int col, int row)
-{
-	g_return_if_fail (eti != NULL);
-	g_return_if_fail (E_IS_TABLE_ITEM (eti));
-	
-	d(g_print("%s: %d, %d, eti_editing() = %s\n", __FUNCTION__, col, row, eti_editing(eti)?"true":"false"));
-
-	if (eti_editing (eti))
-		e_table_item_leave_edit_(eti);
-
-	eti->editing_col = col;
-	eti->editing_row = row;
-
-	eti->edit_ctx = e_cell_enter_edit (eti->cell_views [col], view_to_model_col(eti, col), col, row);
-}
-
-/** 
- * e_table_item_leave_edit_
- * @eti: %ETableItem which will stop being edited
- *
- * This routine stops the given %ETableItem from editing.
- */
-void
-e_table_item_leave_edit (ETableItem *eti)
-{
-	int col, row;
-	void *edit_ctx;
-	
-	g_return_if_fail (eti != NULL);
-	g_return_if_fail (E_IS_TABLE_ITEM (eti));
-
-	d(g_print("%s: eti_editing() = %s\n", __FUNCTION__, eti_editing(eti)?"true":"false"));
-
-	if (!eti_editing (eti))
-		return;
-
-	col = eti->editing_col;
-	row = eti->editing_row;
-	edit_ctx = eti->edit_ctx;
-
-	eti->editing_col = -1;
-	eti->editing_row = -1;
-	eti->edit_ctx = NULL;
-
-	e_cell_leave_edit (eti->cell_views [col],
-			   view_to_model_col(eti, col),
-			   col, row, edit_ctx);
-}
-
-/** 
- * e_table_item_compute_location
- * @eti: %ETableItem to look in.
- * @x: A pointer to the x location to find in the %ETableItem.
- * @y: A pointer to the y location to find in the %ETableItem.
- * @row: A pointer to the location to store the found row in.
- * @col: A pointer to the location to store the found col in.
- *
- * This routine locates the pixel location (*x, *y) in the
- * %ETableItem.  If that location is in the %ETableItem, *row and *col
- * are set to the view row and column where it was found.  If that
- * location is not in the %ETableItem, the height of the %ETableItem
- * is removed from the value y points to.
- */
-void 
-e_table_item_compute_location (ETableItem        *eti,
-			       int               *x,
-			       int               *y,
-			       int               *row,
-			       int               *col)
-{
-	/* Save the grabbed row but make sure that we don't get flawed
-           results because the cursor is grabbed. */
-	int grabbed_row = eti->grabbed_row;
-	eti->grabbed_row = -1;
-
-	if (!find_cell (eti, *x, *y, col, row, NULL, NULL)) {
-		*y -= eti->height;
-	}
-
-	eti->grabbed_row = grabbed_row;
-}
-
-void
-e_table_item_get_cell_geometry   (ETableItem        *eti,
-				  int               *row,
-				  int               *col,
-				  int               *x,
-				  int               *y,
-				  int               *width,
-				  int               *height)
-{
-	if (eti->rows > *row) {
-		if (x)
-			*x = e_table_header_col_diff (eti->header, 0, *col);
-		if (y)
-			*y = e_table_item_row_diff (eti, 0, *row);
-		if (width)
-			*width = e_table_header_col_diff (eti->header, *col, *col + 1);
-		if (height)
-			*height = ETI_ROW_HEIGHT (eti, *row);
-		*row = -1;
-		*col = -1;
-	} else {
-		*row -= eti->rows;
-	}
-}
-
-typedef struct {
-	ETableItem *item;
-	int rows_printed;
-} ETableItemPrintContext;
-
-static gdouble *
-e_table_item_calculate_print_widths (ETableHeader *eth, gdouble width)
-{
-	int i;
-	double extra;
-	double expansion;
-	int last_resizable = -1;
-	gdouble scale = 1.0L;
-	gdouble *widths = g_new(gdouble, e_table_header_count(eth));
-	/* - 1 to account for the last pixel border. */
-	extra = width - 1;
-	expansion = 0;
-	for (i = 0; i < eth->col_count; i++) {
-		extra -= eth->columns[i]->min_width * scale;
-		if (eth->columns[i]->resizable && eth->columns[i]->expansion > 0)
-			last_resizable = i;
-		expansion += eth->columns[i]->resizable ? eth->columns[i]->expansion : 0;
-		widths[i] = eth->columns[i]->min_width * scale;
-	}
-	for (i = 0; i <= last_resizable; i++) {
-		widths[i] += extra * (eth->columns[i]->resizable ? eth->columns[i]->expansion : 0)/expansion;
-	}
-
-	return widths;
-}
-
-static gdouble
-eti_printed_row_height (ETableItem *eti, gdouble *widths, GnomePrintContext *context, gint row)
-{
-	int col;
-	int cols = eti->cols;
-	gdouble height = 0;
-	for (col = 0; col < cols; col++) {
-		ECellView *ecell_view = eti->cell_views [col];
-		gdouble this_height = e_cell_print_height (ecell_view, context, view_to_model_col(eti, col), col, row, 
-							   widths[col] - 1);
-		if (this_height > height)
-			height = this_height;
-	}
-	return height;
-}
-
-#define CHECK(x) if((x) == -1) return -1;
-
-static gint
-gp_draw_rect (GnomePrintContext *context, gdouble x, gdouble y, gdouble width, gdouble height)
-{
-	CHECK(gnome_print_moveto(context, x, y));
-	CHECK(gnome_print_lineto(context, x + width, y));
-	CHECK(gnome_print_lineto(context, x + width, y - height));
-	CHECK(gnome_print_lineto(context, x, y - height));
-	CHECK(gnome_print_lineto(context, x, y));
-	return gnome_print_fill(context);
-}
-
-static void
-e_table_item_print_page  (EPrintable *ep,
-			  GnomePrintContext *context,
-			  gdouble width,
-			  gdouble height,
-			  gboolean quantize,
-			  ETableItemPrintContext *itemcontext)
-{
-	ETableItem *eti = itemcontext->item;
-	const int rows = eti->rows;
-	const int cols = eti->cols;
-	int rows_printed = itemcontext->rows_printed;
-	gdouble *widths;
-	int row, col;
-	gdouble yd = height;
-	
-	widths = e_table_item_calculate_print_widths (itemcontext->item->header, width);
-
-	/*
-	 * Draw cells
-	 */
-	if (eti->horizontal_draw_grid){
-		gp_draw_rect(context, 0, yd, width, 1);
-	}
-	yd--;
-	
-	for (row = rows_printed; row < rows; row++){
-		gdouble xd = 1, row_height;
-		
-		row_height = eti_printed_row_height(eti, widths, context, row);
-		if (quantize) {
-			if (yd - row_height - 1 < 0 && row != rows_printed) {
-				break;
-			}
-		} else {
-			if (yd < 0) {
-				break;
-			}
-		}
-
-		for (col = 0; col < cols; col++){
-			ECellView *ecell_view = eti->cell_views [col];
-
-			if (gnome_print_gsave(context) == -1)
-				/* FIXME */;
-			if (gnome_print_translate(context, xd, yd - row_height) == -1)
-				/* FIXME */;
-
-			if (gnome_print_moveto(context, 0, 0) == -1)
-				/* FIXME */;
-			if (gnome_print_lineto(context, widths[col] - 1, 0) == -1)
-				/* FIXME */;
-			if (gnome_print_lineto(context, widths[col] - 1, row_height) == -1)
-				/* FIXME */;
-			if (gnome_print_lineto(context, 0, row_height) == -1)
-				/* FIXME */;
-			if (gnome_print_lineto(context, 0, 0) == -1)
-				/* FIXME */;
-			if (gnome_print_clip(context) == -1)
-				/* FIXME */;
-
-			e_cell_print (ecell_view, context, view_to_model_col(eti, col), col, row, 
-				      widths[col] - 1, row_height);
-
-			if (gnome_print_grestore(context) == -1)
-				/* FIXME */;
-			
-			xd += widths[col];
-		}
-		yd -= row_height;
-
-		if (eti->horizontal_draw_grid){
-			gp_draw_rect(context, 0, yd, width, 1);
-		}
-		yd--;
-	}
-
-	itemcontext->rows_printed = row;
-
-	if (eti->vertical_draw_grid){
-		gdouble xd = 0;
-		
-		for (col = 0; col < cols; col++){
-			gp_draw_rect(context, xd, height, 1, height - yd);
-			
-			xd += widths[col];
-		}
-		gp_draw_rect(context, xd, height, 1, height - yd);
-	}
-
-	g_free (widths);
-}
-
-static gboolean
-e_table_item_data_left   (EPrintable *ep,
-			  ETableItemPrintContext *itemcontext)
-{
-	ETableItem *item = itemcontext->item;
-	int rows_printed = itemcontext->rows_printed;
-
-	g_signal_stop_emission_by_name(ep, "data_left");
-	return rows_printed < item->rows;
-}
-
-static void
-e_table_item_reset       (EPrintable *ep,
-			  ETableItemPrintContext *itemcontext)
-{
-	itemcontext->rows_printed = 0;
-}
-
-static gdouble
-e_table_item_height      (EPrintable *ep,
-			  GnomePrintContext *context,
-			  gdouble width,
-			  gdouble max_height,
-			  gboolean quantize,
-			  ETableItemPrintContext *itemcontext)
-{
-	ETableItem *item = itemcontext->item;
-	const int rows = item->rows;
-	int rows_printed = itemcontext->rows_printed;
-	gdouble *widths;
-	int row;
-	gdouble yd = 0;
-	
-	widths = e_table_item_calculate_print_widths (itemcontext->item->header, width);
-
-	/*
-	 * Draw cells
-	 */
-	yd++;
-	
-	for (row = rows_printed; row < rows; row++){
-		gdouble row_height;
-		
-		row_height = eti_printed_row_height(item, widths, context, row);
-		if (quantize) {
-			if (max_height != -1 && yd + row_height + 1 > max_height && row != rows_printed) {
-				break;
-			}
-		} else {
-			if (max_height != -1 && yd > max_height) {
-				break;
-			}
-		}
-
-		yd += row_height;
-
-		yd++;
-	}
-
-	g_free (widths);
-	
-	if (max_height != -1 && (!quantize) && yd > max_height)
-		yd = max_height;
-
-	g_signal_stop_emission_by_name(ep, "height");
-	return yd;
-}
-
-static gboolean
-e_table_item_will_fit     (EPrintable *ep,
-			   GnomePrintContext *context,
-			   gdouble width,
-			   gdouble max_height,
-			   gboolean quantize,
-			   ETableItemPrintContext *itemcontext)
-{
-	ETableItem *item = itemcontext->item;
-	const int rows = item->rows;
-	int rows_printed = itemcontext->rows_printed;
-	gdouble *widths;
-	int row;
-	gdouble yd = 0;
-	gboolean ret_val = TRUE;
-	
-	widths = e_table_item_calculate_print_widths (itemcontext->item->header, width);
-
-	/*
-	 * Draw cells
-	 */
-	yd++;
-	
-	for (row = rows_printed; row < rows; row++){
-		gdouble row_height;
-		
-		row_height = eti_printed_row_height(item, widths, context, row);
-		if (quantize) {
-			if (max_height != -1 && yd + row_height + 1 > max_height && row != rows_printed) {
-				ret_val = FALSE;
-				break;
-			}
-		} else {
-			if (max_height != -1 && yd > max_height) {
-				ret_val = FALSE;
-				break;
-			}
-		}
-
-		yd += row_height;
-
-		yd++;
-	}
-
-	g_free (widths);
-
-	g_signal_stop_emission_by_name(ep, "will_fit");
-	return ret_val;
-}
-
-static void
-e_table_item_printable_destroy (gpointer data,
-				GObject *where_object_was)
-{
-	ETableItemPrintContext *itemcontext = data;
-
-	g_object_unref(itemcontext->item);
-	g_free(itemcontext);
-}
-
-/** 
- * e_table_item_get_printable
- * @eti: %ETableItem which will be printed
- *
- * This routine creates and returns an %EPrintable that can be used to
- * print the given %ETableItem.
- *
- * Returns: The %EPrintable. 
- */
-EPrintable *
-e_table_item_get_printable (ETableItem *item)
-{
-	EPrintable *printable = e_printable_new();
-	ETableItemPrintContext *itemcontext;
-
-	itemcontext = g_new(ETableItemPrintContext, 1);
-	itemcontext->item = item;
-	g_object_ref(item);
-	itemcontext->rows_printed = 0;
-
-	g_signal_connect (printable,
-			  "print_page",
-			  G_CALLBACK(e_table_item_print_page),
-			  itemcontext);
-	g_signal_connect (printable,
-			  "data_left",
-			  G_CALLBACK(e_table_item_data_left),
-			  itemcontext);
-	g_signal_connect (printable,
-			  "reset",
-			  G_CALLBACK(e_table_item_reset),
-			  itemcontext);
-	g_signal_connect (printable,
-			  "height",
-			  G_CALLBACK(e_table_item_height),
-			  itemcontext);
-	g_signal_connect (printable,
-			  "will_fit",
-			  G_CALLBACK(e_table_item_will_fit),
-			  itemcontext);
-	g_object_weak_ref (G_OBJECT (printable),
-			   e_table_item_printable_destroy,
-			   itemcontext);
-
-	return printable;
-}
diff --git a/widgets/table/e-table-item.h b/widgets/table/e-table-item.h
deleted file mode 100644
index e5b5322019..0000000000
--- a/widgets/table/e-table-item.h
+++ /dev/null
@@ -1,231 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-item.h
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Miguel de Icaza <miguel@gnu.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_ITEM_H_
-#define _E_TABLE_ITEM_H_
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gal/e-table/e-table-model.h>
-#include <gal/e-table/e-table-header.h>
-#include <gal/e-table/e-table-defines.h>
-#include <gal/e-table/e-table-tooltip.h>
-#include <gal/widgets/e-selection-model.h>
-#include <gal/widgets/e-printable.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_ITEM_TYPE        (e_table_item_get_type ())
-#define E_TABLE_ITEM(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_ITEM_TYPE, ETableItem))
-#define E_TABLE_ITEM_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_ITEM_TYPE, ETableItemClass))
-#define E_IS_TABLE_ITEM(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_ITEM_TYPE))
-#define E_IS_TABLE_ITEM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_ITEM_TYPE))
-
-typedef struct {
-	GnomeCanvasItem  parent;
-	ETableModel     *table_model;
-	ETableHeader    *header;
-
-	ETableModel     *source_model;
-	ESelectionModel *selection;
-
-	int              x1, y1;
-	int              minimum_width, width, height;
-
-	int              cols, rows;
-
-	int              click_count;
-	
-	/*
-	 * Ids for the signals we connect to
-	 */
-	int              header_dim_change_id;
-	int              header_structure_change_id;
-	int              header_request_width_id;
-	int              table_model_pre_change_id;
-	int              table_model_no_change_id;
-	int              table_model_change_id;
-	int              table_model_row_change_id;
-	int              table_model_cell_change_id;
-	int              table_model_rows_inserted_id;
-	int              table_model_rows_deleted_id;
-
-	int              selection_change_id;
-	int              selection_row_change_id;
-	int              cursor_change_id;
-	int              cursor_activated_id;
-
-	guint            cursor_idle_id;
-
-	/* View row, -1 means unknown */
-	int              old_cursor_row;
-
-	int              hadjustment_change_id;
-	int              hadjustment_value_change_id;
-	int              vadjustment_change_id;
-	int              vadjustment_value_change_id;
-	
-	GdkGC           *fill_gc;
-	GdkGC           *grid_gc;
-	GdkGC           *focus_gc;
-	GdkBitmap       *stipple;
-
-	guint		 alternating_row_colors:1;
-	guint 		 horizontal_draw_grid:1;
-	guint 		 vertical_draw_grid:1;
-	guint 		 draw_focus:1;
-	guint 		 uniform_row_height:1;
-	guint 		 cell_views_realized:1;
-	      	    
-	guint 		 needs_redraw : 1;
-	guint 		 needs_compute_height : 1;
-	guint 		 needs_compute_width : 1;
-
-	guint            uses_source_model : 1;
-
-	guint            in_key_press : 1;
-
-	guint            maybe_in_drag : 1;
-	guint            in_drag : 1;
-	guint            grabbed : 1;
-
-	guint            maybe_did_something : 1;
-
-	guint            cursor_on_screen : 1;
-	guint            gtk_grabbed : 1;
-
-	guint            queue_show_cursor : 1;
-	guint            grab_cancelled : 1;
-
-	int              frozen_count;
-
-	int              cursor_x1;
-	int              cursor_y1;
-	int              cursor_x2;
-	int              cursor_y2;
-
-	int    		 drag_col;
-	int    		 drag_row;
-	int    		 drag_x;
-	int    		 drag_y;
-	guint            drag_state;
-
-	/*
-	 * Realized views, per column
-	 */
-	ECellView      **cell_views;
-	int              n_cells;
-
-	int             *height_cache;
-	int              uniform_row_height_cache;
-	int              height_cache_idle_id;
-	int              height_cache_idle_count;
-
-	/*
-	 * Lengh Threshold: above this, we stop computing correctly
-	 * the size
-	 */
-	int              length_threshold;
-	
-	gint             row_guess;
-	ECursorMode      cursor_mode;
-
-	int              motion_col, motion_row;
-
-	/*
-	 * During editing
-	 */
-	int              editing_col, editing_row;
-	void            *edit_ctx;
-
-	int              save_col, save_row;
-	void            *save_state;
-
-	int grabbed_col, grabbed_row;
-	int grabbed_count;
-
-	/*
-	 * Tooltip
-	 */
-	ETableTooltip *tooltip;
-
-} ETableItem;
-
-typedef struct {
-	GnomeCanvasItemClass parent_class;
-
-	void        (*cursor_change)    (ETableItem *eti, int row);
-	void        (*cursor_activated) (ETableItem *eti, int row);
-	void        (*double_click)     (ETableItem *eti, int row, int col, GdkEvent *event);
-	gint        (*right_click)      (ETableItem *eti, int row, int col, GdkEvent *event);
-	gint        (*click)            (ETableItem *eti, int row, int col, GdkEvent *event);
-	gint        (*key_press)        (ETableItem *eti, int row, int col, GdkEvent *event);
-	gint        (*start_drag)       (ETableItem *eti, int row, int col, GdkEvent *event);
-	void        (*style_set)        (ETableItem *eti, GtkStyle *previous_style);
-	void        (*selection_model_removed)    (ETableItem *eti, ESelectionModel *selection);
-	void        (*selection_model_added)    (ETableItem *eti, ESelectionModel *selection);
-} ETableItemClass;
-GType       e_table_item_get_type            (void);
-
-
-/*
- * Focus
- */
-void        e_table_item_set_cursor          (ETableItem        *eti,
-					      int                col,
-					      int                row);
-
-gint        e_table_item_get_focused_column  (ETableItem        *eti);
-
-void        e_table_item_leave_edit          (ETableItem        *eti);
-void        e_table_item_enter_edit          (ETableItem        *eti,
-					      int                col,
-					      int                row);
-
-void        e_table_item_redraw_range        (ETableItem        *eti,
-					      int                start_col,
-					      int                start_row,
-					      int                end_col,
-					      int                end_row);
-
-EPrintable *e_table_item_get_printable       (ETableItem        *eti);
-void        e_table_item_compute_location    (ETableItem        *eti,
-					      int               *x,
-					      int               *y,
-					      int               *row,
-					      int               *col);
-void        e_table_item_get_cell_geometry   (ETableItem        *eti,
-					      int               *row,
-					      int               *col,
-					      int               *x,
-					      int               *y,
-					      int               *width,
-					      int               *height);
-
-int	    e_table_item_row_diff	     (ETableItem	*eti,
-					      int		 start_row,
-					      int		 end_row);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_ITEM_H_ */
diff --git a/widgets/table/e-table-memory-callbacks.c b/widgets/table/e-table-memory-callbacks.c
deleted file mode 100644
index 6cd1b9c8a1..0000000000
--- a/widgets/table/e-table-memory-callbacks.c
+++ /dev/null
@@ -1,208 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-memory-callbacks.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include "e-table-memory-callbacks.h"
-#include "gal/util/e-util.h"
-
-static int
-etmc_column_count (ETableModel *etm)
-{
-	ETableMemoryCalbacks *etmc = E_TABLE_MEMORY_CALLBACKS(etm);
-
-	if (etmc->col_count)
-		return etmc->col_count (etm, etmc->data);
-	else
-		return 0;
-}
-
-static void *
-etmc_value_at (ETableModel *etm, int col, int row)
-{
-	ETableMemoryCalbacks *etmc = E_TABLE_MEMORY_CALLBACKS(etm);
-
-	if (etmc->value_at)
-		return etmc->value_at (etm, col, row, etmc->data);
-	else
-		return NULL;
-}
-
-static void
-etmc_set_value_at (ETableModel *etm, int col, int row, const void *val)
-{
-	ETableMemoryCalbacks *etmc = E_TABLE_MEMORY_CALLBACKS(etm);
-
-	if (etmc->set_value_at)
-		etmc->set_value_at (etm, col, row, val, etmc->data);
-}
-
-static gboolean
-etmc_is_cell_editable (ETableModel *etm, int col, int row)
-{
-	ETableMemoryCalbacks *etmc = E_TABLE_MEMORY_CALLBACKS(etm);
-
-	if (etmc->is_cell_editable)
-		return etmc->is_cell_editable (etm, col, row, etmc->data);
-	else
-		return FALSE;
-}
-
-/* The default for etmc_duplicate_value is to return the raw value. */
-static void *
-etmc_duplicate_value (ETableModel *etm, int col, const void *value)
-{
-	ETableMemoryCalbacks *etmc = E_TABLE_MEMORY_CALLBACKS(etm);
-
-	if (etmc->duplicate_value)
-		return etmc->duplicate_value (etm, col, value, etmc->data);
-	else
-		return (void *)value;
-}
-
-static void
-etmc_free_value (ETableModel *etm, int col, void *value)
-{
-	ETableMemoryCalbacks *etmc = E_TABLE_MEMORY_CALLBACKS(etm);
-
-	if (etmc->free_value)
-		etmc->free_value (etm, col, value, etmc->data);
-}
-
-static void *
-etmc_initialize_value (ETableModel *etm, int col)
-{
-	ETableMemoryCalbacks *etmc = E_TABLE_MEMORY_CALLBACKS(etm);
-	
-	if (etmc->initialize_value)
-		return etmc->initialize_value (etm, col, etmc->data);
-	else
-		return NULL;
-}
-
-static gboolean
-etmc_value_is_empty (ETableModel *etm, int col, const void *value)
-{
-	ETableMemoryCalbacks *etmc = E_TABLE_MEMORY_CALLBACKS(etm);
-	
-	if (etmc->value_is_empty)
-		return etmc->value_is_empty (etm, col, value, etmc->data);
-	else
-		return FALSE;
-}
-
-static char *
-etmc_value_to_string (ETableModel *etm, int col, const void *value)
-{
-	ETableMemoryCalbacks *etmc = E_TABLE_MEMORY_CALLBACKS(etm);
-	
-	if (etmc->value_to_string)
-		return etmc->value_to_string (etm, col, value, etmc->data);
-	else
-		return g_strdup ("");
-}
-
-static void
-etmc_append_row (ETableModel *etm, ETableModel *source, int row)
-{
-	ETableMemoryCalbacks *etmc = E_TABLE_MEMORY_CALLBACKS(etm);
-	
-	if (etmc->append_row)
-		etmc->append_row (etm, source, row, etmc->data);
-}
-
-static void
-e_table_memory_callbacks_class_init (GObjectClass *object_class)
-{
-	ETableModelClass *model_class = (ETableModelClass *) object_class;
-
-	model_class->column_count     = etmc_column_count;
-	model_class->value_at         = etmc_value_at;
-	model_class->set_value_at     = etmc_set_value_at;
-	model_class->is_cell_editable = etmc_is_cell_editable;
-	model_class->duplicate_value  = etmc_duplicate_value;
-	model_class->free_value       = etmc_free_value;
-	model_class->initialize_value = etmc_initialize_value;
-	model_class->value_is_empty   = etmc_value_is_empty;
-	model_class->value_to_string  = etmc_value_to_string;
-	model_class->append_row       = etmc_append_row;
-
-}
-
-E_MAKE_TYPE(e_table_memory_callbacks, "ETableMemoryCalbacks", ETableMemoryCalbacks, e_table_memory_callbacks_class_init, NULL, E_TABLE_MEMORY_TYPE)
-
-
-/**
- * e_table_memory_callbacks_new:
- * @col_count:
- * @value_at:
- * @set_value_at:
- * @is_cell_editable:
- * @duplicate_value:
- * @free_value:
- * @initialize_value:
- * @value_is_empty:
- * @value_to_string:
- * @data: closure pointer.
- *
- * This initializes a new ETableMemoryCalbacksModel object.  ETableMemoryCalbacksModel is
- * an implementaiton of the abstract class ETableModel.  The ETableMemoryCalbacksModel
- * is designed to allow people to easily create ETableModels without having
- * to create a new GtkType derived from ETableModel every time they need one.
- *
- * Instead, ETableMemoryCalbacksModel uses a setup based in callback functions, every
- * callback function signature mimics the signature of each ETableModel method
- * and passes the extra @data pointer to each one of the method to provide them
- * with any context they might want to use. 
- *
- * Returns: An ETableMemoryCalbacksModel object (which is also an ETableModel
- * object).
- */
-ETableModel *
-e_table_memory_callbacks_new (ETableMemoryCalbacksColumnCountFn col_count,
-			      ETableMemoryCalbacksValueAtFn value_at,
-			      ETableMemoryCalbacksSetValueAtFn set_value_at,
-			      ETableMemoryCalbacksIsCellEditableFn is_cell_editable,
-			      ETableMemoryCalbacksDuplicateValueFn duplicate_value,
-			      ETableMemoryCalbacksFreeValueFn free_value,
-			      ETableMemoryCalbacksInitializeValueFn initialize_value,
-			      ETableMemoryCalbacksValueIsEmptyFn value_is_empty,
-			      ETableMemoryCalbacksValueToStringFn value_to_string,
-			      void *data)
-{
-	ETableMemoryCalbacks *et;
-
-	et                   = g_object_new (E_TABLE_MEMORY_CALLBACKS_TYPE, NULL);
-
-	et->col_count        = col_count;
-	et->value_at         = value_at;
-	et->set_value_at     = set_value_at;
-	et->is_cell_editable = is_cell_editable;
-	et->duplicate_value  = duplicate_value;
-	et->free_value       = free_value;
-	et->initialize_value = initialize_value;
-	et->value_is_empty   = value_is_empty;
-	et->value_to_string  = value_to_string;
-	et->data             = data;
-	
-	return (ETableModel *) et;
- }
diff --git a/widgets/table/e-table-memory-callbacks.h b/widgets/table/e-table-memory-callbacks.h
deleted file mode 100644
index 599ffa01f3..0000000000
--- a/widgets/table/e-table-memory-callbacks.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-memory-callbacks.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_MEMORY_CALLBACKS_H_
-#define _E_TABLE_MEMORY_CALLBACKS_H_
-
-#include <gal/e-table/e-table-memory.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_MEMORY_CALLBACKS_TYPE        (e_table_memory_callbacks_get_type ())
-#define E_TABLE_MEMORY_CALLBACKS(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_MEMORY_CALLBACKS_TYPE, ETableMemoryCalbacks))
-#define E_TABLE_MEMORY_CALLBACKS_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_MEMORY_CALLBACKS_TYPE, ETableMemoryCalbacksClass))
-#define E_IS_TABLE_MEMORY_CALLBACKS(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_MEMORY_CALLBACKS_TYPE))
-#define E_IS_TABLE_MEMORY_CALLBACKS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_MEMORY_CALLBACKS_TYPE))
-#define E_TABLE_MEMORY_CALLBACKS_GET_CLASS(k) (G_TYPE_INSTANCE_GET_CLASS((k), E_TABLE_MEMORY_CALLBACKS_TYPE, ETableMemoryCalbacksClass))
-
-typedef int         (*ETableMemoryCalbacksColumnCountFn)     (ETableModel *etm, void *data);
-typedef void        (*ETableMemoryCalbacksAppendRowFn)       (ETableModel *etm, ETableModel *model, int row, void *data);
-
-typedef	void       *(*ETableMemoryCalbacksValueAtFn)         (ETableModel *etm, int col, int row, void *data);
-typedef	void        (*ETableMemoryCalbacksSetValueAtFn)      (ETableModel *etm, int col, int row, const void *val, void *data);
-typedef	gboolean    (*ETableMemoryCalbacksIsCellEditableFn)  (ETableModel *etm, int col, int row, void *data);
-
-typedef	void       *(*ETableMemoryCalbacksDuplicateValueFn)  (ETableModel *etm, int col, const void *val, void *data);
-typedef	void        (*ETableMemoryCalbacksFreeValueFn)       (ETableModel *etm, int col, void *val, void *data);
-typedef void       *(*ETableMemoryCalbacksInitializeValueFn) (ETableModel *etm, int col, void *data);
-typedef gboolean    (*ETableMemoryCalbacksValueIsEmptyFn)    (ETableModel *etm, int col, const void *val, void *data);
-typedef char       *(*ETableMemoryCalbacksValueToStringFn)   (ETableModel *etm, int col, const void *val, void *data);
-
-typedef struct {
-	ETableMemory parent;
-
-	ETableMemoryCalbacksColumnCountFn     col_count;
-	ETableMemoryCalbacksAppendRowFn       append_row;
-
-	ETableMemoryCalbacksValueAtFn         value_at;
-	ETableMemoryCalbacksSetValueAtFn      set_value_at;
-	ETableMemoryCalbacksIsCellEditableFn  is_cell_editable;
-
-	ETableMemoryCalbacksDuplicateValueFn  duplicate_value;
-	ETableMemoryCalbacksFreeValueFn       free_value;
-	ETableMemoryCalbacksInitializeValueFn initialize_value;
-	ETableMemoryCalbacksValueIsEmptyFn    value_is_empty;
-	ETableMemoryCalbacksValueToStringFn   value_to_string;
-	void *data;
-} ETableMemoryCalbacks;
-
-typedef struct {
-	ETableMemoryClass parent_class;
-} ETableMemoryCalbacksClass;
-
-GType e_table_memory_callbacks_get_type (void);
-
-ETableModel *e_table_memory_callbacks_new (ETableMemoryCalbacksColumnCountFn col_count,
-
-				 ETableMemoryCalbacksValueAtFn value_at,
-				 ETableMemoryCalbacksSetValueAtFn set_value_at,
-				 ETableMemoryCalbacksIsCellEditableFn is_cell_editable,
-
-				 ETableMemoryCalbacksDuplicateValueFn duplicate_value,
-				 ETableMemoryCalbacksFreeValueFn free_value,
-				 ETableMemoryCalbacksInitializeValueFn initialize_value,
-				 ETableMemoryCalbacksValueIsEmptyFn value_is_empty,
-				 ETableMemoryCalbacksValueToStringFn value_to_string,
-				 void *data);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_MEMORY_CALLBACKS_H_ */
-
diff --git a/widgets/table/e-table-memory-store.c b/widgets/table/e-table-memory-store.c
deleted file mode 100644
index 69765b32ab..0000000000
--- a/widgets/table/e-table-memory-store.c
+++ /dev/null
@@ -1,583 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-memory-store.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <string.h>
-#include "e-table-memory-store.h"
-#include "gal/util/e-util.h"
-
-#define STORE_LOCATOR(etms, col, row) (*((etms)->priv->store + (row) * (etms)->priv->col_count + (col)))
-
-static ETableMemoryClass *parent_class;
-
-struct _ETableMemoryStorePrivate {
-	int col_count;
-	ETableMemoryStoreColumnInfo *columns;
-	void **store;
-};
-
-static void *
-duplicate_value (ETableMemoryStore *etms, int col, const void *val)
-{
-	switch (etms->priv->columns[col].type) {
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_STRING:
-		return g_strdup (val);
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_PIXBUF:
-		if (val)
-			gdk_pixbuf_ref ((void *) val);
-		return (void *) val;
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_OBJECT:
-		if (val)
-			g_object_ref ((void *) val);
-		return (void *) val;
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_CUSTOM:
-		if (etms->priv->columns[col].custom.duplicate_value)
-			return etms->priv->columns[col].custom.duplicate_value (E_TABLE_MODEL (etms), col, val, NULL);
-		break;
-	default:
-		break;
-	}
-	return (void *) val;
-}
-
-static void
-free_value (ETableMemoryStore *etms, int col, void *value)
-{
-	switch (etms->priv->columns[col].type) {
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_STRING:
-		g_free (value);
-		break;
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_PIXBUF:
-		if (value)
-			gdk_pixbuf_unref (value);
-		break;
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_OBJECT:
-		if (value)
-			g_object_unref (value);
-		break;
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_CUSTOM:
-		if (etms->priv->columns[col].custom.free_value)
-			etms->priv->columns[col].custom.free_value (E_TABLE_MODEL (etms), col, value, NULL);
-		break;
-	default:
-		break;
-	}
-}
-
-
-static int
-etms_column_count (ETableModel *etm)
-{
-	ETableMemoryStore *etms = E_TABLE_MEMORY_STORE(etm);
-
-	return etms->priv->col_count;
-}
-
-static void *
-etms_value_at (ETableModel *etm, int col, int row)
-{
-	ETableMemoryStore *etms = E_TABLE_MEMORY_STORE(etm);
-
-	return STORE_LOCATOR (etms, col, row);
-}
-
-static void
-etms_set_value_at (ETableModel *etm, int col, int row, const void *val)
-{
-	ETableMemoryStore *etms = E_TABLE_MEMORY_STORE(etm);
-
-	e_table_model_pre_change (etm);
-
-	STORE_LOCATOR (etms, col, row) = duplicate_value (etms, col, val);
-
-	e_table_model_cell_changed (etm, col, row);
-}
-
-static gboolean
-etms_is_cell_editable (ETableModel *etm, int col, int row)
-{
-	ETableMemoryStore *etms = E_TABLE_MEMORY_STORE(etm);
-
-	return etms->priv->columns[col].editable;
-}
-
-/* The default for etms_duplicate_value is to return the raw value. */
-static void *
-etms_duplicate_value (ETableModel *etm, int col, const void *value)
-{
-	ETableMemoryStore *etms = E_TABLE_MEMORY_STORE(etm);
-
-	return duplicate_value (etms, col, value);
-}
-
-static void
-etms_free_value (ETableModel *etm, int col, void *value)
-{
-	ETableMemoryStore *etms = E_TABLE_MEMORY_STORE(etm);
-
-	free_value (etms, col, value);
-}
-
-static void *
-etms_initialize_value (ETableModel *etm, int col)
-{
-	ETableMemoryStore *etms = E_TABLE_MEMORY_STORE(etm);
-	
-	switch (etms->priv->columns[col].type) {
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_STRING:
-		return g_strdup ("");
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_PIXBUF:
-		return NULL;
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_CUSTOM:
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_OBJECT:
-		if (etms->priv->columns[col].custom.initialize_value)
-			return etms->priv->columns[col].custom.initialize_value (E_TABLE_MODEL (etms), col, NULL);
-		break;
-	default:
-		break;
-	}
-	return 0;
-}
-
-static gboolean
-etms_value_is_empty (ETableModel *etm, int col, const void *value)
-{
-	ETableMemoryStore *etms = E_TABLE_MEMORY_STORE(etm);
-	
-	switch (etms->priv->columns[col].type) {
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_STRING:
-		return !(value && *(char *) value);
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_PIXBUF:
-		return value == NULL;
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_CUSTOM:
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_OBJECT:
-		if (etms->priv->columns[col].custom.value_is_empty)
-			return etms->priv->columns[col].custom.value_is_empty (E_TABLE_MODEL (etms), col, value, NULL);
-		break;
-	default:
-		break;
-	}
-	return value == 0;
-}
-
-static char *
-etms_value_to_string (ETableModel *etm, int col, const void *value)
-{
-	ETableMemoryStore *etms = E_TABLE_MEMORY_STORE(etm);
-	
-	switch (etms->priv->columns[col].type) {
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_STRING:
-		return g_strdup (value);
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_PIXBUF:
-		return g_strdup ("");
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_CUSTOM:
-	case E_TABLE_MEMORY_STORE_COLUMN_TYPE_OBJECT:
-		if (etms->priv->columns[col].custom.value_is_empty)
-			return etms->priv->columns[col].custom.value_to_string (E_TABLE_MODEL (etms), col, value, NULL);
-		break;
-	default:
-		break;
-	}
-	return g_strdup_printf ("%d", GPOINTER_TO_INT (value));
-}
-
-static void
-etms_append_row (ETableModel *etm, ETableModel *source, int row)
-{
-	ETableMemoryStore *etms = E_TABLE_MEMORY_STORE(etm);
-	void **new_data;
-	int i;
-	int row_count;
-
-	new_data = g_new (void *, etms->priv->col_count);
-
-	for (i = 0; i < etms->priv->col_count; i++) {
-		new_data[i] = e_table_model_value_at (source, i, row);
-	}
-
-	row_count = e_table_model_row_count (E_TABLE_MODEL (etms));
-
-	e_table_memory_store_insert_array (etms, row_count, new_data, NULL);
-}
-
-static void
-etms_finalize (GObject *obj)
-{
-	ETableMemoryStore *etms = (ETableMemoryStore *) obj;
-
-	if (etms->priv) {
-		e_table_memory_store_clear (etms);
-
-		g_free (etms->priv->columns);
-		g_free (etms->priv->store);
-		g_free (etms->priv);
-	}
-
-	if (G_OBJECT_CLASS (parent_class)->finalize)
-		G_OBJECT_CLASS (parent_class)->finalize (obj);
-}
-	
-static void
-e_table_memory_store_init (ETableMemoryStore *etms)
-{
-	etms->priv            = g_new (ETableMemoryStorePrivate, 1);
-
-	etms->priv->col_count = 0;
-	etms->priv->columns   = NULL;
-	etms->priv->store     = NULL;
-}
-
-static void
-e_table_memory_store_class_init (GObjectClass *object_class)
-{
-	ETableModelClass *model_class = (ETableModelClass *) object_class;
-
-	parent_class = g_type_class_peek_parent (object_class);
-
-	object_class->finalize	      = etms_finalize;
-
-	model_class->column_count     = etms_column_count;
-	model_class->value_at         = etms_value_at;
-	model_class->set_value_at     = etms_set_value_at;
-	model_class->is_cell_editable = etms_is_cell_editable;
-	model_class->duplicate_value  = etms_duplicate_value;
-	model_class->free_value       = etms_free_value;
-	model_class->initialize_value = etms_initialize_value;
-	model_class->value_is_empty   = etms_value_is_empty;
-	model_class->value_to_string  = etms_value_to_string;
-	model_class->append_row       = etms_append_row;
-}
-
-E_MAKE_TYPE(e_table_memory_store, "ETableMemoryStore", ETableMemoryStore, e_table_memory_store_class_init, e_table_memory_store_init, E_TABLE_MEMORY_TYPE)
-
-/**
- * e_table_memory_store_new:
- * @col_count:
- * @value_at:
- * @set_value_at:
- * @is_cell_editable:
- * @duplicate_value:
- * @free_value:
- * @initialize_value:
- * @value_is_empty:
- * @value_to_string:
- * @data: closure pointer.
- *
- * This initializes a new ETableMemoryStoreModel object.  ETableMemoryStoreModel is
- * an implementaiton of the abstract class ETableModel.  The ETableMemoryStoreModel
- * is designed to allow people to easily create ETableModels without having
- * to create a new GtkType derived from ETableModel every time they need one.
- *
- * Instead, ETableMemoryStoreModel uses a setup based in callback functions, every
- * callback function signature mimics the signature of each ETableModel method
- * and passes the extra @data pointer to each one of the method to provide them
- * with any context they might want to use. 
- *
- * Returns: An ETableMemoryStoreModel object (which is also an ETableModel
- * object).
- */
-ETableModel *
-e_table_memory_store_new (ETableMemoryStoreColumnInfo *columns)
-{
-	ETableMemoryStore *et = g_object_new (E_TABLE_MEMORY_STORE_TYPE, NULL);
-
-	if (e_table_memory_store_construct (et, columns)) {
-		return (ETableModel *) et;
-	} else {
-		g_object_unref (et);
-		return NULL;
-	}
-}
-
-ETableModel *
-e_table_memory_store_construct (ETableMemoryStore *etms, ETableMemoryStoreColumnInfo *columns)
-{
-	int i;
-	for (i = 0; columns[i].type != E_TABLE_MEMORY_STORE_COLUMN_TYPE_TERMINATOR; i++)
-		/* Intentionally blank */;
-	etms->priv->col_count = i;
-
-	etms->priv->columns = g_new (ETableMemoryStoreColumnInfo, etms->priv->col_count + 1);
-
-	memcpy (etms->priv->columns, columns, (etms->priv->col_count + 1) * sizeof (ETableMemoryStoreColumnInfo));
-
-	return E_TABLE_MODEL (etms);
-}
-				
-
-void
-e_table_memory_store_adopt_value_at (ETableMemoryStore *etms, int col, int row, void *value)
-{
-	e_table_model_pre_change (E_TABLE_MODEL (etms));
-
-	STORE_LOCATOR (etms, col, row) = value;
-
-	e_table_model_cell_changed (E_TABLE_MODEL (etms), col, row);
-}
-
-/* The size of these arrays is the number of columns. */
-void
-e_table_memory_store_insert_array (ETableMemoryStore *etms, int row, void **store, gpointer data)
-{
-	int row_count;
-	int i;
-
-	row_count = e_table_model_row_count (E_TABLE_MODEL (etms)) + 1;
-	if (row == -1)
-		row = row_count - 1;
-	etms->priv->store = g_realloc (etms->priv->store, etms->priv->col_count * row_count * sizeof (void *));
-	memmove (etms->priv->store + etms->priv->col_count * (row + 1),
-		 etms->priv->store + etms->priv->col_count * row,
-		 etms->priv->col_count * (row_count - row - 1) * sizeof (void *));
-
-	for (i = 0; i < etms->priv->col_count; i++) {
-		STORE_LOCATOR(etms, i, row) = duplicate_value(etms, i, store[i]);
-	}
-
-	e_table_memory_insert (E_TABLE_MEMORY (etms), row, data);
-}
-
-void
-e_table_memory_store_insert (ETableMemoryStore *etms, int row, gpointer data, ...)
-{
-	void **store;
-	va_list args;
-	int i;
-
-	store = g_new (void *, etms->priv->col_count + 1);
-
-	va_start (args, data);
-	for (i = 0; i < etms->priv->col_count; i++) {
-		store[i] = va_arg (args, void *);
-	}
-	va_end (args);
-
-	e_table_memory_store_insert_array (etms, row, store, data);
-
-	g_free (store);
-}
-
-void
-e_table_memory_store_insert_adopt_array (ETableMemoryStore *etms, int row, void **store, gpointer data)
-{
-	int row_count;
-	int i;
-
-	row_count = e_table_model_row_count (E_TABLE_MODEL (etms)) + 1;
-	if (row == -1)
-		row = row_count - 1;
-	etms->priv->store = g_realloc (etms->priv->store, etms->priv->col_count * row_count * sizeof (void *));
-	memmove (etms->priv->store + etms->priv->col_count * (row + 1),
-		 etms->priv->store + etms->priv->col_count * row,
-		 etms->priv->col_count * (row_count - row - 1) * sizeof (void *));
-
-	for (i = 0; i < etms->priv->col_count; i++) {
-		STORE_LOCATOR(etms, i, row) = store[i];
-	}
-
-	e_table_memory_insert (E_TABLE_MEMORY (etms), row, data);
-}
-
-void
-e_table_memory_store_insert_adopt (ETableMemoryStore *etms, int row, gpointer data, ...)
-{
-	void **store;
-	va_list args;
-	int i;
-
-	store = g_new (void *, etms->priv->col_count + 1);
-
-	va_start (args, data);
-	for (i = 0; i < etms->priv->col_count; i++) {
-		store[i] = va_arg (args, void *);
-	}
-	va_end (args);
-
-	e_table_memory_store_insert_adopt_array (etms, row, store, data);
-
-	g_free (store);
-}
-
-/**
- * e_table_memory_store_change_array:
- * @etms: the ETabelMemoryStore.
- * @row:  the row we're changing.
- * @store: an array of new values to fill the row
- * @data: the new closure to associate with this row.
- *
- * frees existing values associated with a row and replaces them with
- * duplicates of the values in store.
- *
- */
-void
-e_table_memory_store_change_array (ETableMemoryStore *etms, int row, void **store, gpointer data)
-{
-	int i;
-
-	g_return_if_fail (row >= 0 && row < e_table_model_row_count (E_TABLE_MODEL (etms)));
-
-	e_table_model_pre_change (E_TABLE_MODEL (etms));
-
-	for (i = 0; i < etms->priv->col_count; i++) {
-		free_value (etms, i, STORE_LOCATOR(etms, i, row));
-		STORE_LOCATOR(etms, i, row) = duplicate_value(etms, i, store[i]);
-	}
-
-	e_table_memory_set_data (E_TABLE_MEMORY (etms), row, data);
-	e_table_model_row_changed (E_TABLE_MODEL (etms), row);
-}
-
-/**
- * e_table_memory_store_change:
- * @etms: the ETabelMemoryStore.
- * @row:  the row we're changing.
- * @data: the new closure to associate with this row.
- *
- * a varargs version of e_table_memory_store_change_array.  you must
- * pass in etms->col_count args.
- */
-void
-e_table_memory_store_change (ETableMemoryStore *etms, int row, gpointer data, ...)
-{
-	void **store;
-	va_list args;
-	int i;
-
-	g_return_if_fail (row >= 0 && row < e_table_model_row_count (E_TABLE_MODEL (etms)));
-
-	store = g_new0 (void *, etms->priv->col_count + 1);
-
-	va_start (args, data);
-	for (i = 0; i < etms->priv->col_count; i++) {
-		store[i] = va_arg (args, void *);
-	}
-	va_end (args);
-
-	e_table_memory_store_change_array (etms, row, store, data);
-
-	g_free (store);
-}
-
-/**
- * e_table_memory_store_change_adopt_array:
- * @etms: the ETableMemoryStore
- * @row: the row we're changing.
- * @store: an array of new values to fill the row
- * @data: the new closure to associate with this row.
- *
- * frees existing values for the row and stores the values from store
- * into it.  This function differs from
- * e_table_memory_storage_change_adopt_array in that it does not
- * duplicate the data.
- */
-void
-e_table_memory_store_change_adopt_array (ETableMemoryStore *etms, int row, void **store, gpointer data)
-{
-	int i;
-
-	g_return_if_fail (row >= 0 && row < e_table_model_row_count (E_TABLE_MODEL (etms)));
-
-	for (i = 0; i < etms->priv->col_count; i++) {
-		free_value (etms, i, STORE_LOCATOR(etms, i, row));
-		STORE_LOCATOR(etms, i, row) = store[i];
-	}
-
-	e_table_memory_set_data (E_TABLE_MEMORY (etms), row, data);
-	e_table_model_row_changed (E_TABLE_MODEL (etms), row);
-}
-
-/**
- * e_table_memory_store_change_adopt
- * @etms: the ETabelMemoryStore.
- * @row:  the row we're changing.
- * @data: the new closure to associate with this row.
- *
- * a varargs version of e_table_memory_store_change_adopt_array.  you
- * must pass in etms->col_count args.
- */
-void
-e_table_memory_store_change_adopt (ETableMemoryStore *etms, int row, gpointer data, ...)
-{
-	void **store;
-	va_list args;
-	int i;
-
-	g_return_if_fail (row >= 0 && row < e_table_model_row_count (E_TABLE_MODEL (etms)));
-
-	store = g_new0 (void *, etms->priv->col_count + 1);
-
-	va_start (args, data);
-	for (i = 0; i < etms->priv->col_count; i++) {
-		store[i] = va_arg (args, void *);
-	}
-	va_end (args);
-
-	e_table_memory_store_change_adopt_array (etms, row, store, data);
-
-	g_free (store);
-}
-
-void
-e_table_memory_store_remove (ETableMemoryStore *etms, int row)
-{
-	ETableModel *model;
-	int column_count, row_count;
-	int i;
-
-	model = E_TABLE_MODEL (etms);
-	column_count = e_table_model_column_count (model);
-
-	for (i = 0; i < column_count; i ++)
-		e_table_model_free_value (model, i, e_table_model_value_at (model, i, row));
-
-	row_count = e_table_model_row_count (E_TABLE_MODEL (etms)) - 1;
-	memmove (etms->priv->store + etms->priv->col_count * row,
-		 etms->priv->store + etms->priv->col_count * (row + 1),
-		 etms->priv->col_count * (row_count - row) * sizeof (void *));
-	etms->priv->store = g_realloc (etms->priv->store, etms->priv->col_count * row_count * sizeof (void *));
-
-	e_table_memory_remove (E_TABLE_MEMORY (etms), row);
-}
-
-void
-e_table_memory_store_clear (ETableMemoryStore *etms)
-{
-	ETableModel *model;
-	int row_count, column_count;
-	int i, j;
-
-	model = E_TABLE_MODEL (etms);
-	row_count = e_table_model_row_count (model);
-	column_count = e_table_model_column_count (model);
-
-	for (i = 0; i < row_count; i ++) {
-		for (j = 0; j < column_count; j ++) {
-			e_table_model_free_value (model, j, e_table_model_value_at (model, j, i));
-		}
-	}
-
-	e_table_memory_clear (E_TABLE_MEMORY (etms));
-
-	g_free (etms->priv->store);
-	etms->priv->store = NULL;
-}
diff --git a/widgets/table/e-table-memory-store.h b/widgets/table/e-table-memory-store.h
deleted file mode 100644
index 54306da236..0000000000
--- a/widgets/table/e-table-memory-store.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-memory-store.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_MEMORY_STORE_H_
-#define _E_TABLE_MEMORY_STORE_H_
-
-#include <gal/e-table/e-table-memory.h>
-#include <gal/e-table/e-table-memory-callbacks.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_MEMORY_STORE_TYPE        (e_table_memory_store_get_type ())
-#define E_TABLE_MEMORY_STORE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_MEMORY_STORE_TYPE, ETableMemoryStore))
-#define E_TABLE_MEMORY_STORE_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_MEMORY_STORE_TYPE, ETableMemoryStoreClass))
-#define E_IS_TABLE_MEMORY_STORE(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_MEMORY_STORE_TYPE))
-#define E_IS_TABLE_MEMORY_STORE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_MEMORY_STORE_TYPE))
-#define E_TABLE_MEMORY_STORE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TABLE_MEMORY_STORE_TYPE, ETableMemoryStoreClass))
-
-typedef enum {
-	E_TABLE_MEMORY_STORE_COLUMN_TYPE_TERMINATOR,
-	E_TABLE_MEMORY_STORE_COLUMN_TYPE_INTEGER,
-	E_TABLE_MEMORY_STORE_COLUMN_TYPE_STRING,
-	E_TABLE_MEMORY_STORE_COLUMN_TYPE_PIXBUF,
-	E_TABLE_MEMORY_STORE_COLUMN_TYPE_OBJECT,
-	E_TABLE_MEMORY_STORE_COLUMN_TYPE_CUSTOM
-} ETableMemoryStoreColumnType;
-
-typedef struct {
-	ETableMemoryCalbacksDuplicateValueFn  duplicate_value;
-	ETableMemoryCalbacksFreeValueFn       free_value;
-	ETableMemoryCalbacksInitializeValueFn initialize_value;
-	ETableMemoryCalbacksValueIsEmptyFn    value_is_empty;
-	ETableMemoryCalbacksValueToStringFn   value_to_string;
-} ETableMemoryStoreCustomColumn;
-
-typedef struct {
-	ETableMemoryStoreColumnType   type;
-	ETableMemoryStoreCustomColumn custom;
-	guint                         editable : 1;
-} ETableMemoryStoreColumnInfo;
-
-#define E_TABLE_MEMORY_STORE_TERMINATOR { E_TABLE_MEMORY_STORE_COLUMN_TYPE_TERMINATOR, { NULL }, FALSE }
-#define E_TABLE_MEMORY_STORE_INTEGER { E_TABLE_MEMORY_STORE_COLUMN_TYPE_INTEGER, { NULL }, FALSE }
-#define E_TABLE_MEMORY_STORE_STRING { E_TABLE_MEMORY_STORE_COLUMN_TYPE_STRING, { NULL }, FALSE }
-#define E_TABLE_MEMORY_STORE_PIXBUF { E_TABLE_MEMORY_STORE_COLUMN_TYPE_PIXBUF, { NULL }, FALSE }
-#define E_TABLE_MEMORY_STORE_EDITABLE_STRING { E_TABLE_MEMORY_STORE_COLUMN_TYPE_STRING, { NULL }, TRUE }
-#define E_TABLE_MEMORY_STORE_CUSTOM(editable, duplicate, free, initialize, empty, string) \
-        { E_TABLE_MEMORY_STORE_COLUMN_TYPE_CUSTOM, \
-             { (duplicate), (free), (initialize), (empty), (string) }, editable }
-#define E_TABLE_MEMORY_STORE_OBJECT(editable, initialize, empty, string) \
-        { E_TABLE_MEMORY_STORE_COLUMN_TYPE_CUSTOM, \
-             { NULL, NULL, (initialize), (empty), (string) }, editable }
-
-typedef struct _ETableMemoryStorePrivate ETableMemoryStorePrivate;
-
-typedef struct {
-	ETableMemory parent;
-
-	ETableMemoryStorePrivate *priv;
-} ETableMemoryStore;
-
-typedef struct {
-	ETableMemoryClass parent_class;
-} ETableMemoryStoreClass;
-
-GType        e_table_memory_store_get_type            (void);
-
-/* Object Creation */
-ETableModel *e_table_memory_store_new                 (ETableMemoryStoreColumnInfo  *columns);
-ETableModel *e_table_memory_store_construct           (ETableMemoryStore            *store,
-						       ETableMemoryStoreColumnInfo  *columns);
-
-/* Adopt a value instead of copying it. */
-void         e_table_memory_store_adopt_value_at      (ETableMemoryStore            *etms,
-						       int                           col,
-						       int                           row,
-						       void                         *value);
-
-/* The size of these arrays is the number of columns. */
-void         e_table_memory_store_insert_array        (ETableMemoryStore            *etms,
-						       int                           row,
-						       void                        **store,
-						       gpointer                      data);
-void         e_table_memory_store_insert              (ETableMemoryStore            *etms,
-						       int                           row,
-						       gpointer                      data,
-						       ...);
-void         e_table_memory_store_insert_adopt        (ETableMemoryStore            *etms,
-						       int                           row,
-						       gpointer                      data,
-						       ...);
-void         e_table_memory_store_insert_adopt_array  (ETableMemoryStore            *etms,
-						       int                           row,
-						       void                        **store,
-						       gpointer                      data);
-void         e_table_memory_store_change_array        (ETableMemoryStore            *etms,
-						       int                           row,
-						       void                        **store,
-						       gpointer                      data);
-void         e_table_memory_store_change              (ETableMemoryStore            *etms,
-						       int                           row,
-						       gpointer                      data,
-						       ...);
-void         e_table_memory_store_change_adopt        (ETableMemoryStore            *etms,
-						       int                           row,
-						       gpointer                      data,
-						       ...);
-void         e_table_memory_store_change_adopt_array  (ETableMemoryStore            *etms,
-						       int                           row,
-						       void                        **store,
-						       gpointer                      data);
-void         e_table_memory_store_remove              (ETableMemoryStore            *etms,
-						       int                           row);
-void         e_table_memory_store_clear               (ETableMemoryStore            *etms);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_MEMORY_STORE_H_ */
diff --git a/widgets/table/e-table-memory.c b/widgets/table/e-table-memory.c
deleted file mode 100644
index 7d9958bbd6..0000000000
--- a/widgets/table/e-table-memory.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-memory.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include "e-table-memory.h"
-
-#include <stdio.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-
-#include "gal/util/e-util.h"
-#include "gal/util/e-xml-utils.h"
-#include <string.h>
-
-static ETableModel *parent_class;
-
-struct ETableMemoryPriv {
-	gpointer *data;
-	int num_rows;
-	gint frozen;
-};
-
-
-/* virtual methods */
-
-static void
-etmm_finalize (GObject *object)
-{
-	ETableMemory *etmm = E_TABLE_MEMORY (object);
-	ETableMemoryPriv *priv = etmm->priv;
-
-	/* XXX lots of stuff to free here */
-	if (priv) {
-		g_free (priv->data);
-		g_free (priv);
-	}
-	etmm->priv = NULL;
-
-	G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-static int
-etmm_row_count (ETableModel *etm)
-{
-	ETableMemory *etmm = E_TABLE_MEMORY (etm);
-
-	return etmm->priv->num_rows;
-}
-
-
-static void
-e_table_memory_class_init (GObjectClass *klass)
-{
-	ETableModelClass *table_class = (ETableModelClass *) klass;
-
-	parent_class               = g_type_class_peek_parent (klass);
-	
-	klass->finalize            = etmm_finalize;
-
-	table_class->row_count     = etmm_row_count;
-}
-
-static void
-e_table_memory_init (GObject *object)
-{
-	ETableMemory *etmm = (ETableMemory *)object;
-
-	ETableMemoryPriv *priv;
-
-	priv = g_new0 (ETableMemoryPriv, 1);
-	etmm->priv = priv;
-
-	priv->data = NULL;
-	priv->num_rows = 0;
-	priv->frozen = 0;
-}
-
-E_MAKE_TYPE(e_table_memory, "ETableMemory", ETableMemory, e_table_memory_class_init, e_table_memory_init, E_TABLE_MODEL_TYPE)
-
-
-
-/**
- * e_table_memory_new
- *
- * XXX docs here.
- *
- * return values: a newly constructed ETableMemory.
- */
-ETableMemory *
-e_table_memory_new (void)
-{
-	return g_object_new (E_TABLE_MEMORY_TYPE, NULL);
-}
-
-/**
- * e_table_memory_get_data:
- * @etmm: 
- * @row: 
- * 
- * 
- * 
- * Return value: 
- **/
-gpointer
-e_table_memory_get_data (ETableMemory *etmm, int row)
-{
-	g_return_val_if_fail(row >= 0, NULL);
-	g_return_val_if_fail(row < etmm->priv->num_rows, NULL);
-
-	return etmm->priv->data[row];
-}
-
-/**
- * e_table_memory_set_data:
- * @etmm: 
- * @row: 
- * @data: 
- * 
- * 
- **/
-void
-e_table_memory_set_data (ETableMemory *etmm, int row, gpointer data)
-{
-	g_return_if_fail(row >= 0);
-	g_return_if_fail(row < etmm->priv->num_rows);
-
-	etmm->priv->data[row] = data;
-}
-
-/**
- * e_table_memory_insert:
- * @table_model: 
- * @parent_path: 
- * @position: 
- * @data: 
- * 
- * 
- * 
- * Return value: 
- **/
-void
-e_table_memory_insert (ETableMemory *etmm,
-		       int row,
-		       gpointer data)
-{
-	g_return_if_fail(row >= -1);
-	g_return_if_fail(row <= etmm->priv->num_rows);
-
-	if (!etmm->priv->frozen)
-		e_table_model_pre_change(E_TABLE_MODEL(etmm));
-
-	if (row == -1)
-		row = etmm->priv->num_rows;
-	etmm->priv->data = g_renew(gpointer, etmm->priv->data, etmm->priv->num_rows + 1);
-	memmove(etmm->priv->data + row + 1, etmm->priv->data + row, (etmm->priv->num_rows - row) * sizeof (gpointer));
-	etmm->priv->data[row] = data;
-	etmm->priv->num_rows ++;
-	if (!etmm->priv->frozen)
-		e_table_model_row_inserted(E_TABLE_MODEL(etmm), row);
-}
-
-
-
-/**
- * e_table_memory_remove:
- * @etable: 
- * @path: 
- * 
- * 
- * 
- * Return value: 
- **/
-gpointer
-e_table_memory_remove (ETableMemory *etmm, int row)
-{
-	gpointer ret;
-
-	g_return_val_if_fail(row >= 0, NULL);
-	g_return_val_if_fail(row < etmm->priv->num_rows, NULL);
-
-	if (!etmm->priv->frozen)
-		e_table_model_pre_change(E_TABLE_MODEL(etmm));
-	ret = etmm->priv->data[row];
-	memmove(etmm->priv->data + row, etmm->priv->data + row + 1, (etmm->priv->num_rows - row - 1) * sizeof (gpointer));
-	etmm->priv->num_rows --;
-	if (!etmm->priv->frozen)
-		e_table_model_row_deleted(E_TABLE_MODEL(etmm), row);
-	return ret;
-}
-
-/**
- * e_table_memory_clear:
- * @etable: 
- * @path: 
- * 
- * 
- * 
- * Return value: 
- **/
-void
-e_table_memory_clear (ETableMemory *etmm)
-{
-	if (!etmm->priv->frozen)
-		e_table_model_pre_change(E_TABLE_MODEL(etmm));
-	g_free(etmm->priv->data);
-	etmm->priv->data = NULL;
-	etmm->priv->num_rows = 0;
-	if (!etmm->priv->frozen)
-		e_table_model_changed(E_TABLE_MODEL(etmm));
-}
-
-/**
- * e_table_memory_freeze:
- * @etmm: the ETableModel to freeze.
- * 
- * This function prepares an ETableModel for a period of much change.
- * All signals regarding changes to the table are deferred until we
- * thaw the table.
- * 
- **/
-void
-e_table_memory_freeze(ETableMemory *etmm)
-{
-	ETableMemoryPriv *priv = etmm->priv;
-
-	if (priv->frozen == 0)
-		e_table_model_pre_change(E_TABLE_MODEL(etmm));
-
-	priv->frozen ++;
-}
-
-/**
- * e_table_memory_thaw:
- * @etmm: the ETableMemory to thaw.
- * 
- * This function thaws an ETableMemory.  All the defered signals can add
- * up to a lot, we don't know - so we just emit a model_changed
- * signal.
- * 
- **/
-void
-e_table_memory_thaw(ETableMemory *etmm)
-{
-	ETableMemoryPriv *priv = etmm->priv;
-
-	if (priv->frozen > 0)
-		priv->frozen --;
-	if (priv->frozen == 0) {
-		e_table_model_changed(E_TABLE_MODEL(etmm));
-	}
-}
diff --git a/widgets/table/e-table-memory.h b/widgets/table/e-table-memory.h
deleted file mode 100644
index c1b3cd45f8..0000000000
--- a/widgets/table/e-table-memory.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-memory.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_MEMORY_H_
-#define _E_TABLE_MEMORY_H_
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gal/e-table/e-table-model.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_MEMORY_TYPE        (e_table_memory_get_type ())
-#define E_TABLE_MEMORY(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_MEMORY_TYPE, ETableMemory))
-#define E_TABLE_MEMORY_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_MEMORY_TYPE, ETableMemoryClass))
-#define E_IS_TABLE_MEMORY(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_MEMORY_TYPE))
-#define E_IS_TABLE_MEMORY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_MEMORY_TYPE))
-#define E_TABLE_MEMORY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TABLE_MEMORY_TYPE, ETableMemoryClass))
-
-typedef struct ETableMemory ETableMemory;
-typedef struct ETableMemoryPriv ETableMemoryPriv;
-typedef struct ETableMemoryClass ETableMemoryClass;
-
-struct ETableMemory {
-	ETableModel base;
-	ETableMemoryPriv *priv;
-};
-
-struct ETableMemoryClass {
-	ETableModelClass parent_class;
-};
-
-
-GType         e_table_memory_get_type     (void);
-void          e_table_memory_construct    (ETableMemory *etable);
-ETableMemory *e_table_memory_new          (void);
-
-/* row operations */
-void          e_table_memory_insert  (ETableMemory *etable,
-				      int           row,
-				      gpointer      data);
-gpointer      e_table_memory_remove  (ETableMemory *etable,
-				      int           row);
-void          e_table_memory_clear   (ETableMemory *etable);
-
-/* Freeze and thaw */
-void          e_table_memory_freeze       (ETableMemory *etable);
-void          e_table_memory_thaw         (ETableMemory *etable);
-gpointer      e_table_memory_get_data     (ETableMemory *etm,
-					   int           row);
-void          e_table_memory_set_data     (ETableMemory *etm,
-					   int           row,
-					   gpointer      data);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_MEMORY_H */
diff --git a/widgets/table/e-table-model.c b/widgets/table/e-table-model.c
deleted file mode 100644
index 67c443c8c6..0000000000
--- a/widgets/table/e-table-model.c
+++ /dev/null
@@ -1,616 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-model.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <glib-object.h>
-#include "e-table-model.h"
-#include "gal/util/e-util.h"
-#include "gal/util/e-marshal.h"
-
-#define ETM_CLASS(e) (E_TABLE_MODEL_GET_CLASS (e))
-#define ETM_FROZEN(e) (GPOINTER_TO_INT (g_object_get_data (G_OBJECT(e), "frozen")) != 0)
-
-#define d(x)
-
-d(static gint depth = 0;)
-
-
-static GObjectClass *e_table_model_parent_class;
-
-enum {
-	MODEL_NO_CHANGE,
-	MODEL_CHANGED,
-	MODEL_PRE_CHANGE,
-	MODEL_ROW_CHANGED,
-	MODEL_CELL_CHANGED,
-	MODEL_ROWS_INSERTED,
-	MODEL_ROWS_DELETED,
-	ROW_SELECTION,
-	LAST_SIGNAL
-};
-
-static guint e_table_model_signals [LAST_SIGNAL] = { 0, };
-
-/**
- * e_table_model_column_count:
- * @e_table_model: The e-table-model to operate on
- *
- * Returns: the number of columns in the table model.
- */
-int
-e_table_model_column_count (ETableModel *e_table_model)
-{
-	g_return_val_if_fail (e_table_model != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), 0);
-
-	return ETM_CLASS (e_table_model)->column_count (e_table_model);
-}
-
-
-/**
- * e_table_model_row_count:
- * @e_table_model: the e-table-model to operate on
- *
- * Returns: the number of rows in the Table model.
- */
-int
-e_table_model_row_count (ETableModel *e_table_model)
-{
-	g_return_val_if_fail (e_table_model != NULL, 0);
-	g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), 0);
-
-	return ETM_CLASS (e_table_model)->row_count (e_table_model);
-}
-
-/**
- * e_table_model_append_row:
- * @e_table_model: the table model to append the a row to.
- * @source:
- * @row:
- *
- */
-void
-e_table_model_append_row (ETableModel *e_table_model, ETableModel *source, int row)
-{
-	g_return_if_fail (e_table_model != NULL);
-	g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
-	if (ETM_CLASS (e_table_model)->append_row)
-		ETM_CLASS (e_table_model)->append_row (e_table_model, source, row);
-}
-
-/**
- * e_table_value_at:
- * @e_table_model: the e-table-model to operate on
- * @col: column in the model to pull data from.
- * @row: row in the model to pull data from.
- *
- * Return value: This function returns the value that is stored
- * by the @e_table_model in column @col and row @row.  The data
- * returned can be a pointer or any data value that can be stored
- * inside a pointer.
- *
- * The data returned is typically used by an ECell renderer.
- *
- * The data returned must be valid until the model sends a signal that
- * affect that piece of data.  model_changed affects all data.
- * row_changed affects the data in that row.  cell_changed affects the
- * data in that cell.  rows_deleted affects all data in those rows.
- * rows_inserted and no_change don't affect any data in this way.
- **/
-void *
-e_table_model_value_at (ETableModel *e_table_model, int col, int row)
-{
-	g_return_val_if_fail (e_table_model != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
-
-	return ETM_CLASS (e_table_model)->value_at (e_table_model, col, row);
-}
-
-/**
- * e_table_model_set_value_at:
- * @e_table_model: the table model to operate on.
- * @col: the column where the data will be stored in the model.
- * @row: the row where the data will be stored in the model. 
- * @value: the data to be stored.
- *
- * This function instructs the model to store the value in @data in the
- * the @e_table_model at column @col and row @row.  The @data typically
- * comes from one of the ECell rendering objects.
- *
- * There should be an agreement between the Table Model and the user
- * of this function about the data being stored.  Typically it will
- * be a pointer to a set of data, or a datum that fits inside a void *.
- */
-void
-e_table_model_set_value_at (ETableModel *e_table_model, int col, int row, const void *value)
-{
-	g_return_if_fail (e_table_model != NULL);
-	g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
-	ETM_CLASS (e_table_model)->set_value_at (e_table_model, col, row, value);
-}
-
-/**
- * e_table_model_is_cell_editable:
- * @e_table_model: the table model to query.
- * @col: column to query.
- * @row: row to query.
- *
- * Returns: %TRUE if the cell in @e_table_model at @col,@row can be
- * edited, %FALSE otherwise
- */
-gboolean
-e_table_model_is_cell_editable (ETableModel *e_table_model, int col, int row)
-{
-	g_return_val_if_fail (e_table_model != NULL, FALSE);
-	g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), FALSE);
-
-	return ETM_CLASS (e_table_model)->is_cell_editable (e_table_model, col, row);
-}
-
-
-void *
-e_table_model_duplicate_value (ETableModel *e_table_model, int col, const void *value)
-{
-	g_return_val_if_fail (e_table_model != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
-
-	if (ETM_CLASS (e_table_model)->duplicate_value)
-		return ETM_CLASS (e_table_model)->duplicate_value (e_table_model, col, value);
-	else
-		return NULL;
-}
-
-void
-e_table_model_free_value (ETableModel *e_table_model, int col, void *value)
-{
-	g_return_if_fail (e_table_model != NULL);
-	g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
-	if (ETM_CLASS (e_table_model)->free_value)
-		ETM_CLASS (e_table_model)->free_value (e_table_model, col, value);
-}
-
-gboolean
-e_table_model_has_save_id (ETableModel *e_table_model)
-{
-	g_return_val_if_fail (e_table_model != NULL, FALSE);
-	g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), FALSE);
-
-	if (ETM_CLASS (e_table_model)->has_save_id)
-		return ETM_CLASS (e_table_model)->has_save_id (e_table_model);
-	else
-		return FALSE;
-}
-
-char *
-e_table_model_get_save_id (ETableModel *e_table_model, int row)
-{
-	g_return_val_if_fail (e_table_model != NULL, "/");
-	g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), "/");
-
-	if (ETM_CLASS (e_table_model)->get_save_id)
-		return ETM_CLASS (e_table_model)->get_save_id (e_table_model, row);
-	else
-		return NULL;
-}
-
-gboolean
-e_table_model_has_change_pending(ETableModel *e_table_model)
-{
-	g_return_val_if_fail (e_table_model != NULL, FALSE);
-	g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), FALSE);
-
-	if (ETM_CLASS (e_table_model)->has_change_pending)
-		return ETM_CLASS (e_table_model)->has_change_pending (e_table_model);
-	else
-		return FALSE;
-}
-
-void *
-e_table_model_initialize_value (ETableModel *e_table_model, int col)
-{
-	g_return_val_if_fail (e_table_model != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
-
-	if (ETM_CLASS (e_table_model)->initialize_value)
-		return ETM_CLASS (e_table_model)->initialize_value (e_table_model, col);
-	else
-		return NULL;
-}
-
-gboolean
-e_table_model_value_is_empty (ETableModel *e_table_model, int col, const void *value)
-{
-	g_return_val_if_fail (e_table_model != NULL, FALSE);
-	g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), FALSE);
-
-	if (ETM_CLASS (e_table_model)->value_is_empty)
-		return ETM_CLASS (e_table_model)->value_is_empty (e_table_model, col, value);
-	else
-		return FALSE;
-}
-
-char *
-e_table_model_value_to_string (ETableModel *e_table_model, int col, const void *value)
-{
-	g_return_val_if_fail (e_table_model != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE_MODEL (e_table_model), NULL);
-
-	if (ETM_CLASS (e_table_model)->value_to_string)
-		return ETM_CLASS (e_table_model)->value_to_string (e_table_model, col, value);
-	else
-		return g_strdup("");
-}
-
-static void
-e_table_model_finalize (GObject *object)
-{
-	if (e_table_model_parent_class->finalize)
-		(*e_table_model_parent_class->finalize)(object);
-}
-
-static void
-e_table_model_class_init (GObjectClass *object_class)
-{
-	ETableModelClass *klass = E_TABLE_MODEL_CLASS(object_class);
-	e_table_model_parent_class = g_type_class_peek_parent (object_class);
-	
-	object_class->finalize = e_table_model_finalize;
-
-	e_table_model_signals [MODEL_NO_CHANGE] =
-		g_signal_new ("model_no_change",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableModelClass, model_no_change),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
-
-
-	e_table_model_signals [MODEL_CHANGED] =
-		g_signal_new ("model_changed",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableModelClass, model_changed),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
-
-	e_table_model_signals [MODEL_PRE_CHANGE] =
-		g_signal_new ("model_pre_change",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableModelClass, model_pre_change),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
-
-	e_table_model_signals [MODEL_ROW_CHANGED] =
-		g_signal_new ("model_row_changed",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableModelClass, model_row_changed),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__INT,
-			      G_TYPE_NONE, 1, G_TYPE_INT);
-
-	e_table_model_signals [MODEL_CELL_CHANGED] =
-		g_signal_new ("model_cell_changed",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableModelClass, model_cell_changed),
-			      (GSignalAccumulator) NULL, NULL,
-			      e_marshal_VOID__INT_INT,
-			      G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
-
-	e_table_model_signals [MODEL_ROWS_INSERTED] =
-		g_signal_new ("model_rows_inserted",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableModelClass, model_rows_inserted),
-			      (GSignalAccumulator) NULL, NULL,
-			      e_marshal_VOID__INT_INT,
-			      G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
-
-	e_table_model_signals [MODEL_ROWS_DELETED] =
-		g_signal_new ("model_rows_deleted",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableModelClass, model_rows_deleted),
-			      (GSignalAccumulator) NULL, NULL,
-			      e_marshal_VOID__INT_INT,
-			      G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
-
-	klass->column_count        = NULL;     
-	klass->row_count           = NULL;        
-	klass->append_row          = NULL;
-
-	klass->value_at            = NULL;         
-	klass->set_value_at        = NULL;     
-	klass->is_cell_editable    = NULL; 
-
-	klass->has_save_id         = NULL;
-	klass->get_save_id         = NULL;
-
-	klass->has_change_pending  = NULL;
-
-	klass->duplicate_value     = NULL;  
-	klass->free_value          = NULL;       
-	klass->initialize_value    = NULL; 
-	klass->value_is_empty      = NULL;   
-	klass->value_to_string     = NULL;
-
-	klass->model_no_change     = NULL;    
-	klass->model_changed       = NULL;    
-	klass->model_row_changed   = NULL;
-	klass->model_cell_changed  = NULL;
-	klass->model_rows_inserted = NULL;
-	klass->model_rows_deleted  = NULL;
-}
-
-E_MAKE_TYPE(e_table_model, "ETableModel", ETableModel, e_table_model_class_init, NULL, G_TYPE_OBJECT)
-
-#if d(!)0
-static void
-print_tabs (void)
-{
-	int i;
-	for (i = 0; i < depth; i++)
-		g_print("\t");
-}
-#endif
-
-void
-e_table_model_pre_change (ETableModel *e_table_model)
-{
-	g_return_if_fail (e_table_model != NULL);
-	g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
-	if (ETM_FROZEN (e_table_model))
-		return;
-	
-	d(print_tabs());
-	d(g_print("Emitting pre_change on model 0x%p, a %s.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type)));
-	d(depth++);
-	g_signal_emit (G_OBJECT (e_table_model), 
-		       e_table_model_signals [MODEL_PRE_CHANGE], 0);
-	d(depth--);
-}
-
-/**
- * e_table_model_no_change:
- * @e_table_model: the table model to notify of the lack of a change
- *
- * Use this function to notify any views of this table model that
- * the contents of the table model have changed.  This will emit
- * the signal "model_no_change" on the @e_table_model object.
- *
- * It is preferable to use the e_table_model_row_changed() and
- * the e_table_model_cell_changed() to notify of smaller changes
- * than to invalidate the entire model, as the views might have
- * ways of caching the information they render from the model.
- */
-void
-e_table_model_no_change (ETableModel *e_table_model)
-{
-	g_return_if_fail (e_table_model != NULL);
-	g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-	
-	if (ETM_FROZEN (e_table_model))
-		return;
-	
-	d(print_tabs());
-	d(g_print("Emitting model_no_change on model 0x%p, a %s.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type)));
-	d(depth++);
-	g_signal_emit (G_OBJECT (e_table_model),
-		       e_table_model_signals [MODEL_NO_CHANGE], 0);
-	d(depth--);
-}
-
-/**
- * e_table_model_changed:
- * @e_table_model: the table model to notify of the change
- *
- * Use this function to notify any views of this table model that
- * the contents of the table model have changed.  This will emit
- * the signal "model_changed" on the @e_table_model object.
- *
- * It is preferable to use the e_table_model_row_changed() and
- * the e_table_model_cell_changed() to notify of smaller changes
- * than to invalidate the entire model, as the views might have
- * ways of caching the information they render from the model.
- */
-void
-e_table_model_changed (ETableModel *e_table_model)
-{
-	g_return_if_fail (e_table_model != NULL);
-	g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-	
-	if (ETM_FROZEN (e_table_model))
-		return;
-	
-	d(print_tabs());
-	d(g_print("Emitting model_changed on model 0x%p, a %s.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type)));
-	d(depth++);
-	g_signal_emit (G_OBJECT (e_table_model),
-		       e_table_model_signals [MODEL_CHANGED], 0);
-	d(depth--);
-}
-
-/**
- * e_table_model_row_changed:
- * @e_table_model: the table model to notify of the change
- * @row: the row that was changed in the model.
- *
- * Use this function to notify any views of the table model that
- * the contents of row @row have changed in model.  This function
- * will emit the "model_row_changed" signal on the @e_table_model
- * object
- */
-void
-e_table_model_row_changed (ETableModel *e_table_model, int row)
-{
-	g_return_if_fail (e_table_model != NULL);
-	g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
-	if (ETM_FROZEN (e_table_model))
-		return;
-	
-	d(print_tabs());
-	d(g_print("Emitting row_changed on model 0x%p, a %s, row %d.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type), row));
-	d(depth++);
-	g_signal_emit (G_OBJECT (e_table_model),
-		       e_table_model_signals [MODEL_ROW_CHANGED], 0, row);
-	d(depth--);
-}
-
-/**
- * e_table_model_cell_changed:
- * @e_table_model: the table model to notify of the change
- * @col: the column.
- * @row: the row
- *
- * Use this function to notify any views of the table model that
- * contents of the cell at @col,@row has changed. This will emit
- * the "model_cell_changed" signal on the @e_table_model
- * object
- */
-void
-e_table_model_cell_changed (ETableModel *e_table_model, int col, int row)
-{
-	g_return_if_fail (e_table_model != NULL);
-	g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
-	if (ETM_FROZEN (e_table_model))
-		return;
-	
-	d(print_tabs());
-	d(g_print("Emitting cell_changed on model 0x%p, a %s, row %d, col %d.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type), row, col));
-	d(depth++);
-	g_signal_emit (G_OBJECT (e_table_model),
-		       e_table_model_signals [MODEL_CELL_CHANGED], 0, col, row);
-	d(depth--);
-}
-
-/**
- * e_table_model_rows_inserted:
- * @e_table_model: the table model to notify of the change
- * @row: the row that was inserted into the model.
- * @count: The number of rows that were inserted.
- *
- * Use this function to notify any views of the table model that
- * @count rows at row @row have been inserted into the model.  This
- * function will emit the "model_rows_inserted" signal on the
- * @e_table_model object
- */
-void
-e_table_model_rows_inserted (ETableModel *e_table_model, int row, int count)
-{
-	g_return_if_fail (e_table_model != NULL);
-	g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
-	if (ETM_FROZEN (e_table_model))
-		return;
-	
-	d(print_tabs());
-	d(g_print("Emitting row_inserted on model 0x%p, a %s, row %d.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type), row));
-	d(depth++);
-	g_signal_emit (G_OBJECT (e_table_model),
-		       e_table_model_signals [MODEL_ROWS_INSERTED], 0, row, count);
-	d(depth--);
-}
-
-/**
- * e_table_model_row_inserted:
- * @e_table_model: the table model to notify of the change
- * @row: the row that was inserted into the model.
- *
- * Use this function to notify any views of the table model that the
- * row @row has been inserted into the model.  This function will emit
- * the "model_rows_inserted" signal on the @e_table_model object
- */
-void
-e_table_model_row_inserted (ETableModel *e_table_model, int row)
-{
-	e_table_model_rows_inserted(e_table_model, row, 1);
-}
-
-/**
- * e_table_model_row_deleted:
- * @e_table_model: the table model to notify of the change
- * @row: the row that was deleted
- * @count: The number of rows deleted
- *
- * Use this function to notify any views of the table model that
- * @count rows at row @row have been deleted from the model.  This
- * function will emit the "model_rows_deleted" signal on the
- * @e_table_model object
- */
-void
-e_table_model_rows_deleted (ETableModel *e_table_model, int row, int count)
-{
-	g_return_if_fail (e_table_model != NULL);
-	g_return_if_fail (E_IS_TABLE_MODEL (e_table_model));
-
-	if (ETM_FROZEN (e_table_model))
-		return;
-	
-	d(print_tabs());
-	d(g_print("Emitting row_deleted on model 0x%p, a %s, row %d.\n", e_table_model, gtk_type_name (GTK_OBJECT(e_table_model)->klass->type), row));
-	d(depth++);
-	g_signal_emit (G_OBJECT (e_table_model),
-		       e_table_model_signals [MODEL_ROWS_DELETED], 0, row, count);
-	d(depth--);
-}
-
-/**
- * e_table_model_row_deleted:
- * @e_table_model: the table model to notify of the change
- * @row: the row that was deleted
- *
- * Use this function to notify any views of the table model that the
- * row @row has been deleted from the model.  This function will emit
- * the "model_rows_deleted" signal on the @e_table_model object
- */
-void
-e_table_model_row_deleted (ETableModel *e_table_model, int row)
-{
-	e_table_model_rows_deleted(e_table_model, row, 1);
-}
-
-void
-e_table_model_freeze (ETableModel *e_table_model)
-{
-	e_table_model_pre_change (e_table_model);
-	g_object_set_data (G_OBJECT (e_table_model), "frozen", GINT_TO_POINTER (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (e_table_model), "frozen")) + 1));
-}
-
-void
-e_table_model_thaw (ETableModel *e_table_model)
-{
-	g_object_set_data (G_OBJECT (e_table_model), "frozen", GINT_TO_POINTER (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (e_table_model), "frozen")) - 1));
-	e_table_model_changed (e_table_model);
-}
-
diff --git a/widgets/table/e-table-model.h b/widgets/table/e-table-model.h
deleted file mode 100644
index a08d9712ad..0000000000
--- a/widgets/table/e-table-model.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-model.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_MODEL_H_
-#define _E_TABLE_MODEL_H_
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_MODEL_TYPE        (e_table_model_get_type ())
-#define E_TABLE_MODEL(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_MODEL_TYPE, ETableModel))
-#define E_TABLE_MODEL_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_MODEL_TYPE, ETableModelClass))
-#define E_IS_TABLE_MODEL(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_MODEL_TYPE))
-#define E_IS_TABLE_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_MODEL_TYPE))
-#define E_TABLE_MODEL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TABLE_MODEL_TYPE, ETableModelClass))
-
-typedef struct {
-	GObject   base;
-} ETableModel;
-
-typedef struct {
-	GObjectClass parent_class;
-
-	/*
-	 * Virtual methods
-	 */
-	int         (*column_count)       (ETableModel *etm);
-	int         (*row_count)          (ETableModel *etm);
-	void        (*append_row)         (ETableModel *etm, ETableModel *source, int row);
-
-	void       *(*value_at)           (ETableModel *etm, int col, int row);
-	void        (*set_value_at)       (ETableModel *etm, int col, int row, const void *value);
-	gboolean    (*is_cell_editable)   (ETableModel *etm, int col, int row);
-
-	gboolean    (*has_save_id)        (ETableModel *etm);
-	char       *(*get_save_id)        (ETableModel *etm, int row);
-
-	gboolean    (*has_change_pending) (ETableModel *etm);
-
-	/* Allocate a copy of the given value. */
-	void       *(*duplicate_value)    (ETableModel *etm, int col, const void *value);
-	/* Free an allocated value. */
-	void        (*free_value)         (ETableModel *etm, int col, void *value);
-	/* Return an allocated empty value. */
-	void	   *(*initialize_value)   (ETableModel *etm, int col);
-	/* Return TRUE if value is equivalent to an empty cell. */
-	gboolean    (*value_is_empty)     (ETableModel *etm, int col, const void *value);
-	/* Return an allocated string. */
-	char       *(*value_to_string)    (ETableModel *etm, int col, const void *value);
-
-	
-	/*
-	 * Signals
-	 */
-
-	/*
-	 * These all come after the change has been made.
-	 * No changes, cancel pre_change: no_change
-	 * Major structural changes: model_changed
-	 * Changes only in a row: row_changed
-	 * Only changes in a cell: cell_changed
-	 * A row inserted: row_inserted
-	 * A row deleted: row_deleted
-	 */
-	void        (*model_pre_change)    (ETableModel *etm);
-
-	void        (*model_no_change)     (ETableModel *etm);
-	void        (*model_changed)       (ETableModel *etm);
-	void        (*model_row_changed)   (ETableModel *etm, int row);
-	void        (*model_cell_changed)  (ETableModel *etm, int col, int row);
-	void        (*model_rows_inserted) (ETableModel *etm, int row, int count);
-	void        (*model_rows_deleted)  (ETableModel *etm, int row, int count);
-} ETableModelClass;
-
-GType       e_table_model_get_type            (void);
-
-/**/
-int         e_table_model_column_count        (ETableModel *e_table_model);
-const char *e_table_model_column_name         (ETableModel *e_table_model,
-					       int          col);
-int         e_table_model_row_count           (ETableModel *e_table_model);
-void        e_table_model_append_row          (ETableModel *e_table_model,
-					       ETableModel *source,
-					       int          row);
-
-/**/
-void       *e_table_model_value_at            (ETableModel *e_table_model,
-					       int          col,
-					       int          row);
-void        e_table_model_set_value_at        (ETableModel *e_table_model,
-					       int          col,
-					       int          row,
-					       const void  *value);
-gboolean    e_table_model_is_cell_editable    (ETableModel *e_table_model,
-					       int          col,
-					       int          row);
-
-/**/
-gboolean    e_table_model_has_save_id         (ETableModel *etm);
-char       *e_table_model_get_save_id         (ETableModel *etm,
-					       int          row);
-
-/**/
-gboolean    e_table_model_has_change_pending  (ETableModel *etm);
-
-
-/**/
-void       *e_table_model_duplicate_value     (ETableModel *e_table_model,
-					       int          col,
-					       const void  *value);
-void        e_table_model_free_value          (ETableModel *e_table_model,
-					       int          col,
-					       void        *value);
-void       *e_table_model_initialize_value    (ETableModel *e_table_model,
-					       int          col);
-gboolean    e_table_model_value_is_empty      (ETableModel *e_table_model,
-					       int          col,
-					       const void  *value);
-char       *e_table_model_value_to_string     (ETableModel *e_table_model,
-					       int          col,
-					       const void  *value);
-
-/*
- * Routines for emitting signals on the e_table
- */
-void        e_table_model_pre_change          (ETableModel *e_table_model);
-void        e_table_model_no_change           (ETableModel *e_table_model);
-void        e_table_model_changed             (ETableModel *e_table_model);
-void        e_table_model_row_changed         (ETableModel *e_table_model,
-					       int          row);
-void        e_table_model_cell_changed        (ETableModel *e_table_model,
-					       int          col,
-					       int          row);
-void        e_table_model_rows_inserted       (ETableModel *e_table_model,
-int          row,
-int          count);
-void        e_table_model_rows_deleted        (ETableModel *e_table_model,
-int          row,
-int          count);
-
-/**/
-void        e_table_model_row_inserted        (ETableModel *e_table_model,
-int          row);
-void        e_table_model_row_deleted         (ETableModel *e_table_model,
-int          row);
-
-void        e_table_model_freeze              (ETableModel *e_table_model);
-void        e_table_model_thaw                (ETableModel *e_table_model);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_MODEL_H_ */
diff --git a/widgets/table/e-table-one.c b/widgets/table/e-table-one.c
deleted file mode 100644
index 486f14862f..0000000000
--- a/widgets/table/e-table-one.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-one.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include "e-table-one.h"
-#include "gal/util/e-util.h"
-
-static ETableModelClass *parent_class = NULL;
-
-static int
-one_column_count (ETableModel *etm)
-{
-	ETableOne *one = E_TABLE_ONE(etm);
-
-	if (one->source)
-		return e_table_model_column_count(one->source);
-	else
-		return 0;
-}
-
-static int
-one_row_count (ETableModel *etm)
-{
-	return 1;
-}
-
-static void *
-one_value_at (ETableModel *etm, int col, int row)
-{
-	ETableOne *one = E_TABLE_ONE(etm);
-
-	if (one->data)
-		return one->data[col];
-	else
-		return NULL;
-}
-
-static void
-one_set_value_at (ETableModel *etm, int col, int row, const void *val)
-{
-	ETableOne *one = E_TABLE_ONE(etm);
-
-	if (one->data && one->source) {
-		e_table_model_free_value(one->source, col, one->data[col]);
-		one->data[col] = e_table_model_duplicate_value(one->source, col, val);
-	}
-}
-
-static gboolean
-one_is_cell_editable (ETableModel *etm, int col, int row)
-{
-	ETableOne *one = E_TABLE_ONE(etm);
-
-	if (one->source)
-		return e_table_model_is_cell_editable(one->source, col, -1);
-	else
-		return FALSE;
-}
-
-/* The default for one_duplicate_value is to return the raw value. */
-static void *
-one_duplicate_value (ETableModel *etm, int col, const void *value)
-{
-	ETableOne *one = E_TABLE_ONE(etm);
-
-	if (one->source)
-		return e_table_model_duplicate_value(one->source, col, value);
-	else
-		return (void *)value;
-}
-
-static void
-one_free_value (ETableModel *etm, int col, void *value)
-{
-	ETableOne *one = E_TABLE_ONE(etm);
-
-	if (one->source)
-		e_table_model_free_value(one->source, col, value);
-}
-
-static void *
-one_initialize_value (ETableModel *etm, int col)
-{
-	ETableOne *one = E_TABLE_ONE(etm);
-	
-	if (one->source)
-		return e_table_model_initialize_value (one->source, col);
-	else
-		return NULL;
-}
-
-static gboolean
-one_value_is_empty (ETableModel *etm, int col, const void *value)
-{
-	ETableOne *one = E_TABLE_ONE(etm);
-	
-	if (one->source)
-		return e_table_model_value_is_empty (one->source, col, value);
-	else
-		return FALSE;
-}
-
-static char *
-one_value_to_string (ETableModel *etm, int col, const void *value)
-{
-	ETableOne *one = E_TABLE_ONE(etm);
-	
-	if (one->source)
-		return e_table_model_value_to_string (one->source, col, value);
-	else
-		return g_strdup("");
-}
-
-static void
-one_finalize (GObject *object)
-{
-	G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-static void
-one_dispose (GObject *object)
-{
-	ETableOne *one = E_TABLE_ONE (object);
-
-
-	if (one->data) {
-		int i;
-		int col_count;
-
-		if (one->source) {
-			col_count = e_table_model_column_count(one->source);
-
-			for (i = 0; i < col_count; i++)
-				e_table_model_free_value(one->source, i, one->data[i]);
-		}
-		
-		g_free (one->data);
-	}
-	one->data = NULL;
-
-	if (one->source)
-		g_object_unref(one->source);
-	one->source = NULL;
-
-	G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static void
-e_table_one_class_init (GObjectClass *object_class)
-{
-	ETableModelClass *model_class = (ETableModelClass *) object_class;
-
-	parent_class = g_type_class_peek_parent (object_class);
-
-	model_class->column_count = one_column_count;
-	model_class->row_count = one_row_count;
-	model_class->value_at = one_value_at;
-	model_class->set_value_at = one_set_value_at;
-	model_class->is_cell_editable = one_is_cell_editable;
-	model_class->duplicate_value = one_duplicate_value;
-	model_class->free_value = one_free_value;
-	model_class->initialize_value = one_initialize_value;
-	model_class->value_is_empty = one_value_is_empty;
-	model_class->value_to_string = one_value_to_string;
-
-	object_class->dispose = one_dispose;
-	object_class->finalize = one_finalize;
-}
-
-static void
-e_table_one_init (GObject *object)
-{
-	ETableOne *one = E_TABLE_ONE(object);
-
-	one->source = NULL;
-	one->data = NULL;
-}
-
-E_MAKE_TYPE(e_table_one, "ETableOne", ETableOne, e_table_one_class_init, e_table_one_init, E_TABLE_MODEL_TYPE)
-
-
-ETableModel *
-e_table_one_new (ETableModel *source)
-{
-	ETableOne *eto;
-	int col_count;
-	int i;
-
-	eto = g_object_new (E_TABLE_ONE_TYPE, NULL);
-	eto->source = source;
-	
-	col_count = e_table_model_column_count(source);
-	eto->data = g_new(void *, col_count);
-	for (i = 0; i < col_count; i++) {
-		eto->data[i] = e_table_model_initialize_value(source, i);
-	}
-	
-	if (source)
-		g_object_ref(source);
-	
-	return (ETableModel *) eto;
-}
-
-void
-e_table_one_commit (ETableOne *one)
-{
-	if (one->source) {
-		int empty = TRUE;
-		int col;
-		int cols = e_table_model_column_count(one->source);
-		for (col = 0; col < cols; col++) {
-			if (!e_table_model_value_is_empty(one->source, col, one->data[col])) {
-				empty = FALSE;
-				break;
-			}
-		}
-		if (!empty) {
-			e_table_model_append_row(one->source, E_TABLE_MODEL(one), 0);
-		}
-	}
-}
diff --git a/widgets/table/e-table-one.h b/widgets/table/e-table-one.h
deleted file mode 100644
index 1c8147d779..0000000000
--- a/widgets/table/e-table-one.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-one.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_ONE_H_
-#define _E_TABLE_ONE_H_
-
-#include <gal/e-table/e-table-model.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_ONE_TYPE        (e_table_one_get_type ())
-#define E_TABLE_ONE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_ONE_TYPE, ETableOne))
-#define E_TABLE_ONE_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_ONE_TYPE, ETableOneClass))
-#define E_IS_TABLE_ONE(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_ONE_TYPE))
-#define E_IS_TABLE_ONE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_ONE_TYPE))
-#define E_TABLE_ONE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TABLE_ONE_TYPE, ETableOneClass))
-
-typedef struct {
-	ETableModel   parent;
-		    
-	ETableModel  *source;
-	void        **data;
-} ETableOne;
-
-typedef struct {
-	ETableModelClass parent_class;
-} ETableOneClass;
-
-GType e_table_one_get_type (void);
-
-ETableModel *e_table_one_new (ETableModel *source);
-void         e_table_one_commit (ETableOne *one);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_ONE_H_ */
-
diff --git a/widgets/table/e-table-scrolled.c b/widgets/table/e-table-scrolled.c
deleted file mode 100644
index 1786148c78..0000000000
--- a/widgets/table/e-table-scrolled.c
+++ /dev/null
@@ -1,229 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-scrolled.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdio.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gtk/gtksignal.h>
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-
-#include "e-table.h"
-#include "e-table-scrolled.h"
-#include "gal/util/e-i18n.h"
-
-#define COLUMN_HEADER_HEIGHT 16
-
-#define PARENT_TYPE gtk_scrolled_window_get_type ()
-
-static GtkObjectClass *parent_class;
-
-enum {
-	PROP_0,
-	PROP_TABLE
-};
-
-static void
-e_table_scrolled_init (GtkObject *object)
-{
-	ETableScrolled *ets;
-	GtkScrolledWindow *scrolled_window;
-
-	ets = E_TABLE_SCROLLED (object);
-	scrolled_window = GTK_SCROLLED_WINDOW (object);
-
-	GTK_WIDGET_SET_FLAGS (ets, GTK_CAN_FOCUS);
-
-	ets->table = g_object_new (E_TABLE_TYPE, NULL);
-
-	gtk_scrolled_window_set_policy      (scrolled_window, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-	gtk_scrolled_window_set_shadow_type (scrolled_window, GTK_SHADOW_IN);
-}
-
-static void
-e_table_scrolled_real_construct (ETableScrolled *ets)
-{
-	gtk_container_add(GTK_CONTAINER(ets), GTK_WIDGET(ets->table));
-
-	gtk_widget_show(GTK_WIDGET(ets->table));
-}
-
-ETableScrolled *e_table_scrolled_construct                 (ETableScrolled    *ets,
-							    ETableModel       *etm,
-							    ETableExtras      *ete,
-							    const char        *spec,
-							    const char        *state)
-{
-	g_return_val_if_fail(ets != NULL, NULL);
-	g_return_val_if_fail(E_IS_TABLE_SCROLLED(ets), NULL);
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TABLE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec != NULL, NULL);
-
-	e_table_construct(ets->table, etm, ete, spec, state);
-
-	e_table_scrolled_real_construct(ets);
-
-	return ets;
-}
-
-GtkWidget      *e_table_scrolled_new                       (ETableModel       *etm,
-							    ETableExtras      *ete,
-							    const char        *spec,
-							    const char        *state)
-{
-	ETableScrolled *ets;
-
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TABLE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec != NULL, NULL);
-
-	ets = E_TABLE_SCROLLED (gtk_widget_new (e_table_scrolled_get_type (),
-						"hadjustment", NULL,
-						"vadjustment", NULL,
-						NULL));
-
-	ets = e_table_scrolled_construct (ets, etm, ete, spec, state);
-
-	return GTK_WIDGET (ets);
-}
-
-ETableScrolled *e_table_scrolled_construct_from_spec_file  (ETableScrolled    *ets,
-							    ETableModel       *etm,
-							    ETableExtras      *ete,
-							    const char        *spec_fn,
-							    const char        *state_fn)
-{
-	g_return_val_if_fail(ets != NULL, NULL);
-	g_return_val_if_fail(E_IS_TABLE_SCROLLED(ets), NULL);
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TABLE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec_fn != NULL, NULL);
-
-	e_table_construct_from_spec_file(ets->table, etm, ete, spec_fn, state_fn);
-
-	e_table_scrolled_real_construct(ets);
-
-	return ets;
-}
-
-GtkWidget      *e_table_scrolled_new_from_spec_file        (ETableModel       *etm,
-							    ETableExtras      *ete,
-							    const char        *spec_fn,
-							    const char        *state_fn)
-{
-	ETableScrolled *ets;
-
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TABLE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec_fn != NULL, NULL);
-
-	ets = E_TABLE_SCROLLED (gtk_widget_new (e_table_scrolled_get_type (),
-						"hadjustment", NULL,
-						"vadjustment", NULL,
-						NULL));
-
-	ets = e_table_scrolled_construct_from_spec_file (ets, etm, ete, spec_fn, state_fn);
-
-	return GTK_WIDGET (ets);
-}
-
-ETable *
-e_table_scrolled_get_table                 (ETableScrolled *ets)
-{
-	return ets->table;
-}
-
-static void
-ets_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
-	ETableScrolled *ets = E_TABLE_SCROLLED (object);
-
-	switch (prop_id){
-	case PROP_TABLE:
-		g_value_set_object (value, ets->table);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-/* Grab_focus handler for the scrolled ETable */
-static void
-ets_grab_focus (GtkWidget *widget)
-{
-	ETableScrolled *ets;
-
-	ets = E_TABLE_SCROLLED (widget);
-
-	gtk_widget_grab_focus (GTK_WIDGET (ets->table));
-}
-
-/* Focus handler for the scrolled ETable */
-static gint
-ets_focus (GtkWidget *container, GtkDirectionType direction)
-{
-	ETableScrolled *ets;
-
-	ets = E_TABLE_SCROLLED (container);
-
-	return gtk_widget_child_focus (GTK_WIDGET (ets->table), direction);
-}
-
-static void
-e_table_scrolled_class_init (ETableScrolledClass *class)
-{
-	GObjectClass *object_class;
-	GtkWidgetClass *widget_class;
-	GtkContainerClass *container_class;
-
-	object_class = (GObjectClass *) class;
-	widget_class = (GtkWidgetClass *) class;
-	container_class = (GtkContainerClass *) class;
-
-	parent_class = g_type_class_ref (PARENT_TYPE);
-
-	object_class->get_property = ets_get_property;
-
-	widget_class->grab_focus = ets_grab_focus;
-
-	widget_class->focus = ets_focus;
-
-	g_object_class_install_property (object_class, PROP_TABLE,
-					 g_param_spec_object ("table",
-							      _( "Table" ),
-							      _( "Table" ),
-							      E_TABLE_TYPE,
-							      G_PARAM_READABLE));
-}
-
-E_MAKE_TYPE(e_table_scrolled, "ETableScrolled", ETableScrolled, e_table_scrolled_class_init, e_table_scrolled_init, PARENT_TYPE)
-
diff --git a/widgets/table/e-table-scrolled.h b/widgets/table/e-table-scrolled.h
deleted file mode 100644
index 40de97e99e..0000000000
--- a/widgets/table/e-table-scrolled.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-scrolled.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_SCROLLED_H_
-#define _E_TABLE_SCROLLED_H_
-
-#include <gtk/gtkscrolledwindow.h>
-#include <gal/e-table/e-table-model.h>
-#include <gal/e-table/e-table.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_SCROLLED_TYPE        (e_table_scrolled_get_type ())
-#define E_TABLE_SCROLLED(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_SCROLLED_TYPE, ETableScrolled))
-#define E_TABLE_SCROLLED_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_SCROLLED_TYPE, ETableScrolledClass))
-#define E_IS_TABLE_SCROLLED(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_SCROLLED_TYPE))
-#define E_IS_TABLE_SCROLLED_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_SCROLLED_TYPE))
-
-typedef struct {
-	GtkScrolledWindow parent;
-
-	ETable *table;
-} ETableScrolled;
-
-typedef struct {
-	GtkScrolledWindowClass parent_class;
-} ETableScrolledClass;
-
-GType           e_table_scrolled_get_type                  (void);
-
-ETableScrolled *e_table_scrolled_construct                 (ETableScrolled *ets,
-							    ETableModel    *etm,
-							    ETableExtras   *ete,
-							    const char     *spec,
-							    const char     *state);
-GtkWidget      *e_table_scrolled_new                       (ETableModel    *etm,
-							    ETableExtras   *ete,
-							    const char     *spec,
-							    const char     *state);
-
-ETableScrolled *e_table_scrolled_construct_from_spec_file  (ETableScrolled *ets,
-							    ETableModel    *etm,
-							    ETableExtras   *ete,
-							    const char     *spec_fn,
-							    const char     *state_fn);
-GtkWidget      *e_table_scrolled_new_from_spec_file        (ETableModel    *etm,
-							    ETableExtras   *ete,
-							    const char     *spec_fn,
-							    const char     *state_fn);
-
-ETable         *e_table_scrolled_get_table                 (ETableScrolled *ets);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_SCROLLED_H_ */
-
diff --git a/widgets/table/e-table-search.c b/widgets/table/e-table-search.c
deleted file mode 100644
index c0460e4524..0000000000
--- a/widgets/table/e-table-search.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-search.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include "e-table-search.h"
-#include "gal/util/e-util.h"
-
-#include <string.h>
-
-#define d(x)
-
-d(static gint depth = 0);
-
-struct _ETableSearchPrivate {
-	guint timeout_id;
-
-	char *search_string;
-	gunichar last_character;
-};
-
-static GObjectClass *e_table_search_parent_class;
-
-enum {
-	SEARCH_SEARCH,
-	SEARCH_ACCEPT,
-	LAST_SIGNAL
-};
-
-static guint e_table_search_signals [LAST_SIGNAL] = { 0, };
-
-static gboolean
-e_table_search_search (ETableSearch *e_table_search, char *string, ETableSearchFlags flags)
-{
-	gboolean ret_val;
-	g_return_val_if_fail (e_table_search != NULL, FALSE);
-	g_return_val_if_fail (E_IS_TABLE_SEARCH (e_table_search), FALSE);
-	
-	g_signal_emit (G_OBJECT (e_table_search),
-		       e_table_search_signals [SEARCH_SEARCH], 
-		       0, string, flags, &ret_val);
-
-	return ret_val;
-}
-
-static void
-e_table_search_accept (ETableSearch *e_table_search)
-{
-	g_return_if_fail (e_table_search != NULL);
-	g_return_if_fail (E_IS_TABLE_SEARCH (e_table_search));
-	
-	g_signal_emit (G_OBJECT (e_table_search),
-		       e_table_search_signals [SEARCH_ACCEPT], 0);
-}
-
-static gboolean
-ets_accept (gpointer data)
-{
-	ETableSearch *ets = data;
-	e_table_search_accept (ets);
-	g_free (ets->priv->search_string);
-
-	ets->priv->timeout_id = 0;
-	ets->priv->search_string = g_strdup ("");
-	ets->priv->last_character = 0;
-
-	return FALSE;
-}
-
-static void
-drop_timeout (ETableSearch *ets)
-{
-	if (ets->priv->timeout_id) {
-		g_source_remove (ets->priv->timeout_id);
-	}
-	ets->priv->timeout_id = 0;
-}
-
-static void
-add_timeout (ETableSearch *ets)
-{
-	drop_timeout (ets);
-	ets->priv->timeout_id = g_timeout_add (1000, ets_accept, ets);
-}
-
-static void
-e_table_search_finalize (GObject *object)
-{
-	ETableSearch *ets = (ETableSearch *) object;
-	
-	drop_timeout (ets);
-	g_free (ets->priv->search_string);
-	g_free (ets->priv);
-	
-	if (e_table_search_parent_class->finalize)
-		(*e_table_search_parent_class->finalize)(object);
-}
-
-static void
-e_table_search_class_init (GObjectClass *object_class)
-{
-	ETableSearchClass *klass = E_TABLE_SEARCH_CLASS(object_class);
-	e_table_search_parent_class = g_type_class_peek_parent (klass);
-
-	object_class->finalize = e_table_search_finalize;
-
-	e_table_search_signals [SEARCH_SEARCH] =
-		g_signal_new ("search",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableSearchClass, search),
-			      (GSignalAccumulator) NULL, NULL,
-			      e_marshal_BOOLEAN__STRING_INT,
-			      G_TYPE_BOOLEAN, 2, G_TYPE_STRING, G_TYPE_INT);
-
-	e_table_search_signals [SEARCH_ACCEPT] =
-		g_signal_new ("accept",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableSearchClass, accept),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
-
-	klass->search = NULL;
-	klass->accept = NULL;
-}
-
-static void
-e_table_search_init (ETableSearch *ets)
-{
-	ets->priv = g_new (ETableSearchPrivate, 1);
-
-	ets->priv->timeout_id = 0;
-	ets->priv->search_string = g_strdup ("");
-	ets->priv->last_character = 0;
-}
-
-
-E_MAKE_TYPE(e_table_search, "ETableSearch", ETableSearch, e_table_search_class_init, e_table_search_init, G_TYPE_OBJECT)
-
-ETableSearch *
-e_table_search_new (void)
-{
-	ETableSearch *ets = g_object_new (E_TABLE_SEARCH_TYPE, NULL);
-
-	return ets;
-}
-
-/**
- * e_table_search_column_count:
- * @e_table_search: The e-table-search to operate on
- *
- * Returns: the number of columns in the table search.
- */
-void
-e_table_search_input_character (ETableSearch *ets, gunichar character)
-{
-	char character_utf8[7];
-	char *temp_string;
-
-	g_return_if_fail (ets != NULL);
-	g_return_if_fail (E_IS_TABLE_SEARCH (ets));
-
-	character_utf8 [g_unichar_to_utf8 (character, character_utf8)] = 0;
-
-	temp_string = g_strdup_printf ("%s%s", ets->priv->search_string, character_utf8);
-	if (e_table_search_search (ets, temp_string,
-				   ets->priv->last_character != 0 ? E_TABLE_SEARCH_FLAGS_CHECK_CURSOR_FIRST : 0)) {
-		g_free (ets->priv->search_string);
-		ets->priv->search_string = temp_string;
-		add_timeout (ets);
-		ets->priv->last_character = character;
-		return;
-	} else {
-		g_free (temp_string);
-	}
-
-	if (character == ets->priv->last_character) {
-		if (ets->priv->search_string && e_table_search_search (ets, ets->priv->search_string, 0)) {
-			add_timeout (ets);
-		}
-	}
-}
-
-gboolean
-e_table_search_backspace (ETableSearch *ets)
-{
-	char *end;
-
-	g_return_val_if_fail (ets != NULL, FALSE);
-	g_return_val_if_fail (E_IS_TABLE_SEARCH (ets), FALSE);
-
-	if (!ets->priv->search_string ||
-	    !*ets->priv->search_string)
-		return FALSE;
-
-	end = ets->priv->search_string + strlen (ets->priv->search_string);
-	end = g_utf8_prev_char (end);
-	*end = 0;
-	ets->priv->last_character = 0;
-	add_timeout (ets);
-	return TRUE;
-}
diff --git a/widgets/table/e-table-search.h b/widgets/table/e-table-search.h
deleted file mode 100644
index b3cdd9ff41..0000000000
--- a/widgets/table/e-table-search.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-search.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_SEARCH_H_
-#define _E_TABLE_SEARCH_H_
-
-#include <gtk/gtkobject.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_SEARCH_TYPE        (e_table_search_get_type ())
-#define E_TABLE_SEARCH(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_SEARCH_TYPE, ETableSearch))
-#define E_TABLE_SEARCH_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_SEARCH_TYPE, ETableSearchClass))
-#define E_IS_TABLE_SEARCH(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_SEARCH_TYPE))
-#define E_IS_TABLE_SEARCH_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_SEARCH_TYPE))
-#define E_TABLE_SEARCH_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TABLE_SEARCH_TYPE, ETableSearchClass))
-
-typedef struct _ETableSearchPrivate ETableSearchPrivate;
-
-typedef enum {
-	E_TABLE_SEARCH_FLAGS_CHECK_CURSOR_FIRST = 1 << 0
-} ETableSearchFlags;
-
-typedef struct {
-	GObject   base;
-
-	ETableSearchPrivate *priv;
-} ETableSearch;
-
-typedef struct {
-	GObjectClass parent_class;
-
-	/*
-	 * Signals
-	 */
-	gboolean (*search)    (ETableSearch *ets, char *string /* utf8 */, ETableSearchFlags flags);
-	void     (*accept)    (ETableSearch *ets);
-} ETableSearchClass;
-
-GType       e_table_search_get_type         (void);
-ETableSearch *e_table_search_new              (void);
-
-/**/
-void          e_table_search_input_character  (ETableSearch *e_table_search,
-					       gunichar      character);
-gboolean      e_table_search_backspace        (ETableSearch *e_table_search);
-void          e_table_search_cancel           (ETableSearch *e_table_search);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_SEARCH_H_ */
diff --git a/widgets/table/e-table-selection-model.c b/widgets/table/e-table-selection-model.c
deleted file mode 100644
index 14edf3d6de..0000000000
--- a/widgets/table/e-table-selection-model.c
+++ /dev/null
@@ -1,347 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-selection-model.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include "e-table-selection-model.h"
-
-#include <string.h>
-#include <gdk/gdkkeysyms.h>
-
-#include "gal/util/e-i18n.h"
-#include "gal/util/e-util.h"
-
-#define PARENT_TYPE e_selection_model_array_get_type ()
-
-static ESelectionModelArray *parent_class;
-
-static gint etsm_get_row_count (ESelectionModelArray *esm);
-
-enum {
-	PROP_0,
-	PROP_MODEL,
-	PROP_HEADER
-};
-
-static void
-save_to_hash(int model_row, gpointer closure)
-{
-	ETableSelectionModel *etsm = closure;
-	gchar *key = e_table_model_get_save_id(etsm->model, model_row);
-
-	g_hash_table_insert(etsm->hash, key, key);
-}
-
-static void
-free_key(gpointer key, gpointer value, gpointer closure)
-{
-	g_free(key);
-}
-
-static void
-free_hash(ETableSelectionModel *etsm)
-{
-	if (etsm->hash) {
-		g_hash_table_foreach(etsm->hash, free_key, NULL);
-		g_hash_table_destroy(etsm->hash);
-		etsm->hash = NULL;
-	}
-	if (etsm->cursor_id)
-		g_free(etsm->cursor_id);
-	etsm->cursor_id = NULL;
-}
-
-static void
-model_pre_change (ETableModel *etm, ETableSelectionModel *etsm)
-{
-	free_hash(etsm);
-
-	if (etsm->model && e_table_model_has_save_id (etsm->model)) {
-		gint cursor_row;
-
-		etsm->hash = g_hash_table_new(g_str_hash, g_str_equal);
-		e_selection_model_foreach(E_SELECTION_MODEL(etsm), save_to_hash, etsm);
-
-		g_object_get(etsm,
-			     "cursor_row", &cursor_row,
-			     NULL);
-		g_free (etsm->cursor_id);
-		if (cursor_row != -1)
-			etsm->cursor_id = e_table_model_get_save_id(etm, cursor_row);
-		else
-			etsm->cursor_id = NULL;
-	}
-}
-
-static gint
-model_changed_idle(ETableSelectionModel *etsm)
-{
-	ETableModel *etm = etsm->model;
-
-	e_selection_model_clear(E_SELECTION_MODEL(etsm));
-
-	if (etsm->cursor_id && etm && e_table_model_has_save_id(etm)) {
-		int row_count = e_table_model_row_count(etm);
-		int cursor_row = -1;
-		int cursor_col = -1;
-		int i;
-		e_selection_model_array_confirm_row_count(E_SELECTION_MODEL_ARRAY(etsm));
-		for (i = 0; i < row_count; i++) {
-			char *save_id = e_table_model_get_save_id(etm, i);
-			if (g_hash_table_lookup(etsm->hash, save_id))
-				e_selection_model_change_one_row(E_SELECTION_MODEL(etsm), i, TRUE);
-			
-			if (etsm->cursor_id && !strcmp(etsm->cursor_id, save_id)) {
-				cursor_row = i;
-				cursor_col = e_selection_model_cursor_col(E_SELECTION_MODEL(etsm));
-				if (cursor_col == -1) {
-					if (etsm->eth) {
-						cursor_col = e_table_header_prioritized_column (etsm->eth);
-					} else
-						cursor_col = 0;
-				}
-				e_selection_model_change_cursor(E_SELECTION_MODEL(etsm), cursor_row, cursor_col);
-				g_free(etsm->cursor_id);
-				etsm->cursor_id = NULL;
-			}
-			g_free(save_id);
-		}
-		free_hash(etsm);
-		e_selection_model_cursor_changed (E_SELECTION_MODEL(etsm), cursor_row, cursor_col);
-		e_selection_model_selection_changed (E_SELECTION_MODEL(etsm));
-	}
-	etsm->model_changed_idle_id = 0;
-	return FALSE;
-}
-
-static void
-model_changed(ETableModel *etm, ETableSelectionModel *etsm)
-{
-	e_selection_model_clear(E_SELECTION_MODEL(etsm));
-	if (!etsm->model_changed_idle_id && etm && e_table_model_has_save_id(etm)) {
-		etsm->model_changed_idle_id = g_idle_add_full(G_PRIORITY_HIGH, (GSourceFunc) model_changed_idle, etsm, NULL);
-	}
-}
-
-static void
-model_row_changed(ETableModel *etm, int row, ETableSelectionModel *etsm)
-{
-	free_hash(etsm);
-}
-
-static void
-model_cell_changed(ETableModel *etm, int col, int row, ETableSelectionModel *etsm)
-{
-	free_hash(etsm);
-}
-
-#if 1
-static void
-model_rows_inserted(ETableModel *etm, int row, int count, ETableSelectionModel *etsm)
-{
-	e_selection_model_array_insert_rows(E_SELECTION_MODEL_ARRAY(etsm), row, count);
-	free_hash(etsm);
-}
-
-static void
-model_rows_deleted(ETableModel *etm, int row, int count, ETableSelectionModel *etsm)
-{
-	e_selection_model_array_delete_rows(E_SELECTION_MODEL_ARRAY(etsm), row, count);
-	free_hash(etsm);
-}
-
-#else
-
-static void
-model_rows_inserted(ETableModel *etm, int row, int count, ETableSelectionModel *etsm)
-{
-	model_changed(etm, etsm);
-}
-
-static void
-model_rows_deleted(ETableModel *etm, int row, int count, ETableSelectionModel *etsm)
-{
-	model_changed(etm, etsm);
-}
-#endif
-
-inline static void
-add_model(ETableSelectionModel *etsm, ETableModel *model)
-{
-	etsm->model = model;
-	if (model) {
-		g_object_ref(model);
-		etsm->model_pre_change_id = g_signal_connect(G_OBJECT(model), "model_pre_change",
-							G_CALLBACK(model_pre_change), etsm);
-		etsm->model_changed_id = g_signal_connect(G_OBJECT(model), "model_changed",
-							G_CALLBACK(model_changed), etsm);
-		etsm->model_row_changed_id = g_signal_connect(G_OBJECT(model), "model_row_changed",
-							G_CALLBACK(model_row_changed), etsm);
-		etsm->model_cell_changed_id = g_signal_connect(G_OBJECT(model), "model_cell_changed",
-							G_CALLBACK(model_cell_changed), etsm);
-		etsm->model_rows_inserted_id = g_signal_connect(G_OBJECT(model), "model_rows_inserted",
-							G_CALLBACK(model_rows_inserted), etsm);
-		etsm->model_rows_deleted_id = g_signal_connect(G_OBJECT(model), "model_rows_deleted",
-							G_CALLBACK(model_rows_deleted), etsm);
-	}
-	e_selection_model_array_confirm_row_count(E_SELECTION_MODEL_ARRAY(etsm));
-}
-
-inline static void
-drop_model(ETableSelectionModel *etsm)
-{
-	if (etsm->model) {
-		g_signal_handler_disconnect(G_OBJECT(etsm->model),
-					    etsm->model_pre_change_id);
-		g_signal_handler_disconnect(G_OBJECT(etsm->model),
-					    etsm->model_changed_id);
-		g_signal_handler_disconnect(G_OBJECT(etsm->model),
-					    etsm->model_row_changed_id);
-		g_signal_handler_disconnect(G_OBJECT(etsm->model),
-					    etsm->model_cell_changed_id);
-		g_signal_handler_disconnect(G_OBJECT(etsm->model),
-					    etsm->model_rows_inserted_id);
-		g_signal_handler_disconnect(G_OBJECT(etsm->model),
-					    etsm->model_rows_deleted_id);
-
-		g_object_unref(etsm->model);
-	}
-	etsm->model = NULL;
-}
-
-static void
-etsm_dispose (GObject *object)
-{
-	ETableSelectionModel *etsm;
-
-	etsm = E_TABLE_SELECTION_MODEL (object);
-
-	if (etsm->model_changed_idle_id)
-		g_source_remove (etsm->model_changed_idle_id);
-	etsm->model_changed_idle_id = 0;
-
-	drop_model(etsm);
-	free_hash(etsm);
-
-	if (G_OBJECT_CLASS(parent_class)->dispose)
-		G_OBJECT_CLASS(parent_class)->dispose (object);
-}
-
-static void
-etsm_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
-	ETableSelectionModel *etsm = E_TABLE_SELECTION_MODEL (object);
-
-	switch (prop_id){
-	case PROP_MODEL:
-		g_value_set_object (value, etsm->model);
-		break;
-	case PROP_HEADER:
-		g_value_set_object (value, etsm->eth);
-		break;
-	}
-}
-
-static void
-etsm_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
-	ETableSelectionModel *etsm = E_TABLE_SELECTION_MODEL (object);
-	
-	switch (prop_id){
-	case PROP_MODEL:
-		drop_model(etsm);
-		add_model(etsm, g_value_get_object (value) ? E_TABLE_MODEL(g_value_get_object (value)) : NULL);
-		break;
-	case PROP_HEADER:
-		etsm->eth = E_TABLE_HEADER (g_value_get_object (value));
-		break;
-	}
-}
-
-static void
-e_table_selection_model_init (ETableSelectionModel *selection)
-{
-	selection->model = NULL;
-	selection->hash = NULL;
-	selection->cursor_id = NULL;
-
-	selection->model_changed_idle_id = 0;
-}
-
-static void
-e_table_selection_model_class_init (ETableSelectionModelClass *klass)
-{
-	GObjectClass *object_class;
-	ESelectionModelArrayClass *esma_class;
-
-	parent_class             = g_type_class_ref (PARENT_TYPE);
-
-	object_class             = G_OBJECT_CLASS(klass);
-	esma_class               = E_SELECTION_MODEL_ARRAY_CLASS(klass);
-
-	object_class->dispose      = etsm_dispose;
-	object_class->get_property = etsm_get_property;
-	object_class->set_property = etsm_set_property;
-
-	esma_class->get_row_count = etsm_get_row_count;
-
-	g_object_class_install_property (object_class, PROP_MODEL, 
-					 g_param_spec_object ("model",
-							      _("Model"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_MODEL_TYPE,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_HEADER, 
-					 g_param_spec_object ("header",
-							      _("Header"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_HEADER_TYPE,
-							      G_PARAM_READWRITE));
-}
-
-E_MAKE_TYPE(e_table_selection_model, "ETableSelectionModel", ETableSelectionModel,
-	    e_table_selection_model_class_init, e_table_selection_model_init, PARENT_TYPE)
-
-/** 
- * e_table_selection_model_new
- *
- * This routine creates a new #ETableSelectionModel.
- *
- * Returns: The new #ETableSelectionModel.
- */
-ETableSelectionModel *
-e_table_selection_model_new (void)
-{
-	return g_object_new (E_TABLE_SELECTION_MODEL_TYPE, NULL);
-}
-
-static gint
-etsm_get_row_count (ESelectionModelArray *esma)
-{
-	ETableSelectionModel *etsm = E_TABLE_SELECTION_MODEL(esma);
-
-	if (etsm->model)
-		return e_table_model_row_count (etsm->model);
-	else
-		return 0;
-}
diff --git a/widgets/table/e-table-selection-model.h b/widgets/table/e-table-selection-model.h
deleted file mode 100644
index f3889d6f1b..0000000000
--- a/widgets/table/e-table-selection-model.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-selection-model.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_SELECTION_MODEL_H_
-#define _E_TABLE_SELECTION_MODEL_H_
-
-#include <gtk/gtkobject.h>
-#include <gal/widgets/e-selection-model-array.h>
-#include <gal/e-table/e-table-model.h>
-#include <gal/e-table/e-table-header.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define E_TABLE_SELECTION_MODEL_TYPE        (e_table_selection_model_get_type ())
-#define E_TABLE_SELECTION_MODEL(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_SELECTION_MODEL_TYPE, ETableSelectionModel))
-#define E_TABLE_SELECTION_MODEL_CLASS(k)    (G_TYPE-CHECK_CLASS_CAST((k), E_TABLE_SELECTION_MODEL_TYPE, ETableSelectionModelClass))
-#define E_IS_TABLE_SELECTION_MODEL(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_SELECTION_MODEL_TYPE))
-#define E_IS_TABLE_SELECTION_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_SELECTION_MODEL_TYPE))
-
-typedef struct {
-	ESelectionModelArray base;
-
-	ETableModel  *model;
-	ETableHeader *eth;
-
-	guint model_pre_change_id;
-	guint model_changed_id;
-	guint model_row_changed_id;
-	guint model_cell_changed_id;
-	guint model_rows_inserted_id;
-	guint model_rows_deleted_id;
-
-	guint model_changed_idle_id;
-
-	guint selection_model_changed : 1;
-	guint group_info_changed : 1;
-
-	GHashTable *hash;
-	char      *cursor_id;
-} ETableSelectionModel;
-
-typedef struct {
-	ESelectionModelArrayClass parent_class;
-} ETableSelectionModelClass;
-
-GType                 e_table_selection_model_get_type            (void);
-ETableSelectionModel *e_table_selection_model_new                 (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* _E_TABLE_SELECTION_MODEL_H_ */
diff --git a/widgets/table/e-table-simple.c b/widgets/table/e-table-simple.c
deleted file mode 100644
index b7cf8f66be..0000000000
--- a/widgets/table/e-table-simple.c
+++ /dev/null
@@ -1,289 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-simple.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Miguel de Icaza <miguel.ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include "e-table-simple.h"
-#include "gal/util/e-util.h"
-
-static int
-simple_column_count (ETableModel *etm)
-{
-	ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
-	if (simple->col_count)
-		return simple->col_count (etm, simple->data);
-	else
-		return 0;
-}
-
-static int
-simple_row_count (ETableModel *etm)
-{
-	ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
-	if (simple->row_count)
-		return simple->row_count (etm, simple->data);
-	else
-		return 0;
-}
-
-static void
-simple_append_row (ETableModel *etm, ETableModel *source, int row)
-{
-	ETableSimple *simple = E_TABLE_SIMPLE(etm);
-	
-	if (simple->append_row)
-		simple->append_row (etm, source, row, simple->data);
-}
-
-static void *
-simple_value_at (ETableModel *etm, int col, int row)
-{
-	ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
-	if (simple->value_at)
-		return simple->value_at (etm, col, row, simple->data);
-	else
-		return NULL;
-}
-
-static void
-simple_set_value_at (ETableModel *etm, int col, int row, const void *val)
-{
-	ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
-	if (simple->set_value_at)
-		simple->set_value_at (etm, col, row, val, simple->data);
-}
-
-static gboolean
-simple_is_cell_editable (ETableModel *etm, int col, int row)
-{
-	ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
-	if (simple->is_cell_editable)
-		return simple->is_cell_editable (etm, col, row, simple->data);
-	else
-		return FALSE;
-}
-
-static gboolean
-simple_has_save_id (ETableModel *etm)
-{
-	ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
-	if (simple->has_save_id)
-		return simple->has_save_id (etm, simple->data);
-	else
-		return FALSE;
-}
-
-static char *
-simple_get_save_id (ETableModel *etm, int row)
-{
-	ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
-	if (simple->get_save_id)
-		return simple->get_save_id (etm, row, simple->data);
-	else
-		return NULL;
-}
-
-/* The default for simple_duplicate_value is to return the raw value. */
-static void *
-simple_duplicate_value (ETableModel *etm, int col, const void *value)
-{
-	ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
-	if (simple->duplicate_value)
-		return simple->duplicate_value (etm, col, value, simple->data);
-	else
-		return (void *)value;
-}
-
-static void
-simple_free_value (ETableModel *etm, int col, void *value)
-{
-	ETableSimple *simple = E_TABLE_SIMPLE(etm);
-
-	if (simple->free_value)
-		simple->free_value (etm, col, value, simple->data);
-}
-
-static void *
-simple_initialize_value (ETableModel *etm, int col)
-{
-	ETableSimple *simple = E_TABLE_SIMPLE(etm);
-	
-	if (simple->initialize_value)
-		return simple->initialize_value (etm, col, simple->data);
-	else
-		return NULL;
-}
-
-static gboolean
-simple_value_is_empty (ETableModel *etm, int col, const void *value)
-{
-	ETableSimple *simple = E_TABLE_SIMPLE(etm);
-	
-	if (simple->value_is_empty)
-		return simple->value_is_empty (etm, col, value, simple->data);
-	else
-		return FALSE;
-}
-
-static char *
-simple_value_to_string (ETableModel *etm, int col, const void *value)
-{
-	ETableSimple *simple = E_TABLE_SIMPLE(etm);
-	
-	if (simple->value_to_string)
-		return simple->value_to_string (etm, col, value, simple->data);
-	else
-		return g_strdup ("");
-}
-
-static void
-e_table_simple_class_init (GObjectClass *object_class)
-{
-	ETableModelClass *model_class = (ETableModelClass *) object_class;
-
-	model_class->column_count      = simple_column_count;
-	model_class->row_count         = simple_row_count;
-	model_class->append_row        = simple_append_row;
-
-	model_class->value_at          = simple_value_at;
-	model_class->set_value_at      = simple_set_value_at;
-	model_class->is_cell_editable  = simple_is_cell_editable;
-
-	model_class->has_save_id       = simple_has_save_id;
-	model_class->get_save_id       = simple_get_save_id;
-
-	model_class->duplicate_value   = simple_duplicate_value;
-	model_class->free_value        = simple_free_value;
-	model_class->initialize_value  = simple_initialize_value;
-	model_class->value_is_empty    = simple_value_is_empty;
-	model_class->value_to_string   = simple_value_to_string;
-}
-
-E_MAKE_TYPE(e_table_simple, "ETableSimple", ETableSimple, e_table_simple_class_init, NULL, E_TABLE_MODEL_TYPE)
-
-/**
- * e_table_simple_new:
- * @col_count:
- * @row_count:
- * @value_at:
- * @set_value_at:
- * @is_cell_editable:
- * @duplicate_value:
- * @free_value:
- * @initialize_value:
- * @value_is_empty:
- * @value_to_string:
- * @data: closure pointer.
- *
- * This initializes a new ETableSimpleModel object.  ETableSimpleModel is
- * an implementaiton of the abstract class ETableModel.  The ETableSimpleModel
- * is designed to allow people to easily create ETableModels without having
- * to create a new GtkType derived from ETableModel every time they need one.
- *
- * Instead, ETableSimpleModel uses a setup based in callback functions, every
- * callback function signature mimics the signature of each ETableModel method
- * and passes the extra @data pointer to each one of the method to provide them
- * with any context they might want to use. 
- *
- * Returns: An ETableSimpleModel object (which is also an ETableModel
- * object).
- */
-ETableModel *
-e_table_simple_new  (ETableSimpleColumnCountFn      col_count,
-		     ETableSimpleRowCountFn         row_count,
-		     ETableSimpleAppendRowFn        append_row,
-
-		     ETableSimpleValueAtFn          value_at,
-		     ETableSimpleSetValueAtFn       set_value_at,
-		     ETableSimpleIsCellEditableFn   is_cell_editable,
-
-		     ETableSimpleHasSaveIdFn        has_save_id,
-		     ETableSimpleGetSaveIdFn        get_save_id,
-
-		     ETableSimpleDuplicateValueFn   duplicate_value,
-		     ETableSimpleFreeValueFn        free_value,
-		     ETableSimpleInitializeValueFn  initialize_value,
-		     ETableSimpleValueIsEmptyFn     value_is_empty,
-		     ETableSimpleValueToStringFn    value_to_string,
-		     void                          *data)
-{
-	ETableSimple *et = g_object_new (E_TABLE_SIMPLE_TYPE, NULL);
-
-	et->col_count         = col_count;
-	et->row_count         = row_count;
-	et->append_row        = append_row;
-
-	et->value_at          = value_at;
-	et->set_value_at      = set_value_at;
-	et->is_cell_editable  = is_cell_editable;
-
-	et->has_save_id       = has_save_id;
-	et->get_save_id       = get_save_id;
-
-	et->duplicate_value   = duplicate_value;
-	et->free_value        = free_value;
-	et->initialize_value  = initialize_value;
-	et->value_is_empty    = value_is_empty;
-	et->value_to_string   = value_to_string;
-	et->data              = data;
-
-	return (ETableModel *) et;
-}
-
-void *
-e_table_simple_string_duplicate_value (ETableModel *etm, int col, const void *val, void *data)
-{
-	return g_strdup (val);
-}
-
-void
-e_table_simple_string_free_value (ETableModel *etm, int col, void *val, void *data)
-{
-	g_free (val);
-}
-
-void *
-e_table_simple_string_initialize_value (ETableModel *etm, int col, void *data)
-{
-	return g_strdup ("");
-}
-
-gboolean
-e_table_simple_string_value_is_empty (ETableModel *etm, int col, const void *val, void *data)
-{
-	return !(val && * (char *) val);
-}
-
-char *
-e_table_simple_string_value_to_string (ETableModel *etm, int col, const void *val, void *data)
-{
-	return g_strdup (val);
-}
diff --git a/widgets/table/e-table-simple.h b/widgets/table/e-table-simple.h
deleted file mode 100644
index 39800c3118..0000000000
--- a/widgets/table/e-table-simple.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-simple.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Miguel de Icaza <miguel@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_SIMPLE_H_
-#define _E_TABLE_SIMPLE_H_
-
-#include <gal/e-table/e-table-model.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_SIMPLE_TYPE        (e_table_simple_get_type ())
-#define E_TABLE_SIMPLE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_SIMPLE_TYPE, ETableSimple))
-#define E_TABLE_SIMPLE_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_SIMPLE_TYPE, ETableSimpleClass))
-#define E_IS_TABLE_SIMPLE(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_SIMPLE_TYPE))
-#define E_IS_TABLE_SIMPLE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_SIMPLE_TYPE))
-#define E_TABLE_SIMPLE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TABLE_SIMPLE_TYPE, ETableSimpleClass))
-
-typedef int         (*ETableSimpleColumnCountFn)     (ETableModel *etm, void *data);
-typedef	int         (*ETableSimpleRowCountFn)        (ETableModel *etm, void *data);
-typedef void        (*ETableSimpleAppendRowFn)       (ETableModel *etm, ETableModel *model, int row, void *data);
-
-typedef	void       *(*ETableSimpleValueAtFn)         (ETableModel *etm, int col, int row, void *data);
-typedef	void        (*ETableSimpleSetValueAtFn)      (ETableModel *etm, int col, int row, const void *val, void *data);
-typedef	gboolean    (*ETableSimpleIsCellEditableFn)  (ETableModel *etm, int col, int row, void *data);
-
-typedef gboolean    (*ETableSimpleHasSaveIdFn)       (ETableModel *etm, void *data);
-typedef char       *(*ETableSimpleGetSaveIdFn)       (ETableModel *etm, int row, void *data);
-
-typedef	void       *(*ETableSimpleDuplicateValueFn)  (ETableModel *etm, int col, const void *val, void *data);
-typedef	void        (*ETableSimpleFreeValueFn)       (ETableModel *etm, int col, void *val, void *data);
-typedef void       *(*ETableSimpleInitializeValueFn) (ETableModel *etm, int col, void *data);
-typedef gboolean    (*ETableSimpleValueIsEmptyFn)    (ETableModel *etm, int col, const void *val, void *data);
-typedef char       *(*ETableSimpleValueToStringFn)   (ETableModel *etm, int col, const void *val, void *data);
-
-typedef struct {
-	ETableModel parent;
-
-	ETableSimpleColumnCountFn     col_count;
-	ETableSimpleRowCountFn        row_count;
-	ETableSimpleAppendRowFn       append_row;
-
-	ETableSimpleValueAtFn         value_at;
-	ETableSimpleSetValueAtFn      set_value_at;
-	ETableSimpleIsCellEditableFn  is_cell_editable;
-
-	ETableSimpleHasSaveIdFn       has_save_id;
-	ETableSimpleGetSaveIdFn       get_save_id;
-
-	ETableSimpleDuplicateValueFn  duplicate_value;
-	ETableSimpleFreeValueFn       free_value;
-	ETableSimpleInitializeValueFn initialize_value;
-	ETableSimpleValueIsEmptyFn    value_is_empty;
-	ETableSimpleValueToStringFn   value_to_string; 
-	void *data;
-} ETableSimple;
-
-typedef struct {
-	ETableModelClass parent_class;
-} ETableSimpleClass;
-
-GType        e_table_simple_get_type                 (void);
-ETableModel *e_table_simple_new                      (ETableSimpleColumnCountFn      col_count,
-						      ETableSimpleRowCountFn         row_count,
-						      ETableSimpleAppendRowFn        append_row,
-						      ETableSimpleValueAtFn          value_at,
-						      ETableSimpleSetValueAtFn       set_value_at,
-						      ETableSimpleIsCellEditableFn   is_cell_editable,
-						      ETableSimpleHasSaveIdFn        has_save_id,
-						      ETableSimpleGetSaveIdFn        get_save_id,
-						      ETableSimpleDuplicateValueFn   duplicate_value,
-						      ETableSimpleFreeValueFn        free_value,
-						      ETableSimpleInitializeValueFn  initialize_value,
-						      ETableSimpleValueIsEmptyFn     value_is_empty,
-						      ETableSimpleValueToStringFn    value_to_string,
-						      void                          *data);
-
-
-/* Helper functions for if your values are all just strings. */
-void        *e_table_simple_string_duplicate_value   (ETableModel                   *etm,
-						      int                            col,
-						      const void                    *val,
-						      void                          *data);
-void         e_table_simple_string_free_value        (ETableModel                   *etm,
-						      int                            col,
-						      void                          *val,
-						      void                          *data);
-void        *e_table_simple_string_initialize_value  (ETableModel                   *etm,
-						      int                            col,
-						      void                          *data);
-gboolean     e_table_simple_string_value_is_empty    (ETableModel                   *etm,
-						      int                            col,
-						      const void                    *val,
-						      void                          *data);
-char        *e_table_simple_string_value_to_string   (ETableModel                   *etm,
-						      int                            col,
-						      const void                    *val,
-						      void                          *data);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_SIMPLE_H_ */
diff --git a/widgets/table/e-table-size-test.c b/widgets/table/e-table-size-test.c
deleted file mode 100644
index 05a4245899..0000000000
--- a/widgets/table/e-table-size-test.c
+++ /dev/null
@@ -1,307 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-size-test.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include "gal/e-util/e-cursors.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-checkbox.h"
-#include "e-table.h"
-
-#include "table-test.h"
-
-/*
- * One way in which we make it simpler to build an ETableModel is through
- * the ETableSimple class.  Instead of creating your own ETableModel
- * class, you simply create a new object of the ETableSimple class.  You
- * give it a bunch of functions that act as callbacks.
- * 
- * You also get to pass a void * to ETableSimple and it gets passed to
- * your callbacks.  This would be for having multiple models of the same
- * type.  This is just an example though, so we statically define all the
- * data and ignore the void *data parameter.
- * 
- * In our example we will be creating a table model with 6 columns and 10
- * rows.  This corresponds to having 6 different types of information and
- * 10 different sets of data in our database.
- * 
- * The headers will be hard coded, as will be the example data.
- *
- */
-
-/*
- * There are two different meanings to the word "column".  The first is
- * the model column.  A model column corresponds to a specific type of
- * data.  This is very much like the usage in a database table where a
- * column is a field in the database.
- *
- * The second type of column is a view column.  A view column
- * corresponds to a visually displayed column.  Each view column
- * corresponds to a specific model column, though a model column may
- * have any number of view columns associated with it, from zero to
- * greater than one.
- *
- * Also, a view column doesn't necessarily depend on only one model
- * column.  In some cases, the view column renderer can be given a
- * reference to another column to get extra information about its
- * display.
-*/
-
-#define ROWS 5000
-#define COLS 4
-
-#define IMPORTANCE_COLUMN 4
-#define COLOR_COLUMN 5
-
-/*
- * Here we define the initial layout of the table.  This is an xml
- * format that allows you to change the initial ordering of the
- * columns or to do sorting or grouping initially.  This specification
- * shows all 5 columns, but moves the importance column nearer to the
- * front.  It also sorts by the "Full Name" column (ascending.)
- * Sorting and grouping take the model column as their arguments
- * (sorting is specified by the "column" argument to the leaf elemnt.
- */
-
-#define INITIAL_SPEC "<ETableSpecification>                    	       \
-	<columns-shown>                  			       \
-		<column> 0 </column>     			       \
-		<column> 4 </column>     			       \
-		<column> 1 </column>     			       \
-		<column> 2 </column>     			       \
-		<column> 3 </column>     			       \
-	</columns-shown>                 			       \
-	<grouping> <leaf column=\"1\" ascending=\"true\"/> </grouping>    \
-</ETableSpecification>"
-
-char *headers [COLS] = {
-  "Email",
-  "Full Name",
-  "Address",
-  "Phone"
-};
-
-/*
- * Virtual Column list:
- * 0   Email
- * 1   Full Name
- * 2   Address
- * 3   Phone
- */
-
-/*
- * ETableSimple callbacks
- * These are the callbacks that define the behavior of our custom model.
- */
-
-/*
- * Since our model is a constant size, we can just return its size in
- * the column and row count fields.
- */
-
-/* This function returns the number of columns in our ETableModel. */
-static int
-my_col_count (ETableModel *etc, void *data)
-{
-	return COLS;
-}
-
-/* This function returns the number of rows in our ETableModel. */
-static int
-my_row_count (ETableModel *etc, void *data)
-{
-	return ROWS;
-}
-
-/* This function returns the value at a particular point in our ETableModel. */
-static void *
-my_value_at (ETableModel *etc, int col, int row, void *data)
-{
-	static guchar t[] = {'A', 0xc3, 0x84, 0xc3, 0x95, 0xc3, 0x94, 0xc3, 0xb5, 0x00};
-
-#if 0
-	if (col == 1) return "toshok@ximian.com";
-#else
-	if (col == 1) return t;
-#endif
-        else if (col == 2) return "Chris Toshok";
-        else if (col == 3) return "43 Vicksburg, SF";
-        else if (col == 4) return "415-867-5309";
-	else return NULL;
-}
-
-/* This function sets the value at a particular point in our ETableModel. */
-static void
-my_set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
-}
-
-/* This function returns whether a particular cell is editable. */
-static gboolean
-my_is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
-	return FALSE;
-}
-
-/* This function duplicates the value passed to it. */
-static void *
-my_duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
-	return g_strdup (value);
-}
-
-/* This function frees the value passed to it. */
-static void
-my_free_value (ETableModel *etc, int col, void *value, void *data)
-{
-	g_free (value);
-}
-
-/* This function creates an empty value. */
-static void *
-my_initialize_value (ETableModel *etc, int col, void *data)
-{
-	return g_strdup ("");
-}
-
-/* This function reports if a value is empty. */
-static gboolean
-my_value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
-	return !(value && *(char *)value);
-}
-
-/* This function reports if a value is empty. */
-static char *
-my_value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
-	return g_strdup(value);
-}
-
-/* We create a window containing our new table. */
-static void
-create_table (void)
-{
-	GtkWidget *e_table, *window, *frame;
-	ECell *cell_left_just;
-	ETableHeader *e_table_header;
-	ETableModel *e_table_model = NULL;
-        int i;
-
-	/* Next we create our model.  This uses the functions we defined
-	   earlier. */
-	e_table_model = e_table_simple_new (
-					    my_col_count, my_row_count, my_value_at,
-					    my_set_value_at, my_is_cell_editable,
-					    my_duplicate_value, my_free_value,
-					    my_initialize_value, my_value_is_empty,
-					    my_value_to_string,
-					    NULL);
-	/*
-	 * Next we create a header.  The ETableHeader is used in two
-	 * different way.  The first is the full_header.  This is the
-	 * list of possible columns in the view.  The second use is
-	 * completely internal.  Many of the ETableHeader functions are
-	 * for that purpose.  The only functions we really need are
-	 * e_table_header_new and e_table_header_add_col.
-	 *
-	 * First we create the header.
-	 */
-	e_table_header = e_table_header_new ();
-	
-	/*
-	 * Next we have to build renderers for all of the columns.
-	 * Since all our columns are text columns, we can simply use
-	 * the same renderer over and over again.  If we had different
-	 * types of columns, we could use a different renderer for
-	 * each column.
-	 */
-	cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
-	/*
-	 * Next we create a column object for each view column and add
-	 * them to the header.  We don't create a column object for
-	 * the importance column since it will not be shown.
-	 */
-	for (i = 0; i < COLS; i++) {
-		/* Create the column. */
-		ETableCol *ecol = e_table_col_new (
-						   i, headers [i],
-						   1.0, 20, cell_left_just,
-						   g_str_compare, TRUE);
-		/* Add it to the header. */
-		e_table_header_add_column (e_table_header, ecol, i);
-	}
-
-	/*
-	 * Here we create a window for our new table.  This window
-	 * will get shown and the person will be able to test their
-	 * item.
-	 */
-	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-
-	/* This frame is simply to get a bevel around our table. */
-	frame = gtk_frame_new (NULL);
-
-	/*
-	 * Here we create the table.  We give it the three pieces of
-	 * the table we've created, the header, the model, and the
-	 * initial layout.  It does the rest.
-	 */
-	e_table = e_table_new (e_table_header, e_table_model, INITIAL_SPEC);
-
-	/* Build the gtk widget hierarchy. */
-	gtk_container_add (GTK_CONTAINER (frame), e_table);
-	gtk_container_add (GTK_CONTAINER (window), frame);
-
-	/* Size the initial window. */
-	gtk_widget_set_usize (window, 300, 200);
-
-	/* Show it all. */
-	gtk_widget_show_all (window);
-}
-
-/* This is the main function which just initializes gnome and call our create_table function */
-
-int
-main (int argc, char *argv [])
-{
-	gnome_init ("TableExample", "TableExample", argc, argv);
-	e_cursors_init ();
-
-	gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
-	create_table ();
-	
-	gtk_main ();
-
-	e_cursors_shutdown ();
-	return 0;
-}
-
diff --git a/widgets/table/e-table-sort-info.c b/widgets/table/e-table-sort-info.c
deleted file mode 100644
index ba8f9050ab..0000000000
--- a/widgets/table/e-table-sort-info.c
+++ /dev/null
@@ -1,481 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-sort-info.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include "e-table-sort-info.h"
-
-#include "gal/util/e-util.h"
-#include "gal/util/e-xml-utils.h"
-#include <string.h>
-
-#define ETM_CLASS(e) (E_TABLE_SORT_INFO_GET_CLASS (e))
-
-static GObjectClass *e_table_sort_info_parent_class;
-
-enum {
-	SORT_INFO_CHANGED,
-	GROUP_INFO_CHANGED,
-	LAST_SIGNAL
-};
-
-static guint e_table_sort_info_signals [LAST_SIGNAL] = { 0, };
-
-static void
-etsi_finalize (GObject *object)
-{
-	ETableSortInfo *etsi = E_TABLE_SORT_INFO (object);
-	
-	if (etsi->groupings)
-		g_free(etsi->groupings);
-	etsi->groupings = NULL;
-
-	if (etsi->sortings)
-		g_free(etsi->sortings);
-	etsi->sortings = NULL;
-
-	G_OBJECT_CLASS (e_table_sort_info_parent_class)->finalize (object);
-}
-
-static void
-e_table_sort_info_init (ETableSortInfo *info)
-{
-	info->group_count = 0;
-	info->groupings = NULL;
-	info->sort_count = 0;
-	info->sortings = NULL;
-	info->frozen = 0;
-	info->sort_info_changed = 0;
-	info->group_info_changed = 0;
-	info->can_group = 1;
-}
-
-static void
-e_table_sort_info_class_init (ETableSortInfoClass *klass)
-{
-	GObjectClass * object_class = G_OBJECT_CLASS (klass);
-
-	e_table_sort_info_parent_class = g_type_class_peek_parent (klass);
-
-	object_class->finalize = etsi_finalize;
-
-	e_table_sort_info_signals [SORT_INFO_CHANGED] =
-		g_signal_new ("sort_info_changed",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableSortInfoClass, sort_info_changed),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
-
-	e_table_sort_info_signals [GROUP_INFO_CHANGED] =
-		g_signal_new ("group_info_changed",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableSortInfoClass, group_info_changed),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
-
-	klass->sort_info_changed = NULL;
-	klass->group_info_changed = NULL;
-}
-
-E_MAKE_TYPE(e_table_sort_info, "ETableSortInfo", ETableSortInfo,
-	    e_table_sort_info_class_init, e_table_sort_info_init, G_TYPE_OBJECT)
-
-static void
-e_table_sort_info_sort_info_changed (ETableSortInfo *info)
-{
-	g_return_if_fail (info != NULL);
-	g_return_if_fail (E_IS_TABLE_SORT_INFO (info));
-	
-	if (info->frozen) {
-		info->sort_info_changed = 1;
-	} else {
-		g_signal_emit (G_OBJECT (info), e_table_sort_info_signals [SORT_INFO_CHANGED], 0);
-	}
-}
-
-static void
-e_table_sort_info_group_info_changed (ETableSortInfo *info)
-{
-	g_return_if_fail (info != NULL);
-	g_return_if_fail (E_IS_TABLE_SORT_INFO (info));
-	
-	if (info->frozen) {
-		info->group_info_changed = 1;
-	} else {
-		g_signal_emit (G_OBJECT (info), e_table_sort_info_signals [GROUP_INFO_CHANGED], 0);
-	}
-}
-
-/**
- * e_table_sort_info_freeze:
- * @info: The ETableSortInfo object
- *
- * This functions allows the programmer to cluster various changes to the
- * ETableSortInfo (grouping and sorting) without having the object emit
- * "group_info_changed" or "sort_info_changed" signals on each change.
- *
- * To thaw, invoke the e_table_sort_info_thaw() function, which will
- * trigger any signals that might have been queued.
- */
-void 
-e_table_sort_info_freeze             (ETableSortInfo *info)
-{
-	info->frozen++;
-}
-
-/**
- * e_table_sort_info_thaw:
- * @info: The ETableSortInfo object
- *
- * This functions allows the programmer to cluster various changes to the
- * ETableSortInfo (grouping and sorting) without having the object emit
- * "group_info_changed" or "sort_info_changed" signals on each change.
- *
- * This function will flush any pending signals that might be emited by
- * this object.
- */
-void
-e_table_sort_info_thaw               (ETableSortInfo *info)
-{
-	info->frozen--;
-	if (info->frozen != 0)
-		return;
-	
-	if (info->sort_info_changed) {
-		info->sort_info_changed = 0;
-		e_table_sort_info_sort_info_changed(info);
-	}
-	if (info->group_info_changed) {
-		info->group_info_changed = 0;
-		e_table_sort_info_group_info_changed(info);
-	}
-}
-
-/**
- * e_table_sort_info_grouping_get_count:
- * @info: The ETableSortInfo object
- *
- * Returns: the number of grouping criteria in the object.
- */
-guint
-e_table_sort_info_grouping_get_count (ETableSortInfo *info)
-{
-	if (info->can_group)
-		return info->group_count;
-	else
-		return 0;
-}
-
-static void
-e_table_sort_info_grouping_real_truncate  (ETableSortInfo *info, int length)
-{
-	if (length < info->group_count) {
-		info->group_count = length;
-	}
-	if (length > info->group_count) {
-		info->groupings = g_realloc(info->groupings, length * sizeof(ETableSortColumn));
-		info->group_count = length;
-	}
-}
-
-/**
- * e_table_sort_info_grouping_truncate:
- * @info: The ETableSortInfo object
- * @lenght: position where the truncation happens.
- *
- * This routine can be used to reduce or grow the number of grouping
- * criteria in the object.  
- */
-void
-e_table_sort_info_grouping_truncate  (ETableSortInfo *info, int length)
-{
-	e_table_sort_info_grouping_real_truncate(info, length);
-	e_table_sort_info_group_info_changed(info);
-}
-
-/**
- * e_table_sort_info_grouping_get_nth:
- * @info: The ETableSortInfo object
- * @n: Item information to fetch.
- *
- * Returns: the description of the @n-th grouping criteria in the @info object.
- */
-ETableSortColumn
-e_table_sort_info_grouping_get_nth   (ETableSortInfo *info, int n)
-{
-	if (info->can_group && n < info->group_count) {
-		return info->groupings[n];
-	} else {
-		ETableSortColumn fake = {0, 0};
-		return fake;
-	}
-}
-
-/**
- * e_table_sort_info_grouping_set_nth:
- * @info: The ETableSortInfo object
- * @n: Item information to fetch.
- * @column: new values for the grouping
- *
- * Sets the grouping criteria for index @n to be given by @column (a column number and
- * whether it is ascending or descending).
- */
-void
-e_table_sort_info_grouping_set_nth   (ETableSortInfo *info, int n, ETableSortColumn column)
-{
-	if (n >= info->group_count) {
-		e_table_sort_info_grouping_real_truncate(info, n + 1);
-	}
-	info->groupings[n] = column;
-	e_table_sort_info_group_info_changed(info);
-}
-
-
-/**
- * e_table_sort_info_get_count:
- * @info: The ETableSortInfo object
- *
- * Returns: the number of sorting criteria in the object.
- */
-guint
-e_table_sort_info_sorting_get_count (ETableSortInfo *info)
-{
-	return info->sort_count;
-}
-
-static void
-e_table_sort_info_sorting_real_truncate  (ETableSortInfo *info, int length)
-{
-	if (length < info->sort_count) {
-		info->sort_count = length;
-	}
-	if (length > info->sort_count) {
-		info->sortings = g_realloc(info->sortings, length * sizeof(ETableSortColumn));
-		info->sort_count = length;
-	}
-}
-
-/**
- * e_table_sort_info_sorting_truncate:
- * @info: The ETableSortInfo object
- * @lenght: position where the truncation happens.
- *
- * This routine can be used to reduce or grow the number of sort
- * criteria in the object.  
- */
-void
-e_table_sort_info_sorting_truncate  (ETableSortInfo *info, int length)
-{
-	e_table_sort_info_sorting_real_truncate  (info, length);
-	e_table_sort_info_sort_info_changed(info);
-}
-
-/**
- * e_table_sort_info_sorting_get_nth:
- * @info: The ETableSortInfo object
- * @n: Item information to fetch.
- *
- * Returns: the description of the @n-th grouping criteria in the @info object.
- */
-ETableSortColumn
-e_table_sort_info_sorting_get_nth   (ETableSortInfo *info, int n)
-{
-	if (n < info->sort_count) {
-		return info->sortings[n];
-	} else {
-		ETableSortColumn fake = {0, 0};
-		return fake;
-	}
-}
-
-/**
- * e_table_sort_info_sorting_get_nth:
- * @info: The ETableSortInfo object
- * @n: Item information to fetch.
- * @column: new values for the sorting
- *
- * Sets the sorting criteria for index @n to be given by @column (a
- * column number and whether it is ascending or descending).
- */
-void
-e_table_sort_info_sorting_set_nth   (ETableSortInfo *info, int n, ETableSortColumn column)
-{
-	if (n >= info->sort_count) {
-		e_table_sort_info_sorting_real_truncate(info, n + 1);
-	}
-	info->sortings[n] = column;
-	e_table_sort_info_sort_info_changed(info);
-}
-
-/**
- * e_table_sort_info_new:
- *
- * This creates a new e_table_sort_info object that contains no
- * grouping and no sorting defined as of yet.  This object is used
- * to keep track of multi-level sorting and multi-level grouping of
- * the ETable.  
- *
- * Returns: A new %ETableSortInfo object
- */
-ETableSortInfo *
-e_table_sort_info_new (void)
-{
-	return g_object_new (E_TABLE_SORT_INFO_TYPE, NULL);
-}
-
-/**
- * e_table_sort_info_load_from_node:
- * @info: The ETableSortInfo object
- * @node: pointer to the xmlNode that describes the sorting and grouping information
- * @state_version:
- *
- * This loads the state for the %ETableSortInfo object @info from the
- * xml node @node.
- */
-void
-e_table_sort_info_load_from_node (ETableSortInfo *info,
-				  xmlNode        *node,
-				  gdouble         state_version)
-{
-	int i;
-	xmlNode *grouping;
-
-	if (state_version <= 0.05) {
-		i = 0;
-		for (grouping = node->xmlChildrenNode; grouping && !strcmp (grouping->name, "group"); grouping = grouping->xmlChildrenNode) {
-			ETableSortColumn column;
-			column.column = e_xml_get_integer_prop_by_name (grouping, "column");
-			column.ascending = e_xml_get_bool_prop_by_name (grouping, "ascending");
-			e_table_sort_info_grouping_set_nth(info, i++, column);
-		}
-		i = 0;
-		for (; grouping && !strcmp (grouping->name, "leaf"); grouping = grouping->xmlChildrenNode) {
-			ETableSortColumn column;
-			column.column = e_xml_get_integer_prop_by_name (grouping, "column");
-			column.ascending = e_xml_get_bool_prop_by_name (grouping, "ascending");
-			e_table_sort_info_sorting_set_nth(info, i++, column);
-		}
-	} else {
-		gint gcnt = 0;
-		gint scnt = 0;
-		for (grouping = node->children; grouping; grouping = grouping->next) {
-			ETableSortColumn column;
-
-			if (grouping->type != XML_ELEMENT_NODE)
-				continue;
-
-			if (!strcmp (grouping->name, "group")) {
-				column.column = e_xml_get_integer_prop_by_name (grouping, "column");
-				column.ascending = e_xml_get_bool_prop_by_name (grouping, "ascending");
-				e_table_sort_info_grouping_set_nth(info, gcnt++, column);
-			} else if (!strcmp (grouping->name, "leaf")) {
-				column.column = e_xml_get_integer_prop_by_name (grouping, "column");
-				column.ascending = e_xml_get_bool_prop_by_name (grouping, "ascending");
-				e_table_sort_info_sorting_set_nth(info, scnt++, column);
-			}
-		}
-	}
-	g_signal_emit (G_OBJECT (info), e_table_sort_info_signals [SORT_INFO_CHANGED], 0);
-}
-
-/**
- * e_table_sort_info_save_to_node:
- * @info: The ETableSortInfo object
- * @parent: xmlNode that will be hosting the saved state of the @info object.
- *
- * This function is used
- *
- * Returns: the node that has been appended to @parent as a child containing
- * the sorting and grouping information for this ETableSortInfo object.
- */
-xmlNode *
-e_table_sort_info_save_to_node (ETableSortInfo *info,
-				xmlNode        *parent)
-{
-	xmlNode *grouping;
-	xmlNode *node;
-	int i;
-	const int sort_count = e_table_sort_info_sorting_get_count (info);
-	const int group_count = e_table_sort_info_grouping_get_count (info);
-	
-	grouping = xmlNewChild (parent, NULL, "grouping", NULL);
-
-	for (i = 0; i < group_count; i++) {
-		ETableSortColumn column = e_table_sort_info_grouping_get_nth(info, i);
-		xmlNode *new_node = xmlNewChild(grouping, NULL, "group", NULL);
-
-		e_xml_set_integer_prop_by_name (new_node, "column", column.column);
-		e_xml_set_bool_prop_by_name (new_node, "ascending", column.ascending);
-		node = new_node;
-	}
-
-	for (i = 0; i < sort_count; i++) {
-		ETableSortColumn column = e_table_sort_info_sorting_get_nth(info, i);
-		xmlNode *new_node = xmlNewChild(grouping, NULL, "leaf", NULL);
-		
-		e_xml_set_integer_prop_by_name (new_node, "column", column.column);
-		e_xml_set_bool_prop_by_name (new_node, "ascending", column.ascending);
-		node = new_node;
-	}
-
-	return grouping;
-}
-
-ETableSortInfo *
-e_table_sort_info_duplicate (ETableSortInfo *info)
-{
-	ETableSortInfo *new_info;
-
-	new_info = e_table_sort_info_new();
-
-	new_info->group_count = info->group_count;
-	new_info->groupings = g_new(ETableSortColumn, new_info->group_count);
-	memmove(new_info->groupings, info->groupings, sizeof (ETableSortColumn) * new_info->group_count);
-
-	new_info->sort_count = info->sort_count;
-	new_info->sortings = g_new(ETableSortColumn, new_info->sort_count);
-	memmove(new_info->sortings, info->sortings, sizeof (ETableSortColumn) * new_info->sort_count);
-
-	new_info->can_group = info->can_group;
-
-	return new_info;
-}
-
-void
-e_table_sort_info_set_can_group       (ETableSortInfo   *info,
-				       gboolean          can_group)
-{
-	info->can_group = can_group;
-}
-
-gboolean
-e_table_sort_info_get_can_group       (ETableSortInfo   *info)
-{
-	return info->can_group;
-}
-
-
diff --git a/widgets/table/e-table-sort-info.h b/widgets/table/e-table-sort-info.h
deleted file mode 100644
index 4710fbd453..0000000000
--- a/widgets/table/e-table-sort-info.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-sort-info.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_SORT_INFO_H_
-#define _E_TABLE_SORT_INFO_H_
-
-#include <glib-object.h>
-#include <libxml/tree.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_SORT_INFO_TYPE        (e_table_sort_info_get_type ())
-#define E_TABLE_SORT_INFO(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_SORT_INFO_TYPE, ETableSortInfo))
-#define E_TABLE_SORT_INFO_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_SORT_INFO_TYPE, ETableSortInfoClass))
-#define E_IS_TABLE_SORT_INFO(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_SORT_INFO_TYPE))
-#define E_IS_TABLE_SORT_INFO_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_SORT_INFO_TYPE))
-#define E_TABLE_SORT_INFO_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TABLE_SORT_INFO_TYPE, ETableSortInfoClass))
-
-typedef struct _ETableSortColumn ETableSortColumn;
-
-struct _ETableSortColumn {
-	guint column : 31;
-	guint ascending : 1;
-};
-
-typedef struct {
-	GObject   base;
-	
-	gint group_count;
-	ETableSortColumn *groupings;
-	gint sort_count;
-	ETableSortColumn *sortings;
-	
-	guint frozen : 1;
-	guint sort_info_changed : 1;
-	guint group_info_changed : 1;
-
-	guint can_group : 1;
-} ETableSortInfo;
-
-typedef struct {
-	GObjectClass parent_class;
-
-	/*
-	 * Signals
-	 */
-	void        (*sort_info_changed)      (ETableSortInfo *info);
-	void        (*group_info_changed)     (ETableSortInfo *info);
-} ETableSortInfoClass;
-
-GType             e_table_sort_info_get_type            (void);
-
-void              e_table_sort_info_freeze              (ETableSortInfo   *info);
-void              e_table_sort_info_thaw                (ETableSortInfo   *info);
-
-guint             e_table_sort_info_grouping_get_count  (ETableSortInfo   *info);
-void              e_table_sort_info_grouping_truncate   (ETableSortInfo   *info,
-							 int               length);
-ETableSortColumn  e_table_sort_info_grouping_get_nth    (ETableSortInfo   *info,
-							 int               n);
-void              e_table_sort_info_grouping_set_nth    (ETableSortInfo   *info,
-							 int               n,
-							 ETableSortColumn  column);
-
-guint             e_table_sort_info_sorting_get_count   (ETableSortInfo   *info);
-void              e_table_sort_info_sorting_truncate    (ETableSortInfo   *info,
-							 int               length);
-ETableSortColumn  e_table_sort_info_sorting_get_nth     (ETableSortInfo   *info,
-							 int               n);
-void              e_table_sort_info_sorting_set_nth     (ETableSortInfo   *info,
-							 int               n,
-							 ETableSortColumn  column);
-
-ETableSortInfo   *e_table_sort_info_new                 (void);
-void              e_table_sort_info_load_from_node      (ETableSortInfo   *info,
-							 xmlNode          *node,
-							 gdouble           state_version);
-xmlNode          *e_table_sort_info_save_to_node        (ETableSortInfo   *info,
-							 xmlNode          *parent);
-ETableSortInfo   *e_table_sort_info_duplicate           (ETableSortInfo   *info);
-void              e_table_sort_info_set_can_group       (ETableSortInfo   *info,
-							 gboolean          can_group);
-gboolean          e_table_sort_info_get_can_group       (ETableSortInfo   *info);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_SORT_INFO_H_ */
diff --git a/widgets/table/e-table-sorted-variable.c b/widgets/table/e-table-sorted-variable.c
deleted file mode 100644
index ac3a7d5067..0000000000
--- a/widgets/table/e-table-sorted-variable.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-sorted-variable.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <string.h>
-#include "gal/util/e-util.h"
-#include "e-table-sorted-variable.h"
-#include "e-table-sorting-utils.h"
-
-#define d(x)
-
-#define INCREMENT_AMOUNT 100
-
-/* maximum insertions between an idle event that we will do without scheduling an idle sort */
-#define ETSV_INSERT_MAX (4)
-
-static ETableSubsetVariableClass *etsv_parent_class;
-
-static void etsv_sort_info_changed        (ETableSortInfo *info, ETableSortedVariable *etsv);
-static void etsv_sort                     (ETableSortedVariable *etsv);
-static void etsv_add                      (ETableSubsetVariable *etssv, gint                  row);
-static void etsv_add_all                  (ETableSubsetVariable *etssv);
-
-static void
-etsv_dispose (GObject *object)
-{
-	ETableSortedVariable *etsv = E_TABLE_SORTED_VARIABLE (object);
-
-	if (etsv->sort_info_changed_id)
-		g_signal_handler_disconnect (G_OBJECT (etsv->sort_info),
-				             etsv->sort_info_changed_id);
-	etsv->sort_info_changed_id = 0;
-
-	if (etsv->sort_idle_id) {
-		g_source_remove(etsv->sort_idle_id);
-		etsv->sort_idle_id = 0;
-	}
-	if (etsv->insert_idle_id) {
-		g_source_remove(etsv->insert_idle_id);
-		etsv->insert_idle_id = 0;
-	}
-
-	if (etsv->sort_info)
-		g_object_unref(etsv->sort_info);
-	etsv->sort_info = NULL;
-
-	if (etsv->full_header)
-		g_object_unref(etsv->full_header);
-	etsv->full_header = NULL;
-
-	G_OBJECT_CLASS (etsv_parent_class)->dispose (object);
-}
-
-static void
-etsv_class_init (GObjectClass *object_class)
-{
-	ETableSubsetVariableClass *etssv_class = E_TABLE_SUBSET_VARIABLE_CLASS(object_class);
-
-	etsv_parent_class = g_type_class_peek_parent (object_class);
-
-	object_class->dispose = etsv_dispose;
-
-	etssv_class->add = etsv_add;
-	etssv_class->add_all = etsv_add_all;
-}
-
-static void
-etsv_init (ETableSortedVariable *etsv)
-{
-	etsv->full_header = NULL;
-	etsv->sort_info = NULL;
-
-	etsv->sort_info_changed_id = 0;
-
-	etsv->sort_idle_id = 0;
-	etsv->insert_count = 0;
-}
-
-E_MAKE_TYPE(e_table_sorted_variable, "ETableSortedVariable", ETableSortedVariable, etsv_class_init, etsv_init, E_TABLE_SUBSET_VARIABLE_TYPE)
-
-static gboolean
-etsv_sort_idle(ETableSortedVariable *etsv)
-{
-	g_object_ref(etsv);
-	etsv_sort(etsv);
-	etsv->sort_idle_id = 0;
-	etsv->insert_count = 0;
-	g_object_unref(etsv);
-	return FALSE;
-}
-
-static gboolean
-etsv_insert_idle(ETableSortedVariable *etsv)
-{
-	etsv->insert_count = 0;
-	etsv->insert_idle_id = 0;
-	return FALSE;
-}
-
-
-static void
-etsv_add       (ETableSubsetVariable *etssv,
-		gint                  row)
-{
-	ETableModel *etm = E_TABLE_MODEL(etssv);
-	ETableSubset *etss = E_TABLE_SUBSET(etssv);
-	ETableSortedVariable *etsv = E_TABLE_SORTED_VARIABLE (etssv);
-	int i;
-
-	e_table_model_pre_change (etm);
-
-	if (etss->n_map + 1 > etssv->n_vals_allocated) {
-		etssv->n_vals_allocated += INCREMENT_AMOUNT;
-		etss->map_table = g_realloc (etss->map_table, (etssv->n_vals_allocated) * sizeof(int));
-	}
-	i = etss->n_map;
-	if (etsv->sort_idle_id == 0) {
-		/* this is to see if we're inserting a lot of things between idle loops.
-		   If we are, we're busy, its faster to just append and perform a full sort later */
-		etsv->insert_count++;
-		if (etsv->insert_count > ETSV_INSERT_MAX) {
-			/* schedule a sort, and append instead */
-			etsv->sort_idle_id = g_idle_add_full(50, (GSourceFunc) etsv_sort_idle, etsv, NULL);
-		} else {
-			/* make sure we have an idle handler to reset the count every now and then */
-			if (etsv->insert_idle_id == 0) {
-				etsv->insert_idle_id = g_idle_add_full(40, (GSourceFunc) etsv_insert_idle, etsv, NULL);
-			}
-			i = e_table_sorting_utils_insert(etss->source, etsv->sort_info, etsv->full_header, etss->map_table, etss->n_map, row);
-			memmove(etss->map_table + i + 1, etss->map_table + i, (etss->n_map - i) * sizeof(int));
-		}
-	}
-	etss->map_table[i] = row;
-	etss->n_map++;
-
-	e_table_model_row_inserted (etm, i);
-}
-
-static void
-etsv_add_all   (ETableSubsetVariable *etssv)
-{
-	ETableModel *etm = E_TABLE_MODEL(etssv);
-	ETableSubset *etss = E_TABLE_SUBSET(etssv);
-	ETableSortedVariable *etsv = E_TABLE_SORTED_VARIABLE (etssv);
-	int rows;
-	int i;
-
-	e_table_model_pre_change(etm);
-
-	rows = e_table_model_row_count(etss->source);
-
-	if (etss->n_map + rows > etssv->n_vals_allocated){
-		etssv->n_vals_allocated += MAX(INCREMENT_AMOUNT, rows);
-		etss->map_table = g_realloc (etss->map_table, etssv->n_vals_allocated * sizeof(int));
-	}
-	for (i = 0; i < rows; i++)
-		etss->map_table[etss->n_map++] = i;
-
-	if (etsv->sort_idle_id == 0) {
-		etsv->sort_idle_id = g_idle_add_full(50, (GSourceFunc) etsv_sort_idle, etsv, NULL);
-	}
-
-	e_table_model_changed (etm);
-}
-
-ETableModel *
-e_table_sorted_variable_new (ETableModel *source, ETableHeader *full_header, ETableSortInfo *sort_info)
-{
-	ETableSortedVariable *etsv = g_object_new (E_TABLE_SORTED_VARIABLE_TYPE, NULL);
-	ETableSubsetVariable *etssv = E_TABLE_SUBSET_VARIABLE (etsv);
-
-	if (e_table_subset_variable_construct (etssv, source) == NULL){
-		g_object_unref (etsv);
-		return NULL;
-	}
-
-	etsv->sort_info = sort_info;
-	g_object_ref(etsv->sort_info);
-	etsv->full_header = full_header;
-	g_object_ref(etsv->full_header);
-
-	etsv->sort_info_changed_id = g_signal_connect (G_OBJECT (sort_info), "sort_info_changed",
-						       G_CALLBACK (etsv_sort_info_changed), etsv);
-
-	return E_TABLE_MODEL(etsv);
-}
-
-static void
-etsv_sort_info_changed (ETableSortInfo *info, ETableSortedVariable *etsv)
-{
-	etsv_sort(etsv);
-}
-
-static void
-etsv_sort(ETableSortedVariable *etsv)
-{
-	ETableSubset *etss = E_TABLE_SUBSET(etsv);
-	static int reentering = 0;
-	if (reentering)
-		return;
-	reentering = 1;
-
-	e_table_model_pre_change(E_TABLE_MODEL(etsv));
-
-	e_table_sorting_utils_sort(etss->source, etsv->sort_info, etsv->full_header, etss->map_table, etss->n_map);
-
-	e_table_model_changed (E_TABLE_MODEL(etsv));
-	reentering = 0;
-}
diff --git a/widgets/table/e-table-sorted-variable.h b/widgets/table/e-table-sorted-variable.h
deleted file mode 100644
index 546d04b240..0000000000
--- a/widgets/table/e-table-sorted-variable.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-sorted-variable.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_SORTED_VARIABLE_H_
-#define _E_TABLE_SORTED_VARIABLE_H_
-
-#include <glib-object.h>
-#include <gal/e-table/e-table-model.h>
-#include <gal/e-table/e-table-subset-variable.h>
-#include <gal/e-table/e-table-sort-info.h>
-#include <gal/e-table/e-table-header.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_SORTED_VARIABLE_TYPE        (e_table_sorted_variable_get_type ())
-#define E_TABLE_SORTED_VARIABLE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_SORTED_VARIABLE_TYPE, ETableSortedVariable))
-#define E_TABLE_SORTED_VARIABLE_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_SORTED_VARIABLE_TYPE, ETableSortedVariableClass))
-#define E_IS_TABLE_SORTED_VARIABLE(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_SORTED_VARIABLE_TYPE))
-#define E_IS_TABLE_SORTED_VARIABLE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_SORTED_VARIABLE_TYPE))
-#define E_TABLE_SORTED_VARIABLE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TABLE_SORTED_VARIABLE_TYPE, ETableSortedVariableClass))
-
-typedef struct {
-	ETableSubsetVariable base;
-
-	ETableSortInfo *sort_info;
-	
-	ETableHeader *full_header;
-
-	int              sort_info_changed_id;
-	int              sort_idle_id;
-	int		 insert_idle_id;
-	int		 insert_count;
-
-} ETableSortedVariable;
-
-typedef struct {
-	ETableSubsetVariableClass parent_class;
-} ETableSortedVariableClass;
-
-GType        e_table_sorted_variable_get_type (void);
-ETableModel *e_table_sorted_variable_new      (ETableModel *etm, ETableHeader *header, ETableSortInfo *sort_info);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_SORTED_VARIABLE_H_ */
diff --git a/widgets/table/e-table-sorted.c b/widgets/table/e-table-sorted.c
deleted file mode 100644
index a5b5acb8cf..0000000000
--- a/widgets/table/e-table-sorted.c
+++ /dev/null
@@ -1,310 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-sorted.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <string.h>
-#include "gal/util/e-util.h"
-#include "e-table-sorted.h"
-#include "e-table-sorting-utils.h"
-
-#define d(x)
-
-#define INCREMENT_AMOUNT 100
-
-/* maximum insertions between an idle event that we will do without scheduling an idle sort */
-#define ETS_INSERT_MAX (4)
-
-static ETableSubsetClass *ets_parent_class;
-
-static void ets_sort_info_changed        (ETableSortInfo *info, ETableSorted *ets);
-static void ets_sort                     (ETableSorted *ets);
-static void ets_proxy_model_changed      (ETableSubset *etss, ETableModel *source);
-static void ets_proxy_model_row_changed  (ETableSubset *etss, ETableModel *source, int row);
-static void ets_proxy_model_cell_changed (ETableSubset *etss, ETableModel *source, int col, int row);
-static void ets_proxy_model_rows_inserted (ETableSubset *etss, ETableModel *source, int row, int count);
-static void ets_proxy_model_rows_deleted  (ETableSubset *etss, ETableModel *source, int row, int count);
-
-static void
-ets_dispose (GObject *object)
-{
-	ETableSorted *ets = E_TABLE_SORTED (object);
-
-	if (ets->sort_idle_id)
-		g_source_remove(ets->sort_idle_id);
-	ets->sort_idle_id = 0;
-
-	if (ets->insert_idle_id)
-		g_source_remove(ets->insert_idle_id);
-	ets->insert_idle_id = 0;
-
-	if (ets->sort_info) {
-		g_signal_handler_disconnect (G_OBJECT (ets->sort_info),
-				             ets->sort_info_changed_id);
-		g_object_unref(ets->sort_info);
-		ets->sort_info = NULL;
-	}
-
-	if (ets->full_header)
-		g_object_unref(ets->full_header);
-	ets->full_header = NULL;
-
-	G_OBJECT_CLASS (ets_parent_class)->dispose (object);
-}
-
-static void
-ets_class_init (GObjectClass *object_class)
-{
-	ETableSubsetClass *etss_class = E_TABLE_SUBSET_CLASS(object_class);
-
-	ets_parent_class = g_type_class_peek_parent (object_class);
-
-	etss_class->proxy_model_changed = ets_proxy_model_changed;
-	etss_class->proxy_model_row_changed = ets_proxy_model_row_changed;
-	etss_class->proxy_model_cell_changed = ets_proxy_model_cell_changed;
-	etss_class->proxy_model_rows_inserted = ets_proxy_model_rows_inserted;
-	etss_class->proxy_model_rows_deleted = ets_proxy_model_rows_deleted;
-
-	object_class->dispose = ets_dispose;
-}
-
-static void
-ets_init (ETableSorted *ets)
-{
-	ets->full_header = NULL;
-	ets->sort_info = NULL;
-
-	ets->sort_info_changed_id = 0;
-
-	ets->sort_idle_id = 0;
-	ets->insert_count = 0;
-}
-
-E_MAKE_TYPE(e_table_sorted, "ETableSorted", ETableSorted, ets_class_init, ets_init, E_TABLE_SUBSET_TYPE)
-
-static gboolean
-ets_sort_idle(ETableSorted *ets)
-{
-	g_object_ref(ets);
-	ets_sort(ets);
-	ets->sort_idle_id = 0;
-	ets->insert_count = 0;
-	g_object_unref(ets);
-	return FALSE;
-}
-
-static gboolean
-ets_insert_idle(ETableSorted *ets)
-{
-	ets->insert_count = 0;
-	ets->insert_idle_id = 0;
-	return FALSE;
-}
-
-ETableModel *
-e_table_sorted_new (ETableModel *source, ETableHeader *full_header, ETableSortInfo *sort_info)
-{
-	ETableSorted *ets = g_object_new (E_TABLE_SORTED_TYPE, NULL);
-	ETableSubset *etss = E_TABLE_SUBSET (ets);
-
-	if (ets_parent_class->proxy_model_pre_change)
-		(ets_parent_class->proxy_model_pre_change) (etss, source);
-
-	if (e_table_subset_construct (etss, source, 0) == NULL){
-		g_object_unref (ets);
-		return NULL;
-	}
-
-	ets->sort_info = sort_info;
-	g_object_ref(ets->sort_info);
-	ets->full_header = full_header;
-	g_object_ref(ets->full_header);
-
-	ets_proxy_model_changed(etss, source);
-
-	ets->sort_info_changed_id = g_signal_connect (G_OBJECT (sort_info), "sort_info_changed",
-						      G_CALLBACK (ets_sort_info_changed), ets);
-
-	return E_TABLE_MODEL(ets);
-}
-
-static void
-ets_sort_info_changed (ETableSortInfo *info, ETableSorted *ets)
-{
-	ets_sort(ets);
-}
-
-static void
-ets_proxy_model_changed (ETableSubset *subset, ETableModel *source)
-{
-	int rows, i;
-
-	rows = e_table_model_row_count(source);
-
-	g_free(subset->map_table);
-	subset->n_map = rows;
-	subset->map_table = g_new(int, rows);
-
-	for (i = 0; i < rows; i++) {
-		subset->map_table[i] = i;
-	}
-
-	if (!E_TABLE_SORTED(subset)->sort_idle_id)
-		E_TABLE_SORTED(subset)->sort_idle_id = g_idle_add_full(50, (GSourceFunc) ets_sort_idle, subset, NULL);
-
-	e_table_model_changed(E_TABLE_MODEL(subset));
-}
-
-static void
-ets_proxy_model_row_changed (ETableSubset *subset, ETableModel *source, int row)
-{
-	if (!E_TABLE_SORTED(subset)->sort_idle_id)
-		E_TABLE_SORTED(subset)->sort_idle_id = g_idle_add_full(50, (GSourceFunc) ets_sort_idle, subset, NULL);
-	
-	if (ets_parent_class->proxy_model_row_changed)
-		(ets_parent_class->proxy_model_row_changed) (subset, source, row);
-}
-
-static void
-ets_proxy_model_cell_changed (ETableSubset *subset, ETableModel *source, int col, int row)
-{
-	ETableSorted *ets = E_TABLE_SORTED(subset);
-	if (e_table_sorting_utils_affects_sort(ets->sort_info, ets->full_header, col))
-		ets_proxy_model_row_changed(subset, source, row);
-	else if (ets_parent_class->proxy_model_cell_changed)
-		(ets_parent_class->proxy_model_cell_changed) (subset, source, col, row);
-}
-
-static void
-ets_proxy_model_rows_inserted (ETableSubset *etss, ETableModel *source, int row, int count)
-{
- 	ETableModel *etm = E_TABLE_MODEL(etss);
-	ETableSorted *ets = E_TABLE_SORTED(etss);
-	int i;
-	gboolean full_change = FALSE;
-
-	if (count == 0) {
-		e_table_model_no_change (etm);
-		return;
-	}
-
-	if (row != etss->n_map) {
-		full_change = TRUE;
-		for (i = 0; i < etss->n_map; i++) {
-			if (etss->map_table[i] >= row) {
-				etss->map_table[i] += count;
-			}
-		}
-	}
-
-	etss->map_table = g_realloc (etss->map_table, (etss->n_map + count) * sizeof(int));
-
-	for (; count > 0; count --) {
-		if (!full_change)
-			e_table_model_pre_change (etm);
-		i = etss->n_map;
-		if (ets->sort_idle_id == 0) {
-			/* this is to see if we're inserting a lot of things between idle loops.
-			   If we are, we're busy, its faster to just append and perform a full sort later */
-			ets->insert_count++;
-			if (ets->insert_count > ETS_INSERT_MAX) {
-				/* schedule a sort, and append instead */
-				ets->sort_idle_id = g_idle_add_full(50, (GSourceFunc) ets_sort_idle, ets, NULL);
-			} else {
-				/* make sure we have an idle handler to reset the count every now and then */
-				if (ets->insert_idle_id == 0) {
-					ets->insert_idle_id = g_idle_add_full(40, (GSourceFunc) ets_insert_idle, ets, NULL);
-				}
-				i = e_table_sorting_utils_insert(etss->source, ets->sort_info, ets->full_header, etss->map_table, etss->n_map, row);
-				memmove(etss->map_table + i + 1, etss->map_table + i, (etss->n_map - i) * sizeof(int));
-			}
-		}
-		etss->map_table[i] = row;
-		etss->n_map++;
-		if (!full_change) {
-			e_table_model_row_inserted (etm, i);
-		}
-
-		d(g_print("inserted row %d", row));
-		row++;
-	}
-	if (full_change)
-		e_table_model_changed (etm);
-	else
-		e_table_model_no_change (etm);
-	d(e_table_subset_print_debugging(etss));
-}
-
-static void
-ets_proxy_model_rows_deleted (ETableSubset *etss, ETableModel *source, int row, int count)
-{
-	ETableModel *etm = E_TABLE_MODEL(etss);
-	int i;
-	gboolean shift;
-	int j;
-
-	shift = row == etss->n_map - count;
-
-	for (j = 0; j < count; j++) {
-		for (i = 0; i < etss->n_map; i++){
-			if (etss->map_table[i] == row + j) {
-				if (shift)
-					e_table_model_pre_change (etm);
-				memmove (etss->map_table + i, etss->map_table + i + 1, (etss->n_map - i - 1) * sizeof(int));
-				etss->n_map --;
-				if (shift)
-					e_table_model_row_deleted (etm, i);
-			}
-		}
-	}
-	if (!shift) {
-		for (i = 0; i < etss->n_map; i++) {
-			if (etss->map_table[i] >= row)
-				etss->map_table[i] -= count;
-		}
-
-		e_table_model_changed (etm);
-	} else {
-		e_table_model_no_change (etm);
-	}
-
-	d(g_print("deleted row %d count %d", row, count));
-	d(e_table_subset_print_debugging(etss));
-}
-
-static void
-ets_sort(ETableSorted *ets)
-{
-	ETableSubset *etss = E_TABLE_SUBSET(ets);
-	static int reentering = 0;
-	if (reentering)
-		return;
-	reentering = 1;
-
-	e_table_model_pre_change(E_TABLE_MODEL(ets));
-
-	e_table_sorting_utils_sort(etss->source, ets->sort_info, ets->full_header, etss->map_table, etss->n_map);
-
-	e_table_model_changed (E_TABLE_MODEL(ets));
-	reentering = 0;
-}
diff --git a/widgets/table/e-table-sorted.h b/widgets/table/e-table-sorted.h
deleted file mode 100644
index e1265b0a08..0000000000
--- a/widgets/table/e-table-sorted.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-sorted.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_SORTED_H_
-#define _E_TABLE_SORTED_H_
-
-#include <glib-object.h>
-#include <gal/e-table/e-table-model.h>
-#include <gal/e-table/e-table-subset.h>
-#include <gal/e-table/e-table-sort-info.h>
-#include <gal/e-table/e-table-header.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_SORTED_TYPE        (e_table_sorted_get_type ())
-#define E_TABLE_SORTED(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_SORTED_TYPE, ETableSorted))
-#define E_TABLE_SORTED_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_SORTED_TYPE, ETableSortedClass))
-#define E_IS_TABLE_SORTED(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_SORTED_TYPE))
-#define E_IS_TABLE_SORTED_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_SORTED_TYPE))
-#define E_TABLE_SORTED_GET_CLASS(o)   (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TABLE_SORTED_TYPE, ETableSortedClass))
-
-typedef struct {
-	ETableSubset base;
-
-	ETableSortInfo *sort_info;
-	
-	ETableHeader *full_header;
-
-	int              sort_info_changed_id;
-	int              sort_idle_id;
-	int		 insert_idle_id;
-	int		 insert_count;
-
-} ETableSorted;
-
-typedef struct {
-	ETableSubsetClass parent_class;
-} ETableSortedClass;
-
-GType        e_table_sorted_get_type (void);
-ETableModel *e_table_sorted_new      (ETableModel *etm, ETableHeader *header, ETableSortInfo *sort_info);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_SORTED_H_ */
diff --git a/widgets/table/e-table-sorter.c b/widgets/table/e-table-sorter.c
deleted file mode 100644
index a92af49f4d..0000000000
--- a/widgets/table/e-table-sorter.c
+++ /dev/null
@@ -1,462 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-sorter.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <string.h>
-#include "gal/util/e-i18n.h"
-#include "gal/util/e-util.h"
-#include "e-table-sorter.h"
-
-#define d(x)
-
-/* The arguments we take */
-enum {
-	PROP_0,
-	PROP_SORT_INFO
-};
-
-#define PARENT_TYPE e_sorter_get_type()
-
-#define INCREMENT_AMOUNT 100
-
-static ESorterClass *parent_class;
-
-static void    	ets_model_changed      (ETableModel *etm, ETableSorter *ets);
-static void    	ets_model_row_changed  (ETableModel *etm, int row, ETableSorter *ets);
-static void    	ets_model_cell_changed (ETableModel *etm, int col, int row, ETableSorter *ets);
-static void    	ets_model_rows_inserted (ETableModel *etm, int row, int count, ETableSorter *ets);
-static void    	ets_model_rows_deleted (ETableModel *etm, int row, int count, ETableSorter *ets);
-static void    	ets_sort_info_changed  (ETableSortInfo *info, ETableSorter *ets);
-static void    	ets_clean              (ETableSorter *ets);
-static void    	ets_sort               (ETableSorter *ets);
-static void    	ets_backsort           (ETableSorter *ets);
-
-static gint    	ets_model_to_sorted           (ESorter *sorter, int row);
-static gint    	ets_sorted_to_model           (ESorter *sorter, int row);
-static void    	ets_get_model_to_sorted_array (ESorter *sorter, int **array, int *count);
-static void    	ets_get_sorted_to_model_array (ESorter *sorter, int **array, int *count);
-static gboolean ets_needs_sorting             (ESorter *ets);
-
-static void
-ets_dispose (GObject *object)
-{
-	ETableSorter *ets = E_TABLE_SORTER (object);
-
-	if (ets->sort_info) {
-		if (ets->table_model_changed_id)
-			g_signal_handler_disconnect (ets->source,
-						     ets->table_model_changed_id);
-		if (ets->table_model_row_changed_id)
-			g_signal_handler_disconnect (ets->source,
-						     ets->table_model_row_changed_id);
-		if (ets->table_model_cell_changed_id)
-			g_signal_handler_disconnect (ets->source,
-						     ets->table_model_cell_changed_id);
-		if (ets->table_model_rows_inserted_id)
-			g_signal_handler_disconnect (ets->source,
-						     ets->table_model_rows_inserted_id);
-		if (ets->table_model_rows_deleted_id)
-			g_signal_handler_disconnect (ets->source,
-						     ets->table_model_rows_deleted_id);
-		if (ets->sort_info_changed_id)
-			g_signal_handler_disconnect (ets->sort_info,
-						     ets->sort_info_changed_id);
-		if (ets->group_info_changed_id)
-			g_signal_handler_disconnect (ets->sort_info,
-						     ets->group_info_changed_id);
-
-		ets->table_model_changed_id = 0;
-		ets->table_model_row_changed_id = 0;
-		ets->table_model_cell_changed_id = 0;
-		ets->table_model_rows_inserted_id = 0;
-		ets->table_model_rows_deleted_id = 0;
-		ets->sort_info_changed_id = 0;
-		ets->group_info_changed_id = 0;
-
-		g_object_unref(ets->sort_info);
-		ets->sort_info = NULL;
-	}
-
-	if (ets->full_header)
-		g_object_unref(ets->full_header);
-	ets->full_header = NULL;
-
-	if (ets->source)
-		g_object_unref(ets->source);
-	ets->source = NULL;
-
-	G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static void
-ets_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
-	ETableSorter *ets = E_TABLE_SORTER (object);
-
-	switch (prop_id) {
-	case PROP_SORT_INFO:
-		if (ets->sort_info) {
-			if (ets->sort_info_changed_id)
-				g_signal_handler_disconnect(ets->sort_info, ets->sort_info_changed_id);
-			if (ets->group_info_changed_id)
-				g_signal_handler_disconnect(ets->sort_info, ets->group_info_changed_id);
-			g_object_unref(ets->sort_info);
-		}
-
-		ets->sort_info = E_TABLE_SORT_INFO(g_value_get_object (value));
-		g_object_ref(ets->sort_info);
-		ets->sort_info_changed_id = g_signal_connect (ets->sort_info, "sort_info_changed",
-							      G_CALLBACK (ets_sort_info_changed), ets);
-		ets->group_info_changed_id = g_signal_connect (ets->sort_info, "group_info_changed",
-							       G_CALLBACK (ets_sort_info_changed), ets);
-
-		ets_clean (ets);
-		break;
-	default:
-		break;
-	}
-}
-
-static void
-ets_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
-	ETableSorter *ets = E_TABLE_SORTER (object);
-	switch (prop_id) {
-	case PROP_SORT_INFO:
-		g_value_set_object (value, ets->sort_info);
-		break;
-	}
-}
-
-static void
-ets_class_init (ETableSorterClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS(klass);
-	ESorterClass *sorter_class = E_SORTER_CLASS(klass);
-
-	parent_class                            = g_type_class_peek_parent (klass);
-
-	object_class->dispose                   = ets_dispose;
-	object_class->set_property              = ets_set_property;
-	object_class->get_property              = ets_get_property;
-
-	sorter_class->model_to_sorted           = ets_model_to_sorted           ;
-	sorter_class->sorted_to_model           = ets_sorted_to_model           ;
-	sorter_class->get_model_to_sorted_array = ets_get_model_to_sorted_array ;
-	sorter_class->get_sorted_to_model_array = ets_get_sorted_to_model_array ;		
-	sorter_class->needs_sorting             = ets_needs_sorting             ;
-
-	g_object_class_install_property (object_class, PROP_SORT_INFO, 
-					 g_param_spec_object ("sort_info",
-							      _("Sort Info"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_SORT_INFO_TYPE,
-							      G_PARAM_READWRITE));
-}
-
-static void
-ets_init (ETableSorter *ets)
-{
-	ets->full_header = NULL;
-	ets->sort_info = NULL;
-	ets->source = NULL;
-
-	ets->needs_sorting = -1;
-
-	ets->table_model_changed_id = 0;
-	ets->table_model_row_changed_id = 0;
-	ets->table_model_cell_changed_id = 0;
-	ets->table_model_rows_inserted_id = 0;
-	ets->table_model_rows_deleted_id = 0;
-	ets->sort_info_changed_id = 0;
-	ets->group_info_changed_id = 0;
-}
-
-E_MAKE_TYPE(e_table_sorter, "ETableSorter", ETableSorter, ets_class_init, ets_init, PARENT_TYPE)
-
-ETableSorter *
-e_table_sorter_new (ETableModel *source, ETableHeader *full_header, ETableSortInfo *sort_info)
-{
-	ETableSorter *ets = g_object_new (E_TABLE_SORTER_TYPE, NULL);
-	
-	ets->sort_info = sort_info;
-	g_object_ref(ets->sort_info);
-	ets->full_header = full_header;
-	g_object_ref(ets->full_header);
-	ets->source = source;
-	g_object_ref(ets->source);
-
-	ets->table_model_changed_id = g_signal_connect (source, "model_changed",
-							G_CALLBACK (ets_model_changed), ets);
-	ets->table_model_row_changed_id = g_signal_connect (source, "model_row_changed",
-							G_CALLBACK (ets_model_row_changed), ets);
-	ets->table_model_cell_changed_id = g_signal_connect (source, "model_cell_changed",
-						        G_CALLBACK (ets_model_cell_changed), ets);
-	ets->table_model_rows_inserted_id = g_signal_connect (source, "model_rows_inserted",
-							G_CALLBACK (ets_model_rows_inserted), ets);
-	ets->table_model_rows_deleted_id = g_signal_connect (source, "model_rows_deleted",
-							G_CALLBACK (ets_model_rows_deleted), ets);
-	ets->sort_info_changed_id = g_signal_connect (sort_info, "sort_info_changed",
-							G_CALLBACK (ets_sort_info_changed), ets);
-	ets->group_info_changed_id = g_signal_connect (sort_info, "group_info_changed",
-							G_CALLBACK (ets_sort_info_changed), ets);
-	
-	return ets;
-}
-
-static void
-ets_model_changed (ETableModel *etm, ETableSorter *ets)
-{
-	ets_clean(ets);
-}
-
-static void
-ets_model_row_changed (ETableModel *etm, int row, ETableSorter *ets)
-{
-	ets_clean(ets);
-}
-
-static void
-ets_model_cell_changed (ETableModel *etm, int col, int row, ETableSorter *ets)
-{
-	ets_clean(ets);
-}
-
-static void
-ets_model_rows_inserted (ETableModel *etm, int row, int count, ETableSorter *ets)
-{
-	ets_clean(ets);
-}
-
-static void
-ets_model_rows_deleted (ETableModel *etm, int row, int count, ETableSorter *ets)
-{
-	ets_clean(ets);
-}
-
-static void
-ets_sort_info_changed (ETableSortInfo *info, ETableSorter *ets)
-{
-	d(g_print ("sort info changed\n"));
-	ets_clean(ets);
-}
-
-static ETableSorter *ets_closure;
-static void **vals_closure;
-static int cols_closure;
-static int *ascending_closure;
-static GCompareFunc *compare_closure;
-
-/* FIXME: Make it not cache the second and later columns (as if anyone cares.) */
-
-static int
-qsort_callback(const void *data1, const void *data2)
-{
-	gint row1 = *(int *)data1;
-	gint row2 = *(int *)data2;
-	int j;
-	int sort_count = e_table_sort_info_sorting_get_count(ets_closure->sort_info) + e_table_sort_info_grouping_get_count(ets_closure->sort_info);
-	int comp_val = 0;
-	int ascending = 1;
-	for (j = 0; j < sort_count; j++) {
-		comp_val = (*(compare_closure[j]))(vals_closure[cols_closure * row1 + j], vals_closure[cols_closure * row2 + j]);
-		ascending = ascending_closure[j];
-		if (comp_val != 0)
-			break;
-	}
-	if (comp_val == 0) {
-		if (row1 < row2)
-			comp_val = -1;
-		if (row1 > row2)
-			comp_val = 1;
-	}
-	if (!ascending)
-		comp_val = -comp_val;
-	return comp_val;
-}
-
-static void
-ets_clean(ETableSorter *ets)
-{
-	g_free(ets->sorted);
-	ets->sorted = NULL;
-
-	g_free(ets->backsorted);
-	ets->backsorted = NULL;
-
-	ets->needs_sorting = -1;
-}
-
-
-static void
-ets_sort(ETableSorter *ets)
-{
-	int rows;
-	int i;
-	int j;
-	int cols;
-	int group_cols;
-
-	if (ets->sorted)
-		return;
-
-	rows = e_table_model_row_count(ets->source);
-	group_cols = e_table_sort_info_grouping_get_count(ets->sort_info);
-	cols = e_table_sort_info_sorting_get_count(ets->sort_info) + group_cols;
-
-	ets->sorted = g_new(int, rows);
-	for (i = 0; i < rows; i++)
-		ets->sorted[i] = i;
-
-	cols_closure = cols;
-	ets_closure = ets;
-
-	vals_closure = g_new(void *, rows * cols);
-	ascending_closure = g_new(int, cols);
-	compare_closure = g_new(GCompareFunc, cols);
-
-	for (j = 0; j < cols; j++) {
-		ETableSortColumn column;
-		ETableCol *col;
-
-		if (j < group_cols)
-			column = e_table_sort_info_grouping_get_nth(ets->sort_info, j);
-		else
-			column = e_table_sort_info_sorting_get_nth(ets->sort_info, j - group_cols);
-
-		col = e_table_header_get_column_by_col_idx(ets->full_header, column.column);
-		if (col == NULL)
-			col = e_table_header_get_column (ets->full_header, e_table_header_count (ets->full_header) - 1);
-
-		for (i = 0; i < rows; i++) {
-			vals_closure[i * cols + j] = e_table_model_value_at (ets->source, col->col_idx, i);
-		}
-
-		compare_closure[j] = col->compare;
-		ascending_closure[j] = column.ascending;
-	}
-
-		qsort(ets->sorted, rows, sizeof(int), qsort_callback);
-
-	g_free(vals_closure);
-	g_free(ascending_closure);
-	g_free(compare_closure);
-}
-
-static void
-ets_backsort(ETableSorter *ets)
-{
-	int i, rows;
-
-	if (ets->backsorted)
-		return;
-
-	ets_sort(ets);
-
-	rows = e_table_model_row_count(ets->source);
-	ets->backsorted = g_new0(int, rows);
-
-	for (i = 0; i < rows; i++) {
-		ets->backsorted[ets->sorted[i]] = i;
-	}
-}
-
-
-static gint
-ets_model_to_sorted (ESorter *es, int row)
-{
-	ETableSorter *ets = E_TABLE_SORTER(es);
-	int rows = e_table_model_row_count(ets->source);
-
-	g_return_val_if_fail(row >= 0, -1);
-	g_return_val_if_fail(row < rows, -1);
-
-	if (ets_needs_sorting(es))
-		ets_backsort(ets);
-
-	if (ets->backsorted)
-		return ets->backsorted[row];
-	else
-		return row;
-}
-
-static gint
-ets_sorted_to_model (ESorter *es, int row)
-{
-	ETableSorter *ets = E_TABLE_SORTER(es);
-	int rows = e_table_model_row_count(ets->source);
-
-	g_return_val_if_fail(row >= 0, -1);
-	g_return_val_if_fail(row < rows, -1);
-
-	if (ets_needs_sorting(es))
-		ets_sort(ets);
-
-	if (ets->sorted)
-		return ets->sorted[row];
-	else
-		return row;
-}
-
-static void
-ets_get_model_to_sorted_array (ESorter *es, int **array, int *count)
-{
-	ETableSorter *ets = E_TABLE_SORTER(es);
-	if (array || count) {
-		ets_backsort(ets);
-
-		if (array)
-			*array = ets->backsorted;
-		if (count)
-			*count = e_table_model_row_count(ets->source);
-	}
-}
-
-static void
-ets_get_sorted_to_model_array (ESorter *es, int **array, int *count)
-{
-	ETableSorter *ets = E_TABLE_SORTER(es);
-	if (array || count) {
-		ets_sort(ets);
-
-		if (array)
-			*array = ets->sorted;
-		if (count)
-			*count = e_table_model_row_count(ets->source);
-	}
-}
-
-
-static gboolean
-ets_needs_sorting(ESorter *es)
-{
-	ETableSorter *ets = E_TABLE_SORTER(es);
-	if (ets->needs_sorting < 0) {
-		if (e_table_sort_info_sorting_get_count(ets->sort_info) + e_table_sort_info_grouping_get_count(ets->sort_info))
-			ets->needs_sorting = 1;
-		else
-			ets->needs_sorting = 0;
-	}
-	return ets->needs_sorting;
-}
diff --git a/widgets/table/e-table-sorter.h b/widgets/table/e-table-sorter.h
deleted file mode 100644
index 67be48715a..0000000000
--- a/widgets/table/e-table-sorter.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-sorter.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_SORTER_H_
-#define _E_TABLE_SORTER_H_
-
-#include <glib-object.h>
-#include <gal/util/e-sorter.h>
-#include <gal/e-table/e-table-model.h>
-#include <gal/e-table/e-table-subset-variable.h>
-#include <gal/e-table/e-table-sort-info.h>
-#include <gal/e-table/e-table-header.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_SORTER_TYPE        (e_table_sorter_get_type ())
-#define E_TABLE_SORTER(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_SORTER_TYPE, ETableSorter))
-#define E_TABLE_SORTER_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_SORTER_TYPE, ETableSorterClass))
-#define E_IS_TABLE_SORTER(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_SORTER_TYPE))
-#define E_IS_TABLE_SORTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_SORTER_TYPE))
-
-typedef struct {
-	ESorter base;
-
-	ETableModel    *source;
-	ETableHeader   *full_header;
-	ETableSortInfo *sort_info;
-
-	/* If needs_sorting is 0, then model_to_sorted and sorted_to_model are no-ops. */
-	int             needs_sorting;
-
-	int            *sorted;
-	int            *backsorted;
-
-	int             table_model_changed_id;
-	int             table_model_row_changed_id;
-	int             table_model_cell_changed_id;
-	int             table_model_rows_inserted_id;
-	int             table_model_rows_deleted_id;
-	int             sort_info_changed_id;
-	int             group_info_changed_id;
-} ETableSorter;
-
-typedef struct {
-	ESorterClass parent_class;
-} ETableSorterClass;
-
-GType         e_table_sorter_get_type                   (void);
-ETableSorter *e_table_sorter_new                        (ETableModel     *etm,
-							 ETableHeader    *full_header,
-							 ETableSortInfo  *sort_info);
-G_END_DECLS
-
-#endif /* _E_TABLE_SORTER_H_ */
diff --git a/widgets/table/e-table-sorting-utils.c b/widgets/table/e-table-sorting-utils.c
deleted file mode 100644
index 80a9564a36..0000000000
--- a/widgets/table/e-table-sorting-utils.c
+++ /dev/null
@@ -1,349 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-sorting-utils.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <string.h>
-#include <e-table-sorting-utils.h>
-#include <gal/util/e-util.h>
-
-#define d(x)
-
-/* This takes source rows. */
-static int
-etsu_compare(ETableModel *source, ETableSortInfo *sort_info, ETableHeader *full_header, int row1, int row2)
-{
-	int j;
-	int sort_count = e_table_sort_info_sorting_get_count(sort_info);
-	int comp_val = 0;
-	int ascending = 1;
-
-	for (j = 0; j < sort_count; j++) {
-		ETableSortColumn column = e_table_sort_info_sorting_get_nth(sort_info, j);
-		ETableCol *col;
-		col = e_table_header_get_column_by_col_idx(full_header, column.column);
-		if (col == NULL)
-			col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
-		comp_val = (*col->compare)(e_table_model_value_at (source, col->compare_col, row1),
-					   e_table_model_value_at (source, col->compare_col, row2));
-		ascending = column.ascending;
-		if (comp_val != 0)
-			break;
-	}
-	if (comp_val == 0) {
-		if (row1 < row2)
-			comp_val = -1;
-		if (row1 > row2)
-			comp_val = 1;
-	}
-	if (!ascending)
-		comp_val = -comp_val;
-	return comp_val;
-}
-
-typedef struct {
-	int cols;
-	void **vals;
-	int *ascending;
-	GCompareFunc *compare;
-} ETableSortClosure;
-
-typedef struct {
-	ETreeModel *tree;
-	ETableSortInfo *sort_info;
-	ETableHeader *full_header;
-} ETreeSortClosure;
-
-/* FIXME: Make it not cache the second and later columns (as if anyone cares.) */
-
-static int
-e_sort_callback(const void *data1, const void *data2, gpointer user_data)
-{
-	gint row1 = *(int *)data1;
-	gint row2 = *(int *)data2;
-	ETableSortClosure *closure = user_data;
-	int j;
-	int sort_count = closure->cols;
-	int comp_val = 0;
-	int ascending = 1;
-	for (j = 0; j < sort_count; j++) {
-		comp_val = (*(closure->compare[j]))(closure->vals[closure->cols * row1 + j], closure->vals[closure->cols * row2 + j]);
-		ascending = closure->ascending[j];
-		if (comp_val != 0)
-			break;
-	}
-	if (comp_val == 0) {
-		if (row1 < row2)
-			comp_val = -1;
-		if (row1 > row2)
-			comp_val = 1;
-	}
-	if (!ascending)
-		comp_val = -comp_val;
-	return comp_val;
-}
-
-void
-e_table_sorting_utils_sort(ETableModel *source, ETableSortInfo *sort_info, ETableHeader *full_header, int *map_table, int rows)
-{
-	int total_rows;
-	int i;
-	int j;
-	int cols;
-	ETableSortClosure closure;
-
-	g_return_if_fail(source != NULL);
-	g_return_if_fail(E_IS_TABLE_MODEL(source));
-	g_return_if_fail(sort_info != NULL);
-	g_return_if_fail(E_IS_TABLE_SORT_INFO(sort_info));
-	g_return_if_fail(full_header != NULL);
-	g_return_if_fail(E_IS_TABLE_HEADER(full_header));
-
-	total_rows = e_table_model_row_count(source);
-	cols = e_table_sort_info_sorting_get_count(sort_info);
-	closure.cols = cols;
-
-	closure.vals = g_new(void *, total_rows * cols);
-	closure.ascending = g_new(int, cols);
-	closure.compare = g_new(GCompareFunc, cols);
-
-	for (j = 0; j < cols; j++) {
-		ETableSortColumn column = e_table_sort_info_sorting_get_nth(sort_info, j);
-		ETableCol *col;
-		col = e_table_header_get_column_by_col_idx(full_header, column.column);
-		if (col == NULL)
-			col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
-		for (i = 0; i < rows; i++) {
-			closure.vals[map_table[i] * cols + j] = e_table_model_value_at (source, col->compare_col, map_table[i]);
-		}
-		closure.compare[j] = col->compare;
-		closure.ascending[j] = column.ascending;
-	}
-
-	e_sort(map_table, rows, sizeof(int), e_sort_callback, &closure);
-
-	g_free(closure.vals);
-	g_free(closure.ascending);
-	g_free(closure.compare);
-}
-
-gboolean
-e_table_sorting_utils_affects_sort  (ETableSortInfo *sort_info,
-				     ETableHeader   *full_header,
-				     int             col)
-{
-	int j;
-	int cols;
-
-	g_return_val_if_fail(sort_info != NULL, TRUE);
-	g_return_val_if_fail(E_IS_TABLE_SORT_INFO(sort_info), TRUE);
-	g_return_val_if_fail(full_header != NULL, TRUE);
-	g_return_val_if_fail(E_IS_TABLE_HEADER(full_header), TRUE);
-
-	cols = e_table_sort_info_sorting_get_count(sort_info);
-
-	for (j = 0; j < cols; j++) {
-		ETableSortColumn column = e_table_sort_info_sorting_get_nth(sort_info, j);
-		ETableCol *tablecol;
-		tablecol = e_table_header_get_column_by_col_idx(full_header, column.column);
-		if (tablecol == NULL)
-			tablecol = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
-		if (col == tablecol->compare_col)
-			return TRUE;
-	}
-	return FALSE;
-}
-
-
-/* FIXME: This could be done in time log n instead of time n with a binary search. */
-int
-e_table_sorting_utils_insert(ETableModel *source, ETableSortInfo *sort_info, ETableHeader *full_header, int *map_table, int rows, int row)
-{
-	int i;
-
-	i = 0;
-	/* handle insertions when we have a 'sort group' */
-	while (i < rows && etsu_compare(source, sort_info, full_header, map_table[i], row) < 0)
-		i++;
-
-	return i;
-}
-
-/* FIXME: This could be done in time log n instead of time n with a binary search. */
-int
-e_table_sorting_utils_check_position (ETableModel *source, ETableSortInfo *sort_info, ETableHeader *full_header, int *map_table, int rows, int view_row)
-{
-	int i;
-	int row;
-
-	i = view_row;
-	row = map_table[i];
-
-	i = view_row;
-	if (i < rows - 1 && etsu_compare(source, sort_info, full_header, map_table[i + 1], row) < 0) {
-		i ++;
-		while (i < rows - 1 && etsu_compare(source, sort_info, full_header, map_table[i], row) < 0)
-			i ++;
-	} else if (i > 0 && etsu_compare(source, sort_info, full_header, map_table[i - 1], row) > 0) {
-		i --;
-		while (i > 0 && etsu_compare(source, sort_info, full_header, map_table[i], row) > 0)
-			i --;
-	}
-	return i;
-}
-
-
-
-
-/* This takes source rows. */
-static int
-etsu_tree_compare(ETreeModel *source, ETableSortInfo *sort_info, ETableHeader *full_header, ETreePath path1, ETreePath path2)
-{
-	int j;
-	int sort_count = e_table_sort_info_sorting_get_count(sort_info);
-	int comp_val = 0;
-	int ascending = 1;
-
-	for (j = 0; j < sort_count; j++) {
-		ETableSortColumn column = e_table_sort_info_sorting_get_nth(sort_info, j);
-		ETableCol *col;
-		col = e_table_header_get_column_by_col_idx(full_header, column.column);
-		if (col == NULL)
-			col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
-		comp_val = (*col->compare)(e_tree_model_value_at (source, path1, col->compare_col),
-					   e_tree_model_value_at (source, path2, col->compare_col));
-		ascending = column.ascending;
-		if (comp_val != 0)
-			break;
-	}
-	if (!ascending)
-		comp_val = -comp_val;
-	return comp_val;
-}
-
-static int
-e_sort_tree_callback(const void *data1, const void *data2, gpointer user_data)
-{
-	ETreePath *path1 = *(ETreePath *)data1;
-	ETreePath *path2 = *(ETreePath *)data2;
-	ETreeSortClosure *closure = user_data;
-
-	return etsu_tree_compare(closure->tree, closure->sort_info, closure->full_header, path1, path2);
-}
-
-void
-e_table_sorting_utils_tree_sort(ETreeModel *source, ETableSortInfo *sort_info, ETableHeader *full_header, ETreePath *map_table, int count)
-{
-	ETableSortClosure closure;
-	int cols;
-	int i, j;
-	int *map;
-	ETreePath *map_copy;
-	g_return_if_fail(source != NULL);
-	g_return_if_fail(E_IS_TREE_MODEL(source));
-	g_return_if_fail(sort_info != NULL);
-	g_return_if_fail(E_IS_TABLE_SORT_INFO(sort_info));
-	g_return_if_fail(full_header != NULL);
-	g_return_if_fail(E_IS_TABLE_HEADER(full_header));
-
-	cols = e_table_sort_info_sorting_get_count(sort_info);
-	closure.cols = cols;
-
-	closure.vals = g_new(void *, count * cols);
-	closure.ascending = g_new(int, cols);
-	closure.compare = g_new(GCompareFunc, cols);
-
-	for (j = 0; j < cols; j++) {
-		ETableSortColumn column = e_table_sort_info_sorting_get_nth(sort_info, j);
-		ETableCol *col;
-
-		col = e_table_header_get_column_by_col_idx(full_header, column.column);
-		if (col == NULL)
-			col = e_table_header_get_column (full_header, e_table_header_count (full_header) - 1);
-
-		for (i = 0; i < count; i++) {
-			closure.vals[i * cols + j] = e_tree_model_value_at (source, map_table[i], col->compare_col);
-		}
-		closure.ascending[j] = column.ascending;
-		closure.compare[j] = col->compare;
-	}
-
-	map = g_new(int, count);
-	for (i = 0; i < count; i++) {
-		map[i] = i;
-	}
-
-	e_sort(map, count, sizeof(int), e_sort_callback, &closure);
-
-	map_copy = g_new(ETreePath, count);
-	for (i = 0; i < count; i++) {
-		map_copy[i] = map_table[i];
-	}
-	for (i = 0; i < count; i++) {
-		map_table[i] = map_copy[map[i]];
-	}
-
-	g_free(map);
-	g_free(map_copy);
-
-	g_free(closure.vals);
-	g_free(closure.ascending);
-	g_free(closure.compare);
-}
-
-/* FIXME: This could be done in time log n instead of time n with a binary search. */
-int
-e_table_sorting_utils_tree_check_position (ETreeModel *source, ETableSortInfo *sort_info, ETableHeader *full_header, ETreePath *map_table, int count, int old_index)
-{
-	int i;
-	ETreePath path;
-
-	i = old_index;
-	path = map_table[i];
-
-	if (i < count - 1 && etsu_tree_compare(source, sort_info, full_header, map_table[i + 1], path) < 0) {
-		i ++;
-		while (i < count - 1 && etsu_tree_compare(source, sort_info, full_header, map_table[i], path) < 0)
-			i ++;
-	} else if (i > 0 && etsu_tree_compare(source, sort_info, full_header, map_table[i - 1], path) > 0) {
-		i --;
-		while (i > 0 && etsu_tree_compare(source, sort_info, full_header, map_table[i], path) > 0)
-			i --;
-	}
-	return i;
-}
-
-/* FIXME: This does not pay attention to making sure that it's a stable insert.  This needs to be fixed. */
-int
-e_table_sorting_utils_tree_insert(ETreeModel *source, ETableSortInfo *sort_info, ETableHeader *full_header, ETreePath *map_table, int count, ETreePath path)
-{
-	size_t start;
-	size_t end;
-	ETreeSortClosure closure;
-
-	closure.tree = source;
-	closure.sort_info = sort_info;
-	closure.full_header = full_header;
-
-	e_bsearch(&path, map_table, count, sizeof(ETreePath), e_sort_tree_callback, &closure, &start, &end);
-	return end;
-}
diff --git a/widgets/table/e-table-sorting-utils.h b/widgets/table/e-table-sorting-utils.h
deleted file mode 100644
index 794ead0ac9..0000000000
--- a/widgets/table/e-table-sorting-utils.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-sorting-utils.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_SORTING_UTILS_H_
-#define _E_TABLE_SORTING_UTILS_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#include <gal/e-table/e-table-model.h>
-#include <gal/e-table/e-tree-model.h>
-#include <gal/e-table/e-table-sort-info.h>
-#include <gal/e-table/e-table-header.h>
-gboolean  e_table_sorting_utils_affects_sort         (ETableSortInfo *sort_info,
-						      ETableHeader   *full_header,
-						      int             col);
-
-
-
-void      e_table_sorting_utils_sort                 (ETableModel    *source,
-						      ETableSortInfo *sort_info,
-						      ETableHeader   *full_header,
-						      int            *map_table,
-						      int             rows);
-int       e_table_sorting_utils_insert               (ETableModel    *source,
-						      ETableSortInfo *sort_info,
-						      ETableHeader   *full_header,
-						      int            *map_table,
-						      int             rows,
-						      int             row);
-int       e_table_sorting_utils_check_position       (ETableModel    *source,
-						      ETableSortInfo *sort_info,
-						      ETableHeader   *full_header,
-						      int            *map_table,
-						      int             rows,
-						      int             view_row);
-
-
-
-void      e_table_sorting_utils_tree_sort            (ETreeModel     *source,
-						      ETableSortInfo *sort_info,
-						      ETableHeader   *full_header,
-						      ETreePath      *map_table,
-						      int             count);
-int       e_table_sorting_utils_tree_check_position  (ETreeModel     *source,
-						      ETableSortInfo *sort_info,
-						      ETableHeader   *full_header,
-						      ETreePath      *map_table,
-						      int             count,
-						      int             old_index);
-int       e_table_sorting_utils_tree_insert          (ETreeModel     *source,
-						      ETableSortInfo *sort_info,
-						      ETableHeader   *full_header,
-						      ETreePath      *map_table,
-						      int             count,
-						      ETreePath       path);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_TABLE_SORTING_UTILS_H_ */
diff --git a/widgets/table/e-table-specification.c b/widgets/table/e-table-specification.c
deleted file mode 100644
index 3fcc28689d..0000000000
--- a/widgets/table/e-table-specification.c
+++ /dev/null
@@ -1,432 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-specification.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "e-table-specification.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-#include "gal/util/e-util.h"
-#include "gal/util/e-xml-utils.h"
-
-static GObjectClass *etsp_parent_class;
-
-static void
-etsp_finalize (GObject *object)
-{
-	ETableSpecification *etsp = E_TABLE_SPECIFICATION (object);
-	int i;
-
-	if (etsp->columns) {
-		for (i = 0; etsp->columns[i]; i++) {
-			g_object_unref (etsp->columns[i]);
-		}
-		g_free (etsp->columns);
-		etsp->columns = NULL;
-	}
-
-	if (etsp->state)
-		g_object_unref (etsp->state);
-	etsp->state                = NULL;
-
-	g_free (etsp->click_to_add_message);
-	etsp->click_to_add_message = NULL;
-
-	g_free (etsp->domain);
-	etsp->domain		   = NULL;
-
-	etsp_parent_class->finalize (object);
-}
-
-static void
-etsp_class_init (GObjectClass *klass)
-{
-	etsp_parent_class = g_type_class_peek_parent (klass);
-	
-	klass->finalize = etsp_finalize;
-}
-
-static void
-etsp_init (ETableSpecification *etsp)
-{
-	etsp->columns                = NULL;
-	etsp->state                  = NULL;
-
-	etsp->alternating_row_colors = TRUE;
-	etsp->no_headers             = FALSE;
-	etsp->click_to_add           = FALSE;
-	etsp->click_to_add_end       = FALSE;
-	etsp->horizontal_draw_grid   = FALSE;
-	etsp->vertical_draw_grid     = FALSE;
-	etsp->draw_focus             = TRUE;
-	etsp->horizontal_scrolling   = FALSE;
-	etsp->horizontal_resize      = FALSE;
-	etsp->allow_grouping         = TRUE;
-
-	etsp->cursor_mode            = E_CURSOR_SIMPLE;
-	etsp->selection_mode         = GTK_SELECTION_MULTIPLE;
-
-	etsp->click_to_add_message   = NULL;
-	etsp->domain                 = NULL;
-}
-
-E_MAKE_TYPE (e_table_specification, "ETableSpecification", ETableSpecification, etsp_class_init, etsp_init, G_TYPE_OBJECT)
-
-/**
- * e_table_specification_new:
- *
- * Creates a new %ETableSpecification object.   This object is used to hold the
- * information about the rendering information for ETable.
- * 
- * Returns: a newly created %ETableSpecification object.
- */
-ETableSpecification *
-e_table_specification_new (void)
-{
-	ETableSpecification *etsp = g_object_new (E_TABLE_SPECIFICATION_TYPE, NULL);
-
-	return (ETableSpecification *) etsp;
-}
-
-/**
- * e_table_specification_load_from_file:
- * @specification: An ETableSpecification that you want to modify
- * @filename: a filename that contains an ETableSpecification
- *
- * This routine modifies @specification to reflect the state described
- * by the file @filename.  
- *
- * Returns: TRUE on success, FALSE on failure.
- */
-gboolean
-e_table_specification_load_from_file (ETableSpecification *specification,
-				      const char          *filename)
-{
-	xmlDoc *doc;
-
-	if (!g_file_test (filename, G_FILE_TEST_EXISTS))
-		return FALSE;
-
-	doc = xmlParseFile (filename);
-	if (doc) {
-		xmlNode *node = xmlDocGetRootElement (doc);
-		e_table_specification_load_from_node (specification, node);
-		xmlFreeDoc (doc);
-		return TRUE;
-	}
-	return FALSE;
-}
-
-/**
- * e_table_specification_load_from_string:
- * @specification: An ETableSpecification that you want to modify
- * @xml: a stringified representation of an ETableSpecification description.
- *
- * This routine modifies @specification to reflect the state described
- * by @xml.  @xml is typically returned by e_table_specification_save_to_string
- * or it can be embedded in your source code.
- *
- * Returns: TRUE on success, FALSE on failure.
- */
-gboolean
-e_table_specification_load_from_string (ETableSpecification *specification,
-					const char          *xml)
-{
-	xmlDoc *doc;
-	doc = xmlParseMemory ( (char *) xml, strlen (xml));
-	if (doc) {
-		xmlNode *node = xmlDocGetRootElement (doc);
-		e_table_specification_load_from_node (specification, node);
-		xmlFreeDoc (doc);
-		return TRUE;
-	}
-
-	return FALSE;
-}
-
-/**
- * e_table_specification_load_from_node:
- * @specification: An ETableSpecification that you want to modify
- * @node: an xmlNode with an XML ETableSpecification description.
- *
- * This routine modifies @specification to reflect the state described
- * by @node.
- */
-void
-e_table_specification_load_from_node (ETableSpecification *specification,
-				      const xmlNode       *node)
-{
-	char *temp;
-	xmlNode *children;
-	GList *list = NULL, *list2;
-	int i;
-
-	specification->no_headers = e_xml_get_bool_prop_by_name (node, "no-headers");
-	specification->click_to_add = e_xml_get_bool_prop_by_name (node, "click-to-add");
-	specification->click_to_add_end = e_xml_get_bool_prop_by_name (node, "click-to-add-end") && specification->click_to_add;
-	specification->alternating_row_colors = e_xml_get_bool_prop_by_name_with_default (node, "alternating-row-colors", TRUE);
-	specification->horizontal_draw_grid = e_xml_get_bool_prop_by_name (node, "horizontal-draw-grid");
-	specification->vertical_draw_grid = e_xml_get_bool_prop_by_name (node, "vertical-draw-grid");
-	if (e_xml_get_bool_prop_by_name_with_default(node, "draw-grid", TRUE) ==
-	    e_xml_get_bool_prop_by_name_with_default(node, "draw-grid", FALSE)) {
-		specification->horizontal_draw_grid =
-			specification->vertical_draw_grid = e_xml_get_bool_prop_by_name (node, "draw-grid");
-	}
-	specification->draw_focus = e_xml_get_bool_prop_by_name_with_default (node, "draw-focus", TRUE);
-	specification->horizontal_scrolling = e_xml_get_bool_prop_by_name_with_default (node, "horizontal-scrolling", FALSE);
-	specification->horizontal_resize = e_xml_get_bool_prop_by_name_with_default (node, "horizontal-resize", FALSE);
-	specification->allow_grouping = e_xml_get_bool_prop_by_name_with_default (node, "allow-grouping", TRUE);
-
-	specification->selection_mode = GTK_SELECTION_MULTIPLE;
-	temp = e_xml_get_string_prop_by_name (node, "selection-mode");
-	if (temp && !g_strcasecmp (temp, "single")) {
-		specification->selection_mode = GTK_SELECTION_SINGLE;
-	} else if (temp && !g_strcasecmp (temp, "browse")) {
-		specification->selection_mode = GTK_SELECTION_BROWSE;
-	} else if (temp && !g_strcasecmp (temp, "extended")) {
-		specification->selection_mode = GTK_SELECTION_EXTENDED;
-	}
-	g_free (temp);
-
-	specification->cursor_mode = E_CURSOR_SIMPLE;
-	temp = e_xml_get_string_prop_by_name (node, "cursor-mode");
-	if (temp && !g_strcasecmp (temp, "line")) {
-		specification->cursor_mode = E_CURSOR_LINE;
-	} else 	if (temp && !g_strcasecmp (temp, "spreadsheet")) {
-		specification->cursor_mode = E_CURSOR_SPREADSHEET;
-	}
-	g_free (temp);
-
-	g_free (specification->click_to_add_message);
-	specification->click_to_add_message =
-		e_xml_get_string_prop_by_name (
-			node, "_click-to-add-message");
-
-	g_free (specification->domain);
-	specification->domain =
-		e_xml_get_string_prop_by_name (
-			node, "gettext-domain");
-	if (specification->domain && !*specification->domain) {
-		g_free (specification->domain);
-		specification->domain = NULL;
-	}
-
-	if (specification->state)
-		g_object_unref (specification->state);
-	specification->state = NULL;
-	if (specification->columns) {
-		for (i = 0; specification->columns[i]; i++) {
-			g_object_unref (specification->columns[i]);
-		}
-		g_free (specification->columns);
-	}
-	specification->columns = NULL;
-
-	for (children = node->xmlChildrenNode; children; children = children->next) {
-		if (!strcmp (children->name, "ETableColumn")) {
-			ETableColumnSpecification *col_spec = e_table_column_specification_new ();
-
-			e_table_column_specification_load_from_node (col_spec, children);
-			list = g_list_append (list, col_spec);
-		} else if (specification->state == NULL && !strcmp (children->name, "ETableState")) {
-			specification->state = e_table_state_new ();
-			e_table_state_load_from_node (specification->state, children);
-			e_table_sort_info_set_can_group (specification->state->sort_info, specification->allow_grouping);
-		}
-	}
-
-	if (specification->state == NULL) {
-		/* Make the default state.  */
-		specification->state = e_table_state_vanilla (g_list_length (list));
-	}
-
-	specification->columns = g_new (ETableColumnSpecification *, g_list_length (list) + 1);
-	for (list2 = list, i = 0; list2; list2 = g_list_next (list2), i++) {
-		specification->columns[i] = list2->data;
-	}
-	specification->columns[i] = NULL;
-	g_list_free (list);
-}
-
-/**
- * e_table_specification_save_to_file:
- * @specification: An %ETableSpecification that you want to save
- * @filename: a file name to store the specification.
- *
- * This routine stores the @specification into @filename.  
- *
- * Returns: 0 on success or -1 on error.
- */
-int
-e_table_specification_save_to_file (ETableSpecification *specification,
-				    const char          *filename)
-{
-	xmlDoc *doc;
-	int ret;
-	
-	g_return_val_if_fail (specification != NULL, -1);
-	g_return_val_if_fail (filename != NULL, -1);
-	g_return_val_if_fail (E_IS_TABLE_SPECIFICATION (specification), -1);
-	
-	if ((doc = xmlNewDoc ("1.0")) == NULL)
-		return -1;
-	
-	xmlDocSetRootElement (doc, e_table_specification_save_to_node (specification, doc));
-	
-	ret = e_xml_save_file (filename, doc);
-	
-	xmlFreeDoc (doc);
-	
-	return ret;
-}
-
-/**
- * e_table_specification_save_to_string:
- * @specification: An %ETableSpecification that you want to stringify
- *
- * Saves the state of @specification to a string.
- *
- * Returns: an g_alloc() allocated string containing the stringified 
- * representation of @specification.  This stringified representation
- * uses XML as a convenience.
- */
-char *
-e_table_specification_save_to_string (ETableSpecification *specification)
-{
-	char *ret_val;
-	xmlChar *string;
-	int length;
-	xmlDoc *doc;
-
-	g_return_val_if_fail (specification != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE_SPECIFICATION (specification), NULL);
-	
-	doc = xmlNewDoc ("1.0");
-	xmlDocSetRootElement (doc, e_table_specification_save_to_node (specification, doc));
-	xmlDocDumpMemory (doc, &string, &length);
-
-	ret_val = g_strdup (string);
-	xmlFree (string);
-	return ret_val;
-}
-
-/**
- * e_table_specification_save_to_node:
- * @specification: An ETableSpecification that you want to store.
- * @doc: Node where the specification is saved
- *
- * This routine saves the %ETableSpecification state in the object @specification
- * into the xmlDoc represented by @doc.  
- *
- * Returns: The node that has been attached to @doc with the contents
- * of the ETableSpecification.
- */
-xmlNode *
-e_table_specification_save_to_node (ETableSpecification *specification,
-				    xmlDoc              *doc)
-{
-	xmlNode *node;
-	char *s;
-
-	g_return_val_if_fail (doc != NULL, NULL);
-	g_return_val_if_fail (specification != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE_SPECIFICATION (specification), NULL);
-
-	node = xmlNewNode (NULL, "ETableSpecification");
-	e_xml_set_bool_prop_by_name (node, "no-headers", specification->no_headers);
-	e_xml_set_bool_prop_by_name (node, "click-to-add", specification->click_to_add);
-	e_xml_set_bool_prop_by_name (node, "click-to-add-end", specification->click_to_add_end && specification->click_to_add);
-	e_xml_set_bool_prop_by_name (node, "alternating-row-colors", specification->alternating_row_colors);
-	e_xml_set_bool_prop_by_name (node, "horizontal-draw-grid", specification->horizontal_draw_grid);
-	e_xml_set_bool_prop_by_name (node, "vertical-draw-grid", specification->vertical_draw_grid);
-	e_xml_set_bool_prop_by_name (node, "draw-focus", specification->draw_focus);
-	e_xml_set_bool_prop_by_name (node, "horizontal-scrolling", specification->horizontal_scrolling);
-	e_xml_set_bool_prop_by_name (node, "horizontal-resize", specification->horizontal_resize);
-	e_xml_set_bool_prop_by_name (node, "allow-grouping", specification->allow_grouping);
-
-	switch (specification->selection_mode){
-	case GTK_SELECTION_SINGLE:
-		s = "single";
-		break;
-	case GTK_SELECTION_BROWSE:
-		s = "browse";
-		break;
-	default:
-	case GTK_SELECTION_EXTENDED:
-		s = "extended";
-	}
-	xmlSetProp (node, "selection-mode", s);
-	if (specification->cursor_mode == E_CURSOR_LINE)
-		s = "line";
-	else
-		s = "cell";
-	xmlSetProp (node, "cursor-mode", s);
-
-	xmlSetProp (node, "_click-to-add-message", specification->click_to_add_message);
-	xmlSetProp (node, "gettext-domain", specification->domain);
-
-	if (specification->columns){
-		int i;
-		
-		for (i = 0; specification->columns [i]; i++)
-			e_table_column_specification_save_to_node (
-				specification->columns [i],
-				node);
-	}
-
-	if (specification->state)
-		e_table_state_save_to_node (specification->state, node);
-
-	return node;
-}
-
-/**
- * e_table_specification_duplicate:
- * @spec: specification to duplicate
- *
- * This creates a copy of the %ETableSpecification @spec
- *
- * Returns: The duplicated %ETableSpecification.
- */
-ETableSpecification *
-e_table_specification_duplicate (ETableSpecification *spec)
-{
-	ETableSpecification *new_spec;
-	char *spec_str;
-
-	g_return_val_if_fail (spec != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE_SPECIFICATION (spec), NULL);
-	
-	new_spec = e_table_specification_new ();
-	spec_str = e_table_specification_save_to_string (spec);
-	e_table_specification_load_from_string (new_spec, spec_str);
-	g_free (spec_str);
-	
-	return new_spec;
-}
diff --git a/widgets/table/e-table-specification.h b/widgets/table/e-table-specification.h
deleted file mode 100644
index 961752b9b8..0000000000
--- a/widgets/table/e-table-specification.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-specification.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_SPECIFICATION_H_
-#define _E_TABLE_SPECIFICATION_H_
-
-#include <glib-object.h>
-#include <libxml/tree.h>
-#include <gal/widgets/e-selection-model.h>
-#include <gal/e-table/e-table-state.h>
-#include <gal/e-table/e-table-column-specification.h>
-#include <gal/e-table/e-table-defines.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_SPECIFICATION_TYPE        (e_table_specification_get_type ())
-#define E_TABLE_SPECIFICATION(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_SPECIFICATION_TYPE, ETableSpecification))
-#define E_TABLE_SPECIFICATION_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_SPECIFICATION_TYPE, ETableSpecificationClass))
-#define E_IS_TABLE_SPECIFICATION(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_SPECIFICATION_TYPE))
-#define E_IS_TABLE_SPECIFICATION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_SPECIFICATION_TYPE))
-#define E_TABLE_SPECIFICATION_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TABLE_SPECIFICATION_TYPE, ETableSpecificationClass))
-
-typedef struct {
-	GObject base;
-
-	ETableColumnSpecification **columns;
-	ETableState *state;
-
-	guint alternating_row_colors : 1;
-	guint no_headers : 1;
-	guint click_to_add : 1;
-	guint click_to_add_end : 1;
-	guint horizontal_draw_grid : 1;
-	guint vertical_draw_grid : 1;
-	guint draw_focus : 1;
-	guint horizontal_scrolling : 1;
-	guint horizontal_resize : 1;
-	guint allow_grouping : 1;
-	GtkSelectionMode selection_mode;
-	ECursorMode cursor_mode;
-
-	char *click_to_add_message;
-	char *domain;
-} ETableSpecification;
-
-typedef struct {
-	GObjectClass parent_class;
-} ETableSpecificationClass;
-
-GType                e_table_specification_get_type          (void);
-ETableSpecification *e_table_specification_new               (void);
-
-gboolean             e_table_specification_load_from_file    (ETableSpecification *specification,
-							      const char          *filename);
-gboolean             e_table_specification_load_from_string  (ETableSpecification *specification,
-							      const char          *xml);
-void                 e_table_specification_load_from_node    (ETableSpecification *specification,
-							      const xmlNode       *node);
-
-int                  e_table_specification_save_to_file      (ETableSpecification *specification,
-							      const char          *filename);
-char                *e_table_specification_save_to_string    (ETableSpecification *specification);
-xmlNode             *e_table_specification_save_to_node      (ETableSpecification *specification,
-							      xmlDoc              *doc);
-ETableSpecification *e_table_specification_duplicate         (ETableSpecification *spec);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_SPECIFICATION_H_ */
diff --git a/widgets/table/e-table-state.c b/widgets/table/e-table-state.c
deleted file mode 100644
index c66e5933e0..0000000000
--- a/widgets/table/e-table-state.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-state.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-#include "gal/util/e-util.h"
-#include "gal/util/e-xml-utils.h"
-#include "e-table-state.h"
-
-
-#define STATE_VERSION 0.1
-
-static GObjectClass *etst_parent_class;
-
-static void
-etst_dispose (GObject *object)
-{
-	ETableState *etst = E_TABLE_STATE (object);
-
-	if (etst->sort_info) {
-		g_object_unref (etst->sort_info);
-		etst->sort_info = NULL;
-	}
-
-	G_OBJECT_CLASS (etst_parent_class)->dispose (object);
-}
-	
-static void
-etst_finalize (GObject *object)
-{
-	ETableState *etst = E_TABLE_STATE (object);
-
-	if (etst->columns) {
-		g_free (etst->columns);
-		etst->columns = NULL;
-	}
-
-	if (etst->expansions) {
-		g_free (etst->expansions);
-		etst->expansions = NULL;
-	}
-	
-	G_OBJECT_CLASS (etst_parent_class)->finalize (object);
-}
-
-static void
-etst_class_init (GObjectClass *klass)
-{
-	etst_parent_class = g_type_class_peek_parent (klass);
-	
-	klass->dispose = etst_dispose;
-	klass->finalize = etst_finalize;
-}
-
-static void
-etst_init (ETableState *state)
-{
-	state->columns = NULL;
-	state->expansions = NULL;
-	state->sort_info = e_table_sort_info_new();
-}
-
-E_MAKE_TYPE(e_table_state, "ETableState", ETableState, etst_class_init, etst_init, G_TYPE_OBJECT)
-
-ETableState *
-e_table_state_new (void)
-{
-	return (ETableState *) g_object_new (E_TABLE_STATE_TYPE, NULL);
-}
-
-ETableState *
-e_table_state_vanilla (int col_count)
-{
-	GString *str;
-	int i;
-	ETableState *res;
-
-	str = g_string_new ("<ETableState>\n");
-	for (i = 0; i < col_count; i++)
-		g_string_append_printf (str, "  <column source=\"%d\"/>\n", i);
-	g_string_append (str, "  <grouping></grouping>\n");
-	g_string_append (str, "</ETableState>\n");
-
-	res = e_table_state_new ();
-	e_table_state_load_from_string (res, str->str);
-
-	g_string_free (str, TRUE);
-	return res;
-}
-
-gboolean
-e_table_state_load_from_file    (ETableState *state,
-				 const char          *filename)
-{
-	xmlDoc *doc;
-
-	if (!g_file_test (filename, G_FILE_TEST_EXISTS))
-		return FALSE;
-
-	doc = xmlParseFile (filename);
-	if (doc) {
-		xmlNode *node = xmlDocGetRootElement(doc);
-		e_table_state_load_from_node(state, node);
-		xmlFreeDoc(doc);
-		return TRUE;
-	}
-	return FALSE;
-}
-
-void 
-e_table_state_load_from_string  (ETableState *state,
-				 const char          *xml)
-{
-	xmlDoc *doc;
-	doc = xmlParseMemory ((char *) xml, strlen(xml));
-	if (doc) {
-		xmlNode *node = xmlDocGetRootElement(doc);
-		e_table_state_load_from_node(state, node);
-		xmlFreeDoc(doc);
-	}
-}
-
-typedef struct {
-	int column;
-	double expansion;
-} int_and_double;
-
-void
-e_table_state_load_from_node (ETableState *state,
-			      const xmlNode *node)
-{
-	xmlNode *children;
-	GList *list = NULL, *iterator;
-	gdouble state_version;
-	int i;
-
-	state_version = e_xml_get_double_prop_by_name_with_default (
-		node, "state-version", STATE_VERSION);
-
-	if (state->sort_info)
-		g_object_unref (state->sort_info);
-
-	state->sort_info = NULL;
-	children = node->xmlChildrenNode;
-	for (; children; children = children->next) {
-		if (!strcmp (children->name, "column")) {
-			int_and_double *column_info = g_new(int_and_double, 1);
-
-			column_info->column = e_xml_get_integer_prop_by_name(
-				children, "source");
-			column_info->expansion =
-				e_xml_get_double_prop_by_name_with_default(
-					children, "expansion", 1);
-
-			list = g_list_append (list, column_info);
-		} else if (state->sort_info == NULL &&
-			   !strcmp (children->name, "grouping")) {
-			state->sort_info = e_table_sort_info_new();
-			e_table_sort_info_load_from_node(
-				state->sort_info, children, state_version);
-		}
-	}
-	g_free(state->columns);
-	g_free(state->expansions);
-	state->col_count = g_list_length(list);
-	state->columns = g_new(int, state->col_count);
-	state->expansions = g_new(double, state->col_count);
-
-	for (iterator = list, i = 0; iterator; i++) {
-		int_and_double *column_info = iterator->data;
-		
-		state->columns [i] = column_info->column;
-		state->expansions [i] = column_info->expansion;
-		g_free (column_info);
-		iterator = g_list_next (iterator);
-	}
-	g_list_free(list);
-}
-
-void
-e_table_state_save_to_file      (ETableState *state,
-				 const char          *filename)
-{
-	xmlDoc *doc;
-	
-	if ((doc = xmlNewDoc ("1.0")) == NULL)
-		return;
-	
-	xmlDocSetRootElement (doc, e_table_state_save_to_node (state, NULL));
-	
-	e_xml_save_file (filename, doc);
-	
-	xmlFreeDoc (doc);
-}
-
-char *
-e_table_state_save_to_string    (ETableState *state)
-{
-	char *ret_val;
-	xmlChar *string;
-	int length;
-	xmlDoc *doc;
-
-	doc = xmlNewDoc("1.0");
-	xmlDocSetRootElement(doc, e_table_state_save_to_node(state, NULL));
-	xmlDocDumpMemory(doc, &string, &length);
-	xmlFreeDoc(doc);
-
-	ret_val = g_strdup(string);
-	xmlFree(string);
-	return ret_val;
-}
-
-xmlNode *
-e_table_state_save_to_node      (ETableState *state,
-				 xmlNode     *parent)
-{
-	int i;
-	xmlNode *node;
-
-	if (parent)
-		node = xmlNewChild (parent, NULL, "ETableState", NULL);
-	else
-		node = xmlNewNode (NULL, "ETableState");
-
-	e_xml_set_double_prop_by_name(node, "state-version", STATE_VERSION);
-
-	for (i = 0; i < state->col_count; i++) {
-		int column = state->columns[i];
-		double expansion = state->expansions[i];
-		xmlNode *new_node;
-
-		new_node = xmlNewChild(node, NULL, "column", NULL);
-		e_xml_set_integer_prop_by_name (new_node, "source", column);
-		if (expansion >= -1)
-			e_xml_set_double_prop_by_name(new_node, "expansion", expansion);
-	}
-
-
-	e_table_sort_info_save_to_node(state->sort_info, node);
-
-	return node;
-}
-
-/**
- * e_table_state_duplicate:
- * @state: The ETableState to duplicate
- *
- * This creates a copy of the %ETableState @state
- *
- * Returns: The duplicated %ETableState.
- */
-ETableState *
-e_table_state_duplicate (ETableState *state)
-{
-	ETableState *new_state;
-	char *copy;
-	
-	g_return_val_if_fail (state != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE_STATE (state), NULL);
-
-	new_state = e_table_state_new ();
-	copy = e_table_state_save_to_string (state);
-	e_table_state_load_from_string (new_state, copy);
-	g_free (copy);
-
-	e_table_sort_info_set_can_group
-		(new_state->sort_info,
-		 e_table_sort_info_get_can_group (state->sort_info));
-
-	return new_state;
-}
diff --git a/widgets/table/e-table-state.h b/widgets/table/e-table-state.h
deleted file mode 100644
index 47e0c7b9b8..0000000000
--- a/widgets/table/e-table-state.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-state.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_STATE_H_
-#define _E_TABLE_STATE_H_
-
-#include <glib-object.h>
-#include <libxml/tree.h>
-#include <gal/e-table/e-table-sort-info.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_STATE_TYPE        (e_table_state_get_type ())
-#define E_TABLE_STATE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_STATE_TYPE, ETableState))
-#define E_TABLE_STATE_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_STATE_TYPE, ETableStateClass))
-#define E_IS_TABLE_STATE(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_STATE_TYPE))
-#define E_IS_TABLE_STATE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_STATE_TYPE))
-#define E_TABLE_STATE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TABLE_STATE_TYPE, ETableStateClass))
-
-typedef struct {
-	GObject base;
-
-	ETableSortInfo *sort_info;
-	int             col_count;
-	int            *columns;
-	double         *expansions;
-} ETableState;
-
-typedef struct {
-	GObjectClass parent_class;
-} ETableStateClass;
-
-GType        e_table_state_get_type          (void);
-ETableState *e_table_state_new               (void);
-
-ETableState *e_table_state_vanilla	     (int col_count);
-
-gboolean     e_table_state_load_from_file    (ETableState   *state,
-					      const char    *filename);
-void         e_table_state_load_from_string  (ETableState   *state,
-					      const char    *xml);
-void         e_table_state_load_from_node    (ETableState   *state,
-					      const xmlNode *node);
-
-void         e_table_state_save_to_file      (ETableState   *state,
-					      const char    *filename);
-char        *e_table_state_save_to_string    (ETableState   *state);
-xmlNode     *e_table_state_save_to_node      (ETableState   *state,
-					      xmlNode       *parent);
-ETableState *e_table_state_duplicate         (ETableState   *state);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_STATE_H_ */
diff --git a/widgets/table/e-table-subset-variable.c b/widgets/table/e-table-subset-variable.c
deleted file mode 100644
index efe6529806..0000000000
--- a/widgets/table/e-table-subset-variable.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-subset-variable.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <string.h>
-#include "gal/util/e-util.h"
-#include "e-table-subset-variable.h"
-
-#define ETSSV_CLASS(e) (E_TABLE_SUBSET_VARIABLE_GET_CLASS (e))
-
-#define INCREMENT_AMOUNT 10
-
-static void
-etssv_add       (ETableSubsetVariable *etssv,
-		 gint                  row)
-{
-	ETableModel *etm = E_TABLE_MODEL(etssv);
-	ETableSubset *etss = E_TABLE_SUBSET(etssv);
-	
-	e_table_model_pre_change(etm);
-
-	if (etss->n_map + 1 > etssv->n_vals_allocated){
-		etssv->n_vals_allocated += INCREMENT_AMOUNT;
-		etss->map_table = g_realloc (etss->map_table, etssv->n_vals_allocated * sizeof(int));
-	}
-
-	etss->map_table[etss->n_map++] = row;
-
-	e_table_model_row_inserted (etm, etss->n_map - 1);
-}
-
-static void
-etssv_add_array (ETableSubsetVariable *etssv,
-		 const gint           *array,
-		 gint                  count)
-{
-	ETableModel *etm = E_TABLE_MODEL(etssv);
-	ETableSubset *etss = E_TABLE_SUBSET(etssv);
-	int i;
-
-	e_table_model_pre_change(etm);
-	
-	if (etss->n_map + count > etssv->n_vals_allocated){
-		etssv->n_vals_allocated += MAX(INCREMENT_AMOUNT, count);
-		etss->map_table = g_realloc (etss->map_table, etssv->n_vals_allocated * sizeof(int));
-	}
-	for (i = 0; i < count; i++)
-		etss->map_table[etss->n_map++] = array[i];
-
-	e_table_model_changed (etm);
-}
-
-static void
-etssv_add_all   (ETableSubsetVariable *etssv)
-{
-	ETableModel *etm = E_TABLE_MODEL(etssv);
-	ETableSubset *etss = E_TABLE_SUBSET(etssv);
-	int rows;
-	int i;
-
-	e_table_model_pre_change(etm);
-	
-	rows = e_table_model_row_count(etss->source);
-	if (etss->n_map + rows > etssv->n_vals_allocated){
-		etssv->n_vals_allocated += MAX(INCREMENT_AMOUNT, rows);
-		etss->map_table = g_realloc (etss->map_table, etssv->n_vals_allocated * sizeof(int));
-	}
-	for (i = 0; i < rows; i++)
-		etss->map_table[etss->n_map++] = i;
-
-	e_table_model_changed (etm);
-}
-
-static gboolean
-etssv_remove    (ETableSubsetVariable *etssv,
-		 gint                  row)
-{
-	ETableModel *etm = E_TABLE_MODEL(etssv);
-	ETableSubset *etss = E_TABLE_SUBSET(etssv);
-	int i;
-	
-	for (i = 0; i < etss->n_map; i++){
-		if (etss->map_table[i] == row) {
-			e_table_model_pre_change (etm);
-			memmove (etss->map_table + i, etss->map_table + i + 1, (etss->n_map - i - 1) * sizeof(int));
-			etss->n_map --;
-			
-			e_table_model_row_deleted (etm, i);
-			return TRUE;
-		}
-	}
-	return FALSE;
-}
-
-static void
-etssv_class_init (GObjectClass *object_class)
-{
-	ETableSubsetVariableClass *klass = E_TABLE_SUBSET_VARIABLE_CLASS(object_class);
-
-	klass->add     = etssv_add;
-	klass->add_array = etssv_add_array;
-	klass->add_all = etssv_add_all;
-	klass->remove  = etssv_remove;
-}
-
-E_MAKE_TYPE(e_table_subset_variable, "ETableSubsetVariable", ETableSubsetVariable, etssv_class_init, NULL, E_TABLE_SUBSET_TYPE)
-
-ETableModel *
-e_table_subset_variable_construct (ETableSubsetVariable *etssv,
-				   ETableModel          *source)
-{
-	if (e_table_subset_construct (E_TABLE_SUBSET(etssv), source, 1) == NULL)
-		return NULL;
-	E_TABLE_SUBSET(etssv)->n_map = 0;
-
-	return E_TABLE_MODEL (etssv);
-}
-
-ETableModel *
-e_table_subset_variable_new (ETableModel *source)
-{
-	ETableSubsetVariable *etssv = g_object_new (E_TABLE_SUBSET_VARIABLE_TYPE, NULL);
-
-	if (e_table_subset_variable_construct (etssv, source) == NULL){
-		g_object_unref (etssv);
-		return NULL;
-	}
-
-	return (ETableModel *) etssv;
-}
-
-void
-e_table_subset_variable_add       (ETableSubsetVariable *etssv,
-				   gint                  row)
-{
-	g_return_if_fail (etssv != NULL);
-	g_return_if_fail (E_IS_TABLE_SUBSET_VARIABLE(etssv));
-
-	if (ETSSV_CLASS(etssv)->add)
-		ETSSV_CLASS (etssv)->add (etssv, row);
-}
-
-void
-e_table_subset_variable_add_array   (ETableSubsetVariable *etssv,
-				     const gint           *array,
-				     gint                  count)
-{
-	g_return_if_fail (etssv != NULL);
-	g_return_if_fail (E_IS_TABLE_SUBSET_VARIABLE(etssv));
-
-	if (ETSSV_CLASS(etssv)->add_array)
-		ETSSV_CLASS (etssv)->add_array (etssv, array, count);
-}
-
-void
-e_table_subset_variable_add_all   (ETableSubsetVariable *etssv)
-{
-	g_return_if_fail (etssv != NULL);
-	g_return_if_fail (E_IS_TABLE_SUBSET_VARIABLE(etssv));
-
-	if (ETSSV_CLASS(etssv)->add_all)
-		ETSSV_CLASS (etssv)->add_all (etssv);
-}
-
-gboolean
-e_table_subset_variable_remove    (ETableSubsetVariable *etssv,
-				   gint                  row)
-{
-	g_return_val_if_fail (etssv != NULL, FALSE);
-	g_return_val_if_fail (E_IS_TABLE_SUBSET_VARIABLE(etssv), FALSE);
-
-	if (ETSSV_CLASS(etssv)->remove)
-		return ETSSV_CLASS (etssv)->remove (etssv, row);
-	else
-		return FALSE;
-}
-
-void
-e_table_subset_variable_clear (ETableSubsetVariable *etssv)
-{
-	ETableModel *etm = E_TABLE_MODEL(etssv);
-	ETableSubset *etss = E_TABLE_SUBSET(etssv);
-
-	e_table_model_pre_change (etm);
-	etss->n_map = 0;
-	g_free (etss->map_table);
-	etss->map_table = g_new (unsigned int, 1);
-	etssv->n_vals_allocated = 1;
-	
-	e_table_model_changed (etm);
-}
-
-void
-e_table_subset_variable_increment (ETableSubsetVariable *etssv,
-				   gint                  position,
-				   gint                  amount)
-{
-	int i;
-	ETableSubset *etss = E_TABLE_SUBSET(etssv);
-	for (i = 0; i < etss->n_map; i++) {
-		if (etss->map_table[i] >= position)
-			etss->map_table[i] += amount;
-	}
-}
-
-void
-e_table_subset_variable_decrement (ETableSubsetVariable *etssv,
-				   gint                  position,
-				   gint                  amount)
-{
-	int i;
-	ETableSubset *etss = E_TABLE_SUBSET(etssv);
-	for (i = 0; i < etss->n_map; i++) {
-		if (etss->map_table[i] >= position)
-			etss->map_table[i] -= amount;
-	}
-}
-
-void
-e_table_subset_variable_set_allocation (ETableSubsetVariable *etssv,
-					gint total)
-{
-	ETableSubset *etss = E_TABLE_SUBSET(etssv);
-	if (total <= 0)
-		total = 1;
-	if (total > etss->n_map){
-		etss->map_table = g_realloc (etss->map_table, total * sizeof(int));
-	}
-}
diff --git a/widgets/table/e-table-subset-variable.h b/widgets/table/e-table-subset-variable.h
deleted file mode 100644
index 2dc0914f9b..0000000000
--- a/widgets/table/e-table-subset-variable.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-subset-variable.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_SUBSET_VARIABLE_H_
-#define _E_TABLE_SUBSET_VARIABLE_H_
-
-#include <glib-object.h>
-#include <gal/e-table/e-table-subset.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_SUBSET_VARIABLE_TYPE        (e_table_subset_variable_get_type ())
-#define E_TABLE_SUBSET_VARIABLE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_SUBSET_VARIABLE_TYPE, ETableSubsetVariable))
-#define E_TABLE_SUBSET_VARIABLE_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_SUBSET_VARIABLE_TYPE, ETableSubsetVariableClass))
-#define E_IS_TABLE_SUBSET_VARIABLE(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_SUBSET_VARIABLE_TYPE))
-#define E_IS_TABLE_SUBSET_VARIABLE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_SUBSET_VARIABLE_TYPE))
-#define E_TABLE_SUBSET_VARIABLE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TABLE_SUBSET_VARIABLE_TYPE, ETableSubsetVariableClass))
-
-typedef struct {
-	ETableSubset base;
-
-	int n_vals_allocated;
-} ETableSubsetVariable;
-
-typedef struct {
-	ETableSubsetClass parent_class;
-	
-	void     (*add)       (ETableSubsetVariable *ets,
-			       gint                  row);
-	void     (*add_array) (ETableSubsetVariable *ets,
-			       const gint           *array,
-			       gint                  count);
-	void     (*add_all)   (ETableSubsetVariable *ets);
-	gboolean (*remove)    (ETableSubsetVariable *ets,
-			       gint                  row);
-} ETableSubsetVariableClass;
-
-GType        e_table_subset_variable_get_type        (void);
-ETableModel *e_table_subset_variable_new             (ETableModel          *etm);
-ETableModel *e_table_subset_variable_construct       (ETableSubsetVariable *etssv,
-						      ETableModel          *source);
-void         e_table_subset_variable_add             (ETableSubsetVariable *ets,
-						      gint                  row);
-void         e_table_subset_variable_add_array       (ETableSubsetVariable *ets,
-						      const gint           *array,
-						      gint                  count);
-void         e_table_subset_variable_add_all         (ETableSubsetVariable *ets);
-gboolean     e_table_subset_variable_remove          (ETableSubsetVariable *ets,
-						      gint                  row);
-void         e_table_subset_variable_clear           (ETableSubsetVariable *ets);
-void         e_table_subset_variable_increment       (ETableSubsetVariable *ets,
-						      gint                  position,
-						      gint                  amount);
-void         e_table_subset_variable_decrement       (ETableSubsetVariable *ets,
-						      gint                  position,
-						      gint                  amount);
-void         e_table_subset_variable_set_allocation  (ETableSubsetVariable *ets,
-						      gint                  total);
-G_END_DECLS
-
-#endif /* _E_TABLE_SUBSET_VARIABLE_H_ */
-
diff --git a/widgets/table/e-table-subset.c b/widgets/table/e-table-subset.c
deleted file mode 100644
index a237ba2d94..0000000000
--- a/widgets/table/e-table-subset.c
+++ /dev/null
@@ -1,482 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-subset.c - Implements a table that contains a subset of another table.
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Miguel de Icaza <miguel@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include "gal/util/e-util.h"
-#include "e-table-subset.h"
-
-static void etss_proxy_model_pre_change_real (ETableSubset *etss, ETableModel *etm);
-static void etss_proxy_model_no_change_real (ETableSubset *etss, ETableModel *etm);
-static void etss_proxy_model_changed_real (ETableSubset *etss, ETableModel *etm);
-static void etss_proxy_model_row_changed_real (ETableSubset *etss, ETableModel *etm, int row);
-static void etss_proxy_model_cell_changed_real (ETableSubset *etss, ETableModel *etm, int col, int row);
-static void etss_proxy_model_rows_inserted_real (ETableSubset *etss, ETableModel *etm, int row, int count);
-static void etss_proxy_model_rows_deleted_real (ETableSubset *etss, ETableModel *etm, int row, int count);
-
-#define d(x)
-
-static ETableModelClass *etss_parent_class;
-
-#define ETSS_CLASS(object) (E_TABLE_SUBSET_GET_CLASS(object))
-
-#define VALID_ROW(etss, row) (row >= -1 && row < etss->n_map)
-#define MAP_ROW(etss, row) (row == -1 ? -1 : etss->map_table[row])
-
-static gint
-etss_get_view_row (ETableSubset *etss, int row)
-{
-	const int n = etss->n_map;
-	const int * const map_table = etss->map_table;
-	int i;
-
-	int end = MIN(etss->n_map, etss->last_access + 10);
-	int start = MAX(0, etss->last_access - 10);
-	int initial = MAX (MIN (etss->last_access, end), start);
-
-	for (i = initial; i < end; i++) {
-		if (map_table [i] == row){
-			d(g_print("a) Found %d from %d\n", i, etss->last_access));
-			etss->last_access = i;
-			return i;
-		}
-	}
-
-	for (i = initial - 1; i >= start; i--) {
-		if (map_table [i] == row){
-			d(g_print("b) Found %d from %d\n", i, etss->last_access));
-			etss->last_access = i;
-			return i;
-		}
-	}
-
-	for (i = 0; i < n; i++){
-		if (map_table [i] == row){
-			d(g_print("c) Found %d from %d\n", i, etss->last_access));
-			etss->last_access = i;
-			return i;
-		}
-	}
-	return -1;
-}
-
-static void
-etss_dispose (GObject *object)
-{
-	ETableSubset *etss = E_TABLE_SUBSET (object);
-
-	if (etss->source) {
-		g_signal_handler_disconnect (G_OBJECT (etss->source),
-					     etss->table_model_pre_change_id);
-		g_signal_handler_disconnect (G_OBJECT (etss->source),
-					     etss->table_model_no_change_id);
-		g_signal_handler_disconnect (G_OBJECT (etss->source),
-					     etss->table_model_changed_id);
-		g_signal_handler_disconnect (G_OBJECT (etss->source),
-					     etss->table_model_row_changed_id);
-		g_signal_handler_disconnect (G_OBJECT (etss->source),
-					     etss->table_model_cell_changed_id);
-		g_signal_handler_disconnect (G_OBJECT (etss->source),
-					     etss->table_model_rows_inserted_id);
-		g_signal_handler_disconnect (G_OBJECT (etss->source),
-					     etss->table_model_rows_deleted_id);
-
-		g_object_unref (etss->source);
-		etss->source = NULL;
-
-		etss->table_model_changed_id = 0;
-		etss->table_model_row_changed_id = 0;
-		etss->table_model_cell_changed_id = 0;
-		etss->table_model_rows_inserted_id = 0;
-		etss->table_model_rows_deleted_id = 0;
-	}
-
-	G_OBJECT_CLASS (etss_parent_class)->dispose (object);
-}
-
-static void
-etss_finalize (GObject *object)
-{
-	ETableSubset *etss = E_TABLE_SUBSET (object);
-
-	g_free (etss->map_table);
-	etss->map_table = NULL;
-
-	G_OBJECT_CLASS (etss_parent_class)->finalize (object);
-}
-
-static int
-etss_column_count (ETableModel *etm)
-{
-	ETableSubset *etss = (ETableSubset *)etm;
-
-	return e_table_model_column_count (etss->source);
-}
-
-static int
-etss_row_count (ETableModel *etm)
-{
-	ETableSubset *etss = (ETableSubset *)etm;
-
-	return etss->n_map;
-}
-
-static void *
-etss_value_at (ETableModel *etm, int col, int row)
-{
-	ETableSubset *etss = (ETableSubset *)etm;
-
-	g_return_val_if_fail (VALID_ROW (etss, row), NULL);
-
-	etss->last_access = row;
-	d(g_print("g) Setting last_access to %d\n", row));
-	return e_table_model_value_at (etss->source, col, MAP_ROW(etss, row));
-}
-
-static void
-etss_set_value_at (ETableModel *etm, int col, int row, const void *val)
-{
-	ETableSubset *etss = (ETableSubset *)etm;
-
-	g_return_if_fail (VALID_ROW (etss, row));
-
-	etss->last_access = row;
-	d(g_print("h) Setting last_access to %d\n", row));
-	e_table_model_set_value_at (etss->source, col, MAP_ROW(etss, row), val);
-}
-
-static gboolean
-etss_is_cell_editable (ETableModel *etm, int col, int row)
-{
-	ETableSubset *etss = (ETableSubset *)etm;
-
-	g_return_val_if_fail (VALID_ROW (etss, row), FALSE);
-
-	return e_table_model_is_cell_editable (etss->source, col, MAP_ROW(etss, row));
-}
-
-static gboolean
-etss_has_save_id (ETableModel *etm)
-{
-	return TRUE;
-}
-
-static char *
-etss_get_save_id (ETableModel *etm, int row)
-{
-	ETableSubset *etss = (ETableSubset *)etm;
-
-	g_return_val_if_fail (VALID_ROW (etss, row), NULL);
-
-	if (e_table_model_has_save_id (etss->source))
-		return e_table_model_get_save_id (etss->source, MAP_ROW(etss, row));
-	else
-		return g_strdup_printf ("%d", MAP_ROW(etss, row));
-}
-
-static void
-etss_append_row (ETableModel *etm, ETableModel *source, int row)
-{
-	ETableSubset *etss = (ETableSubset *)etm;
-	e_table_model_append_row (etss->source, source, row);
-}
-
-static void *
-etss_duplicate_value (ETableModel *etm, int col, const void *value)
-{
-	ETableSubset *etss = (ETableSubset *)etm;
-
-	return e_table_model_duplicate_value (etss->source, col, value);
-}
-
-static void
-etss_free_value (ETableModel *etm, int col, void *value)
-{
-	ETableSubset *etss = (ETableSubset *)etm;
-
-	e_table_model_free_value (etss->source, col, value);
-}
-
-static void *
-etss_initialize_value (ETableModel *etm, int col)
-{
-	ETableSubset *etss = (ETableSubset *)etm;
-
-	return e_table_model_initialize_value (etss->source, col);
-}
-
-static gboolean
-etss_value_is_empty (ETableModel *etm, int col, const void *value)
-{
-	ETableSubset *etss = (ETableSubset *)etm;
-
-	return e_table_model_value_is_empty (etss->source, col, value);
-}
-
-static char *
-etss_value_to_string (ETableModel *etm, int col, const void *value)
-{
-	ETableSubset *etss = (ETableSubset *)etm;
-
-	return e_table_model_value_to_string (etss->source, col, value);
-}
-
-static void
-etss_class_init (GObjectClass *object_class)
-{
-	ETableSubsetClass *klass         = (ETableSubsetClass *) object_class;
-	ETableModelClass *table_class    = (ETableModelClass *) object_class;
-
-	etss_parent_class                = g_type_class_peek_parent (klass);
-	
-	object_class->dispose            = etss_dispose;
-	object_class->finalize           = etss_finalize;
-
-	table_class->column_count        = etss_column_count;
-	table_class->row_count           = etss_row_count;
-	table_class->append_row          = etss_append_row;
-
-	table_class->value_at            = etss_value_at;
-	table_class->set_value_at        = etss_set_value_at;
-	table_class->is_cell_editable    = etss_is_cell_editable;
-
-	table_class->has_save_id         = etss_has_save_id;
-	table_class->get_save_id         = etss_get_save_id;
-
-	table_class->duplicate_value     = etss_duplicate_value;
-	table_class->free_value          = etss_free_value;
-	table_class->initialize_value    = etss_initialize_value;
-	table_class->value_is_empty      = etss_value_is_empty;
-	table_class->value_to_string     = etss_value_to_string;
-
-	klass->proxy_model_pre_change    = etss_proxy_model_pre_change_real;
-	klass->proxy_model_no_change     = etss_proxy_model_no_change_real;
-	klass->proxy_model_changed       = etss_proxy_model_changed_real;
-	klass->proxy_model_row_changed   = etss_proxy_model_row_changed_real;
-	klass->proxy_model_cell_changed  = etss_proxy_model_cell_changed_real;
-	klass->proxy_model_rows_inserted = etss_proxy_model_rows_inserted_real;
-	klass->proxy_model_rows_deleted  = etss_proxy_model_rows_deleted_real;
-}
-
-static void
-etss_init (ETableSubset *etss)
-{
-	etss->last_access = 0;
-}
-
-E_MAKE_TYPE(e_table_subset, "ETableSubset", ETableSubset, etss_class_init, etss_init, E_TABLE_MODEL_TYPE)
-
-static void
-etss_proxy_model_pre_change_real (ETableSubset *etss, ETableModel *etm)
-{
-	e_table_model_pre_change (E_TABLE_MODEL (etss));
-}
-
-static void
-etss_proxy_model_no_change_real (ETableSubset *etss, ETableModel *etm)
-{
-	e_table_model_no_change (E_TABLE_MODEL (etss));
-}
-
-static void
-etss_proxy_model_changed_real (ETableSubset *etss, ETableModel *etm)
-{
-	e_table_model_changed (E_TABLE_MODEL (etss));
-}
-
-static void
-etss_proxy_model_row_changed_real (ETableSubset *etss, ETableModel *etm, int row)
-{
-	int view_row = etss_get_view_row (etss, row);
-	if (view_row != -1)
-		e_table_model_row_changed (E_TABLE_MODEL (etss), view_row);
-	else
-		e_table_model_no_change (E_TABLE_MODEL (etss));
-}
-
-static void
-etss_proxy_model_cell_changed_real (ETableSubset *etss, ETableModel *etm, int col, int row)
-{
-	int view_row = etss_get_view_row (etss, row);
-	if (view_row != -1)
-		e_table_model_cell_changed (E_TABLE_MODEL (etss), col, view_row);
-	else
-		e_table_model_no_change (E_TABLE_MODEL (etss));
-}
-
-static void
-etss_proxy_model_rows_inserted_real (ETableSubset *etss, ETableModel *etm, int row, int count)
-{
-	e_table_model_no_change (E_TABLE_MODEL (etss));
-}
-
-static void
-etss_proxy_model_rows_deleted_real (ETableSubset *etss, ETableModel *etm, int row, int count)
-{
-	e_table_model_no_change (E_TABLE_MODEL (etss));
-}
-
-static void
-etss_proxy_model_pre_change (ETableModel *etm, ETableSubset *etss)
-{
-	if (ETSS_CLASS(etss)->proxy_model_pre_change)
-		(ETSS_CLASS(etss)->proxy_model_pre_change) (etss, etm);
-}
-
-static void
-etss_proxy_model_no_change (ETableModel *etm, ETableSubset *etss)
-{
-	if (ETSS_CLASS(etss)->proxy_model_no_change)
-		(ETSS_CLASS(etss)->proxy_model_no_change) (etss, etm);
-}
-
-static void
-etss_proxy_model_changed (ETableModel *etm, ETableSubset *etss)
-{
-	if (ETSS_CLASS(etss)->proxy_model_changed)
-		(ETSS_CLASS(etss)->proxy_model_changed) (etss, etm);
-}
-
-static void
-etss_proxy_model_row_changed (ETableModel *etm, int row, ETableSubset *etss)
-{
-	if (ETSS_CLASS(etss)->proxy_model_row_changed)
-		(ETSS_CLASS(etss)->proxy_model_row_changed) (etss, etm, row);
-}
-
-static void
-etss_proxy_model_cell_changed (ETableModel *etm, int row, int col, ETableSubset *etss)
-{
-	if (ETSS_CLASS(etss)->proxy_model_cell_changed)
-		(ETSS_CLASS(etss)->proxy_model_cell_changed) (etss, etm, col, row);
-}
-
-static void
-etss_proxy_model_rows_inserted (ETableModel *etm, int row, int col, ETableSubset *etss)
-{
-	if (ETSS_CLASS(etss)->proxy_model_rows_inserted)
-		(ETSS_CLASS(etss)->proxy_model_rows_inserted) (etss, etm, row, col);
-}
-
-static void
-etss_proxy_model_rows_deleted (ETableModel *etm, int row, int col, ETableSubset *etss)
-{
-	if (ETSS_CLASS(etss)->proxy_model_rows_deleted)
-		(ETSS_CLASS(etss)->proxy_model_rows_deleted) (etss, etm, row, col);
-}
-
-ETableModel *
-e_table_subset_construct (ETableSubset *etss, ETableModel *source, int nvals)
-{
-	unsigned int *buffer;
-	int i;
-
-	if (nvals) {
-		buffer = (unsigned int *) g_malloc (sizeof (unsigned int) * nvals);
-		if (buffer == NULL)
-			return NULL;
-	} else
-		buffer = NULL;
-	etss->map_table = buffer;
-	etss->n_map = nvals;
-	etss->source = source;
-	g_object_ref (source);
-	
-	/* Init */
-	for (i = 0; i < nvals; i++)
-		etss->map_table [i] = i;
-
-	etss->table_model_pre_change_id    = g_signal_connect (G_OBJECT (source), "model_pre_change",
-							G_CALLBACK (etss_proxy_model_pre_change), etss);
-	etss->table_model_no_change_id     = g_signal_connect (G_OBJECT (source), "model_no_change",
-							G_CALLBACK (etss_proxy_model_no_change), etss);
-	etss->table_model_changed_id       = g_signal_connect (G_OBJECT (source), "model_changed",
-							G_CALLBACK (etss_proxy_model_changed), etss);
-	etss->table_model_row_changed_id   = g_signal_connect (G_OBJECT (source), "model_row_changed",
-							G_CALLBACK (etss_proxy_model_row_changed), etss);
-	etss->table_model_cell_changed_id  = g_signal_connect (G_OBJECT (source), "model_cell_changed",
-							G_CALLBACK (etss_proxy_model_cell_changed), etss);
-	etss->table_model_rows_inserted_id = g_signal_connect (G_OBJECT (source), "model_rows_inserted",
-							G_CALLBACK (etss_proxy_model_rows_inserted), etss);
-	etss->table_model_rows_deleted_id  = g_signal_connect (G_OBJECT (source), "model_rows_deleted",
-							G_CALLBACK (etss_proxy_model_rows_deleted), etss);
-	
-	return E_TABLE_MODEL (etss);
-}
-
-ETableModel *
-e_table_subset_new (ETableModel *source, const int nvals)
-{
-	ETableSubset *etss = g_object_new (E_TABLE_SUBSET_TYPE, NULL);
-
-	if (e_table_subset_construct (etss, source, nvals) == NULL){
-		g_object_unref (etss);
-		return NULL;
-	}
-
-	return (ETableModel *) etss;
-}
-
-int
-e_table_subset_model_to_view_row  (ETableSubset *ets,
-				   int           model_row)
-{
-	int i;
-	for (i = 0; i < ets->n_map; i++) {
-		if (ets->map_table[i] == model_row)
-			return i;
-	}
-	return -1;
-}
-
-int
-e_table_subset_view_to_model_row  (ETableSubset *ets,
-				   int           view_row)
-{
-	if (view_row >= 0 && view_row < ets->n_map)
-		return ets->map_table[view_row];
-	else
-		return -1;
-}
-
-ETableModel *
-e_table_subset_get_toplevel (ETableSubset *table)
-{
-	g_return_val_if_fail (table != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE_SUBSET (table), NULL);
-
-	if (E_IS_TABLE_SUBSET (table->source))
-		return e_table_subset_get_toplevel (E_TABLE_SUBSET (table->source));
-	else
-		return table->source;
-}
-
-void
-e_table_subset_print_debugging  (ETableSubset *table_model)
-{
-	int i;
-	for (i = 0; i < table_model->n_map; i++) {
-		g_print("%8d\n", table_model->map_table[i]);
-	}
-}
diff --git a/widgets/table/e-table-subset.h b/widgets/table/e-table-subset.h
deleted file mode 100644
index 505aa6c305..0000000000
--- a/widgets/table/e-table-subset.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-subset.h - Implements a table that contains a subset of another table.
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Miguel de Icaza <miguel@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_SUBSET_H_
-#define _E_TABLE_SUBSET_H_
-
-#include <glib-object.h>
-#include <gal/e-table/e-table-model.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_SUBSET_TYPE        (e_table_subset_get_type ())
-#define E_TABLE_SUBSET(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_SUBSET_TYPE, ETableSubset))
-#define E_TABLE_SUBSET_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_SUBSET_TYPE, ETableSubsetClass))
-#define E_IS_TABLE_SUBSET(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_SUBSET_TYPE))
-#define E_IS_TABLE_SUBSET_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_SUBSET_TYPE))
-#define E_TABLE_SUBSET_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), E_TABLE_SUBSET_TYPE, ETableSubsetClass))
-
-typedef struct {
-	ETableModel base;
-
-	ETableModel  *source;
-	int  n_map;
-	int *map_table;
-
-	int last_access;
-
-	int              table_model_pre_change_id;
-	int              table_model_no_change_id;
-	int              table_model_changed_id;
-	int              table_model_row_changed_id;
-	int              table_model_cell_changed_id;
-	int              table_model_rows_inserted_id;
-	int              table_model_rows_deleted_id;
-} ETableSubset;
-
-typedef struct {
-	ETableModelClass parent_class;
-
-	void (*proxy_model_pre_change)   (ETableSubset *etss, ETableModel *etm);
-	void (*proxy_model_no_change)   (ETableSubset *etss, ETableModel *etm);
-	void (*proxy_model_changed)      (ETableSubset *etss, ETableModel *etm);
-	void (*proxy_model_row_changed)  (ETableSubset *etss, ETableModel *etm, int row);
-	void (*proxy_model_cell_changed) (ETableSubset *etss, ETableModel *etm, int col, int row);
-	void (*proxy_model_rows_inserted) (ETableSubset *etss, ETableModel *etm, int row, int count);
-	void (*proxy_model_rows_deleted)  (ETableSubset *etss, ETableModel *etm, int row, int count);
-} ETableSubsetClass;
-
-GType        e_table_subset_get_type           (void);
-ETableModel *e_table_subset_new                (ETableModel  *etm,
-						int           n_vals);
-ETableModel *e_table_subset_construct          (ETableSubset *ets,
-						ETableModel  *source,
-						int           nvals);
-
-int          e_table_subset_model_to_view_row  (ETableSubset *ets,
-						int           model_row);
-int          e_table_subset_view_to_model_row  (ETableSubset *ets,
-						int           view_row);
-
-ETableModel *e_table_subset_get_toplevel       (ETableSubset *table_model);
-
-void         e_table_subset_print_debugging    (ETableSubset *table_model);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_SUBSET_H_ */
-
diff --git a/widgets/table/e-table-tooltip.h b/widgets/table/e-table-tooltip.h
deleted file mode 100644
index 81c00f9e34..0000000000
--- a/widgets/table/e-table-tooltip.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-tooltip.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_TOOLTIP_H_
-#define _E_TABLE_TOOLTIP_H_
-
-#include <libgnomecanvas/gnome-canvas.h>
-
-G_BEGIN_DECLS
-
-typedef struct {
-	gint timer;
-	int col, row;
-	int row_height;
-	int x, y;
-	int cx, cy;
-	GdkColor *foreground;
-	GdkColor *background;
-	GnomeCanvasItem *eti;
-} ETableTooltip;
-
-G_END_DECLS
-
-#endif
diff --git a/widgets/table/e-table-tree.h b/widgets/table/e-table-tree.h
deleted file mode 100644
index 5648fc2f06..0000000000
--- a/widgets/table/e-table-tree.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-tree.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_TREE_H_
-#define _E_TABLE_TREE_H_
-
-#include <gal/e-table/e-table-model.h>
-
-G_BEGIN_DECLS
-
-typedef struct {
-	char *title;
-
-	union {
-		ETableModel *table;
-		GList *children;
-	} u;
-
-	guint expanded :1;
-	guint is_leaf  :1;
-} ETableGroup;
-
-ETableGroup *e_table_group_new      (const char *title, ETableModel *table);
-ETableGroup *e_table_group_new_leaf (const char *title);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_TREE_H_ */
diff --git a/widgets/table/e-table-utils.c b/widgets/table/e-table-utils.c
deleted file mode 100644
index eec4fc79d5..0000000000
--- a/widgets/table/e-table-utils.c
+++ /dev/null
@@ -1,191 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-utils.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include "gal/util/e-i18n.h"
-#include "gal/util/e-util.h"
-#include "gal/widgets/e-unicode.h"
-#include "e-table-utils.h"
-#include "e-table-header-utils.h"
-
-ETableHeader *
-e_table_state_to_header (GtkWidget *widget, ETableHeader *full_header, ETableState *state)
-{
-	ETableHeader *nh;
-	const int max_cols = e_table_header_count (full_header);
-	int column;
-	GValue *val = g_new0 (GValue, 1);
-
-	g_return_val_if_fail (widget, NULL);
-	g_return_val_if_fail (full_header, NULL);
-	g_return_val_if_fail (state, NULL);
-
-	nh = e_table_header_new ();
-	g_value_init (val, G_TYPE_DOUBLE);
-	g_value_set_double (val, e_table_header_width_extras (widget->style));
-	g_object_set_property (G_OBJECT(nh), "width_extras", val);
-	g_free (val);
-
-	for (column = 0; column < state->col_count; column++) {
-		int col;
-		double expansion;
-		ETableCol *table_col;
-
-		col = state->columns[column];
-		expansion = state->expansions[column];
-
-		if (col >= max_cols)
-			continue;
-
-		table_col = e_table_header_get_column (full_header, col);
-
-		if (expansion >= -1)
-			table_col->expansion = expansion;
-
-		e_table_header_add_column (nh, table_col, -1);
-	}
-
-	return nh;
-}
-
-static ETableCol *
-et_col_spec_to_col (ETableColumnSpecification *col_spec,
-		    ETableExtras              *ete,
-		    const char                *domain)
-{
-	ETableCol *col = NULL;
-	ECell *cell = NULL;
-	GCompareFunc compare = NULL;
-	ETableSearchFunc search = NULL;
-
-	if (col_spec->cell)
-		cell = e_table_extras_get_cell(ete, col_spec->cell);
-	if (col_spec->compare)
-		compare = e_table_extras_get_compare(ete, col_spec->compare);
-	if (col_spec->search)
-		search = e_table_extras_get_search(ete, col_spec->search);
-
-	if (cell && compare) {
-		char *title = dgettext (domain, col_spec->title);
-
-		title = g_strdup (title);
-
-		if (col_spec->pixbuf && *col_spec->pixbuf) {
-			GdkPixbuf *pixbuf;
-
-			pixbuf = e_table_extras_get_pixbuf(
-				ete, col_spec->pixbuf);
-			if (pixbuf) {
-				col = e_table_col_new_with_pixbuf (
-					col_spec->model_col, title,
-					pixbuf, col_spec->expansion,
-					col_spec->minimum_width,
-					cell, compare, col_spec->resizable, col_spec->disabled, col_spec->priority);
-			}
-		}
-		if (col == NULL && col_spec->title && *col_spec->title) {
-			col = e_table_col_new (
-				col_spec->model_col, title,
-				col_spec->expansion, col_spec->minimum_width,
-				cell, compare, col_spec->resizable, col_spec->disabled, col_spec->priority);
-		}
-		col->search = search;
-
-		g_free (title);
-	}
-	if (col && col_spec->compare_col != col_spec->model_col)
-		g_object_set (col,
-			      "compare_col", col_spec->compare_col,
-			      NULL);
-	return col;
-}
-
-ETableHeader *
-e_table_spec_to_full_header (ETableSpecification *spec,
-			     ETableExtras        *ete)
-{
-	ETableHeader *nh;
-	int column;
-
-	g_return_val_if_fail (spec, NULL);
-	g_return_val_if_fail (ete, NULL);
-
-	nh = e_table_header_new ();
-
-	for (column = 0; spec->columns[column]; column++) {
-		ETableCol *col = et_col_spec_to_col (
-			spec->columns[column], ete, spec->domain);
-
-		if (col) {
-			e_table_header_add_column (nh, col, -1);
-			g_object_unref (col);
-		}
-	}
-
-	return nh;
-}
-
-static gboolean
-check_col (ETableCol *col, gpointer user_data)
-{
-	return col->search ? TRUE : FALSE;
-}
-
-ETableCol *
-e_table_util_calculate_current_search_col (ETableHeader *header, ETableHeader *full_header, ETableSortInfo *sort_info, gboolean always_search)
-{
-	int i;
-	int count;
-	ETableCol *col = NULL;
-	count = e_table_sort_info_grouping_get_count (sort_info);
-	for (i = 0; i < count; i++) {
-		ETableSortColumn column = e_table_sort_info_grouping_get_nth(sort_info, i);
-
-		col = e_table_header_get_column (full_header, column.column);
-
-		if (col && col->search)
-			break;
-
-		col = NULL;
-	}
-
-	if (col == NULL) {
-		count = e_table_sort_info_sorting_get_count (sort_info);
-		for (i = 0; i < count; i++) {
-			ETableSortColumn column = e_table_sort_info_sorting_get_nth(sort_info, i);
-
-			col = e_table_header_get_column (full_header, column.column);
-
-			if (col && col->search)
-				break;
-
-			col = NULL;
-		}
-	}
-
-	if (col == NULL && always_search) {
-		col = e_table_header_prioritized_column_selected (header, check_col, NULL);
-	}
-
-	return col;
-}
diff --git a/widgets/table/e-table-utils.h b/widgets/table/e-table-utils.h
deleted file mode 100644
index 3c7fd937b6..0000000000
--- a/widgets/table/e-table-utils.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-utils.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_UTILS_H_
-#define _E_TABLE_UTILS_H_
-
-#include <gal/e-table/e-table-header.h>
-#include <gal/e-table/e-table-state.h>
-#include <gal/e-table/e-table-specification.h>
-#include <gal/e-table/e-table-extras.h>
-
-G_BEGIN_DECLS
-
-ETableHeader *e_table_state_to_header                    (GtkWidget           *widget,
-							  ETableHeader        *full_header,
-							  ETableState         *state);
-
-ETableHeader *e_table_spec_to_full_header                (ETableSpecification *spec,
-							  ETableExtras        *ete);
-
-ETableCol    *e_table_util_calculate_current_search_col  (ETableHeader        *header,
-							  ETableHeader        *full_header,
-							  ETableSortInfo      *sort_info,
-							  gboolean             always_search);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_UTILS_H_ */
-
diff --git a/widgets/table/e-table-without.c b/widgets/table/e-table-without.c
deleted file mode 100644
index e49076be0f..0000000000
--- a/widgets/table/e-table-without.c
+++ /dev/null
@@ -1,392 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table-without.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <string.h>
-#include "gal/util/e-util.h"
-#include "e-table-without.h"
-
-#define PARENT_TYPE E_TABLE_SUBSET_TYPE
-
-#define INCREMENT_AMOUNT 10
-
-static ETableSubsetClass *parent_class;
-
-struct _ETableWithoutPrivate {
-	GHashTable *hash;
-
-	GHashFunc hash_func;
-	GCompareFunc compare_func;
-
-	ETableWithoutGetKeyFunc get_key_func;
-	ETableWithoutDuplicateKeyFunc duplicate_key_func;
-	ETableWithoutFreeKeyFunc free_gotten_key_func;
-	ETableWithoutFreeKeyFunc free_duplicated_key_func;
-
-	void *closure;
-};
-
-static gboolean 
-check (ETableWithout *etw, int model_row)
-{
-	gboolean ret_val;
-	void *key;
-	ETableSubset *etss = E_TABLE_SUBSET (etw);
-
-	if (etw->priv->get_key_func)
-		key = etw->priv->get_key_func (etss->source, model_row, etw->priv->closure);
-	else
-		key = GINT_TO_POINTER (model_row);
-	ret_val = (g_hash_table_lookup (etw->priv->hash, key) != NULL);
-	if (etw->priv->free_gotten_key_func)
-		etw->priv->free_gotten_key_func (key, etw->priv->closure);
-	return ret_val;
-}
-
-static gboolean 
-check_with_key (ETableWithout *etw, void *key, int model_row)
-{
-	gboolean ret_val;
-	void *key2;
-	ETableSubset *etss = E_TABLE_SUBSET (etw);
-
-	if (etw->priv->get_key_func)
-		key2 = etw->priv->get_key_func (etss->source, model_row, etw->priv->closure);
-	else
-		key2 = GINT_TO_POINTER (model_row);
-	if (etw->priv->compare_func)
-		ret_val = (etw->priv->compare_func (key, key2));
-	else
-		ret_val = (key == key2);
-	if (etw->priv->free_gotten_key_func)
-		etw->priv->free_gotten_key_func (key2, etw->priv->closure);
-	return ret_val;
-}
-
-static gint
-etw_view_to_model_row (ETableWithout *etw, int view_row)
-{
-	ETableSubset *etss = E_TABLE_SUBSET (etw);
-	return etss->map_table[view_row];
-}
-
-static void
-add_row (ETableWithout *etw, int model_row)
-{
-	ETableSubset *etss = E_TABLE_SUBSET (etw);
-
-	e_table_model_pre_change (E_TABLE_MODEL (etw));
-
-	etss->map_table = g_renew (int, etss->map_table, etss->n_map + 1);
-
-	etss->map_table[etss->n_map++] = model_row;
-
-	e_table_model_row_inserted (E_TABLE_MODEL (etw), etss->n_map - 1);
-}
-
-static void
-remove_row (ETableWithout *etw, int view_row)
-{
-	ETableSubset *etss = E_TABLE_SUBSET (etw);
-
-	e_table_model_pre_change (E_TABLE_MODEL (etw));
-	memmove (etss->map_table + view_row, etss->map_table + view_row + 1, (etss->n_map - view_row - 1) * sizeof (int));
-	etss->n_map --;
-	e_table_model_row_deleted (E_TABLE_MODEL (etw), view_row);
-}
-
-static void
-delete_hash_element (gpointer key,
-		     gpointer value,
-		     gpointer closure)
-{
-	ETableWithout *etw = closure;
-	if (etw->priv->free_duplicated_key_func)
-		etw->priv->free_duplicated_key_func (key, etw->priv->closure);
-}
-
-static void
-etw_dispose (GObject *object)
-{
-	ETableWithout *etw = E_TABLE_WITHOUT (object);
-
-	if (etw->priv) {
-		if (etw->priv->hash) {
-			g_hash_table_foreach (etw->priv->hash, delete_hash_element, etw);
-			g_hash_table_destroy (etw->priv->hash);
-			etw->priv->hash = NULL;
-		}
-		g_free (etw->priv);
-		etw->priv = NULL;
-	}
-
-	if (G_OBJECT_CLASS (parent_class)->dispose)
-		(* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-static void
-etw_proxy_model_rows_inserted (ETableSubset *etss, ETableModel *etm, int model_row, int count)
-{
-	int i;
-	ETableWithout *etw = E_TABLE_WITHOUT (etss);
-	gboolean shift = FALSE;
-
-	/* i is View row */
-	if (model_row != etss->n_map) {
-		for (i = 0; i < etss->n_map; i++) {
-			if (etss->map_table[i] > model_row)
-				etss->map_table[i] += count;
-		}
-		shift = TRUE;
-	}
-
-	/* i is Model row */
-	for (i = model_row; i < model_row + count; i++) {
-		if (!check (etw, i)) {
-			add_row (etw, i);
-		}
-	}
-	if (shift)
-		e_table_model_changed (E_TABLE_MODEL (etw));
-	else
-		e_table_model_no_change (E_TABLE_MODEL (etw));
-}
-
-static void
-etw_proxy_model_rows_deleted (ETableSubset *etss, ETableModel *etm, int model_row, int count)
-{
-	int i; /* View row */
-	ETableWithout *etw = E_TABLE_WITHOUT (etss);
-	gboolean shift = FALSE;
-
-	for (i = 0; i < etss->n_map; i++) {
-		if (etss->map_table[i] >= model_row && etss->map_table[i] < model_row + count) {
-			remove_row (etw, i);
-			i--;
-		} else if (etss->map_table[i] >= model_row + count) {
-			etss->map_table[i] -= count;
-			shift = TRUE;
-		}
-	}
-	if (shift)
-		e_table_model_changed (E_TABLE_MODEL (etw));
-	else
-		e_table_model_no_change (E_TABLE_MODEL (etw));
-}
-
-static void
-etw_proxy_model_changed (ETableSubset *etss, ETableModel *etm)
-{
-	int i; /* Model row */
-	int j; /* View row */
-	int row_count;
-	ETableWithout *etw = E_TABLE_WITHOUT (etss);
-
-	g_free (etss->map_table);
-	row_count = e_table_model_row_count (etm);
-	etss->map_table = g_new (int, row_count);
-
-	for (i = 0, j = 0; i < row_count; i++) {
-		if (!check (etw, i)) {
-			etss->map_table[j++] = i;
-		}
-	}
-	etss->n_map = j;
-
-	if (parent_class->proxy_model_changed)
-		parent_class->proxy_model_changed (etss, etm);
-}
-
-static void
-etw_class_init (ETableWithoutClass *klass)
-{
-	ETableSubsetClass *etss_class         = E_TABLE_SUBSET_CLASS (klass);
-	GObjectClass *object_class            = G_OBJECT_CLASS (klass);
-
-	parent_class                          = g_type_class_ref (PARENT_TYPE);
-
-	object_class->dispose                 = etw_dispose;
-
-	etss_class->proxy_model_rows_inserted = etw_proxy_model_rows_inserted;
-	etss_class->proxy_model_rows_deleted  = etw_proxy_model_rows_deleted;
-	etss_class->proxy_model_changed       = etw_proxy_model_changed;
-}
-
-static void
-etw_init (ETableWithout *etw)
-{
-	etw->priv                           = g_new (ETableWithoutPrivate, 1);
-	etw->priv->hash_func                = NULL;
-	etw->priv->compare_func             = NULL;
-	etw->priv->get_key_func             = NULL;
-	etw->priv->duplicate_key_func       = NULL;
-	etw->priv->free_gotten_key_func     = NULL;
-	etw->priv->free_duplicated_key_func = NULL;
-}
-
-E_MAKE_TYPE(e_table_without, "ETableWithout", ETableWithout, etw_class_init, etw_init, PARENT_TYPE)
-
-ETableModel *
-e_table_without_construct (ETableWithout                 *etw,
-			   ETableModel                   *source,
-			   GHashFunc                      hash_func,
-			   GCompareFunc                   compare_func,
-			   ETableWithoutGetKeyFunc        get_key_func,
-			   ETableWithoutDuplicateKeyFunc  duplicate_key_func,
-			   ETableWithoutFreeKeyFunc       free_gotten_key_func,
-			   ETableWithoutFreeKeyFunc       free_duplicated_key_func,
-			   void                          *closure)
-{
-	if (e_table_subset_construct (E_TABLE_SUBSET(etw), source, 1) == NULL)
-		return NULL;
-	E_TABLE_SUBSET(etw)->n_map = 0;
-
-	etw->priv->hash_func                = hash_func;
-	etw->priv->compare_func 	    = compare_func;
-	etw->priv->get_key_func 	    = get_key_func;
-	etw->priv->duplicate_key_func 	    = duplicate_key_func;
-	etw->priv->free_gotten_key_func     = free_gotten_key_func;
-	etw->priv->free_duplicated_key_func = free_duplicated_key_func;
-	etw->priv->closure                  = closure;
-
-	etw->priv->hash = g_hash_table_new (etw->priv->hash_func, etw->priv->compare_func);
-
-	return E_TABLE_MODEL (etw);
-}
-
-ETableModel *
-e_table_without_new        (ETableModel                   *source,
-			    GHashFunc                      hash_func,
-			    GCompareFunc                   compare_func,
-			    ETableWithoutGetKeyFunc        get_key_func,
-			    ETableWithoutDuplicateKeyFunc  duplicate_key_func,
-			    ETableWithoutFreeKeyFunc       free_gotten_key_func,
-			    ETableWithoutFreeKeyFunc       free_duplicated_key_func,
-			    void                          *closure)
-{
-	ETableWithout *etw = g_object_new (E_TABLE_WITHOUT_TYPE, NULL);
-
-	if (e_table_without_construct (etw,
-				       source,
-				       hash_func,
-				       compare_func,
-				       get_key_func,
-				       duplicate_key_func,
-				       free_gotten_key_func,
-				       free_duplicated_key_func,
-				       closure)
-	    == NULL) {
-		g_object_unref (etw);
-		return NULL;
-	}
-
-	return (ETableModel *) etw;
-}
-
-void         e_table_without_hide       (ETableWithout *etw,
-					 void          *key)
-{
-	int i; /* View row */
-	ETableSubset *etss = E_TABLE_SUBSET (etw);
-
-	if (etw->priv->duplicate_key_func)
-		key = etw->priv->duplicate_key_func (key, etw->priv->closure);
-
-	g_hash_table_insert (etw->priv->hash, key, key);
-	for (i = 0; i < etss->n_map; i++) {
-		if (check_with_key (etw, key, etw_view_to_model_row (etw, i))) {
-			remove_row (etw, i);
-			i --;
-		}
-	}
-}
-
-/* An adopted key will later be freed using the free_duplicated_key function. */
-void         e_table_without_hide_adopt (ETableWithout *etw,
-					 void          *key)
-{
-	int i; /* View row */
-	ETableSubset *etss = E_TABLE_SUBSET (etw);
-
-	g_hash_table_insert (etw->priv->hash, key, key);
-	for (i = 0; i < etss->n_map; i++) {
-		if (check_with_key (etw, key, etw_view_to_model_row (etw, i))) {
-			remove_row (etw, i);
-			i --;
-		}
-	}
-}
-
-void
-e_table_without_show       (ETableWithout *etw,
-			    void          *key)
-{
-	int i; /* Model row */
-	ETableSubset *etss = E_TABLE_SUBSET (etw);
-	int count;
-	void *old_key;
-
-	count = e_table_model_row_count (etss->source);
-
-	for (i = 0; i < count; i++) {
-		if (check_with_key (etw, key, i)) {
-			add_row (etw, i);
-		}
-	}
-	if (g_hash_table_lookup_extended (etw->priv->hash, key, &old_key, NULL)) {
-#if 0
-		if (etw->priv->free_duplicated_key_func)
-			etw->priv->free_duplicated_key_func (key, etw->priv->closure);
-#endif
-		g_hash_table_remove (etw->priv->hash, key);
-	}
-}
-
-void
-e_table_without_show_all   (ETableWithout *etw)
-{
-	int i; /* Model row */
-	int row_count;
-	ETableSubset *etss = E_TABLE_SUBSET (etw);
-
-	e_table_model_pre_change (E_TABLE_MODEL (etw));
-
-	if (etw->priv->hash) {
-		g_hash_table_foreach (etw->priv->hash, delete_hash_element, etw);
-		g_hash_table_destroy (etw->priv->hash);
-		etw->priv->hash = NULL;
-	}
-	etw->priv->hash = g_hash_table_new (etw->priv->hash_func, etw->priv->compare_func);
-
-	row_count = e_table_model_row_count (E_TABLE_MODEL(etss->source));
-	g_free (etss->map_table);
-	etss->map_table = g_new (int, row_count);
-
-	for (i = 0; i < row_count; i++) {
-		etss->map_table[i] = i;
-	}
-	etss->n_map = row_count;
-
-	e_table_model_changed (E_TABLE_MODEL (etw));
-}
diff --git a/widgets/table/e-table-without.h b/widgets/table/e-table-without.h
deleted file mode 100644
index 6bcbdcdc65..0000000000
--- a/widgets/table/e-table-without.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table-without.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_WITHOUT_H_
-#define _E_TABLE_WITHOUT_H_
-
-#include <gtk/gtkobject.h>
-#include <gal/e-table/e-table-subset.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define E_TABLE_WITHOUT_TYPE        (e_table_without_get_type ())
-#define E_TABLE_WITHOUT(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_WITHOUT_TYPE, ETableWithout))
-#define E_TABLE_WITHOUT_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_WITHOUT_TYPE, ETableWithoutClass))
-#define E_IS_TABLE_WITHOUT(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_WITHOUT_TYPE))
-#define E_IS_TABLE_WITHOUT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_WITHOUT_TYPE))
-
-typedef struct _ETableWithoutPrivate ETableWithoutPrivate;
-typedef void *(*ETableWithoutGetKeyFunc)       (ETableModel *source,
-						int          row,
-						void        *closure);
-typedef void *(*ETableWithoutDuplicateKeyFunc) (const void  *key,
-						void        *closure);
-typedef void  (*ETableWithoutFreeKeyFunc)      (void        *key,
-						void        *closure);
-
-typedef struct {
-	ETableSubset base;
-
-	ETableWithoutPrivate *priv;
-} ETableWithout;
-
-typedef struct {
-	ETableSubsetClass parent_class;
-	
-} ETableWithoutClass;
-
-GType        e_table_without_get_type   (void);
-ETableModel *e_table_without_new        (ETableModel                   *source,
-					 GHashFunc                      hash_func,
-					 GCompareFunc                   compare_func,
-					 ETableWithoutGetKeyFunc        get_key_func,
-					 ETableWithoutDuplicateKeyFunc  duplicate_key_func,
-					 ETableWithoutFreeKeyFunc       free_gotten_key_func,
-					 ETableWithoutFreeKeyFunc       free_duplicated_key_func,
-					 void                          *closure);
-ETableModel *e_table_without_construct  (ETableWithout                 *etw,
-					 ETableModel                   *source,
-					 GHashFunc                      hash_func,
-					 GCompareFunc                   compare_func,
-					 ETableWithoutGetKeyFunc        get_key_func,
-					 ETableWithoutDuplicateKeyFunc  duplicate_key_func,
-					 ETableWithoutFreeKeyFunc       free_gotten_key_func,
-					 ETableWithoutFreeKeyFunc       free_duplicated_key_func,
-					 void                          *closure);
-void         e_table_without_hide       (ETableWithout                 *etw,
-					 void                          *key);
-void         e_table_without_hide_adopt (ETableWithout                 *etw,
-					 void                          *key);
-void         e_table_without_show       (ETableWithout                 *etw,
-					 void                          *key);
-void         e_table_without_show_all   (ETableWithout                 *etw);
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* _E_TABLE_WITHOUT_H_ */
-
diff --git a/widgets/table/e-table.c b/widgets/table/e-table.c
deleted file mode 100644
index 3a849fbf26..0000000000
--- a/widgets/table/e-table.c
+++ /dev/null
@@ -1,3349 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-table.c - A graphical view of a Table.
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Miguel de Icaza <miguel@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <gdk/gdk.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtksignal.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-
-#include "gal/util/e-i18n.h"
-#include "gal/util/e-util.h"
-#include "gal/widgets/e-canvas.h"
-#include "gal/widgets/e-canvas-background.h"
-#include "gal/widgets/e-canvas-vbox.h"
-#include "gal/widgets/e-unicode.h"
-#include "e-table.h"
-#include "e-table-header-item.h"
-#include "e-table-header-utils.h"
-#include "e-table-subset.h"
-#include "e-table-item.h"
-#include "e-table-group.h"
-#include "e-table-group-leaf.h"
-#include "e-table-click-to-add.h"
-#include "e-table-specification.h"
-#include "e-table-state.h"
-#include "e-table-column-specification.h"
-
-#include "e-table-utils.h"
-
-#include <atk/atk.h>
-#include "gal/a11y/e-table/gal-a11y-e-table.h"
-
-#define COLUMN_HEADER_HEIGHT 16
-
-#define PARENT_TYPE gtk_table_get_type ()
-
-#define d(x)
-
-#if d(!)0
-#define e_table_item_leave_edit_(x) (e_table_item_leave_edit((x)), g_print ("%s: e_table_item_leave_edit\n", __FUNCTION__))
-#else
-#define e_table_item_leave_edit_(x) (e_table_item_leave_edit((x)))
-#endif
-
-static GtkObjectClass *parent_class;
-
-enum {
-	CURSOR_CHANGE,
-	CURSOR_ACTIVATED,
-	SELECTION_CHANGE,
-	DOUBLE_CLICK,
-	RIGHT_CLICK,
-	CLICK,
-	KEY_PRESS,
-	START_DRAG,
-	STATE_CHANGE,
-	WHITE_SPACE_EVENT,
-
-	TABLE_DRAG_BEGIN,
-	TABLE_DRAG_END,
-	TABLE_DRAG_DATA_GET,
-	TABLE_DRAG_DATA_DELETE,
-
-	TABLE_DRAG_LEAVE,
-	TABLE_DRAG_MOTION,
-	TABLE_DRAG_DROP,
-	TABLE_DRAG_DATA_RECEIVED,
-
-	LAST_SIGNAL
-};
-
-enum {
-	PROP_0,
-	PROP_LENGTH_THRESHOLD,
-	PROP_MODEL,
-	PROP_UNIFORM_ROW_HEIGHT,
-	PROP_ALWAYS_SEARCH,
-	PROP_USE_CLICK_TO_ADD
-};
-
-enum {
-	ET_SCROLL_UP = 1 << 0,
-	ET_SCROLL_DOWN = 1 << 1,
-	ET_SCROLL_LEFT = 1 << 2,
-	ET_SCROLL_RIGHT = 1 << 3
-};
-
-static guint et_signals [LAST_SIGNAL] = { 0 };
-
-static void e_table_fill_table (ETable *e_table, ETableModel *model);
-static gboolean changed_idle (gpointer data);
-
-static void et_grab_focus (GtkWidget *widget);
-
-static void et_drag_begin (GtkWidget *widget,
-			   GdkDragContext *context,
-			   ETable *et);
-static void et_drag_end (GtkWidget *widget,
-			 GdkDragContext *context,
-			 ETable *et);
-static void et_drag_data_get(GtkWidget *widget,
-			     GdkDragContext *context,
-			     GtkSelectionData *selection_data,
-			     guint info,
-			     guint time,
-			     ETable *et);
-static void et_drag_data_delete(GtkWidget *widget,
-				GdkDragContext *context,
-				ETable *et);
-
-static void et_drag_leave(GtkWidget *widget,
-			  GdkDragContext *context,
-			  guint time,
-			  ETable *et);
-static gboolean et_drag_motion(GtkWidget *widget,
-			       GdkDragContext *context,
-			       gint x,
-			       gint y,
-			       guint time,
-			       ETable *et);
-static gboolean et_drag_drop(GtkWidget *widget,
-			     GdkDragContext *context,
-			     gint x,
-			     gint y,
-			     guint time,
-			     ETable *et);
-static void et_drag_data_received(GtkWidget *widget,
-				  GdkDragContext *context,
-				  gint x,
-				  gint y,
-				  GtkSelectionData *selection_data,
-				  guint info,
-				  guint time,
-				  ETable *et);
-
-static gint et_focus (GtkWidget *container, GtkDirectionType direction);
-
-static void scroll_off (ETable *et);
-static void scroll_on (ETable *et, guint scroll_direction);
-
-static void
-et_disconnect_model (ETable *et)
-{
-	if (et->model == NULL)
-		return;
-
-	if (et->table_model_change_id != 0)
-		g_signal_handler_disconnect (G_OBJECT (et->model),
-				             et->table_model_change_id);
-	if (et->table_row_change_id != 0)
-		g_signal_handler_disconnect (G_OBJECT (et->model),
-				             et->table_row_change_id);
-	if (et->table_cell_change_id != 0)
-		g_signal_handler_disconnect (G_OBJECT (et->model),
-				             et->table_cell_change_id);
-	if (et->table_rows_inserted_id != 0)
-		g_signal_handler_disconnect (G_OBJECT (et->model),
-				             et->table_rows_inserted_id);
-	if (et->table_rows_deleted_id != 0)
-		g_signal_handler_disconnect (G_OBJECT (et->model),
-				             et->table_rows_deleted_id);
-
-	et->table_model_change_id = 0;
-	et->table_row_change_id = 0;
-	et->table_cell_change_id = 0;
-	et->table_rows_inserted_id = 0;
-	et->table_rows_deleted_id = 0;
-}
-
-static void
-e_table_state_change (ETable *et)
-{
-	g_signal_emit (G_OBJECT (et), et_signals [STATE_CHANGE], 0);
-}
-
-#define CHECK_HORIZONTAL(et) if ((et)->horizontal_scrolling || (et)->horizontal_resize) e_table_header_update_horizontal (et->header);
-
-static void
-clear_current_search_col (ETable *et)
-{
-	et->search_col_set = FALSE;
-}
-
-static ETableCol *
-current_search_col (ETable *et)
-{
-	if (!et->search_col_set) {
-		et->current_search_col = 
-			e_table_util_calculate_current_search_col (et->header,
-								   et->full_header,
-								   et->sort_info,
-								   et->always_search);
-		et->search_col_set = TRUE;
-	}
-
-	return et->current_search_col;
-}
-
-static void
-et_size_request (GtkWidget *widget, GtkRequisition *request)
-{
-	ETable *et = E_TABLE (widget);
-	if (GTK_WIDGET_CLASS (parent_class)->size_request)
-		GTK_WIDGET_CLASS (parent_class)->size_request (widget, request);
-	if (et->horizontal_resize)
-		request->width = MAX (request->width, et->header_width);
-}
-
-static void
-set_header_width (ETable *et)
-{
-	if (et->horizontal_resize) {
-		et->header_width = e_table_header_min_width (et->header);
-		gtk_widget_queue_resize (GTK_WIDGET (et));
-	}
-}
-
-static void
-structure_changed (ETableHeader *header, ETable *et)
-{
-	e_table_state_change (et);
-	set_header_width (et);
-	clear_current_search_col (et);
-}
-
-static void
-expansion_changed (ETableHeader *header, ETable *et)
-{
-	e_table_state_change (et);
-	set_header_width (et);
-}
-
-static void
-dimension_changed (ETableHeader *header, int total_width, ETable *et)
-{
-	set_header_width (et);
-}
-
-static void
-disconnect_header (ETable *e_table)
-{
-	if (e_table->header == NULL)
-		return;
-
-	if (e_table->structure_change_id)
-		g_signal_handler_disconnect (G_OBJECT (e_table->header),
-					     e_table->structure_change_id);
-	if (e_table->expansion_change_id)
-		g_signal_handler_disconnect (G_OBJECT (e_table->header),
-					     e_table->expansion_change_id);
-	if (e_table->dimension_change_id)
-		g_signal_handler_disconnect (G_OBJECT (e_table->header),
-					     e_table->dimension_change_id);
-
-	g_object_unref(e_table->header);
-	e_table->header = NULL;
-}
-
-static void
-connect_header (ETable *e_table, ETableState *state)
-{
-	if (e_table->header != NULL)
-		disconnect_header (e_table);
-
-	e_table->header = e_table_state_to_header (GTK_WIDGET(e_table), e_table->full_header, state);
-
-	e_table->structure_change_id =
-		g_signal_connect (G_OBJECT (e_table->header), "structure_change",
-				  G_CALLBACK (structure_changed), e_table);
-	e_table->expansion_change_id =
-		g_signal_connect (G_OBJECT (e_table->header), "expansion_change",
-				  G_CALLBACK (expansion_changed), e_table);
-	e_table->dimension_change_id =
-		g_signal_connect (G_OBJECT (e_table->header), "dimension_change",
-				  G_CALLBACK (dimension_changed), e_table);
-}
-
-static void
-et_dispose (GObject *object)
-{
-	ETable *et = E_TABLE (object);
-
-	et_disconnect_model (et);
-
-	if (et->search) {
-		if (et->search_search_id)
-			g_signal_handler_disconnect (G_OBJECT (et->search),
-					             et->search_search_id);
-		if (et->search_accept_id)
-			g_signal_handler_disconnect (G_OBJECT (et->search),
-					             et->search_accept_id);
-		g_object_unref (et->search);
-		et->search = NULL;
-	}
-
-	if (et->group_info_change_id) {
-		g_signal_handler_disconnect (G_OBJECT (et->sort_info),
-				             et->group_info_change_id);
-		et->group_info_change_id = 0;
-	}
-	
-	if (et->sort_info_change_id) {
-		g_signal_handler_disconnect (G_OBJECT (et->sort_info),
-				             et->sort_info_change_id);
-		et->sort_info_change_id = 0;
-	}
-
-	if (et->reflow_idle_id) {
-		g_source_remove(et->reflow_idle_id);
-		et->reflow_idle_id = 0;
-	}
-
-	scroll_off (et);
-
-	disconnect_header (et);
-
-	if (et->model) {
-		g_object_unref (et->model);
-		et->model = NULL;
-	}
-
-	if (et->full_header) {
-		g_object_unref (et->full_header);
-		et->full_header = NULL;
-	}
-
-	if (et->sort_info) {
-		g_object_unref (et->sort_info);
-		et->sort_info = NULL;
-	}
-
-	if (et->sorter) {
-		g_object_unref (et->sorter);
-		et->sorter = NULL;
-	}
-
-	if (et->selection) {
-		g_object_unref (et->selection);
-		et->selection = NULL;
-	}
-
-	if (et->spec) {
-		g_object_unref (et->spec);
-		et->spec = NULL;
-	}
-
-	if (et->header_canvas != NULL) {
-		gtk_widget_destroy (GTK_WIDGET (et->header_canvas));
-		et->header_canvas = NULL;
-	}
-
-	if (et->site != NULL) {
-		e_table_drag_source_unset (et);
-		et->site = NULL;
-	}
-
-	if (et->table_canvas != NULL) {
-		gtk_widget_destroy (GTK_WIDGET (et->table_canvas));
-		et->table_canvas = NULL;
-	}
-
-	if (et->rebuild_idle_id != 0) {
-		g_source_remove (et->rebuild_idle_id);
-		et->rebuild_idle_id = 0;
-	}
-
-	g_free(et->click_to_add_message);
-	et->click_to_add_message = NULL;
-
-	g_free(et->domain);
-	et->domain = NULL;
-
-	(*G_OBJECT_CLASS (parent_class)->dispose)(object);
-}
-
-static void
-et_unrealize (GtkWidget *widget)
-{
-	scroll_off (E_TABLE (widget));
-
-	if (GTK_WIDGET_CLASS (parent_class)->unrealize)
-		GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
-}
-
-static gboolean
-check_row (ETable *et, int model_row, int col, ETableSearchFunc search, char *string)
-{
-	const void *value;
-
-	value = e_table_model_value_at (et->model, col, model_row);
-
-	return search (value, string);
-}
-
-static gboolean
-et_search_search (ETableSearch *search, char *string, ETableSearchFlags flags, ETable *et)
-{
-	int cursor;
-	int rows;
-	int i;
-	ETableCol *col = current_search_col (et);
-
-	if (col == NULL)
-		return FALSE;
-
-	rows = e_table_model_row_count (et->model);
-
-	g_object_get(et->selection,
-		     "cursor_row", &cursor,
-		     NULL);
-
-	if ((flags & E_TABLE_SEARCH_FLAGS_CHECK_CURSOR_FIRST) && cursor < rows && cursor >= 0 && check_row (et, cursor, col->col_idx, col->search, string))
-		return TRUE;
-
-	cursor = e_sorter_model_to_sorted (E_SORTER (et->sorter), cursor);
-
-	for (i = cursor + 1; i < rows; i++) {
-		int model_row = e_sorter_sorted_to_model (E_SORTER (et->sorter), i);
-		if (check_row (et, model_row, col->col_idx, col->search, string)) {
-			e_selection_model_select_as_key_press(E_SELECTION_MODEL (et->selection), model_row, col->col_idx, GDK_CONTROL_MASK);
-			return TRUE;
-		}
-	}
-
-	for (i = 0; i < cursor; i++) {
-		int model_row = e_sorter_sorted_to_model (E_SORTER (et->sorter), i);
-		if (check_row (et, model_row, col->col_idx, col->search, string)) {
-			e_selection_model_select_as_key_press(E_SELECTION_MODEL (et->selection), model_row, col->col_idx, GDK_CONTROL_MASK);
-			return TRUE;
-		}
-	}
-
-	cursor = e_sorter_sorted_to_model (E_SORTER (et->sorter), cursor);
-
-	/* Check if the cursor row is the only matching row. */
-	return (!(flags & E_TABLE_SEARCH_FLAGS_CHECK_CURSOR_FIRST) && cursor < rows && cursor >= 0 && check_row (et, cursor, col->col_idx, col->search, string));
-}
-
-static void
-et_search_accept (ETableSearch *search, ETable *et)
-{
-	int cursor;
-	ETableCol *col = current_search_col (et);
-
-	if (col == NULL)
-		return;
-
-	g_object_get(et->selection,
-		     "cursor_row", &cursor,
-		     NULL);
-	e_selection_model_select_as_key_press(E_SELECTION_MODEL (et->selection), cursor, col->col_idx, 0);
-}
-
-static void
-init_search (ETable *e_table)
-{
-	if (e_table->search != NULL)
-		return;
-
-	e_table->search           = e_table_search_new();
-
-	e_table->search_search_id = 
-		g_signal_connect (G_OBJECT (e_table->search), "search",
-				  G_CALLBACK (et_search_search), e_table);
-	e_table->search_accept_id = 
-		g_signal_connect (G_OBJECT (e_table->search), "accept",
-				  G_CALLBACK (et_search_accept), e_table);
-}
-
-static void
-et_finalize (GObject *object)
-{
-	ETable *et = E_TABLE (object);
-
-	g_free (et->click_to_add_message);
-	et->click_to_add_message = NULL;
-
-	g_free(et->domain);
-	et->domain = NULL;
-	G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-static void
-e_table_init (GtkObject *object)
-{
-	ETable *e_table = E_TABLE (object);
-	GtkTable *gtk_table = GTK_TABLE (object);
-
-	GTK_WIDGET_SET_FLAGS (e_table, GTK_CAN_FOCUS);
-
-	gtk_table->homogeneous          = FALSE;
-
-	e_table->sort_info              = NULL;
-	e_table->group_info_change_id   = 0;
-	e_table->sort_info_change_id    = 0;
-	e_table->structure_change_id    = 0;
-	e_table->expansion_change_id    = 0;
-	e_table->dimension_change_id    = 0;
-	e_table->reflow_idle_id         = 0;
-	e_table->scroll_idle_id         = 0;
-
-	e_table->alternating_row_colors = 1;
-	e_table->horizontal_draw_grid   = 1;
-	e_table->vertical_draw_grid     = 1;
-	e_table->draw_focus             = 1;
-	e_table->cursor_mode            = E_CURSOR_SIMPLE;
-	e_table->length_threshold       = 200;
-	e_table->uniform_row_height     = FALSE;
-
-	e_table->need_rebuild           = 0;
-	e_table->rebuild_idle_id        = 0;
-
-	e_table->horizontal_scrolling   = FALSE;
-	e_table->horizontal_resize      = FALSE;
-
-	e_table->click_to_add_message   = NULL;
-	e_table->domain                 = NULL;
-
-	e_table->drop_row               = -1;
-	e_table->drop_col               = -1;
-	e_table->site                   = NULL;
-
-	e_table->do_drag                = 0;
-
-	e_table->sorter                 = NULL;
-	e_table->selection              = e_table_selection_model_new();
-	e_table->cursor_loc             = E_TABLE_CURSOR_LOC_NONE;
-	e_table->spec                   = NULL;
-
-	e_table->always_search          = g_getenv ("GAL_ALWAYS_SEARCH") ? TRUE : FALSE;
-
-	e_table->search                 = NULL;
-	e_table->search_search_id       = 0;
-	e_table->search_accept_id       = 0;
-
-	e_table->current_search_col     = NULL;
-
-	e_table->header_width           = 0;
-}
-
-/* Grab_focus handler for the ETable */
-static void
-et_grab_focus (GtkWidget *widget)
-{
-	ETable *e_table;
-
-	e_table = E_TABLE (widget);
-
-	gtk_widget_grab_focus (GTK_WIDGET (e_table->table_canvas));
-}
-
-/* Focus handler for the ETable */
-static gint
-et_focus (GtkWidget *container, GtkDirectionType direction)
-{
-	ETable *e_table;
-
-	e_table = E_TABLE (container);
-
-	if (GTK_CONTAINER (container)->focus_child) {
-		gtk_container_set_focus_child (GTK_CONTAINER (container), NULL);
-		return FALSE;
-	}
-
-	return gtk_widget_child_focus (GTK_WIDGET (e_table->table_canvas), direction);
-}
-
-static void
-set_header_canvas_width (ETable *e_table)
-{
-	double oldwidth, oldheight, width;
-
-	if (!(e_table->header_item && e_table->header_canvas && e_table->table_canvas))
-		return;
-
-	gnome_canvas_get_scroll_region (GNOME_CANVAS (e_table->table_canvas),
-					NULL, NULL, &width, NULL);
-	gnome_canvas_get_scroll_region (GNOME_CANVAS (e_table->header_canvas),
-					NULL, NULL, &oldwidth, &oldheight);
-
-	if (oldwidth != width ||
-	    oldheight != E_TABLE_HEADER_ITEM (e_table->header_item)->height - 1)
-		gnome_canvas_set_scroll_region (
-						GNOME_CANVAS (e_table->header_canvas),
-						0, 0, width, /*  COLUMN_HEADER_HEIGHT - 1 */
-						E_TABLE_HEADER_ITEM (e_table->header_item)->height - 1);
-
-}
-
-static void
-header_canvas_size_allocate (GtkWidget *widget, GtkAllocation *alloc, ETable *e_table)
-{
-	set_header_canvas_width (e_table);
-
-	/* When the header item is created ->height == 0,
-	   as the font is only created when everything is realized.
-	   So we set the usize here as well, so that the size of the
-	   header is correct */
-	if (GTK_WIDGET (e_table->header_canvas)->allocation.height !=
-	    E_TABLE_HEADER_ITEM (e_table->header_item)->height)
-		gtk_widget_set_usize (GTK_WIDGET (e_table->header_canvas), -2,
-				      E_TABLE_HEADER_ITEM (e_table->header_item)->height);
-}
-
-static void
-group_info_changed (ETableSortInfo *info, ETable *et)
-{
-	gboolean will_be_grouped = e_table_sort_info_grouping_get_count(info) > 0;
-	clear_current_search_col (et);
-	if (et->is_grouped || will_be_grouped) {
-		et->need_rebuild = TRUE;
-		if (!et->rebuild_idle_id) {
-			gtk_object_destroy (GTK_OBJECT (et->group));
-			et->group = NULL;
-			et->rebuild_idle_id = g_idle_add_full (20, changed_idle, et, NULL);
-		}
-	}
-	e_table_state_change (et);
-}
-
-static void
-sort_info_changed (ETableSortInfo *info, ETable *et)
-{
-	clear_current_search_col (et);
-	e_table_state_change (et);
-}
-
-static void
-e_table_setup_header (ETable *e_table)
-{
-	char *pointer;
-	e_table->header_canvas = GNOME_CANVAS (e_canvas_new ());
-
-	gtk_widget_show (GTK_WIDGET (e_table->header_canvas));
-
-	pointer = g_strdup_printf("%p", e_table);
-
-	e_table->header_item = gnome_canvas_item_new (
-		gnome_canvas_root (e_table->header_canvas),
-		e_table_header_item_get_type (),
-		"ETableHeader", e_table->header,
-		"full_header", e_table->full_header,
-		"sort_info", e_table->sort_info,
-		"dnd_code", pointer,
-		"table", e_table,
-		NULL);
-
-	g_free(pointer);
-
-	g_signal_connect (
-		G_OBJECT (e_table->header_canvas), "size_allocate",
-		G_CALLBACK (header_canvas_size_allocate), e_table);
-
-	gtk_widget_set_usize (GTK_WIDGET (e_table->header_canvas), -2,
-			      E_TABLE_HEADER_ITEM (e_table->header_item)->height);
-}
-
-static gboolean
-table_canvas_reflow_idle (ETable *e_table)
-{
-	gdouble height, width;
-	gdouble item_height;
-	gdouble oldheight, oldwidth;
-	GtkAllocation *alloc = &(GTK_WIDGET (e_table->table_canvas)->allocation);
-
-	g_object_get (e_table->canvas_vbox,
-		      "height", &height,
-		      "width", &width,
-		      NULL);
-	item_height = height;
-	height = MAX ((int)height, alloc->height);
-	width = MAX((int)width, alloc->width);
-	/* I have no idea why this needs to be -1, but it works. */
-	gnome_canvas_get_scroll_region (GNOME_CANVAS (e_table->table_canvas),
-					NULL, NULL, &oldwidth, &oldheight);
-
-	if (oldwidth != width - 1 ||
-	    oldheight != height - 1) {
-		gnome_canvas_set_scroll_region (GNOME_CANVAS (e_table->table_canvas),
-						0, 0, width - 1, height - 1);
-		set_header_canvas_width (e_table);
-	}
-	e_table->reflow_idle_id = 0;
-	return FALSE;
-}
-
-static void
-table_canvas_size_allocate (GtkWidget *widget, GtkAllocation *alloc,
-			    ETable *e_table)
-{
-	gdouble width;
-	gdouble height;
-	gdouble item_height;
-	GValue *val = g_new0 (GValue, 1);
-	g_value_init (val, G_TYPE_DOUBLE);
-
-	width = alloc->width;
-	g_value_set_double (val, width);
-	g_object_get (e_table->canvas_vbox,
-		      "height", &height,
-		      NULL);
-	item_height = height;
-	height = MAX ((int)height, alloc->height);
-
-	g_object_set (e_table->canvas_vbox,
-		      "width", width,
-		      NULL);
-	g_object_set_property (G_OBJECT (e_table->header), "width", val);
-	g_free (val);
-	if (e_table->reflow_idle_id)
-		g_source_remove(e_table->reflow_idle_id);
-	table_canvas_reflow_idle(e_table);
-}
-
-static void
-table_canvas_reflow (GnomeCanvas *canvas, ETable *e_table)
-{
-	if (!e_table->reflow_idle_id)
-		e_table->reflow_idle_id = g_idle_add_full (400, (GSourceFunc) table_canvas_reflow_idle, e_table, NULL);
-}
-
-static void
-click_to_add_cursor_change (ETableClickToAdd *etcta, int row, int col, ETable *et)
-{
-	if (et->cursor_loc == E_TABLE_CURSOR_LOC_TABLE) {
-		e_selection_model_clear(E_SELECTION_MODEL (et->selection));
-	}
-	et->cursor_loc = E_TABLE_CURSOR_LOC_ETCTA;
-}
-
-static void
-group_cursor_change (ETableGroup *etg, int row, ETable *et)
-{
-	ETableCursorLoc old_cursor_loc;
-
-	old_cursor_loc = et->cursor_loc;
-
-	et->cursor_loc = E_TABLE_CURSOR_LOC_TABLE;
-	g_signal_emit (G_OBJECT (et), et_signals [CURSOR_CHANGE], 0, row);
-
-	if (old_cursor_loc == E_TABLE_CURSOR_LOC_ETCTA && et->click_to_add)
-		e_table_click_to_add_commit(E_TABLE_CLICK_TO_ADD(et->click_to_add));
-}
-
-static void
-group_cursor_activated (ETableGroup *etg, int row, ETable *et)
-{
-	g_signal_emit (G_OBJECT (et), et_signals [CURSOR_ACTIVATED], 0, row);
-}
-
-static void
-group_double_click (ETableGroup *etg, int row, int col, GdkEvent *event, ETable *et)
-{
-	g_signal_emit (G_OBJECT (et), et_signals [DOUBLE_CLICK], 0, row, col, event);
-}
-
-static gint
-group_right_click (ETableGroup *etg, int row, int col, GdkEvent *event, ETable *et)
-{
-	int return_val = 0;
-	g_signal_emit (G_OBJECT (et), et_signals [RIGHT_CLICK], 0, row, col, event, &return_val);
-	return return_val;
-}
-
-static gint
-group_click (ETableGroup *etg, int row, int col, GdkEvent *event, ETable *et)
-{
-	int return_val = 0;
-	g_signal_emit (G_OBJECT (et), et_signals [CLICK], 0, row, col, event, &return_val);
-	return return_val;
-}
-
-static gint
-group_key_press (ETableGroup *etg, int row, int col, GdkEvent *event, ETable *et)
-{
-	int return_val = 0;
-	GdkEventKey *key = (GdkEventKey *) event;
-	int y, row_local, col_local;
-	GtkAdjustment *vadj;
-
-	switch (key->keyval) {
-	case GDK_Page_Down:
-	case GDK_KP_Page_Down:
-		vadj = gtk_layout_get_vadjustment (GTK_LAYOUT (et->table_canvas));
-		y = CLAMP(vadj->value + (2 * vadj->page_size - 50), 0, vadj->upper);
-		y -= vadj->value;
-		e_table_get_cell_at (et, 30, y, &row_local, &col_local);
-
-		if (row_local == -1)
-			row_local = e_table_model_row_count (et->model) - 1;
-
-		row_local = e_table_view_to_model_row (et, row_local);
-		col_local = e_selection_model_cursor_col (E_SELECTION_MODEL (et->selection));
-		e_selection_model_select_as_key_press (E_SELECTION_MODEL (et->selection), row_local, col_local, key->state);
-		return_val = 1;
-		break;
-	case GDK_Page_Up:
-	case GDK_KP_Page_Up:
-		vadj = gtk_layout_get_vadjustment (GTK_LAYOUT (et->table_canvas));
-		y = CLAMP(vadj->value - (vadj->page_size - 50), 0, vadj->upper);
-		y -= vadj->value;
-		e_table_get_cell_at (et, 30, y, &row_local, &col_local);
-
-		if (row_local == -1)
-			row_local = 0;
-
-		row_local = e_table_view_to_model_row (et, row_local);
-		col_local = e_selection_model_cursor_col (E_SELECTION_MODEL (et->selection));
-		e_selection_model_select_as_key_press (E_SELECTION_MODEL (et->selection), row_local, col_local, key->state);
-		return_val = 1;
-		break;
-	case GDK_BackSpace:
-		init_search (et);
-		if (e_table_search_backspace (et->search))
-			return TRUE;
-		/* Fall through */
-	default:
-		init_search (et);
-		if ((key->state & ~(GDK_SHIFT_MASK | GDK_LOCK_MASK)) == 0
-		    && ((key->keyval >= GDK_a && key->keyval <= GDK_z) ||
-			(key->keyval >= GDK_A && key->keyval <= GDK_Z) ||
-			(key->keyval >= GDK_0 && key->keyval <= GDK_9)))
-			e_table_search_input_character (et->search, key->keyval);
-		g_signal_emit (G_OBJECT (et), et_signals [KEY_PRESS], 0,
-			       row, col, event, &return_val);
-		break;
-	}
-	return return_val;
-}
-
-static gint
-group_start_drag (ETableGroup *etg, int row, int col, GdkEvent *event, ETable *et)
-{
-	int return_val = 0;
-	g_signal_emit (G_OBJECT (et), et_signals [START_DRAG], 0,
-		       row, col, event, &return_val);
-	return return_val;
-}
-
-static void
-et_table_model_changed (ETableModel *model, ETable *et)
-{
-	et->need_rebuild = TRUE;
-	if (!et->rebuild_idle_id) {
-		gtk_object_destroy (GTK_OBJECT (et->group));
-		et->group = NULL;
-		et->rebuild_idle_id = g_idle_add_full (20, changed_idle, et, NULL);
-	}
-}
-
-static void
-et_table_row_changed (ETableModel *table_model, int row, ETable *et)
-{
-	if (!et->need_rebuild) {
-		if (e_table_group_remove (et->group, row))
-			e_table_group_add (et->group, row);
-		CHECK_HORIZONTAL(et);
-	}
-}
-
-static void
-et_table_cell_changed (ETableModel *table_model, int view_col, int row, ETable *et)
-{
-	et_table_row_changed (table_model, row, et);
-}
-
-static void
-et_table_rows_inserted (ETableModel *table_model, int row, int count, ETable *et)
-{
-	/* This number has already been decremented. */
-	int row_count = e_table_model_row_count(table_model);
-	if (!et->need_rebuild) {
-		int i;
-		if (row != row_count - count)
-			e_table_group_increment(et->group, row, count);
-		for (i = 0; i < count; i++)
-			e_table_group_add (et->group, row + i);
-		CHECK_HORIZONTAL(et);
-	}
-}
-
-static void
-et_table_rows_deleted (ETableModel *table_model, int row, int count, ETable *et)
-{
-	int row_count = e_table_model_row_count(table_model);
-	if (!et->need_rebuild) {
-		int i;
-		for (i = 0; i < count; i++)
-			e_table_group_remove (et->group, row + i);
-		if (row != row_count)
-			e_table_group_decrement(et->group, row, count);
-		CHECK_HORIZONTAL(et);
-	}
-}
-
-static void
-et_build_groups (ETable *et)
-{
-	gboolean was_grouped = et->is_grouped;
-
-	et->is_grouped = e_table_sort_info_grouping_get_count(et->sort_info) > 0;
-
-	et->group = e_table_group_new (GNOME_CANVAS_GROUP (et->canvas_vbox),
-				       et->full_header,
-				       et->header,
-				       et->model,
-				       et->sort_info,
-				       0);
-	
-	if (et->use_click_to_add_end)
-		e_canvas_vbox_add_item_start(E_CANVAS_VBOX(et->canvas_vbox), GNOME_CANVAS_ITEM(et->group));
-	else
-		e_canvas_vbox_add_item(E_CANVAS_VBOX(et->canvas_vbox), GNOME_CANVAS_ITEM(et->group));
-
-	gnome_canvas_item_set(GNOME_CANVAS_ITEM(et->group),
-			      "alternating_row_colors", et->alternating_row_colors,
-			      "horizontal_draw_grid", et->horizontal_draw_grid,
-			      "vertical_draw_grid", et->vertical_draw_grid,
-			      "drawfocus", et->draw_focus,
-			      "cursor_mode", et->cursor_mode,
-			      "length_threshold", et->length_threshold,
-			      "uniform_row_height", et->uniform_row_height,
-			      "selection_model", et->selection,
-			      NULL);
-
-	g_signal_connect (G_OBJECT (et->group), "cursor_change",
-			  G_CALLBACK (group_cursor_change), et);
-	g_signal_connect (G_OBJECT (et->group), "cursor_activated",
-			  G_CALLBACK (group_cursor_activated), et);
-	g_signal_connect (G_OBJECT (et->group), "double_click",
-			  G_CALLBACK (group_double_click), et);
-	g_signal_connect (G_OBJECT (et->group), "right_click",
-			  G_CALLBACK (group_right_click), et);
-	g_signal_connect (G_OBJECT (et->group), "click",
-			  G_CALLBACK (group_click), et);
-	g_signal_connect (G_OBJECT (et->group), "key_press",
-			  G_CALLBACK (group_key_press), et);
-	g_signal_connect (G_OBJECT (et->group), "start_drag",
-			  G_CALLBACK (group_start_drag), et);
-
-
-	if (!(et->is_grouped) && was_grouped)
-		et_disconnect_model (et);
-
-	if (et->is_grouped && (!was_grouped)) {
-		et->table_model_change_id = g_signal_connect (G_OBJECT (et->model), "model_changed",
-							      G_CALLBACK (et_table_model_changed), et);
-
-		et->table_row_change_id = g_signal_connect (G_OBJECT (et->model), "model_row_changed",
-							    G_CALLBACK (et_table_row_changed), et);
-
-		et->table_cell_change_id = g_signal_connect (G_OBJECT (et->model), "model_cell_changed",
-							     G_CALLBACK (et_table_cell_changed), et);
-
-		et->table_rows_inserted_id = g_signal_connect (G_OBJECT (et->model), "model_rows_inserted",
-							       G_CALLBACK (et_table_rows_inserted), et);
-
-		et->table_rows_deleted_id = g_signal_connect (G_OBJECT (et->model), "model_rows_deleted",
-							      G_CALLBACK (et_table_rows_deleted), et);
-
-	}
-
-	if (et->is_grouped)
-		e_table_fill_table (et, et->model);
-}
-
-static gboolean
-changed_idle (gpointer data)
-{
-	ETable *et = E_TABLE (data);
-
-	if (et->need_rebuild) {
-		if (et->group)
-			gtk_object_destroy (GTK_OBJECT (et->group));
-		et_build_groups(et);
-		g_object_set (et->canvas_vbox,
-			      "width", (double) GTK_WIDGET (et->table_canvas)->allocation.width,
-			      NULL);
-
-		if (GTK_WIDGET_REALIZED(et->table_canvas))
-			table_canvas_size_allocate (GTK_WIDGET(et->table_canvas), &GTK_WIDGET(et->table_canvas)->allocation, et);
-	}
-
-	et->need_rebuild = 0;
-	et->rebuild_idle_id = 0;
-
-	CHECK_HORIZONTAL(et);
-
-	return FALSE;
-}
-
-static void
-et_canvas_realize (GtkWidget *canvas, ETable *e_table)
-{
-	gnome_canvas_item_set(
-		e_table->white_item,
-		"fill_color_gdk", &GTK_WIDGET(e_table->table_canvas)->style->base[GTK_STATE_NORMAL],
-		NULL);
-
-	CHECK_HORIZONTAL(e_table);
-	set_header_width (e_table);
-}
-
-static gint
-white_item_event (GnomeCanvasItem *white_item, GdkEvent *event, ETable *e_table)
-{
-	int return_val = 0;
-	g_signal_emit (GTK_OBJECT (e_table), et_signals [WHITE_SPACE_EVENT], 0,
-		       event, &return_val);
-	return return_val;
-}
-
-static void
-et_eti_leave_edit (ETable *et)
-{
-	GnomeCanvas *canvas = et->table_canvas;
-
-	if (GTK_WIDGET_HAS_FOCUS(canvas)) {
-		GnomeCanvasItem *item = GNOME_CANVAS(canvas)->focused_item;
-
-		if (E_IS_TABLE_ITEM(item)) {
-			e_table_item_leave_edit_(E_TABLE_ITEM(item));
-		}
-	}
-}
-
-static gint
-et_canvas_root_event (GnomeCanvasItem *root, GdkEvent *event, ETable *e_table)
-{
-	switch (event->type) {
-	case GDK_BUTTON_PRESS:
-	case GDK_2BUTTON_PRESS:
-	case GDK_BUTTON_RELEASE:
-		if (event->button.button != 4 && event->button.button != 5) {
-			et_eti_leave_edit (e_table);
-			return TRUE;
-		}
-		break;
-	default:
-		break;
-	}
-
-	return FALSE;
-}
-
-/* Finds the first descendant of the group that is an ETableItem and focuses it */
-static void
-focus_first_etable_item (ETableGroup *group)
-{
-	GnomeCanvasGroup *cgroup;
-	GList *l;
-
-	cgroup = GNOME_CANVAS_GROUP (group);
-
-	for (l = cgroup->item_list; l; l = l->next) {
-		GnomeCanvasItem *i;
-
-		i = GNOME_CANVAS_ITEM (l->data);
-
-		if (E_IS_TABLE_GROUP (i))
-			focus_first_etable_item (E_TABLE_GROUP (i));
-		else if (E_IS_TABLE_ITEM (i)) {
-			e_table_item_set_cursor (E_TABLE_ITEM (i), 0, 0);
-			gnome_canvas_item_grab_focus (i);
-		}
-	}
-}
-
-/* Handler for focus events in the table_canvas; we have to repaint ourselves
- * always, and also give the focus to some ETableItem if we get focused.
- */
-static gint
-table_canvas_focus_event_cb (GtkWidget *widget, GdkEventFocus *event, gpointer data)
-{
-	GnomeCanvas *canvas;
-	ECanvas *ecanvas; 
-	ETable *etable;
-
-	gtk_widget_queue_draw (widget);
-	canvas = GNOME_CANVAS (widget);
-	ecanvas = E_CANVAS (widget);
-
-	if (!event->in) {
-		gtk_im_context_focus_out(ecanvas->im_context);
-		return FALSE;
-	} else {
-		gtk_im_context_focus_in(ecanvas->im_context);
-	}
-
-	etable = E_TABLE (data);
-
-	if (e_table_model_row_count(etable->model) < 1 
-	    && (etable->click_to_add) 
-	    && !(E_TABLE_CLICK_TO_ADD(etable->click_to_add)->row)) {
-		gnome_canvas_item_grab_focus (etable->canvas_vbox);
-		gnome_canvas_item_grab_focus (etable->click_to_add);
-	} else if (!canvas->focused_item && etable->group) {
-        	focus_first_etable_item (etable->group);
-	} else if (canvas->focused_item) {
-		ESelectionModel *selection = (ESelectionModel *)etable->selection;
-
-		/* check whether click_to_add already got the focus */
-		if (etable->click_to_add) {
-			GnomeCanvasItem *row = E_TABLE_CLICK_TO_ADD(etable->click_to_add)->row;
-			if (canvas->focused_item == row)
-				return TRUE;
-		}
-
-		if (e_selection_model_cursor_row (selection) == -1)
-			focus_first_etable_item (etable->group);
-	}
-
-	return TRUE;
-}
-
-static gboolean
-canvas_vbox_event (ECanvasVbox *vbox, GdkEventKey *key, ETable *etable)
-{
-	GnomeCanvas *canvas;
-
-	canvas = GNOME_CANVAS (etable->table_canvas);
-	switch (key->keyval) {
-		case GDK_Tab:
-		case GDK_KP_Tab:
-		case GDK_ISO_Left_Tab:
-			if ((key->state & GDK_CONTROL_MASK) && etable->click_to_add) {
-				gnome_canvas_item_grab_focus (etable->click_to_add);
-				break;
-			}
-		default:
-			return FALSE;
-	}
-
-	return TRUE;
-}
-
-static gboolean
-click_to_add_event (ETableClickToAdd *etcta, GdkEventKey *key, ETable *etable)
-{
-	GnomeCanvas *canvas;
-
-	canvas = GNOME_CANVAS (etable->table_canvas);
-	switch (key->keyval) {
-		case GDK_Tab:
-		case GDK_KP_Tab:
-		case GDK_ISO_Left_Tab:
-			if (key->state & GDK_CONTROL_MASK) {
-				if (etable->group) {
-					if (e_table_model_row_count(etable->model) > 0)
-						focus_first_etable_item (etable->group);
-					else
-						gtk_widget_child_focus (
-							gtk_widget_get_toplevel(GTK_WIDGET(etable->table_canvas)), GTK_DIR_TAB_FORWARD);
-					break;
-				}
-			}
-		default:
-			return FALSE;
-	}
-
-	return FALSE;
-}
-
-static void
-e_table_setup_table (ETable *e_table, ETableHeader *full_header, ETableHeader *header,
-		     ETableModel *model)
-{
-	e_table->table_canvas = GNOME_CANVAS (e_canvas_new ());
-	g_signal_connect (
-		G_OBJECT (e_table->table_canvas), "size_allocate",
-		G_CALLBACK (table_canvas_size_allocate), e_table);
-	g_signal_connect (
-		G_OBJECT (e_table->table_canvas), "focus_in_event",
-		G_CALLBACK (table_canvas_focus_event_cb), e_table);
-	g_signal_connect (
-		G_OBJECT (e_table->table_canvas), "focus_out_event",
-		G_CALLBACK (table_canvas_focus_event_cb), e_table);
-
-	g_signal_connect (
-		G_OBJECT (e_table), "drag_begin",
-		G_CALLBACK (et_drag_begin), e_table);
-	g_signal_connect (
-		G_OBJECT (e_table), "drag_end",
-		G_CALLBACK (et_drag_end), e_table);
-	g_signal_connect (
-		G_OBJECT (e_table), "drag_data_get",
-		G_CALLBACK (et_drag_data_get), e_table);
-	g_signal_connect (
-		G_OBJECT (e_table), "drag_data_delete",
-		G_CALLBACK (et_drag_data_delete), e_table);
-	g_signal_connect (
-		G_OBJECT (e_table), "drag_motion",
-		G_CALLBACK (et_drag_motion), e_table);
-	g_signal_connect (
-		G_OBJECT (e_table), "drag_leave",
-		G_CALLBACK (et_drag_leave), e_table);
-	g_signal_connect (
-		G_OBJECT (e_table), "drag_drop",
-		G_CALLBACK (et_drag_drop), e_table);
-	g_signal_connect (
-		G_OBJECT (e_table), "drag_data_received",
-		G_CALLBACK (et_drag_data_received), e_table);
-
-	g_signal_connect (G_OBJECT(e_table->table_canvas), "reflow",
-			  G_CALLBACK (table_canvas_reflow), e_table);
-
-	gtk_widget_show (GTK_WIDGET (e_table->table_canvas));
-
-
-	e_table->white_item = gnome_canvas_item_new(
-		gnome_canvas_root(e_table->table_canvas),
-		e_canvas_background_get_type(),
-		"fill_color_gdk", &GTK_WIDGET(e_table->table_canvas)->style->base[GTK_STATE_NORMAL],
-		NULL);
-
-	g_signal_connect (G_OBJECT (e_table->white_item), "event",
-			  G_CALLBACK (white_item_event), e_table);
-
-	g_signal_connect (G_OBJECT(e_table->table_canvas), "realize",
-			  G_CALLBACK(et_canvas_realize), e_table);
-
-	g_signal_connect (G_OBJECT(gnome_canvas_root (e_table->table_canvas)), "event",
-			  G_CALLBACK(et_canvas_root_event), e_table);
-
-	e_table->canvas_vbox = gnome_canvas_item_new(
-		gnome_canvas_root(e_table->table_canvas),
-		e_canvas_vbox_get_type(),
-		"spacing", 10.0,
-		NULL);
-
-	g_signal_connect (
-		G_OBJECT (e_table->canvas_vbox), "event",
-		G_CALLBACK (canvas_vbox_event), e_table);
-
-	et_build_groups(e_table);
-
-	if (e_table->use_click_to_add) {
-		e_table->click_to_add = gnome_canvas_item_new (
-			GNOME_CANVAS_GROUP(e_table->canvas_vbox),
-			e_table_click_to_add_get_type (),
-			"header", e_table->header,
-			"model", e_table->model,
-			"message", e_table->click_to_add_message,
-			NULL);
-
-		if (e_table->use_click_to_add_end)
-			e_canvas_vbox_add_item (
-				E_CANVAS_VBOX(e_table->canvas_vbox),
-				e_table->click_to_add);
-		else
-			e_canvas_vbox_add_item_start (
-				E_CANVAS_VBOX(e_table->canvas_vbox),
-				e_table->click_to_add);
-
-		g_signal_connect (
-			G_OBJECT (e_table->click_to_add), "event",
-			G_CALLBACK (click_to_add_event), e_table);
-                g_signal_connect (
-                        G_OBJECT (e_table->click_to_add), "cursor_change",
-                        G_CALLBACK (click_to_add_cursor_change), e_table);
-	}
-}
-
-static void
-e_table_fill_table (ETable *e_table, ETableModel *model)
-{
-	e_table_group_add_all (e_table->group);
-}
-
-/**
- * e_table_set_state_object:
- * @e_table: The #ETable object to modify
- * @state: The #ETableState to use
- *
- * This routine sets the state of the #ETable from the given
- * #ETableState.
- *
- **/
-void
-e_table_set_state_object(ETable *e_table, ETableState *state)
-{
-	GValue *val = g_new0 (GValue, 1);
-	g_value_init (val, G_TYPE_DOUBLE);
-
-	connect_header (e_table, state);
-
-	g_value_set_double (val, (double) (GTK_WIDGET(e_table->table_canvas)->allocation.width)); 
-	g_object_set_property (G_OBJECT (e_table->header), "width", val);
-	g_free (val);
-
-	if (e_table->sort_info) {
-		if (e_table->group_info_change_id)
-			g_signal_handler_disconnect (G_OBJECT (e_table->sort_info),
-						     e_table->group_info_change_id);
-		if (e_table->sort_info_change_id)
-			g_signal_handler_disconnect (G_OBJECT (e_table->sort_info),
-						     e_table->sort_info_change_id);
-		g_object_unref(e_table->sort_info);
-	}
-	if (state->sort_info) {
-		e_table->sort_info = e_table_sort_info_duplicate(state->sort_info);
-		e_table_sort_info_set_can_group (e_table->sort_info, e_table->allow_grouping);
-		e_table->group_info_change_id =
-			g_signal_connect (G_OBJECT (e_table->sort_info), "group_info_changed",
-					  G_CALLBACK (group_info_changed), e_table);
-		e_table->sort_info_change_id =
-			g_signal_connect (G_OBJECT (e_table->sort_info), "sort_info_changed",
-					  G_CALLBACK (sort_info_changed), e_table);
-	}
-	else
-		e_table->sort_info = NULL;
-
-	if (e_table->sorter)
-		g_object_set(e_table->sorter,
-			     "sort_info", e_table->sort_info,
-			     NULL);
-	if (e_table->header_item)
-		g_object_set(e_table->header_item,
-			     "ETableHeader", e_table->header,
-			     "sort_info", e_table->sort_info,
-			     NULL);
-	if (e_table->click_to_add)
-		g_object_set(e_table->click_to_add,
-			     "header", e_table->header,
-			     NULL);
-	
-	e_table->need_rebuild = TRUE;
-	if (!e_table->rebuild_idle_id)
-		e_table->rebuild_idle_id = g_idle_add_full (20, changed_idle, e_table, NULL);
-}
-
-/**
- * e_table_set_state:
- * @e_table: The #ETable object to modify
- * @state_str: a string representing an #ETableState
- *
- * This routine sets the state of the #ETable from a string.
- *
- **/
-void
-e_table_set_state (ETable      *e_table,
-		   const gchar *state_str)
-{
-	ETableState *state;
-
-	g_return_if_fail(e_table != NULL);
-	g_return_if_fail(E_IS_TABLE(e_table));
-	g_return_if_fail(state_str != NULL);
-
-	state = e_table_state_new();
-	e_table_state_load_from_string(state, state_str);
-
-	if (state->col_count > 0)
-		e_table_set_state_object(e_table, state);
-
-	g_object_unref(state);
-}
-
-/**
- * e_table_load_state:
- * @e_table: The #ETable object to modify
- * @filename: name of the file to use
- *
- * This routine sets the state of the #ETable from a file.
- *
- **/
-void
-e_table_load_state (ETable      *e_table,
-		    const gchar *filename)
-{
-	ETableState *state;
-
-	g_return_if_fail(e_table != NULL);
-	g_return_if_fail(E_IS_TABLE(e_table));
-	g_return_if_fail(filename != NULL);
-
-	state = e_table_state_new();
-	e_table_state_load_from_file(state, filename);
-
-	if (state->col_count > 0)
-		e_table_set_state_object(e_table, state);
-
-	g_object_unref(state);
-}
-
-/**
- * e_table_get_state_object:
- * @e_table: #ETable object to act on
- *
- * Builds an #ETableState corresponding to the current state of the
- * #ETable.
- *
- * Return value:
- * The %ETableState object generated.
- **/
-ETableState *
-e_table_get_state_object (ETable *e_table)
-{
-	ETableState *state;
-	int full_col_count;
-	int i, j;
-
-	state = e_table_state_new();
-	if (state->sort_info)
-		g_object_unref (state->sort_info);
-	state->sort_info = e_table->sort_info;
-	g_object_ref(state->sort_info);
-
-
-	state->col_count = e_table_header_count (e_table->header);
-	full_col_count = e_table_header_count (e_table->full_header);
-	state->columns = g_new(int, state->col_count);
-	state->expansions = g_new(double, state->col_count);
-	for (i = 0; i < state->col_count; i++) {
-		ETableCol *col = e_table_header_get_column(e_table->header, i);
-		state->columns[i] = -1;
-		for (j = 0; j < full_col_count; j++) {
-			if (col->col_idx == e_table_header_index(e_table->full_header, j)) {
-				state->columns[i] = j;
-				break;
-			}
-		}
-		state->expansions[i] = col->expansion;
-	}
-
-	return state;
-}
-
-/**
- * e_table_get_state:
- * @e_table: The #ETable to act on.
- * 
- * Builds a state object based on the current state and returns the
- * string corresponding to that state.
- * 
- * Return value: 
- * A string describing the current state of the #ETable.
- **/
-gchar          *e_table_get_state                 (ETable               *e_table)
-{
-	ETableState *state;
-	gchar *string;
-
-	state = e_table_get_state_object(e_table);
-	string = e_table_state_save_to_string(state);
-	g_object_unref(state);
-	return string;
-}
-
-/**
- * e_table_save_state:
- * @e_table: The #ETable to act on
- * @filename: name of the file to save to
- *
- * Saves the state of the @e_table object into the file pointed by
- * @filename.
- *
- **/
-void
-e_table_save_state (ETable      *e_table,
-		    const gchar *filename)
-{
-	ETableState *state;
-
-	state = e_table_get_state_object(e_table);
-	e_table_state_save_to_file(state, filename);
-	g_object_unref(state);
-}
-
-static void
-et_selection_model_selection_changed (ETableGroup *etg, ETable *et)
-{
-	g_signal_emit (G_OBJECT (et), et_signals [SELECTION_CHANGE], 0);
-}
-
-static void
-et_selection_model_selection_row_changed (ETableGroup *etg, int row, ETable *et)
-{
-	g_signal_emit (G_OBJECT (et), et_signals [SELECTION_CHANGE], 0);
-}
-
-static ETable *
-et_real_construct (ETable *e_table, ETableModel *etm, ETableExtras *ete,
-		   ETableSpecification *specification, ETableState *state)
-{
-	int row = 0;
-	int col_count, i;
-	GValue *val = g_new0 (GValue, 1);
-	g_value_init (val, G_TYPE_OBJECT);
-
-	if (ete)
-		g_object_ref(ete);
-	else {
-		ete = e_table_extras_new();
-	}
-
-	e_table->domain = g_strdup (specification->domain);
-
-	e_table->use_click_to_add = specification->click_to_add;
-	e_table->use_click_to_add_end = specification->click_to_add_end;
-	e_table->click_to_add_message = g_strdup (dgettext (e_table->domain, specification->click_to_add_message));
-	e_table->alternating_row_colors = specification->alternating_row_colors;
-	e_table->horizontal_draw_grid = specification->horizontal_draw_grid;
-	e_table->vertical_draw_grid = specification->vertical_draw_grid;
-	e_table->draw_focus = specification->draw_focus;
-	e_table->cursor_mode = specification->cursor_mode;
-	e_table->full_header = e_table_spec_to_full_header(specification, ete);
-	g_object_ref (e_table->full_header);
-
-	col_count = e_table_header_count (e_table->full_header);
-	for (i = 0; i < col_count; i++) {
-		ETableCol *col = e_table_header_get_column(e_table->full_header, i);
-		if (col && col->search) {
-			e_table->current_search_col = col;
-			e_table->search_col_set = TRUE;
-			break;
-		}
-	}
-
-	e_table->model = etm;
-	g_object_ref (etm);
-
-	gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
-	connect_header (e_table, state);
-	e_table->horizontal_scrolling = specification->horizontal_scrolling;
-	e_table->horizontal_resize = specification->horizontal_resize;
-	e_table->allow_grouping = specification->allow_grouping;
-
-	e_table->sort_info = state->sort_info;
-	g_object_ref (state->sort_info);
-	e_table_sort_info_set_can_group (e_table->sort_info, e_table->allow_grouping);
-
-	e_table->group_info_change_id =
-		g_signal_connect (G_OBJECT (e_table->sort_info), "group_info_changed",
-				  G_CALLBACK (group_info_changed), e_table);
-
-	e_table->sort_info_change_id =
-		g_signal_connect (G_OBJECT (e_table->sort_info), "sort_info_changed",
-				  G_CALLBACK (sort_info_changed), e_table);
-
-
-	g_value_set_object (val, e_table->sort_info);
-	g_object_set_property (G_OBJECT(e_table->header), "sort_info", val);
-	g_free (val);
-
-	e_table->sorter = e_table_sorter_new(etm, e_table->full_header, e_table->sort_info);
-
-	g_object_set (e_table->selection,
-		      "model", etm,
-		      "selection_mode", specification->selection_mode,
-		      "cursor_mode", specification->cursor_mode,
-		      "sorter", e_table->sorter,
-		      "header", e_table->header,
-		      NULL);
-
-	g_signal_connect(e_table->selection, "selection_changed",
-			 G_CALLBACK (et_selection_model_selection_changed), e_table);
-	g_signal_connect(e_table->selection, "selection_row_changed",
-			 G_CALLBACK (et_selection_model_selection_row_changed), e_table);
-
-	if (!specification->no_headers) {
-		e_table_setup_header (e_table);
-	}
-	e_table_setup_table (e_table, e_table->full_header, e_table->header, etm);
-	e_table_fill_table (e_table, etm);
-
-	gtk_layout_get_vadjustment (GTK_LAYOUT (e_table->table_canvas))->step_increment = 20;
-	gtk_adjustment_changed(gtk_layout_get_vadjustment (GTK_LAYOUT (e_table->table_canvas)));
-	gtk_layout_get_hadjustment (GTK_LAYOUT (e_table->table_canvas))->step_increment = 20;
-	gtk_adjustment_changed(gtk_layout_get_hadjustment (GTK_LAYOUT (e_table->table_canvas)));
-
-	if (!specification->no_headers) {
-		/*
-		 * The header
-		 */
-		gtk_table_attach (GTK_TABLE (e_table), GTK_WIDGET (e_table->header_canvas),
-				  0, 1, 0 + row, 1 + row,
-				  GTK_FILL | GTK_EXPAND,
-				  GTK_FILL, 0, 0);
-		row ++;
-	}
-	gtk_table_attach (GTK_TABLE (e_table), GTK_WIDGET (e_table->table_canvas),
-			  0, 1, 0 + row, 1 + row,
-			  GTK_FILL | GTK_EXPAND,
-			  GTK_FILL | GTK_EXPAND,
-			  0, 0);
-
-	gtk_widget_pop_colormap ();
-
-	g_object_unref(ete);
-
-	return e_table;
-}
-
-/**
- * e_table_construct:
- * @e_table: The newly created #ETable object.
- * @etm: The model for this table.
- * @ete: An optional #ETableExtras.  (%NULL is valid.)
- * @spec_str: The spec.
- * @state_str: An optional state.  (%NULL is valid.)
- * 
- * This is the internal implementation of e_table_new() for use by
- * subclasses or language bindings.  See e_table_new() for details.
- * 
- * Return value: 
- * The passed in value @e_table or %NULL if there's an error.
- **/
-ETable *
-e_table_construct (ETable *e_table, ETableModel *etm, ETableExtras *ete,
-		   const char *spec_str, const char *state_str)
-{
-	ETableSpecification *specification;
-	ETableState *state;
-
-	g_return_val_if_fail(e_table != NULL, NULL);
-	g_return_val_if_fail(E_IS_TABLE(e_table), NULL);
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TABLE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec_str != NULL, NULL);
-
-	g_object_ref (etm);
-
-	specification = e_table_specification_new();
-	g_object_ref (specification);
-	if (!e_table_specification_load_from_string(specification, spec_str)) {
-		g_object_unref(specification);
-		return NULL;
-	}
-
-	if (state_str) {
-		state = e_table_state_new();
-		g_object_ref (state);
-		e_table_state_load_from_string(state, state_str);
-		if (state->col_count <= 0) {
-			g_object_unref(state);
-			state = specification->state;
-			g_object_ref(state);
-		}
-	} else {
-		state = specification->state;
-		g_object_ref(state);
-	}
-
-	e_table = et_real_construct (e_table, etm, ete, specification, state);
-
-	e_table->spec = specification;
-	g_object_unref(state);
-
-	return e_table;
-}
-
-/**
- * e_table_construct_from_spec_file:
- * @e_table: The newly created #ETable object.
- * @etm: The model for this table.
- * @ete: An optional #ETableExtras.  (%NULL is valid.)
- * @spec_fn: The filename of the spec.
- * @state_fn: An optional state file.  (%NULL is valid.)
- *
- * This is the internal implementation of e_table_new_from_spec_file()
- * for use by subclasses or language bindings.  See
- * e_table_new_from_spec_file() for details.
- * 
- * Return value: 
- * The passed in value @e_table or %NULL if there's an error.
- **/
-ETable *
-e_table_construct_from_spec_file (ETable *e_table, ETableModel *etm, ETableExtras *ete,
-				  const char *spec_fn, const char *state_fn)
-{
-	ETableSpecification *specification;
-	ETableState *state;
-
-	g_return_val_if_fail(e_table != NULL, NULL);
-	g_return_val_if_fail(E_IS_TABLE(e_table), NULL);
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TABLE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec_fn != NULL, NULL);
-
-	specification = e_table_specification_new();
-	if (!e_table_specification_load_from_file(specification, spec_fn)) {
-		g_object_unref(specification);
-		return NULL;
-	}
-
-	if (state_fn) {
-		state = e_table_state_new();
-		if (!e_table_state_load_from_file(state, state_fn)) {
-			g_object_unref(state);
-			state = specification->state;
-			g_object_ref(state);
-		}
-		if (state->col_count <= 0) {
-			g_object_unref(state);
-			state = specification->state;
-			g_object_ref(state);
-		}
-	} else {
-		state = specification->state;
-		g_object_ref(state);
-	}
-
-	e_table = et_real_construct (e_table, etm, ete, specification, state);
-
-	e_table->spec = specification;
-	g_object_unref(state);
-
-	return e_table;
-}
-
-/**
- * e_table_new:
- * @etm: The model for this table.
- * @ete: An optional #ETableExtras.  (%NULL is valid.)
- * @spec: The spec.
- * @state: An optional state.  (%NULL is valid.)
- *
- * This function creates an #ETable from the given parameters.  The
- * #ETableModel is a table model to be represented.  The #ETableExtras
- * is an optional set of pixbufs, cells, and sorting functions to be
- * used when interpreting the spec.  If you pass in %NULL it uses the
- * default #ETableExtras.  (See e_table_extras_new()).
- *
- * @spec is the specification of the set of viewable columns and the
- * default sorting state and such.  @state is an optional string
- * specifying the current sorting state and such.  If @state is NULL,
- * then the default state from the spec will be used.
- * 
- * Return value: 
- * The newly created #ETable or %NULL if there's an error.
- **/
-GtkWidget *
-e_table_new (ETableModel *etm, ETableExtras *ete, const char *spec, const char *state)
-{
-	ETable *e_table;
-
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TABLE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec != NULL, NULL);
-
-	e_table = g_object_new (E_TABLE_TYPE, NULL);
-
-	e_table = e_table_construct (e_table, etm, ete, spec, state);
-
-	return GTK_WIDGET (e_table);
-}
-
-/**
- * e_table_new_from_spec_file:
- * @etm: The model for this table.
- * @ete: An optional #ETableExtras.  (%NULL is valid.)
- * @spec_fn: The filename of the spec.
- * @state_fn: An optional state file.  (%NULL is valid.)
- * 
- * This is very similar to e_table_new(), except instead of passing in
- * strings you pass in the file names of the spec and state to load.
- *
- * @spec_fn is the filename of the spec to load.  If this file doesn't
- * exist, e_table_new_from_spec_file will return %NULL.
- *
- * @state_fn is the filename of the initial state to load.  If this is
- * %NULL or if the specified file doesn't exist, the default state
- * from the spec file is used.
- * 
- * Return value: 
- * The newly created #ETable or %NULL if there's an error.
- **/
-GtkWidget *
-e_table_new_from_spec_file (ETableModel *etm, ETableExtras *ete, const char *spec_fn, const char *state_fn)
-{
-	ETable *e_table;
-
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TABLE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec_fn != NULL, NULL);
-
-	e_table = g_object_new (E_TABLE_TYPE, NULL);
-
-	e_table = e_table_construct_from_spec_file (e_table, etm, ete, spec_fn, state_fn);
-
-	return GTK_WIDGET (e_table);
-}
-
-#if 0
-static xmlNode *
-et_build_column_spec (ETable *e_table)
-{
-	xmlNode *columns_shown;
-	gint i;
-	gint col_count;
-
-	columns_shown = xmlNewNode (NULL, "columns-shown");
-
-	col_count = e_table_header_count (e_table->header);
-	for (i = 0; i < col_count; i++){
-		gchar *text = g_strdup_printf ("%d", e_table_header_index(e_table->header, i));
-		xmlNewChild (columns_shown, NULL, "column", text);
-		g_free (text);
-	}
-
-	return columns_shown;
-}
-
-static xmlNode *
-et_build_grouping_spec (ETable *e_table)
-{
-	xmlNode *node;
-	xmlNode *grouping;
-	int i;
-	const int sort_count = e_table_sort_info_sorting_get_count (e_table->sort_info);
-	const int group_count = e_table_sort_info_grouping_get_count (e_table->sort_info);
-
-	grouping = xmlNewNode (NULL, "grouping");
-	node = grouping;
-
-	for (i = 0; i < group_count; i++) {
-		ETableSortColumn column = e_table_sort_info_grouping_get_nth(e_table->sort_info, i);
-		xmlNode *new_node = xmlNewChild(node, NULL, "group", NULL);
-
-		e_xml_set_integer_prop_by_name (new_node, "column", column.column);
-		e_xml_set_integer_prop_by_name (new_node, "ascending", column.ascending);
-		node = new_node;
-	}
-
-	for (i = 0; i < sort_count; i++) {
-		ETableSortColumn column = e_table_sort_info_sorting_get_nth(e_table->sort_info, i);
-		xmlNode *new_node = xmlNewChild(node, NULL, "leaf", NULL);
-
-		e_xml_set_integer_prop_by_name (new_node, "column", column.column);
-		e_xml_set_integer_prop_by_name (new_node, "ascending", column.ascending);
-		node = new_node;
-	}
-
-	return grouping;
-}
-
-static xmlDoc *
-et_build_tree (ETable *e_table)
-{
-	xmlDoc *doc;
-	xmlNode *root;
-
-	doc = xmlNewDoc ("1.0");
-	if (doc == NULL)
-		return NULL;
-
-	root = xmlNewDocNode (doc, NULL, "ETableSpecification", NULL);
-	xmlDocSetRootElement (doc, root);
-	xmlAddChild (root, et_build_column_spec (e_table));
-	xmlAddChild (root, et_build_grouping_spec (e_table));
-
-	return doc;
-}
-
-gchar *
-e_table_get_specification (ETable *e_table)
-{
-	xmlDoc *doc;
-	xmlChar *buffer;
-	gint size;
-
-	g_return_val_if_fail(e_table != NULL, NULL);
-	g_return_val_if_fail(E_IS_TABLE(e_table), NULL);
-
-	doc = et_build_tree (e_table);
-	xmlDocDumpMemory (doc, &buffer, &size);
-	xmlFreeDoc (doc);
-
-	return buffer;
-}
-
-int
-e_table_set_specification (ETable *e_table, const char *spec)
-{
-	xmlDoc *xmlSpec;
-	int ret;
-
-	g_return_val_if_fail(e_table != NULL, -1);
-	g_return_val_if_fail(E_IS_TABLE(e_table), -1);
-	g_return_val_if_fail(spec != NULL, -1);
-
-	/* doesn't work yet, sigh */
-	xmlSpec = xmlParseMemory ((char *)spec, strlen(spec));
-	ret = et_real_set_specification(e_table, xmlSpec);
-	xmlFreeDoc (xmlSpec);
-
-	return ret;
-}
-
-void
-e_table_save_specification (ETable *e_table, const char *filename)
-{
-	xmlDoc *doc = et_build_tree (e_table);
-	
-	g_return_if_fail(e_table != NULL);
-	g_return_if_fail(E_IS_TABLE(e_table));
-	g_return_if_fail(filename != NULL);
-	
-	e_xml_save_file (filename, doc);
-	
-	xmlFreeDoc (doc);
-}
-
-int
-e_table_load_specification (ETable *e_table, gchar *filename)
-{
-	xmlDoc *xmlSpec;
-	int ret;
-
-	g_return_val_if_fail(e_table != NULL, -1);
-	g_return_val_if_fail(E_IS_TABLE(e_table), -1);
-	g_return_val_if_fail(filename != NULL, -1);
-
-	/* doesn't work yet, yay */
-	xmlSpec = xmlParseFile (filename);
-	ret = et_real_set_specification(e_table, xmlSpec);
-	xmlFreeDoc (xmlSpec);
-
-	return ret;
-}
-#endif
-
-/**
- * e_table_set_cursor_row:
- * @e_table: The #ETable to set the cursor row of
- * @row: The row number
- * 
- * Sets the cursor row and the selection to the given row number.
- **/
-void
-e_table_set_cursor_row (ETable *e_table, int row)
-{
-	g_return_if_fail(e_table != NULL);
-	g_return_if_fail(E_IS_TABLE(e_table));
-	g_return_if_fail(row >= 0);
-
-	g_object_set(e_table->selection,
-		     "cursor_row", row,
-		     NULL);
-}
-
-/**
- * e_table_get_cursor_row:
- * @e_table: The #ETable to query
- * 
- * Calculates the cursor row.  -1 means that we don't have a cursor.
- * 
- * Return value: 
- * Cursor row
- **/
-int
-e_table_get_cursor_row (ETable *e_table)
-{
-	int row;
-	g_return_val_if_fail(e_table != NULL, -1);
-	g_return_val_if_fail(E_IS_TABLE(e_table), -1);
-
-	g_object_get(e_table->selection,
-		     "cursor_row", &row,
-		     NULL);
-	return row;
-}
-
-/**
- * e_table_selected_row_foreach:
- * @e_table: The #ETable to act on
- * @callback: The callback function to call
- * @closure: The value passed to the callback's closure argument
- * 
- * Calls the given @callback function once for every selected row.
- *
- * If you change the selection or delete or add rows to the table
- * during these callbacks, problems can occur.  A standard thing to do
- * is to create a list of rows or objects the function is called upon
- * and then act upon that list. (In inverse order if it's rows.)
- **/
-void
-e_table_selected_row_foreach     (ETable *e_table,
-				  EForeachFunc callback,
-				  gpointer closure)
-{
-	g_return_if_fail(e_table != NULL);
-	g_return_if_fail(E_IS_TABLE(e_table));
-
-	e_selection_model_foreach(E_SELECTION_MODEL (e_table->selection),
-						     callback,
-						     closure);
-}
-
-/**
- * e_table_selected_count:
- * @e_table: The #ETable to query
- * 
- * Counts the number of selected rows.
- * 
- * Return value: 
- * The number of rows selected.
- **/
-gint
-e_table_selected_count     (ETable *e_table)
-{
-	g_return_val_if_fail(e_table != NULL, -1);
-	g_return_val_if_fail(E_IS_TABLE(e_table), -1);
-
-	return e_selection_model_selected_count(E_SELECTION_MODEL (e_table->selection));
-}
-
-/**
- * e_table_select_all:
- * @table: The #ETable to modify
- * 
- * Selects all the rows in @table.
- **/
-void
-e_table_select_all (ETable *table)
-{
-	g_return_if_fail (table != NULL);
-	g_return_if_fail (E_IS_TABLE (table));
-
-	e_selection_model_select_all (E_SELECTION_MODEL (table->selection));
-}
-
-/**
- * e_table_invert_selection:
- * @table: The #ETable to modify
- * 
- * Inverts the selection in @table.
- **/
-void
-e_table_invert_selection (ETable *table)
-{
-	g_return_if_fail (table != NULL);
-	g_return_if_fail (E_IS_TABLE (table));
-
-	e_selection_model_invert_selection (E_SELECTION_MODEL (table->selection));
-}
-
-
-/**
- * e_table_get_printable:
- * @e_table: #ETable to query
- * 
- * Used for printing your #ETable.
- * 
- * Return value: 
- * The #EPrintable to print.
- **/
-EPrintable *
-e_table_get_printable (ETable *e_table)
-{
-	g_return_val_if_fail(e_table != NULL, NULL);
-	g_return_val_if_fail(E_IS_TABLE(e_table), NULL);
-
-	return e_table_group_get_printable(e_table->group);
-}
-
-/**
- * e_table_right_click_up:
- * @table: The #ETable to modify.
- * 
- * Call this function when you're done handling the right click if you
- * return TRUE from the "right_click" signal.
- **/
-void
-e_table_right_click_up (ETable *table)
-{
-	e_selection_model_right_click_up(E_SELECTION_MODEL(table->selection));
-}
-
-/**
- * e_table_commit_click_to_add:
- * @table: The #ETable to modify
- * 
- * Commits the current values in the click to add to the table.
- **/
-void
-e_table_commit_click_to_add (ETable *table)
-{
-	et_eti_leave_edit (table);
-	if (table->click_to_add)
-		e_table_click_to_add_commit(E_TABLE_CLICK_TO_ADD(table->click_to_add));
-}
-
-static void
-et_get_property (GObject *object,
-		 guint prop_id,
-		 GValue *value,
-		 GParamSpec *pspec)
-{
-	ETable *etable = E_TABLE (object);
-
-	switch (prop_id){
-	case PROP_MODEL:
-		g_value_set_object (value, etable->model);
-		break;
-	case PROP_UNIFORM_ROW_HEIGHT:
-		g_value_set_boolean (value, etable->uniform_row_height);
-		break;
-	case PROP_ALWAYS_SEARCH:
-		g_value_set_boolean (value, etable->always_search);
-		break;
-	case PROP_USE_CLICK_TO_ADD:
-		g_value_set_boolean (value, etable->use_click_to_add);
-		break;
-	default:
-		break;
-	}
-}
-
-typedef struct {
-	char     *arg;
-	gboolean  setting;
-} bool_closure;
-
-static void
-et_set_property (GObject *object,
-		  guint prop_id,
-		  const GValue *value,
-		  GParamSpec *pspec)
-{
-	ETable *etable = E_TABLE (object);
-
-	switch (prop_id){
-	case PROP_LENGTH_THRESHOLD:
-		etable->length_threshold = g_value_get_int (value);
-		if (etable->group) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etable->group),
-					       "length_threshold", etable->length_threshold,
-					       NULL);
-		}
-		break;
-	case PROP_UNIFORM_ROW_HEIGHT:
-		etable->uniform_row_height = g_value_get_boolean (value);
-		if (etable->group) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etable->group),
-					       "uniform_row_height", etable->uniform_row_height,
-					       NULL);
-		}
-		break;
-	case PROP_ALWAYS_SEARCH:
-		if (etable->always_search == g_value_get_boolean (value))
-			return;
-
-		etable->always_search = g_value_get_boolean (value);
-		clear_current_search_col (etable);
-		break;
-	case PROP_USE_CLICK_TO_ADD:
-		if (etable->use_click_to_add == g_value_get_boolean (value))
-			return;
-
-		etable->use_click_to_add = g_value_get_boolean (value);
-		clear_current_search_col (etable);
-
-		if (etable->use_click_to_add) {
-			etable->click_to_add = gnome_canvas_item_new
-				(GNOME_CANVAS_GROUP(etable->canvas_vbox),
-				 e_table_click_to_add_get_type (),
-				 "header", etable->header,
-				 "model", etable->model,
-				 "message", etable->click_to_add_message,
-				 NULL);
-
-			if (etable->use_click_to_add_end)
-				e_canvas_vbox_add_item (E_CANVAS_VBOX(etable->canvas_vbox),
-							etable->click_to_add);
-			else
-				e_canvas_vbox_add_item_start (E_CANVAS_VBOX(etable->canvas_vbox),
-							      etable->click_to_add);
-
-			g_signal_connect (G_OBJECT (etable->click_to_add), "cursor_change",
-					  G_CALLBACK (click_to_add_cursor_change), etable);
-		} else {
-			gtk_object_destroy (GTK_OBJECT (etable->click_to_add));
-			etable->click_to_add = NULL;
-		}
-		break;
-	}
-}
-
-static void
-set_scroll_adjustments   (ETable *table,
-			  GtkAdjustment *hadjustment,
-			  GtkAdjustment *vadjustment)
-{
-	if (vadjustment != NULL) {
-		vadjustment->step_increment = 20;
-		gtk_adjustment_changed(vadjustment);
-	}
-	if (hadjustment != NULL) {
-		hadjustment->step_increment = 20;
-		gtk_adjustment_changed(hadjustment);
-	}
-
-	if (table->table_canvas != NULL) {
-		gtk_layout_set_hadjustment (GTK_LAYOUT(table->table_canvas),
-					    hadjustment);
-		gtk_layout_set_vadjustment (GTK_LAYOUT(table->table_canvas),
-					    vadjustment);
-	}
-
-	if (table->header_canvas != NULL)
-		gtk_layout_set_hadjustment (GTK_LAYOUT(table->header_canvas),
-					    hadjustment);
-}
-
-/**
- * e_table_get_next_row:
- * @e_table: The #ETable to query
- * @model_row: The model row to go from
- * 
- * This function is used when your table is sorted, but you're using
- * model row numbers.  It returns the next row in sorted order as a model row.
- * 
- * Return value: 
- * The model row number.
- **/
-gint
-e_table_get_next_row      (ETable *e_table,
-			   gint    model_row)
-{
-	g_return_val_if_fail(e_table != NULL, -1);
-	g_return_val_if_fail(E_IS_TABLE(e_table), -1);
-
-	if (e_table->sorter) {
-		int i;
-		i = e_sorter_model_to_sorted(E_SORTER (e_table->sorter), model_row);
-		i++;
-		if (i < e_table_model_row_count(e_table->model)) {
-			return e_sorter_sorted_to_model(E_SORTER (e_table->sorter), i);
-		} else
-			return -1;
-	} else
-		if (model_row < e_table_model_row_count(e_table->model) - 1)
-			return model_row + 1;
-		else
-			return -1;
-}
-
-/**
- * e_table_get_prev_row:
- * @e_table: The #ETable to query
- * @model_row: The model row to go from
- * 
- * This function is used when your table is sorted, but you're using
- * model row numbers.  It returns the previous row in sorted order as
- * a model row.
- * 
- * Return value: 
- * The model row number.
- **/
-gint
-e_table_get_prev_row      (ETable *e_table,
-			   gint    model_row)
-{
-	g_return_val_if_fail(e_table != NULL, -1);
-	g_return_val_if_fail(E_IS_TABLE(e_table), -1);
-
-	if (e_table->sorter) {
-		int i;
-		i = e_sorter_model_to_sorted(E_SORTER (e_table->sorter), model_row);
-		i--;
-		if (i >= 0)
-			return e_sorter_sorted_to_model(E_SORTER (e_table->sorter), i);
-		else
-			return -1;
-	} else
-		return model_row - 1;
-}
-
-/**
- * e_table_model_to_view_row:
- * @e_table: The #ETable to query
- * @model_row: The model row number
- * 
- * Turns a model row into a view row.
- * 
- * Return value: 
- * The view row number.
- **/
-gint
-e_table_model_to_view_row        (ETable *e_table,
-				  gint    model_row)
-{
-	g_return_val_if_fail(e_table != NULL, -1);
-	g_return_val_if_fail(E_IS_TABLE(e_table), -1);
-
-	if (e_table->sorter)
-		return e_sorter_model_to_sorted(E_SORTER (e_table->sorter), model_row);
-	else
-		return model_row;
-}
-
-/**
- * e_table_view_to_model_row:
- * @e_table: The #ETable to query
- * @view_row: The view row number
- * 
- * Turns a view row into a model row.
- * 
- * Return value: 
- * The model row number.
- **/
-gint
-e_table_view_to_model_row        (ETable *e_table,
-				  gint    view_row)
-{
-	g_return_val_if_fail(e_table != NULL, -1);
-	g_return_val_if_fail(E_IS_TABLE(e_table), -1);
-
-	if (e_table->sorter)
-		return e_sorter_sorted_to_model (E_SORTER (e_table->sorter), view_row);
-	else
-		return view_row;
-}
-
-/**
- * e_table_get_cell_at:
- * @table: An #ETable widget
- * @x: X coordinate for the pixel
- * @y: Y coordinate for the pixel
- * @row_return: Pointer to return the row value
- * @col_return: Pointer to return the column value
- * 
- * Return the row and column for the cell in which the pixel at (@x, @y) is
- * contained.
- **/
-void
-e_table_get_cell_at (ETable *table,
-		     int x, int y,
-		     int *row_return, int *col_return)
-{
-	g_return_if_fail (table != NULL);
-	g_return_if_fail (E_IS_TABLE (table));
-	g_return_if_fail (row_return != NULL);
-	g_return_if_fail (col_return != NULL);
-
-	/* FIXME it would be nice if it could handle a NULL row_return or
-	 * col_return gracefully.  */
-
-	x += GTK_LAYOUT(table->table_canvas)->hadjustment->value;
-	y += GTK_LAYOUT(table->table_canvas)->vadjustment->value;
-	e_table_group_compute_location(table->group, &x, &y, row_return, col_return);
-}
-
-/**
- * e_table_get_cell_geometry:
- * @table: The #ETable.
- * @row: The row to get the geometry of.
- * @col: The col to get the geometry of.
- * @x_return: Returns the x coordinate of the upper left hand corner of the cell with respect to the widget.
- * @y_return: Returns the y coordinate of the upper left hand corner of the cell with respect to the widget.
- * @width_return: Returns the width of the cell.
- * @height_return: Returns the height of the cell.
- * 
- * Returns the x, y, width, and height of the given cell.  These can
- * all be #NULL and they just won't be set.
- **/
-void
-e_table_get_cell_geometry (ETable *table,
-			   int row, int col,
-			   int *x_return, int *y_return,
-			   int *width_return, int *height_return)
-{
-	g_return_if_fail (table != NULL);
-	g_return_if_fail (E_IS_TABLE (table));
-
-	e_table_group_get_cell_geometry(table->group, &row, &col, x_return, y_return, width_return, height_return);
-
-	if (x_return && table->table_canvas)
-		(*x_return) -= GTK_LAYOUT(table->table_canvas)->hadjustment->value;
-	if (y_return) {
-		if (table->table_canvas)
-			(*y_return) -= GTK_LAYOUT(table->table_canvas)->vadjustment->value;
-		if (table->header_canvas)
-			(*y_return) += GTK_WIDGET(table->header_canvas)->allocation.height;
-	}
-}
-
-/**
- * e_table_get_selection_model:
- * @table: The #ETable to query
- * 
- * Returns the table's #ESelectionModel in case you want to access it
- * directly.
- * 
- * Return value: 
- * The #ESelectionModel.
- **/
-ESelectionModel *
-e_table_get_selection_model (ETable *table)
-{
-	g_return_val_if_fail (table != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE (table), NULL);
-
-	return E_SELECTION_MODEL (table->selection);
-}
-
-struct _ETableDragSourceSite
-{
-	GdkModifierType    start_button_mask;
-	GtkTargetList     *target_list;        /* Targets for drag data */
-	GdkDragAction      actions;            /* Possible actions */
-	GdkColormap       *colormap;	         /* Colormap for drag icon */
-	GdkPixmap         *pixmap;             /* Icon for drag data */
-	GdkBitmap         *mask;
-
-	/* Stored button press information to detect drag beginning */
-	gint               state;
-	gint               x, y;
-	gint               row, col;
-};
-
-typedef enum
-{
-  GTK_DRAG_STATUS_DRAG,
-  GTK_DRAG_STATUS_WAIT,
-  GTK_DRAG_STATUS_DROP
-} GtkDragStatus;
-
-typedef struct _GtkDragDestInfo GtkDragDestInfo;
-typedef struct _GtkDragSourceInfo GtkDragSourceInfo;
-
-struct _GtkDragDestInfo
-{
-  GtkWidget         *widget;	   /* Widget in which drag is in */
-  GdkDragContext    *context;	   /* Drag context */
-  GtkDragSourceInfo *proxy_source; /* Set if this is a proxy drag */
-  GtkSelectionData  *proxy_data;   /* Set while retrieving proxied data */
-  gboolean           dropped : 1;     /* Set after we receive a drop */
-  guint32            proxy_drop_time; /* Timestamp for proxied drop */
-  gboolean           proxy_drop_wait : 1; /* Set if we are waiting for a
-					   * status reply before sending
-					   * a proxied drop on.
-					   */
-  gint               drop_x, drop_y; /* Position of drop */
-};
-
-struct _GtkDragSourceInfo
-{
-  GtkWidget         *widget;
-  GtkTargetList     *target_list; /* Targets for drag data */
-  GdkDragAction      possible_actions; /* Actions allowed by source */
-  GdkDragContext    *context;	  /* drag context */
-  GtkWidget         *icon_window; /* Window for drag */
-  GtkWidget         *ipc_widget;  /* GtkInvisible for grab, message passing */
-  GdkCursor         *cursor;	  /* Cursor for drag */
-  gint hot_x, hot_y;		  /* Hot spot for drag */
-  gint button;			  /* mouse button starting drag */
-
-  GtkDragStatus      status;	  /* drag status */
-  GdkEvent          *last_event;  /* motion event waiting for response */
-
-  gint               start_x, start_y; /* Initial position */
-  gint               cur_x, cur_y;     /* Current Position */
-
-  GList             *selections;  /* selections we've claimed */
-
-  GtkDragDestInfo   *proxy_dest;  /* Set if this is a proxy drag */
-
-  guint              drop_timeout;     /* Timeout for aborting drop */
-  guint              destroy_icon : 1; /* If true, destroy icon_window
-					*/
-};
-
-/* Drag & drop stuff. */
-/* Target */
-
-/**
- * e_table_drag_get_data:
- * @table: 
- * @row: 
- * @col: 
- * @context: 
- * @target: 
- * @time: 
- * 
- * 
- **/
-void
-e_table_drag_get_data (ETable         *table,
-		       int             row,
-		       int             col,
-		       GdkDragContext *context,
-		       GdkAtom         target,
-		       guint32         time)
-{
-	g_return_if_fail(table != NULL);
-	g_return_if_fail(E_IS_TABLE(table));
-
-	gtk_drag_get_data(GTK_WIDGET(table),
-			  context,
-			  target,
-			  time);
-}
-
-/**
- * e_table_drag_highlight:
- * @table: The #ETable to highlight
- * @row: The row number of the cell to highlight
- * @col: The column number of the cell to highlight
- *
- * Set col to -1 to highlight the entire row.  If row is -1, this is
- * identical to e_table_drag_unhighlight().
- **/
-void
-e_table_drag_highlight (ETable *table,
-			int     row,
-			int     col)
-{
-	g_return_if_fail(table != NULL);
-	g_return_if_fail(E_IS_TABLE(table));
-
-	if (row != -1) {
-		int x, y, width, height;
-		if (col == -1) {
-			e_table_get_cell_geometry (table, row, 0, &x, &y, &width, &height);
-			x = 0;
-			width = GTK_WIDGET (table->table_canvas)->allocation.width;
-		} else {
-			e_table_get_cell_geometry (table, row, col, &x, &y, &width, &height);
-			x += GTK_LAYOUT(table->table_canvas)->hadjustment->value;
-		}
-		y += GTK_LAYOUT(table->table_canvas)->vadjustment->value;
-
-		if (table->drop_highlight == NULL) {
-			table->drop_highlight =
-				gnome_canvas_item_new (gnome_canvas_root (table->table_canvas),
-						       gnome_canvas_rect_get_type (),
-						       "fill_color", NULL,
-						       /*						       "outline_color", "black",
-						       "width_pixels", 1,*/
-						       "outline_color_gdk", &(GTK_WIDGET (table)->style->fg[GTK_STATE_NORMAL]),
-						       NULL);
-		}
-		gnome_canvas_item_set (table->drop_highlight,
-				       "x1", (double) x,
-				       "x2", (double) x + width - 1,
-				       "y1", (double) y,
-				       "y2", (double) y + height - 1,
-				       NULL);
-	} else {
-		if (table->drop_highlight) {
-			gtk_object_destroy (GTK_OBJECT (table->drop_highlight));
-			table->drop_highlight = NULL;
-		}
-	}
-}
-
-/**
- * e_table_drag_unhighlight:
- * @table: The #ETable to unhighlight
- * 
- * Removes the highlight from an #ETable.
- **/
-void
-e_table_drag_unhighlight (ETable *table)
-{
-	g_return_if_fail(table != NULL);
-	g_return_if_fail(E_IS_TABLE(table));
-
-	if (table->drop_highlight) {
-		gtk_object_destroy (GTK_OBJECT (table->drop_highlight));
-		table->drop_highlight = NULL;
-	}
-}
-
-void e_table_drag_dest_set   (ETable               *table,
-			      GtkDestDefaults       flags,
-			      const GtkTargetEntry *targets,
-			      gint                  n_targets,
-			      GdkDragAction         actions)
-{
-	g_return_if_fail(table != NULL);
-	g_return_if_fail(E_IS_TABLE(table));
-
-	gtk_drag_dest_set(GTK_WIDGET(table),
-			  flags,
-			  targets,
-			  n_targets,
-			  actions);
-}
-
-void e_table_drag_dest_set_proxy (ETable         *table,
-				  GdkWindow      *proxy_window,
-				  GdkDragProtocol protocol,
-				  gboolean        use_coordinates)
-{
-	g_return_if_fail(table != NULL);
-	g_return_if_fail(E_IS_TABLE(table));
-
-	gtk_drag_dest_set_proxy(GTK_WIDGET(table),
-				proxy_window,
-				protocol,
-				use_coordinates);
-}
-
-/*
- * There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-
-void
-e_table_drag_dest_unset (GtkWidget *widget)
-{
-	g_return_if_fail(widget != NULL);
-	g_return_if_fail(E_IS_TABLE(widget));
-
-	gtk_drag_dest_unset(widget);
-}
-
-/* Source side */
-
-static gint
-et_real_start_drag (ETable *table, int row, int col, GdkEvent *event)
-{
-	GtkDragSourceInfo *info;
-	GdkDragContext *context;
-	ETableDragSourceSite *site;
-
-	if (table->do_drag) {
-		site = table->site;
-
-		site->state = 0;
-		context = e_table_drag_begin (table, row, col,
-					      site->target_list,
-					      site->actions,
-					      1, event);
-
-		if (context) {
-			info = g_dataset_get_data (context, "gtk-info");
-
-			if (info && !info->icon_window) {
-				if (site->pixmap)
-					gtk_drag_set_icon_pixmap (context,
-								  site->colormap,
-								  site->pixmap,
-								  site->mask, -2, -2);
-				else
-					gtk_drag_set_icon_default (context);
-			}
-		}
-		return TRUE;
-	}
-	return FALSE;
-}
-
-/**
- * e_table_drag_source_set:
- * @table: The #ETable to set up as a drag site
- * @start_button_mask: Mask of allowed buttons to start drag
- * @targets: Table of targets for this source
- * @n_targets: Number of targets in @targets
- * @actions: Actions allowed for this source
- * 
- * Registers this table as a drag site, and possibly adds default behaviors.
- **/
-void
-e_table_drag_source_set  (ETable               *table,
-			  GdkModifierType       start_button_mask,
-			  const GtkTargetEntry *targets,
-			  gint                  n_targets,
-			  GdkDragAction         actions)
-{
-	ETableDragSourceSite *site;
-	GtkWidget *canvas;
-
-	g_return_if_fail(table != NULL);
-	g_return_if_fail(E_IS_TABLE(table));
-
-	canvas = GTK_WIDGET(table->table_canvas);
-	site = table->site;
-
-	gtk_widget_add_events (canvas,
-			       gtk_widget_get_events (canvas) |
-			       GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
-			       GDK_BUTTON_MOTION_MASK | GDK_STRUCTURE_MASK);
-
-	table->do_drag = TRUE;
-
-	if (site) {
-		if (site->target_list)
-			gtk_target_list_unref (site->target_list);
-	} else {
-		site = g_new0 (ETableDragSourceSite, 1);
-		table->site = site;
-	}
-
-	site->start_button_mask = start_button_mask;
-
-	if (targets)
-		site->target_list = gtk_target_list_new (targets, n_targets);
-	else
-		site->target_list = NULL;
-
-	site->actions = actions;
-}
-
-/**
- * e_table_drag_source_unset:
- * @table: The #ETable to un set up as a drag site
- * 
- * Unregisters this #ETable as a drag site.
- **/
-void
-e_table_drag_source_unset (ETable *table)
-{
-	ETableDragSourceSite *site;
-
-	g_return_if_fail (table != NULL);
-	g_return_if_fail (E_IS_TABLE(table));
-
-	site = table->site;
-
-	if (site) {
-		if (site->target_list)
-			gtk_target_list_unref (site->target_list);
-		g_free (site);
-		table->site = NULL;
-	}
-	table->do_drag = FALSE;
-}
-
-/* There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-
-/**
- * e_table_drag_begin:
- * @table: The #ETable to drag from
- * @row: The row number of the cell
- * @col: The col number of the cell
- * @targets: The list of targets supported by the drag
- * @actions: The available actions supported by the drag
- * @button: The button held down for the drag
- * @event: The event that initiated the drag
- * 
- * Start a drag from this cell.
- * 
- * Return value: 
- * The drag context.
- **/
-GdkDragContext *
-e_table_drag_begin (ETable            *table,
-		    int     	       row,
-		    int     	       col,
-		    GtkTargetList     *targets,
-		    GdkDragAction      actions,
-		    gint               button,
-		    GdkEvent          *event)
-{
-	g_return_val_if_fail (table != NULL, NULL);
-	g_return_val_if_fail (E_IS_TABLE(table), NULL);
-
-	table->drag_row = row;
-	table->drag_col = col;
-
-	return gtk_drag_begin(GTK_WIDGET(table),
-			      targets,
-			      actions,
-			      button,
-			      event);
-}
-
-static void
-et_drag_begin (GtkWidget *widget,
-	       GdkDragContext *context,
-	       ETable *et)
-{
-	g_signal_emit (G_OBJECT (et), et_signals [TABLE_DRAG_BEGIN], 0,
-		       et->drag_row, et->drag_col, context);
-}
-
-static void
-et_drag_end (GtkWidget *widget,
-	     GdkDragContext *context,
-	     ETable *et)
-{
-	g_signal_emit (G_OBJECT (et), et_signals [TABLE_DRAG_END], 0,
-		       et->drag_row, et->drag_col, context);
-}
-
-static void
-et_drag_data_get(GtkWidget *widget,
-		 GdkDragContext *context,
-		 GtkSelectionData *selection_data,
-		 guint info,
-		 guint time,
-		 ETable *et)
-{
-	g_signal_emit (G_OBJECT (et), et_signals [TABLE_DRAG_DATA_GET], 0,
-		       et->drag_row, et->drag_col, context, selection_data,
-		       info, time);
-}
-
-static void
-et_drag_data_delete(GtkWidget *widget,
-		    GdkDragContext *context,
-		    ETable *et)
-{
-	g_signal_emit (G_OBJECT (et), et_signals [TABLE_DRAG_DATA_DELETE], 0,
-		       et->drag_row, et->drag_col, context);
-}
-
-static gboolean
-do_drag_motion(ETable *et,
-	       GdkDragContext *context,
-	       gint x,
-	       gint y,
-	       guint time)
-{
-	gboolean ret_val;
-	int row = -1, col = -1;
-	GtkWidget *widget;
-
-	widget = GTK_WIDGET (et);
-
-	e_table_get_cell_at (et, x, y, &row, &col);
-
-	if (row != et->drop_row && col != et->drop_row) {
-		g_signal_emit (G_OBJECT (et), et_signals [TABLE_DRAG_LEAVE], 0,
-			       et->drop_row, et->drop_col, context, time);
-	}
-	et->drop_row = row;
-	et->drop_col = col;
-	g_signal_emit (G_OBJECT (et), et_signals [TABLE_DRAG_MOTION], 0,
-		       et->drop_row, et->drop_col, context, x, y, time, &ret_val);
-
-	return ret_val;
-}
-
-static gboolean
-scroll_timeout (gpointer data)
-{
-	ETable *et = data;
-	int dx = 0, dy = 0;
-	GtkAdjustment *h, *v;
-	double hvalue, vvalue;
-
-	if (et->scroll_direction & ET_SCROLL_DOWN)
-		dy += 20;
-	if (et->scroll_direction & ET_SCROLL_UP)
-		dy -= 20;
-
-	if (et->scroll_direction & ET_SCROLL_RIGHT)
-		dx += 20;
-	if (et->scroll_direction & ET_SCROLL_LEFT)
-		dx -= 20;
-
-	h = GTK_LAYOUT(et->table_canvas)->hadjustment;
-	v = GTK_LAYOUT(et->table_canvas)->vadjustment;
-
-	hvalue = h->value;
-	vvalue = v->value;
-
-	gtk_adjustment_set_value(h, CLAMP(h->value + dx, h->lower, h->upper - h->page_size));
-	gtk_adjustment_set_value(v, CLAMP(v->value + dy, v->lower, v->upper - v->page_size));
-
-	if (h->value != hvalue ||
-	    v->value != vvalue)
-		do_drag_motion(et,
-			       et->last_drop_context,
-			       et->last_drop_x,
-			       et->last_drop_y,
-			       et->last_drop_time);
-			       
-
-	return TRUE;
-}
-
-static void
-scroll_on (ETable *et, guint scroll_direction)
-{
-	if (et->scroll_idle_id == 0 || scroll_direction != et->scroll_direction) {
-		if (et->scroll_idle_id != 0)
-			g_source_remove (et->scroll_idle_id);
-		et->scroll_direction = scroll_direction;
-		et->scroll_idle_id = g_timeout_add (100, scroll_timeout, et);
-	}
-}
-
-static void
-scroll_off (ETable *et)
-{
-	if (et->scroll_idle_id) {
-		g_source_remove (et->scroll_idle_id);
-		et->scroll_idle_id = 0;
-	}
-}
-
-static void
-context_destroyed (gpointer data)
-{
-	ETable *et = data;
-	/* if (!GTK_OBJECT_DESTROYED (et)) */
-#ifndef NO_WARNINGS
-#warning FIXME
-#endif
-	{
-		et->last_drop_x       = 0;
-		et->last_drop_y       = 0;
-		et->last_drop_time    = 0;
-		et->last_drop_context = NULL;
-		scroll_off (et);
-	}
-	g_object_unref (et);
-}
-
-static void
-context_connect (ETable *et, GdkDragContext *context)
-{
-	if (g_dataset_get_data (context, "e-table") == NULL) {
-		g_object_ref (et);
-		g_dataset_set_data_full (context, "e-table", et, context_destroyed);
-	}
-}
-
-static void
-et_drag_leave(GtkWidget *widget,
-	      GdkDragContext *context,
-	      guint time,
-	      ETable *et)
-{
-	g_signal_emit (G_OBJECT (et), et_signals [TABLE_DRAG_LEAVE], 0,
-		       et->drop_row, et->drop_col, context, time);
-	et->drop_row = -1;
-	et->drop_col = -1;
-
-	scroll_off (et);
-}
-
-static gboolean
-et_drag_motion(GtkWidget *widget,
-	       GdkDragContext *context,
-	       gint x,
-	       gint y,
-	       guint time,
-	       ETable *et)
-{
-	gboolean ret_val;
-	guint direction = 0;
-
-	et->last_drop_x = x;
-	et->last_drop_y = y;
-	et->last_drop_time = time;
-	et->last_drop_context = context;
-	context_connect (et, context);
-
-	ret_val = do_drag_motion (et,
-				  context,
-				  x,
-				  y,
-				  time);
-
-
-	if (y < 20)
-		direction |= ET_SCROLL_UP;
-	if (y > widget->allocation.height - 20)
-		direction |= ET_SCROLL_DOWN;
-	if (x < 20)
-		direction |= ET_SCROLL_LEFT;
-	if (x > widget->allocation.width - 20)
-		direction |= ET_SCROLL_RIGHT;
-
-	if (direction != 0)
-		scroll_on (et, direction);
-	else
-		scroll_off (et);
-
-	return ret_val;
-}
-
-static gboolean
-et_drag_drop(GtkWidget *widget,
-	     GdkDragContext *context,
-	     gint x,
-	     gint y,
-	     guint time,
-	     ETable *et)
-{
-	gboolean ret_val;
-	int row, col;
-
-	e_table_get_cell_at (et, x, y, &row, &col);
-
-	if (row != et->drop_row && col != et->drop_row) {
-		g_signal_emit (G_OBJECT (et), et_signals [TABLE_DRAG_LEAVE], 0,
-			       et->drop_row, et->drop_col, context, time);
-		g_signal_emit (G_OBJECT (et), et_signals [TABLE_DRAG_MOTION], 0,
-			       row, col, context, x, y, time, &ret_val);
-	}
-	et->drop_row = row;
-	et->drop_col = col;
-	g_signal_emit (G_OBJECT (et), et_signals [TABLE_DRAG_DROP], 0,
-		       et->drop_row, et->drop_col, context, x, y, time, &ret_val);
-	et->drop_row = -1;
-	et->drop_col = -1;
-
-	scroll_off (et);
-
-	return ret_val;
-}
-
-static void
-et_drag_data_received(GtkWidget *widget,
-		      GdkDragContext *context,
-		      gint x,
-		      gint y,
-		      GtkSelectionData *selection_data,
-		      guint info,
-		      guint time,
-		      ETable *et)
-{
-	int row, col;
-
-	e_table_get_cell_at (et, x, y, &row, &col);
-
-	g_signal_emit (G_OBJECT (et), et_signals [TABLE_DRAG_DATA_RECEIVED], 0,
-		       row, col, context, x, y, selection_data, info, time);
-}
-
-static void
-e_table_class_init (ETableClass *class)
-{
-	GObjectClass *object_class;
-	GtkWidgetClass *widget_class;
-	GtkContainerClass *container_class;
-
-	object_class                    = (GObjectClass *) class;
-	widget_class                    = (GtkWidgetClass *) class;
-	container_class                 = (GtkContainerClass *) class;
-
-	parent_class                    = g_type_class_peek_parent (class);
-
-	object_class->dispose           = et_dispose;
-	object_class->finalize          = et_finalize;
-	object_class->set_property      = et_set_property;
-	object_class->get_property      = et_get_property;
-
-	widget_class->grab_focus        = et_grab_focus;
-	widget_class->unrealize         = et_unrealize;
-	widget_class->size_request      = et_size_request;
-
-	widget_class->focus             = et_focus;
-
-	class->cursor_change            = NULL;
-	class->cursor_activated         = NULL;
-	class->selection_change         = NULL;
-	class->double_click             = NULL;
-	class->right_click              = NULL;
-	class->click                    = NULL;
-	class->key_press                = NULL;
-	class->start_drag               = et_real_start_drag;
-	class->state_change             = NULL;
-	class->white_space_event        = NULL;
-
-	class->table_drag_begin         = NULL;
-	class->table_drag_end           = NULL;
-	class->table_drag_data_get      = NULL;
-	class->table_drag_data_delete   = NULL;
-
-	class->table_drag_leave         = NULL;
-	class->table_drag_motion        = NULL;
-	class->table_drag_drop          = NULL;
-	class->table_drag_data_received = NULL;
-
-	et_signals [CURSOR_CHANGE] =
-		g_signal_new ("cursor_change",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, cursor_change),
-			      NULL, NULL,
-			      e_marshal_NONE__INT,
-			      G_TYPE_NONE, 1, G_TYPE_INT);
-
-	et_signals [CURSOR_ACTIVATED] =
-		g_signal_new ("cursor_activated",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, cursor_activated),
-			      NULL, NULL,
-			      e_marshal_NONE__INT,
-			      G_TYPE_NONE, 1, G_TYPE_INT);
-
-	et_signals [SELECTION_CHANGE] =
-		g_signal_new ("selection_change",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, selection_change),
-			      NULL, NULL,
-			      e_marshal_NONE__NONE,
-			      G_TYPE_NONE, 0);
-
-	et_signals [DOUBLE_CLICK] =
-		g_signal_new ("double_click",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, double_click),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_INT_BOXED,
-			      G_TYPE_NONE, 3, G_TYPE_INT,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	et_signals [RIGHT_CLICK] =
-		g_signal_new ("right_click",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, right_click),
-			      NULL, NULL,
-			      e_marshal_INT__INT_INT_BOXED,
-			      G_TYPE_INT, 3, G_TYPE_INT,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	et_signals [CLICK] =
-		g_signal_new ("click",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, click),
-			      NULL, NULL,
-			      e_marshal_INT__INT_INT_BOXED,
-			      G_TYPE_INT, 3, G_TYPE_INT,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	et_signals [KEY_PRESS] =
-		g_signal_new ("key_press",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, key_press),
-			      NULL, NULL,
-			      e_marshal_INT__INT_INT_BOXED,
-			      G_TYPE_INT, 3, G_TYPE_INT,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	et_signals [START_DRAG] =
-		g_signal_new ("start_drag",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, start_drag),
-			      NULL, NULL,
-			      e_marshal_INT__INT_INT_BOXED,
-			      G_TYPE_INT, 3, G_TYPE_INT,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	et_signals [STATE_CHANGE] =
-		g_signal_new ("state_change",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, state_change),
-			      NULL, NULL,
-			      e_marshal_NONE__NONE,
-			      G_TYPE_NONE, 0);
-
-	et_signals [WHITE_SPACE_EVENT] =
-		g_signal_new ("white_space_event",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, white_space_event),
-			      NULL, NULL,
-			      e_marshal_INT__BOXED,
-			      G_TYPE_INT, 1, GDK_TYPE_EVENT);
-
-	et_signals[TABLE_DRAG_BEGIN] =
-		g_signal_new ("table_drag_begin",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, table_drag_begin),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_INT_OBJECT,
-			      G_TYPE_NONE, 3,
-			      G_TYPE_INT,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT);
-	et_signals[TABLE_DRAG_END] =
-		g_signal_new ("table_drag_end",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, table_drag_end),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_INT_OBJECT,
-			      G_TYPE_NONE, 3,
-			      G_TYPE_INT,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT);
-	et_signals[TABLE_DRAG_DATA_GET] =
-		g_signal_new ("table_drag_data_get",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, table_drag_data_get),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_INT_OBJECT_BOXED_UINT_UINT,
-			      G_TYPE_NONE, 6,
-			      G_TYPE_INT,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT,
-			      GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE,
-			      G_TYPE_UINT,
-			      G_TYPE_UINT);
-	et_signals[TABLE_DRAG_DATA_DELETE] =
-		g_signal_new ("table_drag_data_delete",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, table_drag_data_delete),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_INT_OBJECT,
-			      G_TYPE_NONE, 3,
-			      G_TYPE_INT,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT);
-
-	et_signals[TABLE_DRAG_LEAVE] =
-		g_signal_new ("table_drag_leave",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, table_drag_leave),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_INT_OBJECT_UINT,
-			      G_TYPE_NONE, 4,
-			      G_TYPE_INT,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT,
-			      G_TYPE_UINT);
-	et_signals[TABLE_DRAG_MOTION] =
-		g_signal_new ("table_drag_motion",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, table_drag_motion),
-			      NULL, NULL,
-			      e_marshal_BOOLEAN__INT_INT_OBJECT_INT_INT_UINT,
-			      G_TYPE_BOOLEAN, 6,
-			      G_TYPE_INT,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT,
-			      G_TYPE_INT,
-			      G_TYPE_INT,
-			      G_TYPE_UINT);
-	et_signals[TABLE_DRAG_DROP] =
-		g_signal_new ("table_drag_drop",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, table_drag_drop),
-			      NULL, NULL,
-			      e_marshal_BOOLEAN__INT_INT_OBJECT_INT_INT_UINT,
-			      G_TYPE_BOOLEAN, 6,
-			      G_TYPE_INT,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT,
-			      G_TYPE_INT,
-			      G_TYPE_INT,
-			      G_TYPE_UINT);
-	et_signals[TABLE_DRAG_DATA_RECEIVED] =
-		g_signal_new ("table_drag_data_received",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, table_drag_data_received),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_INT_OBJECT_INT_INT_BOXED_UINT_UINT,
-			      G_TYPE_NONE, 8,
-			      G_TYPE_INT,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT,
-			      G_TYPE_INT,
-			      G_TYPE_INT,
-			      GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE,
-			      G_TYPE_UINT,
-			      G_TYPE_UINT);
-
-	class->set_scroll_adjustments = set_scroll_adjustments;
-
-	widget_class->set_scroll_adjustments_signal =
-		g_signal_new ("set_scroll_adjustments",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETableClass, set_scroll_adjustments),
-			      NULL, NULL,
-			      e_marshal_NONE__OBJECT_OBJECT,
-			      G_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
-
-	g_object_class_install_property (object_class, PROP_LENGTH_THRESHOLD,
-					 g_param_spec_int ("length_threshold",
-							   _("Length Threshold"),
-							   /*_( */"XXX blurb" /*)*/,
-							   0, G_MAXINT, 0,
-							   G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_UNIFORM_ROW_HEIGHT,
-					 g_param_spec_boolean ("uniform_row_height",
-							       _("Uniform row height"),
-							       /*_( */"XXX blurb" /*)*/,
-							       FALSE,
-							       G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_ALWAYS_SEARCH,
-					 g_param_spec_boolean ("always_search",
-							       _("Always Search"),
-							       /*_( */"XXX blurb" /*)*/,
-							       FALSE,
-							       G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_USE_CLICK_TO_ADD,
-					 g_param_spec_boolean ("use_click_to_add",
-							       _("Use click to add"),
-							       /*_( */"XXX blurb" /*)*/,
-							       FALSE,
-							       G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_MODEL,
-					 g_param_spec_object ("model",
-							      _("Model"),
-							      /*_( */"XXX blurb" /*)*/,
-							      E_TABLE_MODEL_TYPE,
-							      G_PARAM_READABLE));
-
-	gal_a11y_e_table_init ();
-}
-
-E_MAKE_TYPE(e_table, "ETable", ETable, e_table_class_init, e_table_init, PARENT_TYPE)
diff --git a/widgets/table/e-table.dia b/widgets/table/e-table.dia
deleted file mode 100644
index 5aeb01228c..0000000000
Binary files a/widgets/table/e-table.dia and /dev/null differ
diff --git a/widgets/table/e-table.h b/widgets/table/e-table.h
deleted file mode 100644
index f025318905..0000000000
--- a/widgets/table/e-table.h
+++ /dev/null
@@ -1,358 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-table.h - A graphical view of a Table.
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Miguel de Icaza <miguel@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TABLE_H_
-#define _E_TABLE_H_
-
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gtk/gtkdnd.h>
-#include <gtk/gtktable.h>
-#include <libxml/tree.h>
-#include <gal/e-table/e-table-model.h>
-#include <gal/e-table/e-table-header.h>
-#include <gal/e-table/e-table-group.h>
-#include <gal/e-table/e-table-sort-info.h>
-#include <gal/e-table/e-table-item.h>
-#include <gal/e-table/e-table-selection-model.h>
-#include <gal/e-table/e-table-extras.h>
-#include <gal/e-table/e-table-specification.h>
-#include <gal/widgets/e-printable.h>
-#include <gal/e-table/e-table-state.h>
-#include <gal/e-table/e-table-sorter.h>
-#include <gal/e-table/e-table-search.h>
-
-G_BEGIN_DECLS
-
-#define E_TABLE_TYPE        (e_table_get_type ())
-#define E_TABLE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TABLE_TYPE, ETable))
-#define E_TABLE_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TABLE_TYPE, ETableClass))
-#define E_IS_TABLE(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TABLE_TYPE))
-#define E_IS_TABLE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TABLE_TYPE))
-
-typedef struct _ETableDragSourceSite ETableDragSourceSite;
-
-typedef enum {
-	E_TABLE_CURSOR_LOC_NONE = 0,
-	E_TABLE_CURSOR_LOC_ETCTA = 1 << 0,
-	E_TABLE_CURSOR_LOC_TABLE = 1 << 1
-} ETableCursorLoc;
-
-typedef struct {
-	GtkTable parent;
-
-	ETableModel *model;
-
-	ETableHeader *full_header, *header;
-
-	GnomeCanvasItem *canvas_vbox;
-	ETableGroup  *group;
-
-	ETableSortInfo *sort_info;
-	ETableSorter   *sorter;
-
-	ETableSelectionModel *selection;
-	ETableCursorLoc cursor_loc;
-	ETableSpecification *spec;
-
-	ETableSearch     *search;
-
-	ETableCol        *current_search_col;
-
-	guint   	  search_search_id;
-	guint   	  search_accept_id;
-
-	int table_model_change_id;
-	int table_row_change_id;
-	int table_cell_change_id;
-	int table_rows_inserted_id;
-	int table_rows_deleted_id;
-
-	int group_info_change_id;
-	int sort_info_change_id;
-
-	int structure_change_id;
-	int expansion_change_id;
-	int dimension_change_id;
-
-	int reflow_idle_id;
-	int scroll_idle_id;
-
-	GnomeCanvas *header_canvas, *table_canvas;
-
-	GnomeCanvasItem *header_item, *root;
-
-	GnomeCanvasItem *white_item;
-
-	gint length_threshold;
-
-	gint rebuild_idle_id;
-	guint need_rebuild:1;
-
-	/*
-	 * Configuration settings
-	 */
-	guint alternating_row_colors : 1;
-	guint horizontal_draw_grid : 1;
-	guint vertical_draw_grid : 1;
-	guint draw_focus : 1;
-	guint row_selection_active : 1;
-
-	guint horizontal_scrolling : 1;
-	guint horizontal_resize : 1;
-
-	guint is_grouped : 1;
-
-	guint scroll_direction : 4;
-
-	guint do_drag : 1;
-
-	guint uniform_row_height : 1;
-	guint allow_grouping : 1;
-	
-	guint always_search : 1;
-	guint search_col_set : 1;
-
-	char *click_to_add_message;
-	GnomeCanvasItem *click_to_add;
-	gboolean use_click_to_add;
-	gboolean use_click_to_add_end;
-
-	ECursorMode cursor_mode;
-
-	int drop_row;
-	int drop_col;
-	GnomeCanvasItem *drop_highlight;
-	int last_drop_x;
-	int last_drop_y;
-	int last_drop_time;
-	GdkDragContext *last_drop_context;
-
-	int drag_row;
-	int drag_col;
-	ETableDragSourceSite *site;
-
-	int header_width;
-
-	char *domain;
-} ETable;
-
-typedef struct {
-	GtkTableClass parent_class;
-
-	void        (*cursor_change)      (ETable *et, int row);
-	void        (*cursor_activated)   (ETable *et, int row);
-	void        (*selection_change)   (ETable *et);
-	void        (*double_click)       (ETable *et, int row, int col, GdkEvent *event);
-	gint        (*right_click)        (ETable *et, int row, int col, GdkEvent *event);
-	gint        (*click)              (ETable *et, int row, int col, GdkEvent *event);
-	gint        (*key_press)          (ETable *et, int row, int col, GdkEvent *event);
-	gint        (*start_drag)         (ETable *et, int row, int col, GdkEvent *event);
-	void        (*state_change)       (ETable *et);
-	gint        (*white_space_event)  (ETable *et, GdkEvent *event);
-
-	void  (*set_scroll_adjustments)   (ETable	 *table,
-					   GtkAdjustment *hadjustment,
-					   GtkAdjustment *vadjustment);
-
-	/* Source side drag signals */
-	void (* table_drag_begin)	           (ETable	       *table,
-						    int                 row,
-						    int                 col,
-						    GdkDragContext     *context);
-	void (* table_drag_end)	           (ETable	       *table,
-					    int                 row,
-					    int                 col,
-					    GdkDragContext     *context);
-	void (* table_drag_data_get)             (ETable             *table,
-						  int                 row,
-						  int                 col,
-						  GdkDragContext     *context,
-						  GtkSelectionData   *selection_data,
-						  guint               info,
-						  guint               time);
-	void (* table_drag_data_delete)          (ETable	       *table,
-						  int                 row,
-						  int                 col,
-						  GdkDragContext     *context);
-	
-	/* Target side drag signals */	   
-	void (* table_drag_leave)	           (ETable	       *table,
-						    int                 row,
-						    int                 col,
-						    GdkDragContext     *context,
-						    guint               time);
-	gboolean (* table_drag_motion)           (ETable	       *table,
-						  int                 row,
-						  int                 col,
-						  GdkDragContext     *context,
-						  gint                x,
-						  gint                y,
-						  guint               time);
-	gboolean (* table_drag_drop)             (ETable	       *table,
-						  int                 row,
-						  int                 col,
-						  GdkDragContext     *context,
-						  gint                x,
-						  gint                y,
-						  guint               time);
-	void (* table_drag_data_received)        (ETable             *table,
-						  int                 row,
-						  int                 col,
-						  GdkDragContext     *context,
-						  gint                x,
-						  gint                y,
-						  GtkSelectionData   *selection_data,
-						  guint               info,
-						  guint               time);
-} ETableClass;
-GType            e_table_get_type                  (void);
-ETable          *e_table_construct                 (ETable               *e_table,
-						    ETableModel          *etm,
-						    ETableExtras         *ete,
-						    const char           *spec,
-						    const char           *state);
-GtkWidget       *e_table_new                       (ETableModel          *etm,
-						    ETableExtras         *ete,
-						    const char           *spec,
-						    const char           *state);
-
-/* Create an ETable using files. */
-ETable          *e_table_construct_from_spec_file  (ETable               *e_table,
-						    ETableModel          *etm,
-						    ETableExtras         *ete,
-						    const char           *spec_fn,
-						    const char           *state_fn);
-GtkWidget       *e_table_new_from_spec_file        (ETableModel          *etm,
-						    ETableExtras         *ete,
-						    const char           *spec_fn,
-						    const char           *state_fn);
-
-/* To save the state */
-gchar           *e_table_get_state                 (ETable               *e_table);
-void             e_table_save_state                (ETable               *e_table,
-						    const gchar          *filename);
-ETableState     *e_table_get_state_object          (ETable               *e_table);
-
-/* note that it is more efficient to provide the state at creation time */
-void             e_table_set_state                 (ETable               *e_table,
-						    const gchar          *state);
-void             e_table_set_state_object          (ETable               *e_table,
-						    ETableState          *state);
-void             e_table_load_state                (ETable               *e_table,
-						    const gchar          *filename);
-void             e_table_set_cursor_row            (ETable               *e_table,
-						    int                   row);
-
-/* -1 means we don't have the cursor.  This is in model rows. */
-int              e_table_get_cursor_row            (ETable               *e_table);
-void             e_table_selected_row_foreach      (ETable               *e_table,
-						    EForeachFunc          callback,
-						    gpointer              closure);
-gint             e_table_selected_count            (ETable               *e_table);
-EPrintable      *e_table_get_printable             (ETable               *e_table);
-gint             e_table_get_next_row              (ETable               *e_table,
-						    gint                  model_row);
-gint             e_table_get_prev_row              (ETable               *e_table,
-						    gint                  model_row);
-gint             e_table_model_to_view_row         (ETable               *e_table,
-						    gint                  model_row);
-gint             e_table_view_to_model_row         (ETable               *e_table,
-						    gint                  view_row);
-void             e_table_get_cell_at               (ETable               *table,
-						    int                   x,
-						    int                   y,
-						    int                  *row_return,
-						    int                  *col_return);
-void             e_table_get_cell_geometry         (ETable               *table,
-						    int                   row,
-						    int                   col,
-						    int                  *x_return,
-						    int                  *y_return,
-						    int                  *width_return,
-						    int                  *height_return);
-
-/* Useful accessor functions. */
-ESelectionModel *e_table_get_selection_model       (ETable               *table);
-
-/* Drag & drop stuff. */
-/* Target */
-void             e_table_drag_get_data             (ETable               *table,
-						    int                   row,
-						    int                   col,
-						    GdkDragContext       *context,
-						    GdkAtom               target,
-						    guint32               time);
-void             e_table_drag_highlight            (ETable               *table,
-						    int                   row,
-						    int                   col); /* col == -1 to highlight entire row. */
-void             e_table_drag_unhighlight          (ETable               *table);
-void             e_table_drag_dest_set             (ETable               *table,
-						    GtkDestDefaults       flags,
-						    const GtkTargetEntry *targets,
-						    gint                  n_targets,
-						    GdkDragAction         actions);
-void             e_table_drag_dest_set_proxy       (ETable               *table,
-						    GdkWindow            *proxy_window,
-						    GdkDragProtocol       protocol,
-						    gboolean              use_coordinates);
-
-/* There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-void             e_table_drag_dest_unset           (GtkWidget            *widget);
-
-/* Source side */
-void             e_table_drag_source_set           (ETable               *table,
-						    GdkModifierType       start_button_mask,
-						    const GtkTargetEntry *targets,
-						    gint                  n_targets,
-						    GdkDragAction         actions);
-void             e_table_drag_source_unset         (ETable               *table);
-
-/* There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-GdkDragContext  *e_table_drag_begin                (ETable               *table,
-						    int                   row,
-						    int                   col,
-						    GtkTargetList        *targets,
-						    GdkDragAction         actions,
-						    gint                  button,
-						    GdkEvent             *event);
-
-/* selection stuff */
-void             e_table_select_all                (ETable               *table);
-void             e_table_invert_selection          (ETable               *table);
-
-/* This function is only needed in single_selection_mode. */
-void             e_table_right_click_up            (ETable               *table);
-
-void             e_table_commit_click_to_add       (ETable               *table);
-
-void             e_table_commit_click_to_add       (ETable               *table);
-
-G_END_DECLS
-
-#endif /* _E_TABLE_H_ */
-
diff --git a/widgets/table/e-tree-memory-callbacks.c b/widgets/table/e-tree-memory-callbacks.c
deleted file mode 100644
index b6fe3fc375..0000000000
--- a/widgets/table/e-tree-memory-callbacks.c
+++ /dev/null
@@ -1,275 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-tree-memory-callbacks.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <gtk/gtksignal.h>
-#include "gal/util/e-util.h"
-#include "e-tree-memory-callbacks.h"
-
-#define PARENT_TYPE E_TREE_MEMORY_TYPE
-
-static GdkPixbuf *
-etmc_icon_at (ETreeModel *etm, ETreePath node)
-{
-	ETreeMemoryCallbacks *etmc = E_TREE_MEMORY_CALLBACKS(etm);
-
-	return etmc->icon_at (etm, node, etmc->model_data);
-}
-
-static int
-etmc_column_count (ETreeModel *etm)
-{
-	ETreeMemoryCallbacks *etmc = E_TREE_MEMORY_CALLBACKS(etm);
-
-	if (etmc->column_count)
-		return etmc->column_count (etm, etmc->model_data);
-	else
-		return 0;
-}
-
-
-static gboolean
-etmc_has_save_id (ETreeModel *etm)
-{
-	ETreeMemoryCallbacks *etmc = E_TREE_MEMORY_CALLBACKS(etm);
-
-	if (etmc->has_save_id)
-		return etmc->has_save_id (etm, etmc->model_data);
-	else
-		return FALSE;
-}
-
-static char *
-etmc_get_save_id (ETreeModel *etm, ETreePath node)
-{
-	ETreeMemoryCallbacks *etmc = E_TREE_MEMORY_CALLBACKS(etm);
-
-	if (etmc->get_save_id)
-		return etmc->get_save_id (etm, node, etmc->model_data);
-	else
-		return NULL;
-}
-
-static gboolean
-etmc_has_get_node_by_id (ETreeModel *etm)
-{
-	ETreeMemoryCallbacks *etmc = E_TREE_MEMORY_CALLBACKS(etm);
-
-	if (etmc->has_get_node_by_id)
-		return etmc->has_get_node_by_id (etm, etmc->model_data);
-	else
-		return FALSE;
-}
-
-static ETreePath
-etmc_get_node_by_id (ETreeModel *etm, const char *save_id)
-{
-	ETreeMemoryCallbacks *etmc = E_TREE_MEMORY_CALLBACKS(etm);
-
-	if (etmc->get_node_by_id)
-		return etmc->get_node_by_id (etm, save_id, etmc->model_data);
-	else
-		return NULL;
-}
-
-
-static void *
-etmc_value_at (ETreeModel *etm, ETreePath node, int col)
-{
-	ETreeMemoryCallbacks *etmc = E_TREE_MEMORY_CALLBACKS(etm);
-
-	return etmc->value_at (etm, node, col, etmc->model_data);
-}
-
-static void
-etmc_set_value_at (ETreeModel *etm, ETreePath node, int col, const void *val)
-{
-	ETreeMemoryCallbacks *etmc = E_TREE_MEMORY_CALLBACKS(etm);
-
-	etmc->set_value_at (etm, node, col, val, etmc->model_data);
-}
-
-static gboolean
-etmc_is_editable (ETreeModel *etm, ETreePath node, int col)
-{
-	ETreeMemoryCallbacks *etmc = E_TREE_MEMORY_CALLBACKS(etm);
-
-	return etmc->is_editable (etm, node, col, etmc->model_data);
-}
-
-
-/* The default for etmc_duplicate_value is to return the raw value. */
-static void *
-etmc_duplicate_value (ETreeModel *etm, int col, const void *value)
-{
-	ETreeMemoryCallbacks *etmc = E_TREE_MEMORY_CALLBACKS(etm);
-
-	if (etmc->duplicate_value)
-		return etmc->duplicate_value (etm, col, value, etmc->model_data);
-	else
-		return (void *)value;
-}
-
-static void
-etmc_free_value (ETreeModel *etm, int col, void *value)
-{
-	ETreeMemoryCallbacks *etmc = E_TREE_MEMORY_CALLBACKS(etm);
-
-	if (etmc->free_value)
-		etmc->free_value (etm, col, value, etmc->model_data);
-}
-
-static void *
-etmc_initialize_value (ETreeModel *etm, int col)
-{
-	ETreeMemoryCallbacks *etmc = E_TREE_MEMORY_CALLBACKS(etm);
-	
-	if (etmc->initialize_value)
-		return etmc->initialize_value (etm, col, etmc->model_data);
-	else
-		return NULL;
-}
-
-static gboolean
-etmc_value_is_empty (ETreeModel *etm, int col, const void *value)
-{
-	ETreeMemoryCallbacks *etmc = E_TREE_MEMORY_CALLBACKS(etm);
-	
-	if (etmc->value_is_empty)
-		return etmc->value_is_empty (etm, col, value, etmc->model_data);
-	else
-		return FALSE;
-}
-
-static char *
-etmc_value_to_string (ETreeModel *etm, int col, const void *value)
-{
-	ETreeMemoryCallbacks *etmc = E_TREE_MEMORY_CALLBACKS(etm);
-	
-	if (etmc->value_to_string)
-		return etmc->value_to_string (etm, col, value, etmc->model_data);
-	else
-		return g_strdup ("");
-}
-
-static void
-e_tree_memory_callbacks_class_init (GtkObjectClass *object_class)
-{
-	ETreeModelClass *model_class        = (ETreeModelClass *) object_class;
-
-	model_class->icon_at            = etmc_icon_at;
-
-	model_class->column_count       = etmc_column_count;
-
-	model_class->has_save_id        = etmc_has_save_id;
-	model_class->get_save_id        = etmc_get_save_id;
-
-	model_class->has_get_node_by_id = etmc_has_get_node_by_id;
-	model_class->get_node_by_id     = etmc_get_node_by_id;
-
-	model_class->value_at           = etmc_value_at;
-	model_class->set_value_at       = etmc_set_value_at;
-	model_class->is_editable        = etmc_is_editable;
-
-	model_class->duplicate_value    = etmc_duplicate_value;
-	model_class->free_value         = etmc_free_value;
-	model_class->initialize_value   = etmc_initialize_value;
-	model_class->value_is_empty     = etmc_value_is_empty;
-	model_class->value_to_string    = etmc_value_to_string;
-}
-
-E_MAKE_TYPE(e_tree_memory_callbacks, "ETreeMemoryCallbacks", ETreeMemoryCallbacks, e_tree_memory_callbacks_class_init, NULL, PARENT_TYPE)
-
-/**
- * e_tree_memory_callbacks_new:
- * 
- * This initializes a new ETreeMemoryCallbacksModel object.
- * ETreeMemoryCallbacksModel is an implementaiton of the somewhat
- * abstract class ETreeMemory.  The ETreeMemoryCallbacksModel is
- * designed to allow people to easily create ETreeMemorys without
- * having to create a new GtkType derived from ETreeMemory every time
- * they need one.
- *
- * Instead, ETreeMemoryCallbacksModel uses a setup based in callback functions, every
- * callback function signature mimics the signature of each ETreeModel method
- * and passes the extra @data pointer to each one of the method to provide them
- * with any context they might want to use. 
- * 
- * ETreeMemoryCallbacks is to ETreeMemory as ETableSimple is to ETableModel.
- *
- * Return value: An ETreeMemoryCallbacks object (which is also an
- * ETreeMemory and thus an ETreeModel object).
- *
- */
-ETreeModel *
-e_tree_memory_callbacks_new  (ETreeMemoryCallbacksIconAtFn icon_at,
-
-			      ETreeMemoryCallbacksColumnCountFn        column_count,
-
-			      ETreeMemoryCallbacksHasSaveIdFn          has_save_id,
-			      ETreeMemoryCallbacksGetSaveIdFn          get_save_id,
-
-			      ETreeMemoryCallbacksHasGetNodeByIdFn     has_get_node_by_id,
-			      ETreeMemoryCallbacksGetNodeByIdFn        get_node_by_id,
-
-			      ETreeMemoryCallbacksValueAtFn            value_at,
-			      ETreeMemoryCallbacksSetValueAtFn         set_value_at,
-			      ETreeMemoryCallbacksIsEditableFn         is_editable,
-
-			      ETreeMemoryCallbacksDuplicateValueFn     duplicate_value,
-			      ETreeMemoryCallbacksFreeValueFn          free_value,
-			      ETreeMemoryCallbacksInitializeValueFn    initialize_value,
-			      ETreeMemoryCallbacksValueIsEmptyFn       value_is_empty,
-			      ETreeMemoryCallbacksValueToStringFn      value_to_string,
-
-			      gpointer                                 model_data)
-{
-	ETreeMemoryCallbacks *etmc;
-
-	etmc = g_object_new (E_TREE_MEMORY_CALLBACKS_TYPE, NULL);
-
-	etmc->icon_at            = icon_at;
-
-	etmc->column_count       = column_count;
-
-	etmc->has_save_id        = has_save_id;
-	etmc->get_save_id        = get_save_id;
-
-	etmc->has_get_node_by_id = has_get_node_by_id;
-	etmc->get_node_by_id     = get_node_by_id;
-
-	etmc->value_at           = value_at;
-	etmc->set_value_at       = set_value_at;
-	etmc->is_editable        = is_editable;
-
-	etmc->duplicate_value    = duplicate_value;
-	etmc->free_value         = free_value;
-	etmc->initialize_value   = initialize_value;
-	etmc->value_is_empty     = value_is_empty;
-	etmc->value_to_string    = value_to_string;
-
-	etmc->model_data         = model_data;
-
-	return (ETreeModel*)etmc;
-}
-
diff --git a/widgets/table/e-tree-memory-callbacks.h b/widgets/table/e-tree-memory-callbacks.h
deleted file mode 100644
index 0f75fa98be..0000000000
--- a/widgets/table/e-tree-memory-callbacks.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-tree-memory-callbacks.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-
-#ifndef _E_TREE_MEMORY_CALLBACKS_H_
-#define _E_TREE_MEMORY_CALLBACKS_H_
-
-#include <gal/e-table/e-tree-memory.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#define E_TREE_MEMORY_CALLBACKS_TYPE        (e_tree_memory_callbacks_get_type ())
-#define E_TREE_MEMORY_CALLBACKS(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TREE_MEMORY_CALLBACKS_TYPE, ETreeMemoryCallbacks))
-#define E_TREE_MEMORY_CALLBACKS_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TREE_MEMORY_CALLBACKS_TYPE, ETreeMemoryCallbacksClass))
-#define E_IS_TREE_MEMORY_CALLBACKS(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TREE_MEMORY_CALLBACKS_TYPE))
-#define E_IS_TREE_MEMORY_CALLBACKS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TREE_MEMORY_CALLBACKS_TYPE))
-
-
-typedef GdkPixbuf* (*ETreeMemoryCallbacksIconAtFn)             (ETreeModel *etree, ETreePath path, void *model_data);
-
-typedef gint       (*ETreeMemoryCallbacksColumnCountFn)        (ETreeModel *etree, void *model_data);
-
-typedef gboolean   (*ETreeMemoryCallbacksHasSaveIdFn)          (ETreeModel *etree, void *model_data);
-typedef gchar     *(*ETreeMemoryCallbacksGetSaveIdFn)          (ETreeModel *etree, ETreePath path, void *model_data);
-
-typedef gboolean   (*ETreeMemoryCallbacksHasGetNodeByIdFn)     (ETreeModel *etree, void *model_data);
-typedef ETreePath  (*ETreeMemoryCallbacksGetNodeByIdFn)        (ETreeModel *etree, const char *save_id, void *model_data);
-
-typedef void*      (*ETreeMemoryCallbacksValueAtFn)            (ETreeModel *etree, ETreePath path, int col, void *model_data);
-typedef void       (*ETreeMemoryCallbacksSetValueAtFn)         (ETreeModel *etree, ETreePath path, int col, const void *val, void *model_data);
-typedef gboolean   (*ETreeMemoryCallbacksIsEditableFn)         (ETreeModel *etree, ETreePath path, int col, void *model_data);
-
-typedef	void      *(*ETreeMemoryCallbacksDuplicateValueFn)     (ETreeModel *etm, int col, const void *val, void *data);
-typedef	void       (*ETreeMemoryCallbacksFreeValueFn)          (ETreeModel *etm, int col, void *val, void *data);
-typedef void      *(*ETreeMemoryCallbacksInitializeValueFn)    (ETreeModel *etm, int col, void *data);
-typedef gboolean   (*ETreeMemoryCallbacksValueIsEmptyFn)       (ETreeModel *etm, int col, const void *val, void *data);
-typedef char      *(*ETreeMemoryCallbacksValueToStringFn)      (ETreeModel *etm, int col, const void *val, void *data);
-
-typedef struct {
-	ETreeMemory parent;
-
-	ETreeMemoryCallbacksIconAtFn icon_at;
-
-	ETreeMemoryCallbacksColumnCountFn     column_count;
-
-	ETreeMemoryCallbacksHasSaveIdFn       has_save_id;
-	ETreeMemoryCallbacksGetSaveIdFn       get_save_id;
-
-	ETreeMemoryCallbacksHasGetNodeByIdFn  has_get_node_by_id;
-	ETreeMemoryCallbacksGetNodeByIdFn     get_node_by_id;
-
-	ETreeMemoryCallbacksValueAtFn         value_at;
-	ETreeMemoryCallbacksSetValueAtFn      set_value_at;
-	ETreeMemoryCallbacksIsEditableFn      is_editable;
-
-	ETreeMemoryCallbacksDuplicateValueFn  duplicate_value;
-	ETreeMemoryCallbacksFreeValueFn       free_value;
-	ETreeMemoryCallbacksInitializeValueFn initialize_value;
-	ETreeMemoryCallbacksValueIsEmptyFn    value_is_empty;
-	ETreeMemoryCallbacksValueToStringFn   value_to_string;
-
-	gpointer model_data;
-} ETreeMemoryCallbacks;
-
-typedef struct {
-	ETreeMemoryClass parent_class;
-} ETreeMemoryCallbacksClass;
-
-GType   e_tree_memory_callbacks_get_type (void);
-
-ETreeModel *e_tree_memory_callbacks_new  (ETreeMemoryCallbacksIconAtFn icon_at,
-
-					  ETreeMemoryCallbacksColumnCountFn        column_count,
-
-					  ETreeMemoryCallbacksHasSaveIdFn          has_save_id,
-					  ETreeMemoryCallbacksGetSaveIdFn          get_save_id,
-
-					  ETreeMemoryCallbacksHasGetNodeByIdFn     has_get_node_by_id,
-					  ETreeMemoryCallbacksGetNodeByIdFn        get_node_by_id,
-
-					  ETreeMemoryCallbacksValueAtFn            value_at,
-					  ETreeMemoryCallbacksSetValueAtFn         set_value_at,
-					  ETreeMemoryCallbacksIsEditableFn         is_editable,
-
-					  ETreeMemoryCallbacksDuplicateValueFn     duplicate_value,
-					  ETreeMemoryCallbacksFreeValueFn          free_value,
-					  ETreeMemoryCallbacksInitializeValueFn    initialize_value,
-					  ETreeMemoryCallbacksValueIsEmptyFn       value_is_empty,
-					  ETreeMemoryCallbacksValueToStringFn      value_to_string,
-
-					  gpointer                                 model_data);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_TREE_MEMORY_CALLBACKS_H_ */
diff --git a/widgets/table/e-tree-memory.c b/widgets/table/e-tree-memory.c
deleted file mode 100644
index 3f178455df..0000000000
--- a/widgets/table/e-tree-memory.c
+++ /dev/null
@@ -1,717 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-tree-memory.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Chris Toshok <toshok@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-
-#include "gal/util/e-util.h"
-#include "gal/util/e-xml-utils.h"
-#include "e-tree-memory.h"
-
-#define TREEPATH_CHUNK_AREA_SIZE (30 * sizeof (ETreeMemoryPath))
-
-static ETreeModelClass *parent_class;
-static GMemChunk  *node_chunk;
-
-enum {
-	FILL_IN_CHILDREN,
-	LAST_SIGNAL
-};
-
-static guint signals [LAST_SIGNAL] = { 0, };
-
-typedef struct ETreeMemoryPath ETreeMemoryPath;
-
-struct ETreeMemoryPath {
-	gpointer         node_data;
-
-	guint            children_computed : 1;
-
-	/* parent/child/sibling pointers */
-	ETreeMemoryPath *parent;
-	ETreeMemoryPath *next_sibling;
-	ETreeMemoryPath *prev_sibling;
-	ETreeMemoryPath *first_child;
-	ETreeMemoryPath *last_child;
-
-	gint             num_children;
-};
-
-struct ETreeMemoryPriv {
-	ETreeMemoryPath *root;
-	gboolean         expanded_default; /* whether nodes are created expanded or collapsed by default */
-	gint             frozen;
-	GFunc            destroy_func;
-	gpointer         destroy_user_data;
-};
-
-
-/* ETreeMemoryPath functions */
-
-static inline void
-check_children (ETreeMemory *memory, ETreePath node)
-{
-	ETreeMemoryPath *path = node;
-	if (!path->children_computed) {
-		g_signal_emit (G_OBJECT (memory), signals[FILL_IN_CHILDREN], 0, node);
-		path->children_computed = TRUE;
-	}
-}
-
-static int
-e_tree_memory_path_depth (ETreeMemoryPath *path)
-{
-	int depth = 0;
-
-	g_return_val_if_fail(path != NULL, -1);
-
-	for ( path = path->parent; path; path = path->parent)
-		depth ++;
-	return depth;
-}
-
-static void
-e_tree_memory_path_insert (ETreeMemoryPath *parent, int position, ETreeMemoryPath *child)
-{
-	g_return_if_fail (position <= parent->num_children && position >= -1);
-
-	child->parent = parent;
-
-	if (parent->first_child == NULL)
-		parent->first_child = child;
-
-	if (position == -1 || position == parent->num_children) {
-		child->prev_sibling = parent->last_child;
-		if (parent->last_child)
-			parent->last_child->next_sibling = child;
-		parent->last_child = child;
-	} else {
-		ETreeMemoryPath *c;
-		for (c = parent->first_child; c; c = c->next_sibling) {
-			if (position == 0) {
-				child->next_sibling = c;
-				child->prev_sibling = c->prev_sibling;
-
-				if (child->next_sibling)
-					child->next_sibling->prev_sibling = child;
-				if (child->prev_sibling)
-					child->prev_sibling->next_sibling = child;
-
-				if (parent->first_child == c)
-					parent->first_child = child;
-				break;
-			}
-			position --;
-		}
-	}
-
-	parent->num_children++;
-}
-
-static void
-e_tree_path_unlink (ETreeMemoryPath *path)
-{
-	ETreeMemoryPath *parent = path->parent;
-
-	/* unlink first/last child if applicable */
-	if (parent) {
-		if (path == parent->first_child)
-			parent->first_child = path->next_sibling;
-		if (path == parent->last_child)
-			parent->last_child = path->prev_sibling;
-
-		parent->num_children --;
-	}
-
-	/* unlink prev/next sibling links */
-	if (path->next_sibling)
-		path->next_sibling->prev_sibling = path->prev_sibling;
-	if (path->prev_sibling)
-		path->prev_sibling->next_sibling = path->next_sibling;
-
-	path->parent = NULL;
-	path->next_sibling = NULL;
-	path->prev_sibling = NULL;
-}
-
-
-
-/**
- * e_tree_memory_freeze:
- * @etmm: the ETreeModel to freeze.
- * 
- * This function prepares an ETreeModel for a period of much change.
- * All signals regarding changes to the tree are deferred until we
- * thaw the tree.
- * 
- **/
-void
-e_tree_memory_freeze(ETreeMemory *etmm)
-{
-	ETreeMemoryPriv *priv = etmm->priv;
-
-	if (priv->frozen == 0)
-		e_tree_model_pre_change(E_TREE_MODEL(etmm));
-
-	priv->frozen ++;
-}
-
-/**
- * e_tree_memory_thaw:
- * @etmm: the ETreeMemory to thaw.
- * 
- * This function thaws an ETreeMemory.  All the defered signals can add
- * up to a lot, we don't know - so we just emit a model_changed
- * signal.
- * 
- **/
-void
-e_tree_memory_thaw(ETreeMemory *etmm)
-{
-	ETreeMemoryPriv *priv = etmm->priv;
-
-	if (priv->frozen > 0)
-		priv->frozen --;
-	if (priv->frozen == 0) {
-		e_tree_model_node_changed(E_TREE_MODEL(etmm), priv->root);
-	}
-}
-
-
-/* virtual methods */
-
-static void
-etmm_dispose (GObject *object)
-{
-	ETreeMemory *etmm = E_TREE_MEMORY (object);
-	ETreeMemoryPriv *priv = etmm->priv;
-
-	if (priv) {
-	/* XXX lots of stuff to free here */
-
-		if (priv->root)
-			e_tree_memory_node_remove (etmm, priv->root);
-
-		g_free (priv);
-	}
-	etmm->priv = NULL;
-
-	G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static ETreePath
-etmm_get_root (ETreeModel *etm)
-{
-	ETreeMemoryPriv *priv = E_TREE_MEMORY(etm)->priv;
-	return priv->root;
-}
-
-static ETreePath
-etmm_get_parent (ETreeModel *etm, ETreePath node)
-{
-	ETreeMemoryPath *path = node;
-	return path->parent;
-}
-
-static ETreePath
-etmm_get_first_child (ETreeModel *etm, ETreePath node)
-{
-	ETreeMemoryPath *path = node;
-
-	check_children (E_TREE_MEMORY (etm), node);
-	return path->first_child;
-}
-
-static ETreePath
-etmm_get_last_child (ETreeModel *etm, ETreePath node)
-{
-	ETreeMemoryPath *path = node;
-
-	check_children (E_TREE_MEMORY (etm), node);
-	return path->last_child;
-}
-
-static ETreePath
-etmm_get_next (ETreeModel *etm, ETreePath node)
-{
-	ETreeMemoryPath *path = node;
-	return path->next_sibling;
-}
-
-static ETreePath
-etmm_get_prev (ETreeModel *etm, ETreePath node)
-{
-	ETreeMemoryPath *path = node;
-	return path->prev_sibling;
-}
-
-static gboolean
-etmm_is_root (ETreeModel *etm, ETreePath node)
-{
- 	ETreeMemoryPath *path = node;
-	return e_tree_memory_path_depth (path) == 0;
-}
-
-static gboolean
-etmm_is_expandable (ETreeModel *etm, ETreePath node)
-{
-	ETreeMemoryPath *path = node;
-
-	check_children (E_TREE_MEMORY (etm), node);
-	return path->first_child != NULL;
-}
-
-static guint
-etmm_get_children (ETreeModel *etm, ETreePath node, ETreePath **nodes)
-{
-	ETreeMemoryPath *path = node;
-	guint n_children;
-
-	check_children (E_TREE_MEMORY (etm), node);
-
-	n_children = path->num_children;
-
-	if (nodes) {
-		ETreeMemoryPath *p;
-		int i = 0;
-
-		(*nodes) = g_new (ETreePath, n_children);
-		for (p = path->first_child; p; p = p->next_sibling) {
-			(*nodes)[i++] = p;
-		}
-	}
-
-	return n_children;
-}
-
-static guint
-etmm_depth (ETreeModel *etm, ETreePath path)
-{
-	return e_tree_memory_path_depth(path);
-}
-
-static gboolean
-etmm_get_expanded_default (ETreeModel *etm)
-{
-	ETreeMemory *etmm = E_TREE_MEMORY (etm);
-	ETreeMemoryPriv *priv = etmm->priv;
-
-	return priv->expanded_default;
-}
-
-static void
-etmm_clear_children_computed (ETreeMemoryPath *path)
-{
-	for (path = path->first_child; path; path = path->next_sibling) {
-		path->children_computed = FALSE;
-		etmm_clear_children_computed (path);
-	}
-}
-
-static void
-etmm_node_request_collapse (ETreeModel *etm, ETreePath node)
-{
-	if (node)
-		etmm_clear_children_computed (node);
-
-	if (parent_class->node_request_collapse) {
-		parent_class->node_request_collapse (etm, node);
-	}
-}
-
-
-static void
-e_tree_memory_class_init (ETreeMemoryClass *klass)
-{
-	ETreeModelClass *tree_class = (ETreeModelClass *) klass;
-	GObjectClass  *object_class = (GObjectClass *) klass;
-
-	parent_class                     = g_type_class_peek_parent (klass);
-	
-	node_chunk                       = g_mem_chunk_create (ETreeMemoryPath, TREEPATH_CHUNK_AREA_SIZE, G_ALLOC_AND_FREE);
-
-	signals [FILL_IN_CHILDREN] =
-		g_signal_new ("fill_in_children",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeMemoryClass, fill_in_children),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__POINTER,
-			      G_TYPE_NONE, 1, G_TYPE_POINTER);
-
-	object_class->dispose             = etmm_dispose;
-
-	tree_class->get_root              = etmm_get_root;
-	tree_class->get_prev              = etmm_get_prev;
-	tree_class->get_next              = etmm_get_next;
-	tree_class->get_first_child       = etmm_get_first_child;
-	tree_class->get_last_child        = etmm_get_last_child;
-	tree_class->get_parent            = etmm_get_parent;
-
-	tree_class->is_root               = etmm_is_root;
-	tree_class->is_expandable         = etmm_is_expandable;
-	tree_class->get_children          = etmm_get_children;
-	tree_class->depth                 = etmm_depth;
-	tree_class->get_expanded_default  = etmm_get_expanded_default;
-
-	tree_class->node_request_collapse = etmm_node_request_collapse;
-
-	klass->fill_in_children           = NULL;
-}
-
-static void
-e_tree_memory_init (GObject *object)
-{
-	ETreeMemory *etmm = (ETreeMemory *)object;
-
-	ETreeMemoryPriv *priv;
-
-	priv = g_new0 (ETreeMemoryPriv, 1);
-	etmm->priv = priv;
-
-	priv->root = NULL;
-	priv->frozen = 0;
-	priv->expanded_default = 0;
-	priv->destroy_func = NULL;
-	priv->destroy_user_data = NULL;
-}
-
-E_MAKE_TYPE(e_tree_memory, "ETreeMemory", ETreeMemory, e_tree_memory_class_init, e_tree_memory_init, E_TREE_MODEL_TYPE)
-
-
-
-/**
- * e_tree_memory_construct:
- * @etree: 
- * 
- * 
- **/
-void
-e_tree_memory_construct (ETreeMemory *etmm)
-{
-}
-
-/**
- * e_tree_memory_new
- *
- * XXX docs here.
- *
- * return values: a newly constructed ETreeMemory.
- */
-ETreeMemory *
-e_tree_memory_new (void)
-{
-	return (ETreeMemory *) g_object_new (E_TREE_MEMORY_TYPE, NULL);
-}
-
-void
-e_tree_memory_set_expanded_default         (ETreeMemory *etree, gboolean expanded)
-{
-	etree->priv->expanded_default = expanded;
-}
-
-/**
- * e_tree_memory_node_get_data:
- * @etmm: 
- * @node: 
- * 
- * 
- * 
- * Return value: 
- **/
-gpointer
-e_tree_memory_node_get_data (ETreeMemory *etmm, ETreePath node)
-{
-	ETreeMemoryPath *path = node;
-
-	g_return_val_if_fail (path, NULL);
-
-	return path->node_data;
-}
-
-/**
- * e_tree_memory_node_set_data:
- * @etmm: 
- * @node: 
- * @node_data: 
- * 
- * 
- **/
-void
-e_tree_memory_node_set_data (ETreeMemory *etmm, ETreePath node, gpointer node_data)
-{
-	ETreeMemoryPath *path = node;
-
-	g_return_if_fail (path);
-
-	path->node_data = node_data;
-}
-
-/**
- * e_tree_memory_node_insert:
- * @tree_model: 
- * @parent_path: 
- * @position: 
- * @node_data: 
- * 
- * 
- * 
- * Return value: 
- **/
-ETreePath
-e_tree_memory_node_insert (ETreeMemory *tree_model,
-			   ETreePath parent_node,
-			   int position,
-			   gpointer node_data)
-{
-	ETreeMemoryPriv *priv;
-	ETreeMemoryPath *new_path;
-	ETreeMemoryPath *parent_path = parent_node;
-
-	g_return_val_if_fail(tree_model != NULL, NULL);
-
-	priv = tree_model->priv;
-
-	g_return_val_if_fail (parent_path != NULL || priv->root == NULL, NULL);
-
-	priv = tree_model->priv;
-
-	if (!tree_model->priv->frozen)
-		e_tree_model_pre_change(E_TREE_MODEL(tree_model));
-
-	new_path = g_chunk_new0 (ETreeMemoryPath, node_chunk);
-
-	new_path->node_data = node_data;
-	new_path->children_computed = FALSE;
-
-	if (parent_path != NULL) {
-		e_tree_memory_path_insert (parent_path, position, new_path);
-		if (!tree_model->priv->frozen)
-			e_tree_model_node_inserted (E_TREE_MODEL(tree_model), parent_path, new_path);
-	} else {
-		priv->root = new_path;
-		if (!tree_model->priv->frozen)
-			e_tree_model_node_changed(E_TREE_MODEL(tree_model), new_path);
-	}
-
-	return new_path;
-}
-
-ETreePath e_tree_memory_node_insert_id     (ETreeMemory *etree, ETreePath parent, int position, gpointer node_data, char *id)
-{
-	return e_tree_memory_node_insert(etree, parent, position, node_data);
-}
-
-/**
- * e_tree_memory_node_insert_before:
- * @etree: 
- * @parent: 
- * @sibling: 
- * @node_data: 
- * 
- * 
- * 
- * Return value: 
- **/
-ETreePath
-e_tree_memory_node_insert_before (ETreeMemory *etree,
-				  ETreePath parent,
-				  ETreePath sibling,
-				  gpointer node_data)
-{
-	ETreeMemoryPath *child;
-	ETreeMemoryPath *parent_path = parent;
-	ETreeMemoryPath *sibling_path = sibling;
-	int position = 0;
-
-	g_return_val_if_fail(etree != NULL, NULL);
-
-	if (sibling != NULL) {
-		for (child = parent_path->first_child; child; child = child->next_sibling) {
-			if (child == sibling_path)
-				break;
-			position ++;
-		}
-	} else
-		position = parent_path->num_children;
-	return e_tree_memory_node_insert (etree, parent, position, node_data);
-}
-
-/* just blows away child data, doesn't take into account unlinking/etc */
-static void
-child_free(ETreeMemory *etree, ETreeMemoryPath *node)
-{
-	ETreeMemoryPath *child, *next;
-
-	child = node->first_child;
-	while (child) {
-		next = child->next_sibling;
-		child_free(etree, child);
-		child = next;
-	}
-
-	if (etree->priv->destroy_func) {
-		etree->priv->destroy_func (node->node_data, etree->priv->destroy_user_data);
-	}
-
-	g_chunk_free(node, node_chunk);
-}
-
-/**
- * e_tree_memory_node_remove:
- * @etree: 
- * @path: 
- * 
- * 
- * 
- * Return value: 
- **/
-gpointer
-e_tree_memory_node_remove (ETreeMemory *etree, ETreePath node)
-{
-	ETreeMemoryPath *path = node;
-	ETreeMemoryPath *parent = path->parent;
-	ETreeMemoryPath *sibling;
-	gpointer ret = path->node_data;
-	int old_position = 0;
-
-	g_return_val_if_fail(etree != NULL, NULL);
-
-	if (!etree->priv->frozen) {
-		e_tree_model_pre_change(E_TREE_MODEL(etree));
-		for (old_position = 0, sibling = path;
-		     sibling; 
-		     old_position++, sibling = sibling->prev_sibling)
-			/* Empty intentionally*/;
-		old_position --;
-	}
-
-	/* unlink this node - we only have to unlink the root node being removed,
-	   since the others are only references from this node */
-	e_tree_path_unlink (path);
-
-	/*printf("removing %d nodes from position %d\n", visible, base);*/
-	if (!etree->priv->frozen)
-		e_tree_model_node_removed(E_TREE_MODEL(etree), parent, path, old_position);
-
-	child_free(etree, path);
-
-	if (path == etree->priv->root)
-		etree->priv->root = NULL;
-
-	if (!etree->priv->frozen)
-		e_tree_model_node_deleted(E_TREE_MODEL(etree), path);
-
-	return ret;
-}
-
-typedef struct {
-	ETreeMemory *memory;
-	gpointer closure;
-	ETreeMemorySortCallback callback;
-} MemoryAndClosure;
-
-static int
-sort_callback(const void *data1, const void *data2, gpointer user_data)
-{
-	ETreePath path1 = *(ETreePath *)data1;
-	ETreePath path2 = *(ETreePath *)data2;
-	MemoryAndClosure *mac = user_data;
-	return (*mac->callback) (mac->memory, path1, path2, mac->closure);
-}
-
-void
-e_tree_memory_sort_node             (ETreeMemory             *etmm,
-				     ETreePath                node,
-				     ETreeMemorySortCallback  callback,
-				     gpointer                 user_data)
-{
-	ETreeMemoryPath **children;
-	ETreeMemoryPath *child;
-	int count;
-	int i;
-	ETreeMemoryPath *path = node;
-	MemoryAndClosure mac;
-	ETreeMemoryPath *last;
-
-	e_tree_model_pre_change (E_TREE_MODEL (etmm));
-	
-	i = 0;
-	for (child = path->first_child; child; child = child->next_sibling)
-		i++;
-
-	children = g_new(ETreeMemoryPath *, i);
-
-	count = i;
-
-	for (child = path->first_child, i = 0;
-	     child;
-	     child = child->next_sibling, i++) {
-		children[i] = child;
-	}
-
-	mac.memory = etmm;
-	mac.closure = user_data;
-	mac.callback = callback;
-
-	e_sort (children, count, sizeof (ETreeMemoryPath *), sort_callback, &mac);
-
-	path->first_child = NULL;
-	last = NULL;
-	for (i = 0;
-	     i < count;
-	     i++) {
-		children[i]->prev_sibling = last;
-		if (last)
-			last->next_sibling = children[i];
-		else
-			path->first_child = children[i];
-		last = children[i];
-	}
-	if (last)
-		last->next_sibling = NULL;
-
-	path->last_child = last;
-
-	g_free(children);
-
-	e_tree_model_node_changed(E_TREE_MODEL(etmm), node);
-}
-
-void
-e_tree_memory_set_node_destroy_func  (ETreeMemory             *etmm,
-				      GFunc                    destroy_func,
-				      gpointer                 user_data)
-{
-	etmm->priv->destroy_func = destroy_func;
-	etmm->priv->destroy_user_data = user_data;
-}
diff --git a/widgets/table/e-tree-memory.h b/widgets/table/e-tree-memory.h
deleted file mode 100644
index ce0003b60a..0000000000
--- a/widgets/table/e-tree-memory.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-tree-memory.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Chris Toshok <toshok@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TREE_MEMORY_H_
-#define _E_TREE_MEMORY_H_
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gal/e-table/e-tree-model.h>
-
-G_BEGIN_DECLS
-
-#define E_TREE_MEMORY_TYPE        (e_tree_memory_get_type ())
-#define E_TREE_MEMORY(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TREE_MEMORY_TYPE, ETreeMemory))
-#define E_TREE_MEMORY_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TREE_MEMORY_TYPE, ETreeMemoryClass))
-#define E_IS_TREE_MEMORY(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TREE_MEMORY_TYPE))
-#define E_IS_TREE_MEMORY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TREE_MEMORY_TYPE))
-#define E_TREE_MEMORY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TREE_MEMORY_TYPE, ETreeMemoryClass))
-
-typedef struct ETreeMemory ETreeMemory;
-typedef struct ETreeMemoryPriv ETreeMemoryPriv;
-typedef struct ETreeMemoryClass ETreeMemoryClass;
-
-typedef int (*ETreeMemorySortCallback) (ETreeMemory *etmm, ETreePath path1, ETreePath path2, gpointer closure);
-
-struct ETreeMemory {
-	ETreeModel base;
-	ETreeMemoryPriv *priv;
-};
-
-struct ETreeMemoryClass {
-	ETreeModelClass parent_class;
-
-	/* signals */
-	void (*fill_in_children) (ETreeMemory *model, ETreePath node);
-};
-
-
-GType        e_tree_memory_get_type               (void);
-void         e_tree_memory_construct              (ETreeMemory             *etree);
-ETreeMemory *e_tree_memory_new                    (void);
-
-/* node operations */
-ETreePath    e_tree_memory_node_insert            (ETreeMemory             *etree,
-						   ETreePath                parent,
-						   int                      position,
-						   gpointer                 node_data);
-ETreePath    e_tree_memory_node_insert_id         (ETreeMemory             *etree,
-						   ETreePath                parent,
-						   int                      position,
-						   gpointer                 node_data,
-						   char                    *id);
-ETreePath    e_tree_memory_node_insert_before     (ETreeMemory             *etree,
-						   ETreePath                parent,
-						   ETreePath                sibling,
-						   gpointer                 node_data);
-gpointer     e_tree_memory_node_remove            (ETreeMemory             *etree,
-						   ETreePath                path);
-
-/* Freeze and thaw */
-void         e_tree_memory_freeze                 (ETreeMemory             *etree);
-void         e_tree_memory_thaw                   (ETreeMemory             *etree);
-void         e_tree_memory_set_expanded_default   (ETreeMemory             *etree,
-						   gboolean                 expanded);
-gpointer     e_tree_memory_node_get_data          (ETreeMemory             *etm,
-						   ETreePath                node);
-void         e_tree_memory_node_set_data          (ETreeMemory             *etm,
-						   ETreePath                node,
-						   gpointer                 node_data);
-void         e_tree_memory_sort_node              (ETreeMemory             *etm,
-						   ETreePath                node,
-						   ETreeMemorySortCallback  callback,
-						   gpointer                 user_data);
-void         e_tree_memory_set_node_destroy_func  (ETreeMemory             *etmm,
-						   GFunc                    destroy_func,
-						   gpointer                 user_data);
-
-G_END_DECLS
-
-#endif /* _E_TREE_MEMORY_H */
-
diff --git a/widgets/table/e-tree-model.c b/widgets/table/e-tree-model.c
deleted file mode 100644
index 6ca0e17af9..0000000000
--- a/widgets/table/e-tree-model.c
+++ /dev/null
@@ -1,1098 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-tree-model.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey  <clahey@ximian.com>
- *   Chris Toshok <toshok@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-
-#include <gtk/gtksignal.h>
-#include "gal/util/e-util.h"
-#include "gal/util/e-xml-utils.h"
-#include "e-tree-model.h"
-
-#define ETM_CLASS(e) (E_TREE_MODEL_GET_CLASS(e))
-
-#define d(x)
-
-static GObjectClass *parent_class;
-
-enum {
-	PRE_CHANGE,
-	NO_CHANGE,
-	NODE_CHANGED,
-	NODE_DATA_CHANGED,
-	NODE_COL_CHANGED,
-	NODE_INSERTED,
-	NODE_REMOVED,
-	NODE_DELETED,
-	NODE_REQUEST_COLLAPSE,
-	LAST_SIGNAL
-};
-
-static guint e_tree_model_signals [LAST_SIGNAL] = {0, };
-
-
-static void
-e_tree_model_class_init (GObjectClass *klass)
-{
-	ETreeModelClass *tree_class = (ETreeModelClass *) klass;
-
-	parent_class = g_type_class_peek_parent (klass);
-
-	e_tree_model_signals [PRE_CHANGE] =
-		g_signal_new ("pre_change",
-			      E_OBJECT_CLASS_TYPE (klass),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeModelClass, pre_change),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
-
-	e_tree_model_signals [NO_CHANGE] =
-		g_signal_new ("no_change",
-			      E_OBJECT_CLASS_TYPE (klass),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeModelClass, no_change),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
-
-	e_tree_model_signals [NODE_CHANGED] =
-		g_signal_new ("node_changed",
-			      E_OBJECT_CLASS_TYPE (klass),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeModelClass, node_changed),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__POINTER,
-			      G_TYPE_NONE, 1, G_TYPE_POINTER);
-
-	e_tree_model_signals [NODE_DATA_CHANGED] =
-		g_signal_new ("node_data_changed",
-			      E_OBJECT_CLASS_TYPE (klass),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeModelClass, node_data_changed),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__POINTER,
-			      G_TYPE_NONE, 1, G_TYPE_POINTER);
-
-	e_tree_model_signals [NODE_COL_CHANGED] =
-		g_signal_new ("node_col_changed",
-			      E_OBJECT_CLASS_TYPE (klass),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeModelClass, node_col_changed),
-			      (GSignalAccumulator) NULL, NULL,
-			      e_marshal_VOID__POINTER_INT,
-			      G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_INT);
-
-	e_tree_model_signals [NODE_INSERTED] =
-		g_signal_new ("node_inserted",
-			      E_OBJECT_CLASS_TYPE (klass),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeModelClass, node_inserted),
-			      (GSignalAccumulator) NULL, NULL,
-			      e_marshal_VOID__POINTER_POINTER,
-			      G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER);
-
-	e_tree_model_signals [NODE_REMOVED] =
-		g_signal_new ("node_removed",
-			      E_OBJECT_CLASS_TYPE (klass),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeModelClass, node_removed),
-			      (GSignalAccumulator) NULL, NULL,
-			      e_marshal_VOID__POINTER_POINTER_INT,
-			      G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_INT);
-
-	e_tree_model_signals [NODE_DELETED] =
-		g_signal_new ("node_deleted",
-			      E_OBJECT_CLASS_TYPE (klass),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeModelClass, node_deleted),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__POINTER,
-			      G_TYPE_NONE, 1, G_TYPE_POINTER);
-
-	e_tree_model_signals [NODE_REQUEST_COLLAPSE] =
-		g_signal_new ("node_request_collapse",
-			      E_OBJECT_CLASS_TYPE (klass),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeModelClass, node_request_collapse),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__POINTER,
-			      G_TYPE_NONE, 1, G_TYPE_POINTER);
-
-	tree_class->get_root              = NULL;
-
-	tree_class->get_parent            = NULL;
-	tree_class->get_first_child       = NULL;
-	tree_class->get_last_child        = NULL;
-	tree_class->get_next              = NULL;
-	tree_class->get_prev              = NULL;
-
-	tree_class->is_root               = NULL;
-	tree_class->is_expandable         = NULL;
-	tree_class->get_children          = NULL;
-	tree_class->depth                 = NULL;
-
-	tree_class->icon_at               = NULL;
-
-	tree_class->get_expanded_default  = NULL;
-	tree_class->column_count          = NULL;
-
-	tree_class->has_save_id           = NULL;
-	tree_class->get_save_id           = NULL;
-	tree_class->has_get_node_by_id    = NULL;
-	tree_class->get_node_by_id        = NULL;
-
-	tree_class->has_change_pending    = NULL;
-
-	tree_class->value_at              = NULL;
-	tree_class->set_value_at          = NULL;
-	tree_class->is_editable           = NULL;
-
-	tree_class->duplicate_value       = NULL;
-	tree_class->free_value            = NULL;
-	tree_class->initialize_value      = NULL;
-	tree_class->value_is_empty        = NULL;
-	tree_class->value_to_string       = NULL;
-
-	tree_class->pre_change            = NULL;
-	tree_class->no_change             = NULL;
-	tree_class->node_changed          = NULL;
-	tree_class->node_data_changed     = NULL;
-	tree_class->node_col_changed      = NULL;
-	tree_class->node_inserted         = NULL;
-	tree_class->node_removed          = NULL;
-	tree_class->node_deleted          = NULL;
-	tree_class->node_request_collapse = NULL;
-}
-
-E_MAKE_TYPE(e_tree_model, "ETreeModel", ETreeModel, e_tree_model_class_init, NULL, G_TYPE_OBJECT)
-
-
-/* signals */
-
-/**
- * e_tree_model_node_changed:
- * @tree_model: 
- * @node: 
- * 
- * 
- * 
- * Return value: 
- **/
-void
-e_tree_model_pre_change  (ETreeModel *tree_model)
-{
-	g_return_if_fail (tree_model != NULL);
-	g_return_if_fail (E_IS_TREE_MODEL (tree_model));
-	
-	d(g_print("Emitting pre_change on model 0x%p, a %s.\n", tree_model, gtk_type_name (GTK_OBJECT(tree_model)->klass->type)));
-
-	g_signal_emit (G_OBJECT (tree_model), e_tree_model_signals [PRE_CHANGE], 0);
-}
-
-/**
- * e_tree_model_node_changed:
- * @tree_model: 
- * @node: 
- * 
- * 
- * 
- * Return value: 
- **/
-void
-e_tree_model_no_change  (ETreeModel *tree_model)
-{
-	g_return_if_fail (tree_model != NULL);
-	g_return_if_fail (E_IS_TREE_MODEL (tree_model));
-	
-	d(g_print("Emitting no_change on model 0x%p, a %s.\n", tree_model, gtk_type_name (GTK_OBJECT(tree_model)->klass->type)));
-
-	g_signal_emit (G_OBJECT (tree_model), e_tree_model_signals [NO_CHANGE], 0);
-}
-
-/**
- * e_tree_model_node_changed:
- * @tree_model: 
- * @node: 
- * 
- * 
- * 
- * Return value: 
- **/
-void
-e_tree_model_node_changed  (ETreeModel *tree_model, ETreePath node)
-{
-	g_return_if_fail (tree_model != NULL);
-	g_return_if_fail (E_IS_TREE_MODEL (tree_model));
-	
-	d(g_print("Emitting node_changed on model 0x%p, a %s.\n", tree_model, gtk_type_name (GTK_OBJECT(tree_model)->klass->type)));
-
-	g_signal_emit (G_OBJECT (tree_model), e_tree_model_signals [NODE_CHANGED], 0, node);
-}
-
-/**
- * e_tree_model_node_data_changed:
- * @tree_model: 
- * @node: 
- * 
- * 
- * 
- * Return value: 
- **/
-void
-e_tree_model_node_data_changed  (ETreeModel *tree_model, ETreePath node)
-{
-	g_return_if_fail (tree_model != NULL);
-	g_return_if_fail (E_IS_TREE_MODEL (tree_model));
-	
-	d(g_print("Emitting node_data_changed on model 0x%p, a %s.\n", tree_model, gtk_type_name (GTK_OBJECT(tree_model)->klass->type)));
-
-	g_signal_emit (G_OBJECT (tree_model), e_tree_model_signals [NODE_DATA_CHANGED], 0, node);
-}
-
-/**
- * e_tree_model_node_col_changed:
- * @tree_model: 
- * @node: 
- * 
- * 
- * 
- * Return value: 
- **/
-void
-e_tree_model_node_col_changed  (ETreeModel *tree_model, ETreePath node, int col)
-{
-	g_return_if_fail (tree_model != NULL);
-	g_return_if_fail (E_IS_TREE_MODEL (tree_model));
-	
-	d(g_print("Emitting node_col_changed on model 0x%p, a %s.\n", tree_model, gtk_type_name (GTK_OBJECT(tree_model)->klass->type)));
-
-	g_signal_emit (G_OBJECT (tree_model), e_tree_model_signals [NODE_COL_CHANGED], 0, node, col);
-}
-
-/**
- * e_tree_model_node_inserted:
- * @tree_model: 
- * @parent_node: 
- * @inserted_node: 
- * 
- * 
- **/
-void
-e_tree_model_node_inserted (ETreeModel *tree_model,
-			    ETreePath parent_node,
-			    ETreePath inserted_node)
-{
-	g_return_if_fail (tree_model != NULL);
-	g_return_if_fail (E_IS_TREE_MODEL (tree_model));
-
-	d(g_print("Emitting node_inserted on model 0x%p, a %s.\n", tree_model, gtk_type_name (GTK_OBJECT(tree_model)->klass->type)));
-
-	g_signal_emit (G_OBJECT (tree_model), e_tree_model_signals [NODE_INSERTED], 0,
-		       parent_node, inserted_node);
-}
-
-/**
- * e_tree_model_node_removed:
- * @tree_model: 
- * @parent_node: 
- * @removed_node: 
- * 
- * 
- **/
-void
-e_tree_model_node_removed  (ETreeModel *tree_model, ETreePath parent_node, ETreePath removed_node, int old_position)
-{
-	g_return_if_fail (tree_model != NULL);
-	g_return_if_fail (E_IS_TREE_MODEL (tree_model));
-	
-	d(g_print("Emitting node_removed on model 0x%p, a %s.\n", tree_model, gtk_type_name (GTK_OBJECT(tree_model)->klass->type)));
-
-	g_signal_emit (G_OBJECT (tree_model), e_tree_model_signals [NODE_REMOVED], 0,
-		       parent_node, removed_node, old_position);
-}
-
-/**
- * e_tree_model_node_deleted:
- * @tree_model: 
- * @deleted_node: 
- * 
- * 
- **/
-void
-e_tree_model_node_deleted  (ETreeModel *tree_model, ETreePath deleted_node)
-{
-	g_return_if_fail (tree_model != NULL);
-	g_return_if_fail (E_IS_TREE_MODEL (tree_model));
-	
-	d(g_print("Emitting node_deleted on model 0x%p, a %s.\n", tree_model, gtk_type_name (GTK_OBJECT(tree_model)->klass->type)));
-
-	g_signal_emit (G_OBJECT (tree_model), e_tree_model_signals [NODE_DELETED], 0, deleted_node);
-}
-
-/**
- * e_tree_model_node_request_collapse:
- * @tree_model: 
- * @collapsed_node: 
- * 
- * 
- **/
-void
-e_tree_model_node_request_collapse  (ETreeModel *tree_model, ETreePath collapsed_node)
-{
-	g_return_if_fail (tree_model != NULL);
-	g_return_if_fail (E_IS_TREE_MODEL (tree_model));
-	
-	d(g_print("Emitting node_request_collapse on model 0x%p, a %s.\n", tree_model, gtk_type_name (GTK_OBJECT(tree_model)->klass->type)));
-
-	g_signal_emit (G_OBJECT (tree_model), e_tree_model_signals [NODE_REQUEST_COLLAPSE], 0, collapsed_node);
-}
-
-
-
-/**
- * e_tree_model_new
- *
- * XXX docs here.
- *
- * return values: a newly constructed ETreeModel.
- */
-ETreeModel *
-e_tree_model_new ()
-{
-	return (ETreeModel *) g_object_new (E_TREE_MODEL_TYPE, NULL);
-}
-
-/**
- * e_tree_model_get_root
- * @etree: the ETreeModel of which we want the root node.
- *
- * Accessor for the root node of @etree.
- *
- * return values: the ETreePath corresponding to the root node.
- */
-ETreePath 
-e_tree_model_get_root (ETreeModel *etree)
-{
-	g_return_val_if_fail (etree != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE_MODEL (etree), NULL);
-
-	if (ETM_CLASS(etree)->get_root)
-		return ETM_CLASS(etree)->get_root(etree);
-	else
-		return NULL;
-}
-
-/**
- * e_tree_model_node_get_parent:
- * @etree: 
- * @path: 
- * 
- * 
- * 
- * Return value: 
- **/
-ETreePath 
-e_tree_model_node_get_parent (ETreeModel *etree, ETreePath node)
-{
-	g_return_val_if_fail(etree != NULL, NULL);
-	if (ETM_CLASS(etree)->get_parent)
-		return ETM_CLASS(etree)->get_parent(etree, node);
-	else
-		return NULL;
-}
-
-/**
- * e_tree_model_node_get_first_child:
- * @etree: 
- * @node: 
- * 
- * 
- * 
- * Return value: 
- **/
-ETreePath 
-e_tree_model_node_get_first_child (ETreeModel *etree, ETreePath node)
-{
-	g_return_val_if_fail (etree != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE_MODEL (etree), NULL);
-
-	if (ETM_CLASS(etree)->get_first_child)
-		return ETM_CLASS(etree)->get_first_child(etree, node);
-	else
-		return NULL;
-}
-
-/**
- * e_tree_model_node_get_last_child:
- * @etree: 
- * @node: 
- * 
- * 
- * 
- * Return value: 
- **/
-ETreePath 
-e_tree_model_node_get_last_child (ETreeModel *etree, ETreePath node)
-{
-	g_return_val_if_fail (etree != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE_MODEL (etree), NULL);
-
-	if (ETM_CLASS(etree)->get_last_child)
-		return ETM_CLASS(etree)->get_last_child(etree, node);
-	else
-		return NULL;
-}
-
-
-/**
- * e_tree_model_node_get_next:
- * @etree: 
- * @node: 
- * 
- * 
- * 
- * Return value: 
- **/
-ETreePath 
-e_tree_model_node_get_next (ETreeModel *etree, ETreePath node)
-{
-	g_return_val_if_fail (etree != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE_MODEL (etree), NULL);
-
-	if (ETM_CLASS(etree)->get_next)
-		return ETM_CLASS(etree)->get_next(etree, node);
-	else
-		return NULL;
-}
-
-/**
- * e_tree_model_node_get_prev:
- * @etree: 
- * @node: 
- * 
- * 
- * 
- * Return value: 
- **/
-ETreePath 
-e_tree_model_node_get_prev (ETreeModel *etree, ETreePath node)
-{
-	g_return_val_if_fail (etree != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE_MODEL (etree), NULL);
-
-	if (ETM_CLASS(etree)->get_prev)
-		return ETM_CLASS(etree)->get_prev(etree, node);
-	else
-		return NULL;
-}
-
-/**
- * e_tree_model_node_is_root:
- * @etree: 
- * @path: 
- * 
- * 
- * 
- * Return value: 
- **/
-gboolean
-e_tree_model_node_is_root (ETreeModel *etree, ETreePath node)
-{
-	g_return_val_if_fail(etree != NULL, FALSE);
-
-	if (ETM_CLASS(etree)->is_root)
-		return ETM_CLASS(etree)->is_root(etree, node);
-	else
-		return FALSE;
-}
-
-/**
- * e_tree_model_node_is_expandable:
- * @etree: 
- * @path: 
- * 
- * 
- * 
- * Return value: 
- **/
-gboolean
-e_tree_model_node_is_expandable (ETreeModel *etree, ETreePath node)
-{
-	g_return_val_if_fail(etree != NULL, FALSE);
-	g_return_val_if_fail(node != NULL, FALSE);
-
-	if (ETM_CLASS(etree)->is_expandable)
-		return ETM_CLASS(etree)->is_expandable(etree, node);
-	else
-		return FALSE;
-}
-
-guint
-e_tree_model_node_get_children (ETreeModel *etree, ETreePath node, ETreePath **nodes)
-{
-	g_return_val_if_fail(etree != NULL, 0);
-	if (ETM_CLASS(etree)->get_children)
-		return ETM_CLASS(etree)->get_children (etree, node, nodes);
-	else
-		return 0;
-}
-
-/**
- * e_tree_model_node_depth:
- * @etree: 
- * @path: 
- * 
- * 
- * 
- * Return value: 
- **/
-guint
-e_tree_model_node_depth (ETreeModel *etree, ETreePath node)
-{
-	g_return_val_if_fail (etree != NULL, 0);
-	g_return_val_if_fail (E_IS_TREE_MODEL (etree), 0);
-
-	if (ETM_CLASS(etree)->depth)
-		return ETM_CLASS(etree)->depth(etree, node);
-	else
-		return 0;
-}
-
-/**
- * e_tree_model_icon_at
- * @etree: The ETreeModel.
- * @path: The ETreePath to the node we're getting the icon of.
- *
- * XXX docs here.
- *
- * return values: the GdkPixbuf associated with this node.
- */
-GdkPixbuf *
-e_tree_model_icon_at (ETreeModel *etree, ETreePath node)
-{
-	g_return_val_if_fail (etree != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE_MODEL (etree), NULL);
-
-	if (ETM_CLASS(etree)->icon_at)
-		return ETM_CLASS(etree)->icon_at (etree, node);
-	else
-		return NULL;
-}
-
-/**
- * e_tree_model_get_expanded_default
- * @etree: The ETreeModel.
- *
- * XXX docs here.
- *
- * return values: Whether nodes should be expanded by default.
- */
-gboolean
-e_tree_model_get_expanded_default (ETreeModel *etree)
-{
-	g_return_val_if_fail (etree != NULL, FALSE);
-	g_return_val_if_fail (E_IS_TREE_MODEL (etree), FALSE);
-
-	if (ETM_CLASS(etree)->get_expanded_default)
-		return ETM_CLASS(etree)->get_expanded_default (etree);
-	else
-		return FALSE;
-}
-
-/**
- * e_tree_model_column_count
- * @etree: The ETreeModel.
- *
- * XXX docs here.
- *
- * return values: The number of columns
- */
-gint
-e_tree_model_column_count (ETreeModel *etree)
-{
-	g_return_val_if_fail (etree != NULL, 0);
-	g_return_val_if_fail (E_IS_TREE_MODEL (etree), 0);
-
-	if (ETM_CLASS(etree)->column_count)
-		return ETM_CLASS(etree)->column_count (etree);
-	else
-		return 0;
-}
-
-/**
- * e_tree_model_has_save_id
- * @etree: The ETreeModel.
- *
- * XXX docs here.
- *
- * return values: Whether this tree has valid save id data.
- */
-gboolean
-e_tree_model_has_save_id (ETreeModel *etree)
-{
-	g_return_val_if_fail (etree != NULL, FALSE);
-	g_return_val_if_fail (E_IS_TREE_MODEL (etree), FALSE);
-
-	if (ETM_CLASS(etree)->has_save_id)
-		return ETM_CLASS(etree)->has_save_id (etree);
-	else
-		return FALSE;
-}
-
-/**
- * e_tree_model_get_save_id
- * @etree: The ETreeModel.
- * @node: The ETreePath.
- *
- * XXX docs here.
- *
- * return values: The save id for this path.
- */
-gchar *
-e_tree_model_get_save_id (ETreeModel *etree, ETreePath node)
-{
-	g_return_val_if_fail (etree != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE_MODEL (etree), NULL);
-
-	if (ETM_CLASS(etree)->get_save_id)
-		return ETM_CLASS(etree)->get_save_id (etree, node);
-	else
-		return NULL;
-}
-
-/**
- * e_tree_model_has_get_node_by_id
- * @etree: The ETreeModel.
- *
- * XXX docs here.
- *
- * return values: Whether this tree can quickly get a node from its save id.
- */
-gboolean
-e_tree_model_has_get_node_by_id (ETreeModel *etree)
-{
-	g_return_val_if_fail (etree != NULL, FALSE);
-	g_return_val_if_fail (E_IS_TREE_MODEL (etree), FALSE);
-
-	if (ETM_CLASS(etree)->has_get_node_by_id)
-		return ETM_CLASS(etree)->has_get_node_by_id (etree);
-	else
-		return FALSE;
-}
-
-/**
- * e_tree_model_get_node_by_id
- * @etree: The ETreeModel.
- * @node: The ETreePath.
- *
- * get_node_by_id(get_save_id(node)) should be the original node.
- * Likewise if get_node_by_id is not NULL, then
- * get_save_id(get_node_by_id(string)) should be a copy of the
- * original string.
- *
- * return values: The path for this save id.
- */
-ETreePath
-e_tree_model_get_node_by_id (ETreeModel *etree, const char *save_id)
-{
-	g_return_val_if_fail (etree != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE_MODEL (etree), NULL);
-
-	if (ETM_CLASS(etree)->get_node_by_id)
-		return ETM_CLASS(etree)->get_node_by_id (etree, save_id);
-	else
-		return NULL;
-}
-
-/**
- * e_tree_model_has_change_pending
- * @etree: The ETreeModel.
- *
- * XXX docs here.
- *
- * return values: Whether this tree has valid save id data.
- */
-gboolean
-e_tree_model_has_change_pending (ETreeModel *etree)
-{
-	g_return_val_if_fail (etree != NULL, FALSE);
-	g_return_val_if_fail (E_IS_TREE_MODEL (etree), FALSE);
-
-	if (ETM_CLASS(etree)->has_change_pending)
-		return ETM_CLASS(etree)->has_change_pending (etree);
-	else
-		return FALSE;
-}
-
-/**
- * e_tree_model_value_at:
- * @etree: The ETreeModel.
- * @node: The ETreePath to the node we're getting the data from.
- * @col: the column to retrieve data from
- * 
- * Return value: This function returns the value that is stored by the
- * @etree in column @col and node @node.  The data returned can be a
- * pointer or any data value that can be stored inside a pointer.
- *
- * The data returned is typically used by an ECell renderer.
- *
- * The data returned must be valid until the model sends a signal that
- * affect that piece of data.  node_changed and node_deleted affect
- * all data in tha t node and all nodes under that node.
- * node_data_changed affects the data in that node.  node_col_changed
- * affects the data in that node for that column.  node_inserted,
- * node_removed, and no_change don't affect any data in this way.
- **/
-void *
-e_tree_model_value_at (ETreeModel *etree, ETreePath node, int col)
-{
-	g_return_val_if_fail (etree != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE_MODEL (etree), NULL);
-
-	if (ETM_CLASS(etree)->value_at)
-		return ETM_CLASS(etree)->value_at (etree, node, col);
-	else
-		return NULL;
-}
-
-/**
- * e_tree_model_icon_of_node
- * @etree: The ETreeModel.
- * @path: The ETreePath to the node we're getting the icon of.
- *
- * XXX docs here.
- *
- * return values: the GdkPixbuf associated with this node.
- */
-void
-e_tree_model_set_value_at (ETreeModel *etree, ETreePath node, int col, const void *val)
-{
-	g_return_if_fail (etree != NULL);
-	g_return_if_fail (E_IS_TREE_MODEL (etree));
-
-	if (ETM_CLASS(etree)->set_value_at)
-		ETM_CLASS(etree)->set_value_at (etree, node, col, val);
-}
-
-/**
- * e_tree_model_node_is_editable:
- * @etree: 
- * @path: 
- * 
- * 
- * 
- * Return value: 
- **/
-gboolean
-e_tree_model_node_is_editable (ETreeModel *etree, ETreePath node, int col)
-{
-	g_return_val_if_fail(etree != NULL, FALSE);
-
-	if (ETM_CLASS(etree)->is_editable)
-		return ETM_CLASS(etree)->is_editable(etree, node, col);
-	else
-		return FALSE;
-}
-
-/**
- * e_tree_model_duplicate_value:
- * @etree: 
- * @path: 
- * 
- * 
- * 
- * Return value: 
- **/
-void *
-e_tree_model_duplicate_value (ETreeModel *etree, int col, const void *value)
-{
-	g_return_val_if_fail(etree != NULL, NULL);
-
-	if (ETM_CLASS(etree)->duplicate_value)
-		return ETM_CLASS(etree)->duplicate_value(etree, col, value);
-	else
-		return NULL;
-}
-
-/**
- * e_tree_model_free_value:
- * @etree: 
- * @path: 
- * 
- * 
- * 
- * Return value: 
- **/
-void
-e_tree_model_free_value (ETreeModel *etree, int col, void *value)
-{
-	g_return_if_fail(etree != NULL);
-
-	if (ETM_CLASS(etree)->free_value)
-		ETM_CLASS(etree)->free_value(etree, col, value);
-}
-
-/**
- * e_tree_model_initialize_value:
- * @etree: 
- * @path: 
- * 
- * 
- * 
- * Return value: 
- **/
-void *
-e_tree_model_initialize_value (ETreeModel *etree, int col)
-{
-	g_return_val_if_fail(etree != NULL, NULL);
-
-	if (ETM_CLASS(etree)->initialize_value)
-		return ETM_CLASS(etree)->initialize_value(etree, col);
-	else
-		return NULL;
-}
-
-/**
- * e_tree_model_value_is_empty:
- * @etree: 
- * @path: 
- * 
- * 
- * 
- * Return value: 
- **/
-gboolean
-e_tree_model_value_is_empty (ETreeModel *etree, int col, const void *value)
-{
-	g_return_val_if_fail(etree != NULL, TRUE);
-
-	if (ETM_CLASS(etree)->value_is_empty)
-		return ETM_CLASS(etree)->value_is_empty(etree, col, value);
-	else
-		return TRUE;
-}
-
-/**
- * e_tree_model_value_to_string:
- * @etree: 
- * @path: 
- * 
- * 
- * 
- * Return value: 
- **/
-char *
-e_tree_model_value_to_string (ETreeModel *etree, int col, const void *value)
-{
-	g_return_val_if_fail(etree != NULL, g_strdup(""));
-
-	if (ETM_CLASS(etree)->value_to_string)
-		return ETM_CLASS(etree)->value_to_string(etree, col, value);
-	else
-		return g_strdup("");
-}
-
-/**
- * e_tree_model_node_traverse:
- * @model: 
- * @path: 
- * @func: 
- * @data: 
- * 
- * 
- **/
-void
-e_tree_model_node_traverse (ETreeModel *model, ETreePath path, ETreePathFunc func, gpointer data)
-{
-	ETreePath child;
-
-	g_return_if_fail (model != NULL);
-	g_return_if_fail (E_IS_TREE_MODEL (model));
-	g_return_if_fail (path != NULL);
-
-	child = e_tree_model_node_get_first_child (model, path);
-
-	while (child) {
-		ETreePath next_child;
-
-		next_child = e_tree_model_node_get_next (model, child);
-		e_tree_model_node_traverse (model, child, func, data);
-		if (func (model, child, data))
-			return;
-
-		child = next_child;
-	}
-}
-
-/**
- * e_tree_model_node_traverse_preorder:
- * @model: 
- * @path: 
- * @func: 
- * @data: 
- * 
- * 
- **/
-void
-e_tree_model_node_traverse_preorder (ETreeModel *model, ETreePath path, ETreePathFunc func, gpointer data)
-{
-	ETreePath child;
-
-	g_return_if_fail (model != NULL);
-	g_return_if_fail (E_IS_TREE_MODEL (model));
-	g_return_if_fail (path != NULL);
-
-	child = e_tree_model_node_get_first_child (model, path);
-
-	while (child) {
-		ETreePath next_child;
-
-		if (func (model, child, data))
-			return;
-
-		next_child = e_tree_model_node_get_next (model, child);
-		e_tree_model_node_traverse_preorder (model, child, func, data);
-
-		child = next_child;
-	}
-}
-
-/**
- * e_tree_model_node_traverse_preorder:
- * @model: 
- * @path: 
- * @func: 
- * @data: 
- * 
- * 
- **/
-static ETreePath
-e_tree_model_node_real_traverse (ETreeModel *model, ETreePath path, ETreePath end_path, gboolean forward_direction, ETreePathFunc func, gpointer data)
-{
-	ETreePath child;
-
-	g_return_val_if_fail (model != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE_MODEL (model), NULL);
-	g_return_val_if_fail (path != NULL, NULL);
-
-	if (forward_direction)
-		child = e_tree_model_node_get_first_child (model, path);
-	else
-		child = e_tree_model_node_get_last_child (model, path);
-
-	while (child) {
-		ETreePath result;
-
-		if (forward_direction && (child == end_path || func (model, child, data)))
-			return child;
-
-		if ((result = e_tree_model_node_real_traverse (model, child, end_path, forward_direction, func, data)))
-			return result;
-
-		if (!forward_direction && (child == end_path || func (model, child, data)))
-			return child;
-
-		if (forward_direction)
-			child = e_tree_model_node_get_next (model, child);
-		else
-			child = e_tree_model_node_get_prev (model, child);
-	}
-	return NULL;
-}
-
-/**
- * e_tree_model_node_traverse_preorder:
- * @model: 
- * @path: 
- * @func: 
- * @data: 
- * 
- * 
- **/
-ETreePath
-e_tree_model_node_find (ETreeModel *model, ETreePath path, ETreePath end_path, gboolean forward_direction, ETreePathFunc func, gpointer data)
-{
-	ETreePath result;
-	ETreePath next;
-
-	g_return_val_if_fail (model != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE_MODEL (model), NULL);
-
-	/* Just search the whole tree in this case. */
-	if (path == NULL) {
-		ETreePath root;
-		root = e_tree_model_get_root (model);
-
-		if (forward_direction && (end_path == root || func (model, root, data)))
-			return root;
-
-		if ((result = e_tree_model_node_real_traverse (model, root, end_path, forward_direction, func, data)))
-			return result;
-
-		if (!forward_direction && (end_path == root || func (model, root, data)))
-			return root;
-
-		return NULL;
-	}
-
-	while (1) {
-
-		if (forward_direction) {
-			if ((result = e_tree_model_node_real_traverse (model, path, end_path, forward_direction, func, data)))
-				return result;
-			next = e_tree_model_node_get_next (model, path);
-		} else {
-			next = e_tree_model_node_get_prev (model, path);
-			if (next && (result = e_tree_model_node_real_traverse (model, next, end_path, forward_direction, func, data)))
-				return result;
-		}
-
-		while (next == NULL) {
-			path = e_tree_model_node_get_parent (model, path);
-
-			if (path == NULL)
-				return NULL;
-
-			if (forward_direction)
-				next = e_tree_model_node_get_next (model, path);
-			else
-				next = path;
-		}
-
-		if (end_path == next || func (model, next, data))
-			return next;
-
-		path = next;
-	}
-}
-
diff --git a/widgets/table/e-tree-model.h b/widgets/table/e-tree-model.h
deleted file mode 100644
index c9574388e1..0000000000
--- a/widgets/table/e-tree-model.h
+++ /dev/null
@@ -1,227 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-tree-model.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Chris Toshok <toshok@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TREE_MODEL_H_
-#define _E_TREE_MODEL_H_
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <glib-object.h>
-
-
-G_BEGIN_DECLS
-
-
-#define E_TREE_MODEL_TYPE        (e_tree_model_get_type ())
-#define E_TREE_MODEL(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TREE_MODEL_TYPE, ETreeModel))
-#define E_TREE_MODEL_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TREE_MODEL_TYPE, ETreeModelClass))
-#define E_IS_TREE_MODEL(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TREE_MODEL_TYPE))
-#define E_IS_TREE_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TREE_MODEL_TYPE))
-#define E_TREE_MODEL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TREE_MODEL_TYPE, ETreeModelClass))
-
-typedef void * ETreePath;
-typedef struct ETreeModel ETreeModel;
-typedef struct ETreeModelClass ETreeModelClass;
-typedef gint (*ETreePathCompareFunc)(ETreeModel *model, ETreePath path1, ETreePath path2);
-typedef gboolean (*ETreePathFunc)(ETreeModel *model, ETreePath path, gpointer data);
-
-struct ETreeModel {
-	GObject base;
-};
-
-struct ETreeModelClass {
-	GObjectClass parent_class;
-
-	/*
-	 * Virtual methods
-	 */
-	ETreePath  (*get_root)              (ETreeModel *etm);
-
-	ETreePath  (*get_parent)            (ETreeModel *etm, ETreePath node);
-	ETreePath  (*get_first_child)       (ETreeModel *etm, ETreePath node);
-	ETreePath  (*get_last_child)        (ETreeModel *etm, ETreePath node);
-	ETreePath  (*get_next)              (ETreeModel *etm, ETreePath node);
-	ETreePath  (*get_prev)              (ETreeModel *etm, ETreePath node);
-
-	gboolean   (*is_root)               (ETreeModel *etm, ETreePath node);
-	gboolean   (*is_expandable)         (ETreeModel *etm, ETreePath node);
-	guint      (*get_children)          (ETreeModel *etm, ETreePath node, ETreePath **paths);
-	guint      (*depth)                 (ETreeModel *etm, ETreePath node);
-
-	GdkPixbuf *(*icon_at)               (ETreeModel *etm, ETreePath node);
-
-	gboolean   (*get_expanded_default)  (ETreeModel *etm);
-	gint       (*column_count)          (ETreeModel *etm);
-
-	gboolean   (*has_save_id)           (ETreeModel *etm);
-	gchar     *(*get_save_id)           (ETreeModel *etm, ETreePath node);
-
-	gboolean   (*has_get_node_by_id)    (ETreeModel *etm);
-	ETreePath  (*get_node_by_id)        (ETreeModel *etm, const char *save_id);
-
-	gboolean   (*has_change_pending)    (ETreeModel *etm);
-
-	/*
-	 * ETable analogs
-	 */
-	void      *(*value_at)              (ETreeModel *etm, ETreePath node, int col);
-	void       (*set_value_at)          (ETreeModel *etm, ETreePath node, int col, const void *val);
-	gboolean   (*is_editable)           (ETreeModel *etm, ETreePath node, int col);
-					    
-	void      *(*duplicate_value)       (ETreeModel *etm, int col, const void *value);
-	void       (*free_value)            (ETreeModel *etm, int col, void *value);
-	void	  *(*initialize_value)      (ETreeModel *etm, int col);
-	gboolean   (*value_is_empty)        (ETreeModel *etm, int col, const void *value);
-	char      *(*value_to_string)       (ETreeModel *etm, int col, const void *value);
-
-	/*
-	 * Signals
-	 */
-
-	/* During node_remove, the ETreePath of the child is removed
-	 * from the tree but is still a valid ETreePath.  At
-	 * node_deleted, the ETreePath is no longer valid.
-	 */
-
-	void       (*pre_change)            (ETreeModel *etm);
-	void       (*no_change)             (ETreeModel *etm);
-	void       (*node_changed)          (ETreeModel *etm, ETreePath node);
-	void       (*node_data_changed)     (ETreeModel *etm, ETreePath node);
-	void       (*node_col_changed)      (ETreeModel *etm, ETreePath node,   int col);
-	void       (*node_inserted)         (ETreeModel *etm, ETreePath parent, ETreePath inserted_node);
-	void       (*node_removed)          (ETreeModel *etm, ETreePath parent, ETreePath removed_node, int old_position);
-	void       (*node_deleted)          (ETreeModel *etm, ETreePath deleted_node);
-
-	/* This signal requests that any viewers of the tree that
-	 * collapse and expand nodes collapse this node.
-	 */
-	void       (*node_request_collapse) (ETreeModel *etm, ETreePath node);
-};
-
-
-GType       e_tree_model_get_type                (void);
-ETreeModel *e_tree_model_new                     (void);
-
-/* tree traversal operations */
-ETreePath   e_tree_model_get_root                (ETreeModel     *etree);
-ETreePath   e_tree_model_node_get_parent         (ETreeModel     *etree,
-						  ETreePath       path);
-ETreePath   e_tree_model_node_get_first_child    (ETreeModel     *etree,
-						  ETreePath       path);
-ETreePath   e_tree_model_node_get_last_child     (ETreeModel     *etree,
-						  ETreePath       path);
-ETreePath   e_tree_model_node_get_next           (ETreeModel     *etree,
-						  ETreePath       path);
-ETreePath   e_tree_model_node_get_prev           (ETreeModel     *etree,
-						  ETreePath       path);
-
-/* node accessors */
-gboolean    e_tree_model_node_is_root            (ETreeModel     *etree,
-						  ETreePath       path);
-gboolean    e_tree_model_node_is_expandable      (ETreeModel     *etree,
-						  ETreePath       path);
-guint       e_tree_model_node_get_children       (ETreeModel     *etree,
-						  ETreePath       path,
-						  ETreePath     **paths);
-guint       e_tree_model_node_depth              (ETreeModel     *etree,
-						  ETreePath       path);
-GdkPixbuf  *e_tree_model_icon_at                 (ETreeModel     *etree,
-						  ETreePath       path);
-gboolean    e_tree_model_get_expanded_default    (ETreeModel     *model);
-gint        e_tree_model_column_count            (ETreeModel     *model);
-gboolean    e_tree_model_has_save_id             (ETreeModel     *model);
-gchar      *e_tree_model_get_save_id             (ETreeModel     *model,
-						  ETreePath       node);
-gboolean    e_tree_model_has_get_node_by_id      (ETreeModel     *model);
-ETreePath   e_tree_model_get_node_by_id          (ETreeModel     *model,
-						  const char     *save_id);
-gboolean    e_tree_model_has_change_pending      (ETreeModel     *model);
-void       *e_tree_model_value_at                (ETreeModel     *etree,
-						  ETreePath       node,
-						  int             col);
-void        e_tree_model_set_value_at            (ETreeModel     *etree,
-						  ETreePath       node,
-						  int             col,
-						  const void     *val);
-gboolean    e_tree_model_node_is_editable        (ETreeModel     *etree,
-						  ETreePath       node,
-						  int             col);
-void       *e_tree_model_duplicate_value         (ETreeModel     *etree,
-						  int             col,
-						  const void     *value);
-void        e_tree_model_free_value              (ETreeModel     *etree,
-						  int             col,
-						  void           *value);
-void       *e_tree_model_initialize_value        (ETreeModel     *etree,
-						  int             col);
-gboolean    e_tree_model_value_is_empty          (ETreeModel     *etree,
-						  int             col,
-						  const void     *value);
-char       *e_tree_model_value_to_string         (ETreeModel     *etree,
-						  int             col,
-						  const void     *value);
-
-/* depth first traversal of path's descendents, calling func on each one */
-void        e_tree_model_node_traverse           (ETreeModel     *model,
-						  ETreePath       path,
-						  ETreePathFunc   func,
-						  gpointer        data);
-void        e_tree_model_node_traverse_preorder  (ETreeModel     *model,
-						  ETreePath       path,
-						  ETreePathFunc   func,
-						  gpointer        data);
-ETreePath   e_tree_model_node_find               (ETreeModel     *model,
-						  ETreePath       path,
-						  ETreePath       end_path,
-						  gboolean        forward_direction,
-						  ETreePathFunc   func,
-						  gpointer        data);
-
-/*
-** Routines for emitting signals on the ETreeModel
-*/
-void        e_tree_model_pre_change              (ETreeModel     *tree_model);
-void        e_tree_model_no_change               (ETreeModel     *tree_model);
-void        e_tree_model_node_changed            (ETreeModel     *tree_model,
-						  ETreePath       node);
-void        e_tree_model_node_data_changed       (ETreeModel     *tree_model,
-						  ETreePath       node);
-void        e_tree_model_node_col_changed        (ETreeModel     *tree_model,
-						  ETreePath       node,
-						  int             col);
-void        e_tree_model_node_inserted           (ETreeModel     *tree_model,
-						  ETreePath       parent_node,
-						  ETreePath       inserted_node);
-void        e_tree_model_node_removed            (ETreeModel     *tree_model,
-						  ETreePath       parent_node,
-						  ETreePath       removed_node,
-						  int             old_position);
-void        e_tree_model_node_deleted            (ETreeModel     *tree_model,
-						  ETreePath       deleted_node);
-void        e_tree_model_node_request_collapse   (ETreeModel     *tree_model,
-						  ETreePath       deleted_node);
-
-
-G_END_DECLS
-
-#endif /* _E_TREE_MODEL_H */
diff --git a/widgets/table/e-tree-scrolled.c b/widgets/table/e-tree-scrolled.c
deleted file mode 100644
index a72a246b69..0000000000
--- a/widgets/table/e-tree-scrolled.c
+++ /dev/null
@@ -1,228 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-tree-scrolled.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdio.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gtk/gtksignal.h>
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-#include <gal/util/e-util.h>
-#include <gal/util/e-i18n.h>
-
-#include "e-tree-scrolled.h"
-
-#define COLUMN_HEADER_HEIGHT 16
-
-#define PARENT_TYPE gtk_scrolled_window_get_type ()
-
-static GtkObjectClass *parent_class;
-
-enum {
-	PROP_0,
-	PROP_TREE
-};
-
-static void
-e_tree_scrolled_init (GtkObject *object)
-{
-	ETreeScrolled *ets;
-	GtkScrolledWindow *scrolled_window;
-
-	ets = E_TREE_SCROLLED (object);
-	scrolled_window = GTK_SCROLLED_WINDOW (object);
-
-	GTK_WIDGET_SET_FLAGS (ets, GTK_CAN_FOCUS);
-
-	ets->tree = g_object_new (E_TREE_TYPE, NULL);
-
-	gtk_scrolled_window_set_policy      (scrolled_window, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-	gtk_scrolled_window_set_shadow_type (scrolled_window, GTK_SHADOW_IN);
-}
-
-static void
-e_tree_scrolled_real_construct (ETreeScrolled *ets)
-{
-	gtk_container_add(GTK_CONTAINER(ets), GTK_WIDGET(ets->tree));
-
-	gtk_widget_show(GTK_WIDGET(ets->tree));
-}
-
-ETreeScrolled *e_tree_scrolled_construct                 (ETreeScrolled    *ets,
-							    ETreeModel       *etm,
-							    ETableExtras      *ete,
-							    const char        *spec,
-							    const char        *state)
-{
-	g_return_val_if_fail(ets != NULL, NULL);
-	g_return_val_if_fail(E_IS_TREE_SCROLLED(ets), NULL);
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TREE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec != NULL, NULL);
-
-	e_tree_construct(ets->tree, etm, ete, spec, state);
-
-	e_tree_scrolled_real_construct(ets);
-
-	return ets;
-}
-
-GtkWidget      *e_tree_scrolled_new                       (ETreeModel       *etm,
-							    ETableExtras      *ete,
-							    const char        *spec,
-							    const char        *state)
-{
-	ETreeScrolled *ets;
-
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TREE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec != NULL, NULL);
-
-	ets = E_TREE_SCROLLED (gtk_widget_new (e_tree_scrolled_get_type (),
-						"hadjustment", NULL,
-						"vadjustment", NULL,
-						NULL));
-
-	ets = e_tree_scrolled_construct (ets, etm, ete, spec, state);
-
-	return GTK_WIDGET (ets);
-}
-
-ETreeScrolled *e_tree_scrolled_construct_from_spec_file  (ETreeScrolled    *ets,
-							    ETreeModel       *etm,
-							    ETableExtras      *ete,
-							    const char        *spec_fn,
-							    const char        *state_fn)
-{
-	g_return_val_if_fail(ets != NULL, NULL);
-	g_return_val_if_fail(E_IS_TREE_SCROLLED(ets), NULL);
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TREE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec_fn != NULL, NULL);
-
-	e_tree_construct_from_spec_file(ets->tree, etm, ete, spec_fn, state_fn);
-
-	e_tree_scrolled_real_construct(ets);
-
-	return ets;
-}
-
-GtkWidget      *e_tree_scrolled_new_from_spec_file        (ETreeModel       *etm,
-							    ETableExtras      *ete,
-							    const char        *spec_fn,
-							    const char        *state_fn)
-{
-	ETreeScrolled *ets;
-
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TREE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec_fn != NULL, NULL);
-
-	ets = E_TREE_SCROLLED (gtk_widget_new (e_tree_scrolled_get_type (),
-                                                "hadjustment", NULL,
-                                                "vadjustment", NULL,
-                                                NULL));
-	ets = e_tree_scrolled_construct_from_spec_file (ets, etm, ete, spec_fn, state_fn);
-
-	return GTK_WIDGET (ets);
-}
-
-ETree *
-e_tree_scrolled_get_tree                 (ETreeScrolled *ets)
-{
-	return ets->tree;
-}
-
-static void
-ets_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
-	ETreeScrolled *ets = E_TREE_SCROLLED (object);
-
-	switch (prop_id){
-	case PROP_TREE:
-		g_value_set_object (value, ets->tree);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-/* Grab_focus handler for the scrolled ETree */
-static void
-ets_grab_focus (GtkWidget *widget)
-{
-	ETreeScrolled *ets;
-
-	ets = E_TREE_SCROLLED (widget);
-
-	gtk_widget_grab_focus (GTK_WIDGET (ets->tree));
-}
-
-/* Focus handler for the scrolled ETree */
-static gint
-ets_focus (GtkWidget *container, GtkDirectionType direction)
-{
-	ETreeScrolled *ets;
-
-	ets = E_TREE_SCROLLED (container);
-
-	return gtk_widget_child_focus (GTK_WIDGET (ets->tree), direction);
-}
-
-static void
-e_tree_scrolled_class_init (ETreeScrolledClass *class)
-{
-	GObjectClass *object_class;
-	GtkWidgetClass *widget_class;
-	GtkContainerClass *container_class;
-
-	object_class = (GObjectClass *) class;
-	widget_class = (GtkWidgetClass *) class;
-	container_class = (GtkContainerClass *) class;
-
-	parent_class = g_type_class_ref (PARENT_TYPE);
-
-	object_class->get_property = ets_get_property;
-
-	widget_class->grab_focus = ets_grab_focus;
-
-	widget_class->focus = ets_focus;
-
-	g_object_class_install_property (object_class, PROP_TREE,
-					 g_param_spec_object ("tree",
-							      _( "Tree" ),
-							      _( "Tree" ),
-							      E_TREE_TYPE,
-							      G_PARAM_READABLE));
-}
-
-E_MAKE_TYPE(e_tree_scrolled, "ETreeScrolled", ETreeScrolled, e_tree_scrolled_class_init, e_tree_scrolled_init, PARENT_TYPE)
-
diff --git a/widgets/table/e-tree-scrolled.h b/widgets/table/e-tree-scrolled.h
deleted file mode 100644
index f861b71138..0000000000
--- a/widgets/table/e-tree-scrolled.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-tree-scrolled.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TREE_SCROLLED_H_
-#define _E_TREE_SCROLLED_H_
-
-#include <gtk/gtkscrolledwindow.h>
-#include <gal/e-table/e-tree-model.h>
-#include <gal/e-table/e-tree.h>
-
-G_BEGIN_DECLS
-
-#define E_TREE_SCROLLED_TYPE        (e_tree_scrolled_get_type ())
-#define E_TREE_SCROLLED(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TREE_SCROLLED_TYPE, ETreeScrolled))
-#define E_TREE_SCROLLED_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TREE_SCROLLED_TYPE, ETreeScrolledClass))
-#define E_IS_TREE_SCROLLED(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TREE_SCROLLED_TYPE))
-#define E_IS_TREE_SCROLLED_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TREE_SCROLLED_TYPE))
-
-typedef struct {
-	GtkScrolledWindow parent;
-
-	ETree *tree;
-} ETreeScrolled;
-
-typedef struct {
-	GtkScrolledWindowClass parent_class;
-} ETreeScrolledClass;
-
-GType           e_tree_scrolled_get_type                  (void);
-
-ETreeScrolled *e_tree_scrolled_construct                 (ETreeScrolled *ets,
-							  ETreeModel    *etm,
-							  ETableExtras   *ete,
-							  const char     *spec,
-							  const char     *state);
-GtkWidget      *e_tree_scrolled_new                       (ETreeModel    *etm,
-							   ETableExtras   *ete,
-							   const char     *spec,
-							   const char     *state);
-
-ETreeScrolled *e_tree_scrolled_construct_from_spec_file  (ETreeScrolled *ets,
-							  ETreeModel    *etm,
-							  ETableExtras   *ete,
-							  const char     *spec_fn,
-							  const char     *state_fn);
-GtkWidget      *e_tree_scrolled_new_from_spec_file        (ETreeModel    *etm,
-							   ETableExtras   *ete,
-							   const char     *spec_fn,
-							   const char     *state_fn);
-
-ETree         *e_tree_scrolled_get_tree                 (ETreeScrolled *ets);
-
-G_END_DECLS
-
-#endif /* _E_TREE_SCROLLED_H_ */
diff --git a/widgets/table/e-tree-selection-model.c b/widgets/table/e-tree-selection-model.c
deleted file mode 100644
index 6d45b6257c..0000000000
--- a/widgets/table/e-tree-selection-model.c
+++ /dev/null
@@ -1,816 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-tree-selection-model.c
- * Copyright 2000, 2001, 2003 Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Mike Kestner <mkestner@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include "e-tree-selection-model.h"
-#include <gal/util/e-i18n.h>
-#include <gal/util/e-util.h>
-#include <gdk/gdkkeysyms.h>
-#include <gal/e-table/e-tree-table-adapter.h>
-
-#define PARENT_TYPE e_selection_model_get_type ()
-
-static ESelectionModelClass *parent_class;
-
-enum {
-	PROP_0,
-	PROP_CURSOR_ROW,
-	PROP_CURSOR_COL,
-	PROP_MODEL,
-	PROP_ETTA,
-};
-
-struct ETreeSelectionModelPriv {
-	ETreeTableAdapter *etta;
-	ETreeModel *model;
-
-	GHashTable *paths;
-	ETreePath cursor_path;
-	ETreePath start_path;
-	gint cursor_col;
-	gchar *cursor_save_id;
-
-	gint tree_model_pre_change_id;
-	gint tree_model_no_change_id;
-	gint tree_model_node_changed_id;
-	gint tree_model_node_data_changed_id;
-	gint tree_model_node_col_changed_id;
-	gint tree_model_node_inserted_id;
-	gint tree_model_node_removed_id;
-	gint tree_model_node_deleted_id;
-};
-
-static gint
-get_cursor_row (ETreeSelectionModel *etsm)
-{
-	if (etsm->priv->cursor_path)
-		return e_tree_table_adapter_row_of_node(etsm->priv->etta, etsm->priv->cursor_path);
-
-	return -1;
-}
-
-static void
-clear_selection (ETreeSelectionModel *etsm)
-{
-	g_hash_table_destroy (etsm->priv->paths);
-	etsm->priv->paths = g_hash_table_new (NULL, NULL);
-}
-
-static void
-change_one_path (ETreeSelectionModel *etsm, ETreePath path, gboolean grow)
-{
-	if (!path)
-		return;
-
-	if (grow)
-		g_hash_table_insert (etsm->priv->paths, path, path);
-	else if (g_hash_table_lookup (etsm->priv->paths, path))
-		g_hash_table_remove (etsm->priv->paths, path);
-}
-
-static void
-select_single_path (ETreeSelectionModel *etsm, ETreePath path)
-{
-	clear_selection (etsm);
-	change_one_path(etsm, path, TRUE);
-	etsm->priv->cursor_path = path;
-	etsm->priv->start_path = NULL;
-}
-
-static void
-select_range (ETreeSelectionModel *etsm, gint start, gint end)
-{
-	gint i;
-
-	if (start > end) {
-		i = start;
-		start = end;
-		end = i;
-	}
-
-	for (i = start; i <= end; i++) {
-		ETreePath path = e_tree_table_adapter_node_at_row (etsm->priv->etta, i);
-		if (path)
-			g_hash_table_insert (etsm->priv->paths, path, path);
-	}
-}
-
-static void
-free_id (ETreeSelectionModel *etsm)
-{
-	g_free (etsm->priv->cursor_save_id);
-	etsm->priv->cursor_save_id = NULL;
-}
-
-static void
-restore_cursor (ETreeSelectionModel *etsm, ETreeModel *etm)
-{
-	clear_selection (etsm);
-	etsm->priv->cursor_path = NULL;
-
-	if (etsm->priv->cursor_save_id) {
-		etsm->priv->cursor_path = e_tree_model_get_node_by_id (etm, etsm->priv->cursor_save_id);
-		if (etsm->priv->cursor_path != NULL && etsm->priv->cursor_col == -1)
-			etsm->priv->cursor_col = 0;
-
-		select_single_path(etsm, etsm->priv->cursor_path);
-	}
-
-	e_selection_model_selection_changed(E_SELECTION_MODEL(etsm));
-
-	if (etsm->priv->cursor_path) {
-		gint cursor_row = get_cursor_row (etsm);
-		e_selection_model_cursor_changed(E_SELECTION_MODEL(etsm), cursor_row, etsm->priv->cursor_col);
-	} else {
-		e_selection_model_cursor_changed(E_SELECTION_MODEL(etsm), -1, -1);
-		e_selection_model_cursor_activated(E_SELECTION_MODEL(etsm), -1, -1);
-
-	}
-
-	free_id (etsm);
-}
-
-static void
-etsm_pre_change (ETreeModel *etm, ETreeSelectionModel *etsm)
-{
-	g_free (etsm->priv->cursor_save_id);
-	etsm->priv->cursor_save_id = NULL;
-
-	if (e_tree_model_has_get_node_by_id (etm) && e_tree_model_has_save_id (etm) && etsm->priv->cursor_path) {
-		etsm->priv->cursor_save_id = e_tree_model_get_save_id (etm, etsm->priv->cursor_path);
-	}
-}
-
-static void
-etsm_no_change (ETreeModel *etm, ETreeSelectionModel *etsm)
-{
-	free_id (etsm);
-}
-
-static void
-etsm_node_changed (ETreeModel *etm, ETreePath node, ETreeSelectionModel *etsm)
-{
-	restore_cursor (etsm, etm);
-}
-
-static void
-etsm_node_data_changed (ETreeModel *etm, ETreePath node, ETreeSelectionModel *etsm)
-{
-	free_id (etsm);
-}
-
-static void
-etsm_node_col_changed (ETreeModel *etm, ETreePath node, int col, ETreeSelectionModel *etsm)
-{
-	free_id (etsm);
-}
-
-static void
-etsm_node_inserted (ETreeModel *etm, ETreePath parent, ETreePath child, ETreeSelectionModel *etsm)
-{
-	restore_cursor (etsm, etm);
-}
-
-static void
-etsm_node_removed (ETreeModel *etm, ETreePath parent, ETreePath child, int old_position, ETreeSelectionModel *etsm)
-{
-	restore_cursor (etsm, etm);
-}
-
-static void
-etsm_node_deleted (ETreeModel *etm, ETreePath child, ETreeSelectionModel *etsm)
-{
-	restore_cursor (etsm, etm);
-}
-
-
-static void
-add_model(ETreeSelectionModel *etsm, ETreeModel *model)
-{
-	ETreeSelectionModelPriv *priv = etsm->priv;
-
-	priv->model = model;
-
-	if (!priv->model)
-		return;
-
-	g_object_ref(priv->model);
-	priv->tree_model_pre_change_id      = g_signal_connect_after (G_OBJECT (priv->model), "pre_change",
-									G_CALLBACK (etsm_pre_change), etsm);
-	priv->tree_model_no_change_id      = g_signal_connect_after (G_OBJECT (priv->model), "no_change",
-									G_CALLBACK (etsm_no_change), etsm);
-	priv->tree_model_node_changed_id      = g_signal_connect_after (G_OBJECT (priv->model), "node_changed",
-									G_CALLBACK (etsm_node_changed), etsm);
-	priv->tree_model_node_data_changed_id      = g_signal_connect_after (G_OBJECT (priv->model), "node_data_changed",
-									G_CALLBACK (etsm_node_data_changed), etsm);
-	priv->tree_model_node_col_changed_id      = g_signal_connect_after (G_OBJECT (priv->model), "node_col_changed",
-									G_CALLBACK (etsm_node_col_changed), etsm);
-	priv->tree_model_node_inserted_id      = g_signal_connect_after (G_OBJECT (priv->model), "node_inserted",
-									G_CALLBACK (etsm_node_inserted), etsm);
-	priv->tree_model_node_removed_id      = g_signal_connect_after (G_OBJECT (priv->model), "node_removed",
-									G_CALLBACK (etsm_node_removed), etsm);
-	priv->tree_model_node_deleted_id      = g_signal_connect_after (G_OBJECT (priv->model), "node_deleted",
-									G_CALLBACK (etsm_node_deleted), etsm);
-}
-
-static void
-drop_model(ETreeSelectionModel *etsm)
-{
-	ETreeSelectionModelPriv *priv = etsm->priv;
-
-	if (!priv->model)
-		return;
-
-	g_signal_handler_disconnect (G_OBJECT (priv->model),
-			             priv->tree_model_pre_change_id);
-	g_signal_handler_disconnect (G_OBJECT (priv->model),
-			             priv->tree_model_no_change_id);
-	g_signal_handler_disconnect (G_OBJECT (priv->model),
-			             priv->tree_model_node_changed_id);
-	g_signal_handler_disconnect (G_OBJECT (priv->model),
-			             priv->tree_model_node_data_changed_id);
-	g_signal_handler_disconnect (G_OBJECT (priv->model),
-			             priv->tree_model_node_col_changed_id);
-	g_signal_handler_disconnect (G_OBJECT (priv->model),
-			             priv->tree_model_node_inserted_id);
-	g_signal_handler_disconnect (G_OBJECT (priv->model),
-			             priv->tree_model_node_removed_id);
-	g_signal_handler_disconnect (G_OBJECT (priv->model),
-			             priv->tree_model_node_deleted_id);
-
-	g_object_unref (priv->model);
-	priv->model = NULL;
-
-	priv->tree_model_pre_change_id = 0;
-	priv->tree_model_no_change_id = 0;
-	priv->tree_model_node_changed_id = 0;
-	priv->tree_model_node_data_changed_id = 0;
-	priv->tree_model_node_col_changed_id = 0;
-	priv->tree_model_node_inserted_id = 0;
-	priv->tree_model_node_removed_id = 0;
-	priv->tree_model_node_deleted_id = 0;
-}
-
-static void
-etsm_dispose (GObject *object)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL (object);
-
-	drop_model(etsm);
-
-	if (G_OBJECT_CLASS (parent_class)->dispose)
-		(* G_OBJECT_CLASS (parent_class)->dispose) (object);
-}
-
-static void
-etsm_finalize (GObject *object)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL (object);
-
-	if (etsm->priv) {
-		clear_selection (etsm);
-		g_hash_table_destroy (etsm->priv->paths);
-		g_free (etsm->priv);
-		etsm->priv = NULL;
-	}
-
-	if (G_OBJECT_CLASS (parent_class)->finalize)
-		(* G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-static void
-etsm_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL (object);
-
-	switch (prop_id){
-	case PROP_CURSOR_ROW:
-		g_value_set_int (value, get_cursor_row(etsm));
-		break;
-
-	case PROP_CURSOR_COL:
-		g_value_set_int (value, etsm->priv->cursor_col);
-		break;
-
-	case PROP_MODEL:
-		g_value_set_object (value, etsm->priv->model);
-		break;
-
-	case PROP_ETTA:
-		g_value_set_object (value, etsm->priv->etta);
-		break;
-	}
-}
-
-static void
-etsm_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
-	ESelectionModel *esm = E_SELECTION_MODEL (object);
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL (object);
-
-	switch (prop_id){
-	case PROP_CURSOR_ROW:
-		e_selection_model_do_something(esm, g_value_get_int (value), etsm->priv->cursor_col, 0);
-		break;
-
-	case PROP_CURSOR_COL:
-		e_selection_model_do_something(esm, get_cursor_row(etsm), g_value_get_int(value), 0);
-		break;
-
-	case PROP_MODEL:
-		drop_model(etsm);
-		add_model(etsm, E_TREE_MODEL (g_value_get_object(value)));
-		break;
-
-	case PROP_ETTA:
-		etsm->priv->etta = E_TREE_TABLE_ADAPTER (g_value_get_object (value));
-		break;
-	}
-}
-
-static gboolean
-etsm_is_path_selected (ETreeSelectionModel *etsm, ETreePath path)
-{
-	if (path && g_hash_table_lookup (etsm->priv->paths, path))
-		return TRUE;
-
-	return FALSE;
-}
-
-/** 
- * e_selection_model_is_row_selected
- * @selection: #ESelectionModel to check
- * @n: The row to check
- *
- * This routine calculates whether the given row is selected.
- *
- * Returns: %TRUE if the given row is selected
- */
-static gboolean
-etsm_is_row_selected (ESelectionModel *selection,
-		      gint             row)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL(selection);
-	ETreePath path;
-
-	g_return_val_if_fail(row < e_table_model_row_count(E_TABLE_MODEL(etsm->priv->etta)), FALSE);
-	g_return_val_if_fail(row >= 0, FALSE);
-	g_return_val_if_fail(etsm != NULL, FALSE);
-
-	path = e_tree_table_adapter_node_at_row(etsm->priv->etta, row);
-	return etsm_is_path_selected (etsm, path);
-}
-
-
-typedef struct {
-	ETreeSelectionModel *etsm;
-	EForeachFunc callback;
-	gpointer closure;
-} ModelAndCallback;
-
-static void
-etsm_row_foreach_cb (gpointer key, gpointer value, gpointer user_data)
-{
-	ETreePath path = key;
-	ModelAndCallback *mac = user_data;
-	int row = e_tree_table_adapter_row_of_node(mac->etsm->priv->etta, path);
-	if (row >= 0)
-		mac->callback(row, mac->closure);
-}
-
-/** 
- * e_selection_model_foreach
- * @selection: #ESelectionModel to traverse
- * @callback: The callback function to call back.
- * @closure: The closure
- *
- * This routine calls the given callback function once for each
- * selected row, passing closure as the closure.
- */
-static void 
-etsm_foreach (ESelectionModel *selection,
-	      EForeachFunc     callback,
-	      gpointer         closure)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL(selection);
-	ModelAndCallback mac;
-
-	mac.etsm = etsm;
-	mac.callback = callback;
-	mac.closure = closure;
-
-	g_hash_table_foreach(etsm->priv->paths, etsm_row_foreach_cb, &mac);
-}
-
-/** 
- * e_selection_model_clear
- * @selection: #ESelectionModel to clear
- *
- * This routine clears the selection to no rows selected.
- */
-static void
-etsm_clear(ESelectionModel *selection)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL(selection);
-
-	clear_selection (etsm);
-
-	etsm->priv->cursor_path = NULL;
-	e_selection_model_selection_changed(E_SELECTION_MODEL(etsm));
-	e_selection_model_cursor_changed(E_SELECTION_MODEL(etsm), -1, -1);
-}
-
-/** 
- * e_selection_model_selected_count
- * @selection: #ESelectionModel to count
- *
- * This routine calculates the number of rows selected.
- *
- * Returns: The number of rows selected in the given model.
- */
-static gint
-etsm_selected_count (ESelectionModel *selection)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL(selection);
-
-	return g_hash_table_size (etsm->priv->paths);
-}
-
-static int
-etsm_row_count (ESelectionModel *selection)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL(selection);
-	return e_table_model_row_count(E_TABLE_MODEL(etsm->priv->etta));
-}
-
-/** 
- * e_selection_model_select_all
- * @selection: #ESelectionModel to select all
- *
- * This routine selects all the rows in the given
- * #ESelectionModel.
- */
-static void
-etsm_select_all (ESelectionModel *selection)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL(selection);
-	ETreePath root;
-
-	root = e_tree_model_get_root(etsm->priv->model);
-	if (root == NULL)
-		return;
-
-	clear_selection (etsm);
-	select_range (etsm, 0, etsm_row_count (selection) - 1);
-
-	if (etsm->priv->cursor_path == NULL)
-		etsm->priv->cursor_path = e_tree_table_adapter_node_at_row(etsm->priv->etta, 0);
-
-	e_selection_model_selection_changed(E_SELECTION_MODEL(etsm));
-	e_selection_model_cursor_changed(E_SELECTION_MODEL(etsm), get_cursor_row(etsm), etsm->priv->cursor_col);
-}
-
-/** 
- * e_selection_model_invert_selection
- * @selection: #ESelectionModel to invert
- *
- * This routine inverts all the rows in the given
- * #ESelectionModel.
- */
-static void
-etsm_invert_selection (ESelectionModel *selection)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL(selection);
-        gint count = etsm_row_count (selection);
-	gint i;
-
-	for (i = 0; i < count; i++) {
-		ETreePath path = e_tree_table_adapter_node_at_row (etsm->priv->etta, i);
-		if (!path)
-			continue;
-		if (g_hash_table_lookup (etsm->priv->paths, path))
-			g_hash_table_remove (etsm->priv->paths, path);
-		else
-			g_hash_table_insert (etsm->priv->paths, path, path);
-	}
-
-	etsm->priv->cursor_col = -1;
-	etsm->priv->cursor_path = NULL;
-	etsm->priv->start_path = NULL;
-	e_selection_model_selection_changed(E_SELECTION_MODEL(etsm));
-	e_selection_model_cursor_changed(E_SELECTION_MODEL(etsm), -1, -1);
-}
-
-static void
-etsm_change_one_row(ESelectionModel *selection, int row, gboolean grow)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL(selection);
-	ETreePath path;
-
-	g_return_if_fail(row < e_table_model_row_count(E_TABLE_MODEL(etsm->priv->etta)));
-	g_return_if_fail(row >= 0);
-	g_return_if_fail(selection != NULL);
-
-	path = e_tree_table_adapter_node_at_row(etsm->priv->etta, row);
-
-	if (!path)
-		return;
-
-	change_one_path (etsm, path, grow);
-}
-
-static void
-etsm_change_cursor (ESelectionModel *selection, int row, int col)
-{
-	ETreeSelectionModel *etsm;
-
-	g_return_if_fail(selection != NULL);
-	g_return_if_fail(E_IS_SELECTION_MODEL(selection));
-
-	etsm = E_TREE_SELECTION_MODEL(selection);
-
-	if (row == -1) {
-		etsm->priv->cursor_path = NULL;
-	} else {
-		etsm->priv->cursor_path = e_tree_table_adapter_node_at_row(etsm->priv->etta, row);
-	}
-	etsm->priv->cursor_col = col;
-}
-
-static gint
-etsm_cursor_row (ESelectionModel *selection)
-{
-	return get_cursor_row(E_TREE_SELECTION_MODEL(selection));
-}
-
-static gint
-etsm_cursor_col (ESelectionModel *selection)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL(selection);
-	return etsm->priv->cursor_col;
-}
-
-static void
-etsm_select_single_row (ESelectionModel *selection, gint row)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL(selection);
-	ETreePath path = e_tree_table_adapter_node_at_row (etsm->priv->etta, row);
-
-	g_return_if_fail (path != NULL);
-
-	select_single_path (etsm, path);
-
-	e_selection_model_selection_changed(E_SELECTION_MODEL(etsm));
-}
-
-static void
-etsm_toggle_single_row (ESelectionModel *selection, gint row)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL(selection);
-	ETreePath path = e_tree_table_adapter_node_at_row(etsm->priv->etta, row);
-
-	g_return_if_fail (path);
-
-	if (g_hash_table_lookup (etsm->priv->paths, path))
-		g_hash_table_remove (etsm->priv->paths, path);
-	else
-		g_hash_table_insert (etsm->priv->paths, path, path);
-
-	etsm->priv->start_path = NULL;
-	e_selection_model_selection_changed(E_SELECTION_MODEL(etsm));
-}
-
-static void
-etsm_real_move_selection_end (ETreeSelectionModel *etsm, gint row)
-{
-	ETreePath end_path = e_tree_table_adapter_node_at_row (etsm->priv->etta, row);
-	gint start;
-
-	g_return_if_fail (end_path);
-
-	start = e_tree_table_adapter_row_of_node(etsm->priv->etta, etsm->priv->start_path);
-	clear_selection (etsm);
-	select_range (etsm, start, row);
-}
-
-static void
-etsm_move_selection_end (ESelectionModel *selection, gint row)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL(selection);
-
-	g_return_if_fail (etsm->priv->cursor_path);
-
-	etsm_real_move_selection_end (etsm, row);
-	e_selection_model_selection_changed(E_SELECTION_MODEL(selection));
-}
-
-static void
-etsm_set_selection_end (ESelectionModel *selection, gint row)
-{
-	ETreeSelectionModel *etsm = E_TREE_SELECTION_MODEL(selection);
-
-	g_return_if_fail (etsm->priv->cursor_path);
-
-	if (!etsm->priv->start_path)
-		etsm->priv->start_path = etsm->priv->cursor_path;
-	etsm_real_move_selection_end(etsm, row);
-	e_selection_model_selection_changed(E_SELECTION_MODEL(etsm));
-}
-
-struct foreach_path_t {
-	ETreeForeachFunc callback;
-	gpointer closure;
-};
-
-static void
-foreach_path (gpointer key, gpointer value, gpointer data)
-{
-	ETreePath path = key;
-	struct foreach_path_t *c = data;
-	c->callback (path, c->closure);
-}
-
-void
-e_tree_selection_model_foreach (ETreeSelectionModel *etsm, ETreeForeachFunc callback, gpointer closure)
-{
-	if (etsm->priv->paths) {
-		struct foreach_path_t c;
-		c.callback = callback;
-		c.closure = closure;
-		g_hash_table_foreach(etsm->priv->paths, foreach_path, &c);
-		return;
-	}
-}
-
-void
-e_tree_selection_model_select_single_path (ETreeSelectionModel *etsm, ETreePath path)
-{
-	select_single_path (etsm, path);
-
-	e_selection_model_selection_changed(E_SELECTION_MODEL(etsm));
-}
-
-void
-e_tree_selection_model_select_paths (ETreeSelectionModel *etsm, GPtrArray *paths)
-{
-	ETreePath path;
-	int i;
-
-	for (i=0;i<paths->len;i++) {
-		path = paths->pdata[i];
-		change_one_path(etsm, path, TRUE);
-	}
-
-	e_selection_model_selection_changed(E_SELECTION_MODEL(etsm));
-}
-
-void
-e_tree_selection_model_add_to_selection (ETreeSelectionModel *etsm, ETreePath path)
-{
-	change_one_path(etsm, path, TRUE);
-
-	e_selection_model_selection_changed(E_SELECTION_MODEL(etsm));
-}
-
-void
-e_tree_selection_model_change_cursor (ETreeSelectionModel *etsm, ETreePath path)
-{
-	int row;
-
-	etsm->priv->cursor_path = path;
-
-	row = get_cursor_row(etsm);
-
-	E_SELECTION_MODEL (etsm)->old_selection = -1;
-
-	e_selection_model_cursor_changed(E_SELECTION_MODEL(etsm), row, etsm->priv->cursor_col);
-	e_selection_model_cursor_activated(E_SELECTION_MODEL(etsm), row, etsm->priv->cursor_col);
-}
-
-ETreePath
-e_tree_selection_model_get_cursor (ETreeSelectionModel *etsm)
-{
-	return etsm->priv->cursor_path;
-}
-
-
-static void
-e_tree_selection_model_init (ETreeSelectionModel *etsm)
-{
-	ETreeSelectionModelPriv *priv;
-	priv                                  = g_new(ETreeSelectionModelPriv, 1);
-	etsm->priv                            = priv;
-
-	priv->etta                            = NULL;
-	priv->model                           = NULL;
-
-	priv->paths                           = g_hash_table_new (NULL, NULL);
-
-	priv->cursor_path                     = NULL;
-	priv->start_path                      = NULL;
-	priv->cursor_col                      = -1;
-	priv->cursor_save_id		      = NULL;
-
-	priv->tree_model_pre_change_id        = 0;
-	priv->tree_model_no_change_id         = 0;
-	priv->tree_model_node_changed_id      = 0;
-	priv->tree_model_node_data_changed_id = 0;
-	priv->tree_model_node_col_changed_id  = 0;
-	priv->tree_model_node_inserted_id     = 0;
-	priv->tree_model_node_removed_id      = 0;
-	priv->tree_model_node_deleted_id      = 0;
-}
-
-static void
-e_tree_selection_model_class_init (ETreeSelectionModelClass *klass)
-{
-	GObjectClass *object_class;
-	ESelectionModelClass *esm_class;
-
-	parent_class = g_type_class_ref (PARENT_TYPE);
-
-	object_class = G_OBJECT_CLASS(klass);
-	esm_class = E_SELECTION_MODEL_CLASS(klass);
-
-	object_class->dispose = etsm_dispose;
-	object_class->finalize = etsm_finalize;
-	object_class->get_property = etsm_get_property;
-	object_class->set_property = etsm_set_property;
-
-	esm_class->is_row_selected    = etsm_is_row_selected    ;
-	esm_class->foreach            = etsm_foreach            ;
-	esm_class->clear              = etsm_clear              ;
-	esm_class->selected_count     = etsm_selected_count     ;
-	esm_class->select_all         = etsm_select_all         ;
-	esm_class->invert_selection   = etsm_invert_selection   ;
-	esm_class->row_count          = etsm_row_count          ;
-
-	esm_class->change_one_row     = etsm_change_one_row     ;
-	esm_class->change_cursor      = etsm_change_cursor      ;
-	esm_class->cursor_row         = etsm_cursor_row         ;
-	esm_class->cursor_col         = etsm_cursor_col         ;
-
-	esm_class->select_single_row  = etsm_select_single_row  ;
-	esm_class->toggle_single_row  = etsm_toggle_single_row  ;
-	esm_class->move_selection_end = etsm_move_selection_end ;
-	esm_class->set_selection_end  = etsm_set_selection_end  ;
-
-	g_object_class_install_property (object_class, PROP_CURSOR_ROW, 
-					 g_param_spec_int ("cursor_row",
-							   _("Cursor Row"),
-							   /*_( */"XXX blurb" /*)*/,
-							   0, G_MAXINT, 0,
-							   G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_CURSOR_COL, 
-					 g_param_spec_int ("cursor_col",
-							   _("Cursor Column"),
-							   /*_( */"XXX blurb" /*)*/,
-							   0, G_MAXINT, 0,
-							   G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_MODEL, 
-					 g_param_spec_object ("model",
-							      _("Model"),
-							      "XXX blurb",
-							      E_TREE_MODEL_TYPE,
-							      G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_ETTA, 
-					 g_param_spec_object ("etta",
-							      "ETTA",
-							      "XXX blurb",
-							      E_TREE_TABLE_ADAPTER_TYPE,
-							      G_PARAM_READWRITE));
-
-}
-
-ESelectionModel *
-e_tree_selection_model_new (void)
-{
-	return g_object_new (E_TREE_SELECTION_MODEL_TYPE, NULL);
-}
-
-E_MAKE_TYPE(e_tree_selection_model, "ETreeSelectionModel", ETreeSelectionModel,
-	    e_tree_selection_model_class_init, e_tree_selection_model_init, PARENT_TYPE)
diff --git a/widgets/table/e-tree-selection-model.h b/widgets/table/e-tree-selection-model.h
deleted file mode 100644
index 44ebf08f31..0000000000
--- a/widgets/table/e-tree-selection-model.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-tree-selection-model.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TREE_SELECTION_MODEL_H_
-#define _E_TREE_SELECTION_MODEL_H_
-
-#include <gdk/gdktypes.h>
-#include <gtk/gtkobject.h>
-#include <gal/util/e-sorter.h>
-#include <gal/widgets/e-selection-model.h>
-#include <gal/e-table/e-tree-model.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-typedef void (*ETreeForeachFunc) (ETreePath path,
-				  gpointer closure);
-
-typedef struct ETreeSelectionModelPriv ETreeSelectionModelPriv;
-
-#define E_TREE_SELECTION_MODEL_TYPE        (e_tree_selection_model_get_type ())
-#define E_TREE_SELECTION_MODEL(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TREE_SELECTION_MODEL_TYPE, ETreeSelectionModel))
-#define E_TREE_SELECTION_MODEL_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TREE_SELECTION_MODEL_TYPE, ETreeSelectionModelClass))
-#define E_IS_TREE_SELECTION_MODEL(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TREE_SELECTION_MODEL_TYPE))
-#define E_IS_TREE_SELECTION_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TREE_SELECTION_MODEL_TYPE))
-
-typedef struct {
-	ESelectionModel base;
-
-	ETreeSelectionModelPriv *priv;
-} ETreeSelectionModel;
-
-typedef struct {
-	ESelectionModelClass parent_class;
-} ETreeSelectionModelClass;
-
-
-GType            e_tree_selection_model_get_type            (void);
-ESelectionModel *e_tree_selection_model_new                 (void);
-void             e_tree_selection_model_foreach             (ETreeSelectionModel *etsm,
-							     ETreeForeachFunc     callback,
-							     gpointer             closure);
-void             e_tree_selection_model_select_single_path  (ETreeSelectionModel *etsm,
-							     ETreePath            path);
-void		 e_tree_selection_model_select_paths        (ETreeSelectionModel *etsm, GPtrArray *paths);
-
-void             e_tree_selection_model_add_to_selection    (ETreeSelectionModel *etsm,
-							     ETreePath            path);
-void             e_tree_selection_model_change_cursor       (ETreeSelectionModel *etsm,
-							     ETreePath            path);
-ETreePath        e_tree_selection_model_get_cursor          (ETreeSelectionModel *etsm);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* _E_TREE_SELECTION_MODEL_H_ */
diff --git a/widgets/table/e-tree-simple.c b/widgets/table/e-tree-simple.c
deleted file mode 100644
index e8dff1e05a..0000000000
--- a/widgets/table/e-tree-simple.c
+++ /dev/null
@@ -1,208 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-tree-simple.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include "gal/util/e-util.h"
-#include "e-tree-simple.h"
-
-static int
-simple_column_count (ETableModel *etm)
-{
-	ETreeSimple *simple = E_TREE_SIMPLE(etm);
-
-	if (simple->col_count)
-		return simple->col_count (etm, simple->model_data);
-	else
-		return 0;
-}
-
-/* The default for simple_duplicate_value is to return the raw value. */
-static void *
-simple_duplicate_value (ETableModel *etm, int col, const void *value)
-{
-	ETreeSimple *simple = E_TREE_SIMPLE(etm);
-
-	if (simple->duplicate_value)
-		return simple->duplicate_value (etm, col, value, simple->model_data);
-	else
-		return (void *)value;
-}
-
-static void
-simple_free_value (ETableModel *etm, int col, void *value)
-{
-	ETreeSimple *simple = E_TREE_SIMPLE(etm);
-
-	if (simple->free_value)
-		simple->free_value (etm, col, value, simple->model_data);
-}
-
-static void *
-simple_initialize_value (ETableModel *etm, int col)
-{
-	ETreeSimple *simple = E_TREE_SIMPLE(etm);
-	
-	if (simple->initialize_value)
-		return simple->initialize_value (etm, col, simple->model_data);
-	else
-		return NULL;
-}
-
-static gboolean
-simple_value_is_empty (ETableModel *etm, int col, const void *value)
-{
-	ETreeSimple *simple = E_TREE_SIMPLE(etm);
-	
-	if (simple->value_is_empty)
-		return simple->value_is_empty (etm, col, value, simple->model_data);
-	else
-		return FALSE;
-}
-
-static char *
-simple_value_to_string (ETableModel *etm, int col, const void *value)
-{
-	ETreeSimple *simple = E_TREE_SIMPLE(etm);
-	
-	if (simple->value_to_string)
-		return simple->value_to_string (etm, col, value, simple->model_data);
-	else
-		return g_strdup ("");
-}
-
-static void *
-simple_value_at (ETreeModel *etm, ETreePath *node, int col)
-{
-	ETreeSimple *simple = E_TREE_SIMPLE(etm);
-
-	return simple->value_at (etm, node, col, simple->model_data);
-}
-
-static GdkPixbuf *
-simple_icon_at (ETreeModel *etm, ETreePath *node)
-{
-	ETreeSimple *simple = E_TREE_SIMPLE(etm);
-
-	return simple->icon_at (etm, node, simple->model_data);
-}
-
-static void
-simple_set_value_at (ETreeModel *etm, ETreePath *node, int col, const void *val)
-{
-	ETreeSimple *simple = E_TREE_SIMPLE(etm);
-
-	simple->set_value_at (etm, node, col, val, simple->model_data);
-}
-
-static gboolean
-simple_is_editable (ETreeModel *etm, ETreePath *node, int col)
-{
-	ETreeSimple *simple = E_TREE_SIMPLE(etm);
-
-	return simple->is_editable (etm, node, col, simple->model_data);
-}
-
-static void
-e_tree_simple_class_init (GObjectClass *object_class)
-{
-	ETreeModelClass *model_class        = (ETreeModelClass *) object_class;
-	ETableModelClass *table_model_class = (ETableModelClass *) object_class;
-
-	table_model_class->column_count     = simple_column_count;
-	table_model_class->duplicate_value  = simple_duplicate_value;
-	table_model_class->free_value       = simple_free_value;
-	table_model_class->initialize_value = simple_initialize_value;
-	table_model_class->value_is_empty   = simple_value_is_empty;
-	table_model_class->value_to_string  = simple_value_to_string;
-
-	model_class      ->icon_at          = simple_icon_at;
-	model_class      ->value_at         = simple_value_at;
-	model_class      ->set_value_at     = simple_set_value_at;
-	model_class      ->is_editable      = simple_is_editable;
-}
-
-E_MAKE_TYPE(e_tree_simple, "ETreeSimple", ETreeSimple, e_tree_simple_class_init, NULL, E_TREE_MODEL_TYPE)
-
-/**
- * e_tree_simple_new:
- * @col_count: 
- * @duplicate_value: 
- * @free_value: 
- * @initialize_value: 
- * @value_is_empty: 
- * @value_to_string: 
- * @icon_at: 
- * @value_at: 
- * @set_value_at: 
- * @is_editable: 
- * @model_data: 
- * 
- * This initializes a new ETreeSimpleModel object.  ETreeSimpleModel is
- * an implementaiton of the abstract class ETreeModel.  The ETreeSimpleModel
- * is designed to allow people to easily create ETreeModels without having
- * to create a new GtkType derived from ETreeModel every time they need one.
- *
- * Instead, ETreeSimpleModel uses a setup based in callback functions, every
- * callback function signature mimics the signature of each ETreeModel method
- * and passes the extra @data pointer to each one of the method to provide them
- * with any context they might want to use. 
- * 
- * ETreeSimple is to ETreeModel as ETableSimple is to ETableModel.
- *
- * Return value: An ETreeSimple object (which is also an ETreeModel
- * object).
- **/
-ETreeModel *
-e_tree_simple_new  (ETableSimpleColumnCountFn     col_count,
-		    ETableSimpleDuplicateValueFn  duplicate_value,
-		    ETableSimpleFreeValueFn       free_value,
-		    ETableSimpleInitializeValueFn initialize_value,
-		    ETableSimpleValueIsEmptyFn    value_is_empty,
-		    ETableSimpleValueToStringFn   value_to_string,
-
-		    ETreeSimpleIconAtFn      	  icon_at,
-		    ETreeSimpleValueAtFn     	  value_at,
-		    ETreeSimpleSetValueAtFn  	  set_value_at,
-		    ETreeSimpleIsEditableFn  	  is_editable,
-
-		    gpointer                 	  model_data)
-{
-	ETreeSimple *etg = g_object_new (E_TREE_SIMPLE_TYPE, NULL);
-
-	etg->col_count        = col_count;
-	etg->duplicate_value  = duplicate_value;
-	etg->free_value       = free_value;
-	etg->initialize_value = initialize_value;
-	etg->value_is_empty   = value_is_empty;
-	etg->value_to_string  = value_to_string;
-
-	etg->icon_at          = icon_at;
-	etg->value_at         = value_at;
-	etg->set_value_at     = set_value_at;
-	etg->is_editable      = is_editable;
-
-	etg->model_data       = model_data;
-
-	return (ETreeModel*)etg;
-}
-
diff --git a/widgets/table/e-tree-simple.h b/widgets/table/e-tree-simple.h
deleted file mode 100644
index f9980c9544..0000000000
--- a/widgets/table/e-tree-simple.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-tree-simple.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TREE_SIMPLE_H_
-#define _E_TREE_SIMPLE_H_
-
-#include <gal/e-table/e-tree-model.h>
-#include <gal/e-table/e-table-simple.h>
-
-G_BEGIN_DECLS
-
-#define E_TREE_SIMPLE_TYPE        (e_tree_simple_get_type ())
-#define E_TREE_SIMPLE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TREE_SIMPLE_TYPE, ETreeSimple))
-#define E_TREE_SIMPLE_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TREE_SIMPLE_TYPE, ETreeSimpleClass))
-#define E_IS_TREE_SIMPLE(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TREE_SIMPLE_TYPE))
-#define E_IS_TREE_SIMPLE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TREE_SIMPLE_TYPE))
-#define E_TREE_SIMPLE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TREE_SIMPLE_TYPE, ETreeSimpleClass))
-
-
-typedef GdkPixbuf* (*ETreeSimpleIconAtFn)     (ETreeModel *etree, ETreePath *path, void *model_data);
-typedef void*      (*ETreeSimpleValueAtFn)    (ETreeModel *etree, ETreePath *path, int col, void *model_data);
-typedef void       (*ETreeSimpleSetValueAtFn) (ETreeModel *etree, ETreePath *path, int col, const void *val, void *model_data);
-typedef gboolean   (*ETreeSimpleIsEditableFn) (ETreeModel *etree, ETreePath *path, int col, void *model_data);
-
-typedef struct {
-	ETreeModel parent;
-
-	/* Table methods */
-	ETableSimpleColumnCountFn     col_count;
-	ETableSimpleDuplicateValueFn  duplicate_value;
-	ETableSimpleFreeValueFn       free_value;
-	ETableSimpleInitializeValueFn initialize_value;
-	ETableSimpleValueIsEmptyFn    value_is_empty;
-	ETableSimpleValueToStringFn   value_to_string;
-
-	/* Tree methods */
-	ETreeSimpleIconAtFn icon_at;
-	ETreeSimpleValueAtFn value_at;
-	ETreeSimpleSetValueAtFn set_value_at;
-	ETreeSimpleIsEditableFn is_editable;
-
-	gpointer model_data;
-} ETreeSimple;
-
-typedef struct {
-	ETreeModelClass parent_class;
-} ETreeSimpleClass;
-
-GType e_tree_simple_get_type (void);
-
-ETreeModel *e_tree_simple_new  (ETableSimpleColumnCountFn     col_count,
-				ETableSimpleDuplicateValueFn  duplicate_value,
-				ETableSimpleFreeValueFn       free_value,
-				ETableSimpleInitializeValueFn initialize_value,
-				ETableSimpleValueIsEmptyFn    value_is_empty,
-				ETableSimpleValueToStringFn   value_to_string,
-				ETreeSimpleIconAtFn           icon_at,
-				ETreeSimpleValueAtFn          value_at,
-				ETreeSimpleSetValueAtFn       set_value_at,
-				ETreeSimpleIsEditableFn       is_editable,
-				gpointer                      model_data);
-
-G_END_DECLS
-
-#endif /* _E_TREE_SIMPLE_H_ */
diff --git a/widgets/table/e-tree-sorted-variable.c b/widgets/table/e-tree-sorted-variable.c
deleted file mode 100644
index bb73b8b776..0000000000
--- a/widgets/table/e-tree-sorted-variable.c
+++ /dev/null
@@ -1,477 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-tree-sorted-variable.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <string.h>
-#include "gal/util/e-util.h"
-#include "e-tree-sorted-variable.h"
-
-#define d(x)
-
-#define INCREMENT_AMOUNT 100
-
-/* maximum insertions between an idle event that we will do without scheduling an idle sort */
-#define ETSV_INSERT_MAX (4)
-
-static ETreeModelClass *etsv_parent_class;
-
-struct ETreePath {
-	GNode node;
-};
-
-struct ETreeSortedVariablePrivate {
-	GNode *root;
-};
-
-static void etsv_proxy_model_changed      (ETableModel *etm, ETreeSortedVariable *etsv);
-#if 0
-static void etsv_proxy_model_row_changed  (ETableModel *etm, int row, ETreeSortedVariable *etsv);
-static void etsv_proxy_model_cell_changed (ETableModel *etm, int col, int row, ETreeSortedVariable *etsv);
-#endif
-static void etsv_sort_info_changed        (ETableSortInfo *info, ETreeSortedVariable *etsv);
-static void etsv_sort                     (ETreeSortedVariable *etsv);
-static void etsv_add                      (ETreeSortedVariable *etsv, gint                  row);
-static void etsv_add_all                  (ETreeSortedVariable *etsv);
-
-static void
-etsv_dispose (GObject *object)
-{
-	ETreeSortedVariable *etsv = E_TREE_SORTED_VARIABLE (object);
-
-	if (etsv->table_model_changed_id)
-		g_signal_handler_disconnect (G_OBJECT (etss->source),
-				             etsv->table_model_changed_id);
-	etsv->table_model_changed_id = 0;
-
-#if 0
-	g_signal_handler_disconnect (etss->source,
-				     etsv->table_model_row_changed_id);
-	g_signal_handler_disconnect (etss->source,
-				     etsv->table_model_cell_changed_id);
-
-	etsv->table_model_row_changed_id = 0;
-	etsv->table_model_cell_changed_id = 0;
-#endif
-	if (etsv->sort_info_changed_id)
-		g_signal_handler_disconnect (etsv->sort_info,
-				             etsv->sort_info_changed_id);
-	etsv->sort_info_changed_id = 0;
-
-	if (etsv->sort_idle_id)
-		g_source_remove(etsv->sort_idle_id);
-	etsv->sort_idle_id = 0;
-	
-	if (etsv->insert_idle_id)
-		g_source_remove(etsv->insert_idle_id);
-	etsv->insert_idle_id = 0;
-
-	if (etsv->sort_info)
-		g_object_unref(etsv->sort_info);
-	etsv->sort_info = NULL;
-
-	if (etsv->full_header)
-		g_object_unref(etsv->full_header);
-	etsv->full_header = NULL;
-
-	G_OBJECT_CLASS (etsv_parent_class)->dispose (object);
-}
-
-static void
-etsv_class_init (GObjectClass *object_class)
-{
-	ETreeSortedVariableClass *etsv_class = E_TREE_MODEL_CLASS(object_class);
-
-	etsv_parent_class = g_type_class_peek_parent (object_class);
-
-	object_class->dispose = etsv_dispose;
-
-	etsv_class->add = etsv_add;
-	etsv_class->add_all = etsv_add_all;
-}
-
-static void
-etsv_init (ETreeSortedVariable *etsv)
-{
-	etsv->full_header = NULL;
-	etsv->sort_info = NULL;
-
-	etsv->table_model_changed_id = 0;
-	etsv->table_model_row_changed_id = 0;
-	etsv->table_model_cell_changed_id = 0;
-	etsv->sort_info_changed_id = 0;
-
-	etsv->sort_idle_id = 0;
-	etsv->insert_count = 0;
-}
-
-E_MAKE_TYPE(e_tree_sorted_variable, "ETreeSortedVariable", ETreeSortedVariable, etsv_class_init, etsv_init, E_TREE_MODEL_TYPE)
-
-static gboolean
-etsv_sort_idle(ETreeSortedVariable *etsv)
-{
-	g_object_ref(etsv);
-	etsv_sort(etsv);
-	etsv->sort_idle_id = 0;
-	etsv->insert_count = 0;
-	g_object_unref(etsv);
-	return FALSE;
-}
-
-static gboolean
-etsv_insert_idle(ETreeSortedVariable *etsv)
-{
-	etsv->insert_count = 0;
-	etsv->insert_idle_id = 0;
-	return FALSE;
-}
-
-
-ETableModel *
-e_tree_sorted_variable_new (ETreeModel *source, ETableHeader *full_header, ETableSortInfo *sort_info)
-{
-	ETreeSortedVariable *etsv = g_object_new (E_TREE_SORTED_VARIABLE_TYPE, NULL);
-	ETreeSortedVariable *etsv = E_TABLE_SUBSET_VARIABLE (etsv);
-
-	if (e_table_subset_variable_construct (etsv, source) == NULL){
-		g_object_unref (etsv);
-		return NULL;
-	}
-
-	etsv->sort_info = sort_info;
-	g_object_ref(etsv->sort_info);
-	etsv->full_header = full_header;
-	g_object_ref(etsv->full_header);
-
-	etsv->table_model_changed_id = g_signal_connect (source, "model_changed",
-							 G_CALLBACK (etsv_proxy_model_changed), etsv);
-#if 0
-	etsv->table_model_row_changed_id = g_signal_connect (source, "model_row_changed",
-							     G_CALLBACK (etsv_proxy_model_row_changed), etsv);
-	etsv->table_model_cell_changed_id = g_signal_connect (source, "model_cell_changed",
-							      G_CALLBACK (etsv_proxy_model_cell_changed), etsv);
-#endif
-	etsv->sort_info_changed_id = g_signal_connect (sort_info, "sort_info_changed",
-						       G_CALLBACK (etsv_sort_info_changed), etsv);
-
-	return E_TABLE_MODEL(etsv);
-}
-
-static void
-etsv_proxy_model_changed (ETableModel *etm, ETreeSortedVariable *etsv)
-{
-	/* FIXME: do_resort (); */
-}
-#if 0
-static void
-etsv_proxy_model_row_changed (ETableModel *etm, int row, ETreeSortedVariable *etsv)
-{
-	ETreeSortedVariable *etsv = E_TABLE_SUBSET_VARIABLE(etsv);
-
-	if (e_table_subset_variable_remove(etsv, row))
-		e_table_subset_variable_add (etsv, row);
-}
-
-static void
-etsv_proxy_model_cell_changed (ETableModel *etm, int col, int row, ETreeSortedVariable *etsv)
-{
-	ETreeSortedVariable *etsv = E_TABLE_SUBSET_VARIABLE(etsv);
-
-	if (e_table_subset_variable_remove(etsv, row))
-		e_table_subset_variable_add (etsv, row);
-}
-#endif
-
-static void
-etsv_sort_info_changed (ETableSortInfo *info, ETreeSortedVariable *etsv)
-{
-	etsv_sort(etsv);
-}
-
-/* This takes source rows. */
-static int
-etsv_compare(ETreeSortedVariable *etsv, const ETreePath *path1, const ETreePath *path2)
-{
-	int j;
-	int sort_count = e_table_sort_info_sorting_get_count(etsv->sort_info);
-	int comp_val = 0;
-	int ascending = 1;
-
-	for (j = 0; j < sort_count; j++) {
-		ETableSortColumn column = e_table_sort_info_sorting_get_nth(etsv->sort_info, j);
-		ETableCol *col;
-		col = e_table_header_get_column_by_col_idx(etsv->full_header, column.column);
-		if (col == NULL)
-			col = e_table_header_get_column (etsv->full_header, e_table_header_count (etsv->full_header) - 1);
-		comp_val = (*col->compare)(e_tree_model_value_at (etsv->source, path1, col->col_idx),
-					   e_tree_model_value_at (etsv->source, path2, col->col_idx));
-		ascending = column.ascending;
-		if (comp_val != 0)
-			break;
-	}
-	if (comp_val == 0) {
-		if (row1 < row2)
-			comp_val = -1;
-		if (row1 > row2)
-			comp_val = 1;
-	}
-	if (!ascending)
-		comp_val = -comp_val;
-	return comp_val;
-}
-
-
-static ETreeSortedVariable *etsv_closure;
-int cols_closure;
-int *ascending_closure;
-int *col_idx_closure;
-GCompareFunc *compare_closure;
-
-static int
-etsv_compare_closure(const ETreePath *path1, const ETreePath *path2)
-{
-	int j;
-	int sort_count = e_table_sort_info_sorting_get_count(etsv_closure->sort_info);
-	int comp_val = 0;
-	int ascending = 1;
-	for (j = 0; j < sort_count; j++) {
-
-		comp_val = (*(compare_closure[j]))(e_tree_model_value_at (etsv_closure->source, path1, col_idx_closure[j]),
-						   e_tree_model_value_at (etsv_closure->source, path2, col_idx_closure[j]));
-		ascending = ascending_closure[j];
-		if (comp_val != 0)
-			break;
-	}
-	if (comp_val == 0) {
-		if (row1 < row2)
-			comp_val = -1;
-		if (row1 > row2)
-			comp_val = 1;
-	}
-	if (!ascending)
-		comp_val = -comp_val;
-	return comp_val;
-}
-
-static int
-qsort_callback(const void *data1, const void *data2)
-{
-	GNode *node1 = *(GNode **)data1;
-	GNode *node2 = *(GNode **)data2;
-	return etsv_compare_closure(node1->data, node2->data);
-}
-
-static int
-qsort_callback_source(const void *data1, const void *data2)
-{
-	return etsv_compare_closure(data1, data2);
-}
-
-static void
-etsv_setup_closures(ETreeSortedVariable *etsv)
-{
-	int j;
-	int cols;
-
-	cols = e_table_sort_info_sorting_get_count(etsv->sort_info);
-	cols_closure = cols;
-	etsv_closure = etsv;
-
-	ascending_closure = g_new(int, cols);
-	col_idx_closure = g_new(int, cols);
-	compare_closure = g_new(GCompareFunc, cols);
-
-	for (j = 0; j < cols; j++) {
-		ETableSortColumn column = e_table_sort_info_sorting_get_nth(etsv->sort_info, j);
-		ETableCol *col;
-
-		col = e_table_header_get_column_by_col_idx(etsv->full_header, column.column);
-		if (col == NULL) {
-			col = e_table_header_get_column (etsv->full_header, e_table_header_count (etsv->full_header) - 1);
-		}
-
-		ascending_closure[j] = column.ascending;
-		col_idx_closure[j] = col->col_idx;
-		compare_closure[j] = col->compare;
-	}
-}
-
-static void
-etsv_free_closures(ETreeSortedVariable *etsv)
-{
-	g_free(ascending_closure);
-	g_free(col_idx_closure);
-	g_free(compare_closure);
-
-}
-
-static void
-etsv_sort_node(ETreeSortedVariable *etsv, GNode *node)
-{
-	gint n;
-	gint i;
-	GNode **children;
-	GNode *child;
-	GNode *prev;
-
-	n = g_node_n_children(node);
-	children = g_new(GNode *, n);
-	for (i = 0, child = node->children; child && i; child = child->next, i++) {
-		children[i] = child;
-	}
-	qsort(children, n, sizeof(GNode *), qsort_callback);
-
-	prev = NULL;
-	for (i = 0; i < n; i++) {
-		children[i]->prev = prev;
-		if (prev) prev->next = children[i];
-		prev = children[i];
-		children[i]->next = NULL;
-	}
-}
-
-static void
-etsv_sort_tree(ETreeSortedVariable *etsv, GNode *root)
-{
-	GNode *childr;
-
-	etsv_sort_node(etsv, node);
-	
-	for (child = node->child; child; child = child->next) {
-		etsv_sort_tree(etsv, child);
-	}
-}
-
-static void
-etsv_sort(ETreeSortedVariable *etsv)
-{
-	static int reentering = 0;
-	if (reentering)
-		return;
-	reentering = 1;
-
-	e_table_model_pre_change(E_TABLE_MODEL(etsv));
-
-	etsv_setup_closures(etsv);
-
-	etsv_sort_tree(etsv, etsv->root);
-
-	etsv_free_closures(etsv);
-
-	e_table_model_changed (E_TABLE_MODEL(etsv));
-	reentering = 0;
-}
-
-static void
-etsv_add_node (ETreeSortedVariable *etsv, ETreePath *path, GNode *root)
-{
-	GNode *node;
-	GNode *new_node;
-	for (node = root; node; node = node->next) {
-		if (e_tree_model_node_is_ancestor(etsv->source, path, node->data)) {
-			etsv_add_node(etsv, path, node->data);
-			return;
-		}
-	}
-	new_node = g_node_new(path);
-	for (node = root; node; ) {
-		if (e_tree_model_node_is_ancestor(etsv->source, node->data, path)) {
-			GNode *next;
-			next = node->next;
-			g_node_unlink(node);
-			g_node_prepend(new_node, node);
-			node = next;
-		} else
-			node = node->next;
-	}
-
-	etsv_sort_node(etsv, new_node);
-
-
-#if 0
-	g_node_prepend(root, new_node);
-	etsv_sort_node(etsv, root);
-#else
-	/* Insert sort to be a bit faster than the above prepend and then sort. */
-	for (node = root; node; node = node->next) {
-		if (etsv_compare(etsv, path, node->data) > 0) {
-			g_node_insert_before (root, node, new_node);
-			return;
-		}
-	}
-	g_node_append(root, new_node);
-#endif
-}
-
-etsv_add(ETreeSortedVariable *etsv, gint row)
-{
-	ETreeModel *source = etsv->source;
-	ETreePath *path;
-
-	path = e_table_model_value_at (E_TABLE_MODEL(source), -1, row);
-	etsv_add_node(etsv, path, etsv->root);
-}
-
-/* Optimize by doing the qsorts as we build.  But we'll do that later. */
-static void
-etsv_add_all_node (ETreeSortedVariable *etsv, ETreePath *path, GNode *node)
-{
-	ETreeModel *source = etsv->source;
-	ETreePath **children;
-	int n;
-	int i;
-
-	n = e_tree_model_node_get_children(source, path, &children);
-	qsort(children, n, sizeof(ETreePath *), qsort_callback_source);
-
-	for (i = n - 1; i >= 0; i--) {
-		GNode *new_child = g_node_new(children[i]);
-		g_node_prepend(path, new_child);
-		etsv_add_all_node (etsv, children[i], new_child)
-	}
-
-	g_free(children);
-}
-
-static void
-etsv_add_all   (ETreeSortedVariable *etsv)
-{
-	GNode *node;
-	ETreePath *path;
-
-	e_table_model_pre_change(etm);
-
-	if (etsv->root)
-		g_node_destroy(etsv->root);
-
-	etsv_setup_closures(etsv);
-
-	path = e_tree_model_get_root(etsv->source);
-	node = g_node_new(path);
-	etsv_add_all_node(etsv, path, node);
-	etsv->root = node;
-
-	etsv_free_closures(etsv);
-
-	e_tree_model_node_changed (etsv, etsv->root);
-}
diff --git a/widgets/table/e-tree-sorted-variable.h b/widgets/table/e-tree-sorted-variable.h
deleted file mode 100644
index 35c4c22ffd..0000000000
--- a/widgets/table/e-tree-sorted-variable.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-tree-sorted-variable.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TREE_SORTED_VARIABLE_H_
-#define _E_TREE_SORTED_VARIABLE_H_
-
-#include <glib-object.h>
-#include <gal/e-tree/e-tree-model.h>
-#include <gal/e-table/e-table-subset-variable.h>
-#include <gal/e-table/e-table-sort-info.h>
-#include <gal/e-table/e-table-header.h>
-
-G_BEGIN_DECLS
-
-#define E_TREE_SORTED_VARIABLE_TYPE        (e_tree_sorted_variable_get_type ())
-#define E_TREE_SORTED_VARIABLE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TREE_SORTED_VARIABLE_TYPE, ETreeSortedVariable))
-#define E_TREE_SORTED_VARIABLE_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TREE_SORTED_VARIABLE_TYPE, ETreeSortedVariableClass))
-#define E_IS_TREE_SORTED_VARIABLE(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TREE_SORTED_VARIABLE_TYPE))
-#define E_IS_TREE_SORTED_VARIABLE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TREE_SORTED_VARIABLE_TYPE))
-#define E_TREE_SORTED_VARIABLE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TREE_SORTED_VARIABLE_TYPE, ETreeSortedVariableClass))
-
-typedef struct {
-	ETreeModel base;
-
-	ETableSortInfo *sort_info;
-	
-	ETableHeader *full_header;
-
-	int              table_model_changed_id;
-	int              table_model_row_changed_id;
-	int              table_model_cell_changed_id;
-	int              sort_info_changed_id;
-	int              sort_idle_id;
-	int		 insert_idle_id;
-	int		 insert_count;
-
-} ETreeSortedVariable;
-
-typedef struct {
-	ETreeModelClass parent_class;
-} ETreeSortedVariableClass;
-
-GType        e_tree_sorted_variable_get_type        (void);
-ETableModel *e_tree_sorted_variable_new             (ETreeModel          *etm,
-						     ETableHeader        *header,
-						     ETableSortInfo      *sort_info);
-
-ETreeModel  *e_tree_sorted_get_toplevel             (ETreeSortedVariable *tree_model);
-
-void         e_tree_sorted_variable_add             (ETreeSortedVariable *ets,
-						     gint                 row);
-void         e_tree_sorted_variable_add_all         (ETreeSortedVariable *ets);
-gboolean     e_tree_sorted_variable_remove          (ETreeSortedVariable *ets,
-						     gint                 row);
-void         e_tree_sorted_variable_increment       (ETreeSortedVariable *ets,
-						     gint                 position,
-						     gint                 amount);
-void         e_tree_sorted_variable_decrement       (ETreeSortedVariable *ets,
-						     gint                 position,
-						     gint                 amount);
-void         e_tree_sorted_variable_set_allocation  (ETreeSortedVariable *ets,
-						     gint                 total);
-G_END_DECLS
-
-#endif /* _E_TREE_SORTED_VARIABLE_H_ */
diff --git a/widgets/table/e-tree-sorted.c b/widgets/table/e-tree-sorted.c
deleted file mode 100644
index 20ecdad63f..0000000000
--- a/widgets/table/e-tree-sorted.c
+++ /dev/null
@@ -1,1390 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-tree-sorted.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Chris Toshok <toshok@ximian.com>
- *
- * Adapted from the gtree code and ETableModel.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-/* FIXME: Overall e-tree-sorted.c needs to be made more efficient. */
-
-
-#include <config.h>
-
-#include "e-tree-sorted.h"
-
-#include <stdio.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-
-#include <libxml/parser.h>
-#include <libxml/xmlmemory.h>
-
-#include "gal/util/e-util.h"
-#include "gal/util/e-xml-utils.h"
-#include "e-table-sorting-utils.h"
-
-/* maximum insertions between an idle event that we will do without scheduling an idle sort */
-#define ETS_INSERT_MAX (4)
-
-#define TREEPATH_CHUNK_AREA_SIZE (30 * sizeof (ETreeSortedPath))
-
-#define d(x)
-
-static ETreeModel *parent_class;
-static GMemChunk  *node_chunk;
-
-enum {
-	NODE_RESORTED,
-	LAST_SIGNAL
-};
-
-static guint signals [LAST_SIGNAL] = {0, };
-
-typedef struct ETreeSortedPath ETreeSortedPath;
-
-struct ETreeSortedPath {
-	ETreePath         corresponding;
-
-	/* parent/child/sibling pointers */
-	ETreeSortedPath  *parent;
-	gint              num_children;
-	ETreeSortedPath **children;
-	int               position;
-	int               orig_position;
-
-	guint             needs_resort : 1;
-	guint             child_needs_resort : 1;
-	guint             resort_all_children : 1;
-	guint             needs_regen_to_sort : 1;
-};
-
-struct ETreeSortedPriv {
-	ETreeModel      *source;
-	ETreeSortedPath *root;
-
-	ETableSortInfo   *sort_info;
-	ETableHeader     *full_header;
-
-	ETreeSortedPath  *last_access;
-
-	int          tree_model_pre_change_id;
-	int          tree_model_no_change_id;
-	int          tree_model_node_changed_id;
-	int          tree_model_node_data_changed_id;
-	int          tree_model_node_col_changed_id;
-	int          tree_model_node_inserted_id;
-	int          tree_model_node_removed_id;
-	int          tree_model_node_deleted_id;
-	int          tree_model_node_request_collapse_id;
-
-	int          sort_info_changed_id;
-	int          sort_idle_id;
-	int          insert_idle_id;
-	int          insert_count;
-
-	guint        in_resort_idle : 1;
-	guint        nested_resort_idle : 1;
-};
-
-enum {
-	ARG_0,
-
-	ARG_SORT_INFO
-};
-
-static void ets_sort_info_changed (ETableSortInfo *sort_info, ETreeSorted *ets);
-static void resort_node (ETreeSorted *ets, ETreeSortedPath *path, gboolean resort_all_children, gboolean needs_regen, gboolean send_signals);
-static void mark_path_needs_resort (ETreeSorted *ets, ETreeSortedPath *path, gboolean needs_rebuild, gboolean resort_all_children);
-static void schedule_resort (ETreeSorted *ets, ETreeSortedPath *path, gboolean needs_regen, gboolean resort_all_children);
-static void free_path (ETreeSortedPath *path);
-static void generate_children(ETreeSorted *ets, ETreeSortedPath *path);
-static void regenerate_children(ETreeSorted *ets, ETreeSortedPath *path);
-
-
-
-/* idle callbacks */
-
-static gboolean
-ets_sort_idle(gpointer user_data)
-{
-	ETreeSorted *ets = user_data;
-	if (ets->priv->in_resort_idle) {
-		ets->priv->nested_resort_idle = TRUE;
-		return FALSE;
-	}
-	ets->priv->in_resort_idle = TRUE;
-	if (ets->priv->root) {
-		do {
-			ets->priv->nested_resort_idle = FALSE;
-			resort_node (ets, ets->priv->root, FALSE, FALSE, TRUE);
-		} while (ets->priv->nested_resort_idle);
-	}
-	ets->priv->in_resort_idle = FALSE;
-	ets->priv->sort_idle_id = 0;
-	return FALSE;
-}
-
-#define ETS_SORT_IDLE_ACTIVATED(ets) ((ets)->priv->sort_idle_id != 0)
-
-inline static void
-ets_stop_sort_idle (ETreeSorted *ets)
-{
-	if (ets->priv->sort_idle_id) {
-		g_source_remove(ets->priv->sort_idle_id);
-		ets->priv->sort_idle_id = 0;
-	}
-}
-
-static gboolean
-ets_insert_idle(ETreeSorted *ets)
-{
-	ets->priv->insert_count = 0;
-	ets->priv->insert_idle_id = 0;
-	return FALSE;
-}
-
-
-
-/* Helper functions */
-
-#define CHECK_AROUND_LAST_ACCESS
-
-static inline ETreeSortedPath *
-check_last_access (ETreeSorted *ets, ETreePath corresponding)
-{
-#ifdef CHECK_AROUND_LAST_ACCESS
-	ETreeSortedPath *parent;
-#endif
-
-	if (ets->priv->last_access == NULL)
-		return NULL;
-
-	if (ets->priv->last_access == corresponding) {
-		d(g_print("Found last access %p at %p.", ets->priv->last_access, ets->priv->last_access));
-		return ets->priv->last_access;
-	}
-
-#ifdef CHECK_AROUND_LAST_ACCESS
-	parent = ets->priv->last_access->parent;
-	if (parent && parent->children) {
-		int position = ets->priv->last_access->position;
-		int end = MIN(parent->num_children, position + 10);
-		int start = MAX(0, position - 10);
-		int initial = MAX (MIN (position, end), start);
-		int i;
-
-		for (i = initial; i < end; i++) {
-			if (parent->children[i] && parent->children[i]->corresponding == corresponding) {
-				d(g_print("Found last access %p at %p.", ets->priv->last_access, parent->children[i]));
-				return parent->children[i];
-			}
-		}
-
-		for (i = initial - 1; i >= start; i--) {
-			if (parent->children[i] && parent->children[i]->corresponding == corresponding) {
-				d(g_print("Found last access %p at %p.", ets->priv->last_access, parent->children[i]));
-				return parent->children[i];
-			}
-		}
-	}
-#endif
-	return NULL;
-}
-
-static ETreeSortedPath *
-find_path(ETreeSorted *ets, ETreePath corresponding)
-{
-	int depth;
-	ETreePath *sequence;
-	int i;
-	ETreeSortedPath *path;
-	ETreeSortedPath *check_last;
-
-	if (corresponding == NULL)
-		return NULL;
-
-	check_last = check_last_access (ets, corresponding);
-	if (check_last) {
-		d(g_print(" (find_path)\n"));
-		return check_last;
-	}
-
-	depth = e_tree_model_node_depth(ets->priv->source, corresponding);
-
-	sequence = g_new(ETreePath, depth + 1);
-
-	sequence[0] = corresponding;
-
-	for (i = 0; i < depth; i++)
-		sequence[i + 1] = e_tree_model_node_get_parent(ets->priv->source, sequence[i]);
-
-	path = ets->priv->root;
-
-	for (i = depth - 1; i >= 0 && path != NULL; i --) {
-		int j;
-
-		if (path->num_children == -1) {
-			path = NULL;
-			break;
-		}
-
-		for (j = 0; j < path->num_children; j++) {
-			if (path->children[j]->corresponding == sequence[i]) {
-				break;
-			}
-		}
-
-		if (j < path->num_children) {
-			path = path->children[j];
-		} else {
-			path = NULL;
-		}
-	}
-	g_free (sequence);
-
-	d(g_print("Didn't find last access %p.  Setting to %p. (find_path)\n", ets->priv->last_access, path));
-	ets->priv->last_access = path;
-
-	return path;
-}
-
-static ETreeSortedPath *
-find_child_path(ETreeSorted *ets, ETreeSortedPath *parent, ETreePath corresponding)
-{
-	int i;
-
-	if (corresponding == NULL)
-		return NULL;
-
-	if (parent->num_children == -1) {
-		return NULL;
-	}
-
-	for (i = 0; i < parent->num_children; i++)
-		if (parent->children[i]->corresponding == corresponding)
-			return parent->children[i];
-
-	return NULL;
-}
-
-static ETreeSortedPath *
-find_or_create_path(ETreeSorted *ets, ETreePath corresponding)
-{
-	int depth;
-	ETreePath *sequence;
-	int i;
-	ETreeSortedPath *path;
-	ETreeSortedPath *check_last;
-
-	if (corresponding == NULL)
-		return NULL;
-
-	check_last = check_last_access (ets, corresponding);
-	if (check_last) {
-		d(g_print(" (find_or_create_path)\n"));
-		return check_last;
-	}
-
-	depth = e_tree_model_node_depth(ets->priv->source, corresponding);
-
-	sequence = g_new(ETreePath, depth + 1);
-
-	sequence[0] = corresponding;
-
-	for (i = 0; i < depth; i++)
-		sequence[i + 1] = e_tree_model_node_get_parent(ets->priv->source, sequence[i]);
-
-	path = ets->priv->root;
-
-	for (i = depth - 1; i >= 0 && path != NULL; i --) {
-		int j;
-
-		if (path->num_children == -1) {
-			generate_children(ets, path);
-		}
-
-		for (j = 0; j < path->num_children; j++) {
-			if (path->children[j]->corresponding == sequence[i]) {
-				break;
-			}
-		}
-
-		if (j < path->num_children) {
-			path = path->children[j];
-		} else {
-			path = NULL;
-		}
-	}
-	g_free (sequence);
-
-	d(g_print("Didn't find last access %p.  Setting to %p. (find_or_create_path)\n", ets->priv->last_access, path));
-	ets->priv->last_access = path;
-
-	return path;
-}
-
-static void
-free_children (ETreeSortedPath *path)
-{
-	int i;
-
-	if (path == NULL)
-		return;
-
-	for (i = 0; i < path->num_children; i++) {
-		free_path(path->children[i]);
-	}
-
-	g_free(path->children);
-	path->children = NULL;
-	path->num_children = -1;
-}
-
-static void
-free_path (ETreeSortedPath *path)
-{
-	free_children(path);
-	g_chunk_free(path, node_chunk);
-}
-
-static ETreeSortedPath *
-new_path (ETreeSortedPath *parent, ETreePath corresponding)
-{
-	ETreeSortedPath *path;
-
-	path = g_chunk_new0 (ETreeSortedPath, node_chunk);
-
-	path->corresponding = corresponding;
-	path->parent = parent;
-	path->num_children = -1;
-	path->children = NULL;
-	path->position = -1;
-	path->orig_position = -1;
-	path->child_needs_resort = 0;
-	path->resort_all_children = 0;
-	path->needs_resort = 0;
-	path->needs_regen_to_sort = 0;
-
-	return path;
-}
-
-static gboolean
-reposition_path (ETreeSorted *ets, ETreeSortedPath *path)
-{
-	int new_index;
-	int old_index = path->position;
-	ETreeSortedPath *parent = path->parent;
-	gboolean changed = FALSE;
-	if (parent) {
-		if (ets->priv->sort_idle_id == 0) {
-			if (ets->priv->insert_count > ETS_INSERT_MAX) {
-				/* schedule a sort, and append instead */
-				schedule_resort(ets, parent, TRUE, FALSE);
-			} else {
-				/* make sure we have an idle handler to reset the count every now and then */
-				if (ets->priv->insert_idle_id == 0) {
-					ets->priv->insert_idle_id = g_idle_add_full(40, (GSourceFunc) ets_insert_idle, ets, NULL);
-				}
-
-				new_index = e_table_sorting_utils_tree_check_position
-					(E_TREE_MODEL(ets),
-					 ets->priv->sort_info,
-					 ets->priv->full_header,
-					 (ETreePath *) parent->children,
-					 parent->num_children,
-					 old_index);
-
-				if (new_index > old_index) {
-					int i;
-					ets->priv->insert_count++;
-					memmove(parent->children + old_index, parent->children + old_index + 1, sizeof (ETreePath) * (new_index - old_index));
-					parent->children[new_index] = path;
-					for (i = old_index; i <= new_index; i++)
-						parent->children[i]->position = i;
-					changed = TRUE;
-					e_tree_model_node_changed(E_TREE_MODEL(ets), parent);
-					e_tree_sorted_node_resorted(ets, parent);
-				} else if (new_index < old_index) {
-					int i;
-					ets->priv->insert_count++;
-					memmove(parent->children + new_index + 1, parent->children + new_index, sizeof (ETreePath) * (old_index - new_index));
-					parent->children[new_index] = path;
-					for (i = new_index; i <= old_index; i++)
-						parent->children[i]->position = i;
-					changed = TRUE;
-					e_tree_model_node_changed(E_TREE_MODEL(ets), parent);
-					e_tree_sorted_node_resorted(ets, parent);
-				}
-			}
-		} else
-			mark_path_needs_resort(ets, parent, TRUE, FALSE);
-	}
-	return changed;
-}
-
-static void
-regenerate_children(ETreeSorted *ets, ETreeSortedPath *path)
-{
-	ETreeSortedPath **children;
-	int i;
-
-	children = g_new(ETreeSortedPath *, path->num_children);
-	for (i = 0; i < path->num_children; i++)
-		children[path->children[i]->orig_position] = path->children[i];
-	g_free(path->children);
-	path->children = children;
-}
-
-static void
-generate_children(ETreeSorted *ets, ETreeSortedPath *path)
-{
-	ETreePath child;
-	int i;
-	int count;
-
-	free_children(path);
-
-	count = 0;
-	for (child = e_tree_model_node_get_first_child(ets->priv->source, path->corresponding);
-	     child;
-	     child = e_tree_model_node_get_next(ets->priv->source, child)) {
-		count ++;
-	}
-
-	path->num_children = count;
-	path->children = g_new(ETreeSortedPath *, count);
-	for (child = e_tree_model_node_get_first_child(ets->priv->source, path->corresponding), i = 0;
-	     child;
-	     child = e_tree_model_node_get_next(ets->priv->source, child), i++) {
-		path->children[i] = new_path(path, child);
-		path->children[i]->position = i;
-		path->children[i]->orig_position = i;
-	}
-	if (path->num_children > 0)
-		schedule_resort (ets, path, FALSE, TRUE);
-}
-
-static void
-resort_node (ETreeSorted *ets, ETreeSortedPath *path, gboolean resort_all_children, gboolean needs_regen, gboolean send_signals)
-{
-	gboolean needs_resort;
-	if (path) {
-		needs_resort = path->needs_resort || resort_all_children;
-		needs_regen = path->needs_regen_to_sort || needs_regen;
-		if (path->num_children > 0) {
-			if (needs_resort && send_signals)
-				e_tree_model_pre_change(E_TREE_MODEL(ets));
-			if (needs_resort) {
-				int i;
-				d(g_print("Start sort of node %p\n", path));
-				if (needs_regen)
-					regenerate_children(ets, path);
-				d(g_print("Regened sort of node %p\n", path));
-				e_table_sorting_utils_tree_sort (E_TREE_MODEL(ets),
-								 ets->priv->sort_info,
-								 ets->priv->full_header,
-								 (ETreePath *) path->children,
-								 path->num_children);
-				d(g_print("Renumbering sort of node %p\n", path));
-				for (i = 0; i < path->num_children; i++) {
-					path->children[i]->position = i;
-				}
-				d(g_print("End sort of node %p\n", path));
-			}
-			if (path->resort_all_children)
-				resort_all_children = TRUE;
-			if ((resort_all_children || path->child_needs_resort) && path->num_children >= 0) {
-				int i;
-				for (i = 0; i < path->num_children; i++) {
-					resort_node(ets, path->children[i], resort_all_children, needs_regen, send_signals && !needs_resort);
-				}
-				path->child_needs_resort = 0;
-			}
-		}
-		path->needs_resort = 0;	
-		path->child_needs_resort = 0;
-		path->needs_regen_to_sort = 0;
-		path->resort_all_children = 0;
-		if (needs_resort && send_signals && path->num_children > 0) {
-			e_tree_model_node_changed(E_TREE_MODEL(ets), path);
-			e_tree_sorted_node_resorted(ets, path);
-		}
-	}
-}
-
-static void
-mark_path_child_needs_resort (ETreeSorted *ets, ETreeSortedPath *path)
-{
-	if (path == NULL)
-		return;
-	if (!path->child_needs_resort) {
-		path->child_needs_resort = 1;
-		mark_path_child_needs_resort (ets, path->parent);
-	}
-}
-
-static void
-mark_path_needs_resort (ETreeSorted *ets, ETreeSortedPath *path, gboolean needs_regen, gboolean resort_all_children)
-{
-	if (path == NULL)
-		return;
-	if (path->num_children == 0)
-		return;
-	path->needs_resort = 1;
-	path->needs_regen_to_sort = needs_regen;
-	path->resort_all_children = resort_all_children;
-	mark_path_child_needs_resort(ets, path->parent);
-}
-
-static void
-schedule_resort (ETreeSorted *ets, ETreeSortedPath *path, gboolean needs_regen, gboolean resort_all_children)
-{
-	ets->priv->insert_count = 0;
-	if (ets->priv->insert_idle_id != 0) {
-		g_source_remove(ets->priv->insert_idle_id);
-		ets->priv->insert_idle_id = 0;
-	}
-
-	if (path == NULL)
-		return;
-	if (path->num_children == 0)
-		return;
-
-	mark_path_needs_resort(ets, path, needs_regen, resort_all_children);
-	if (ets->priv->sort_idle_id == 0) {
-		ets->priv->sort_idle_id = g_idle_add_full(50, (GSourceFunc) ets_sort_idle, ets, NULL);
-	} else if (ets->priv->in_resort_idle) {
-		ets->priv->nested_resort_idle = TRUE;
-	}
-}
-
-
-
-/* virtual methods */
-
-static void
-ets_dispose (GObject *object)
-{
-	ETreeSorted *ets = E_TREE_SORTED (object);
-	ETreeSortedPriv *priv = ets->priv;
-
-	/* FIXME lots of stuff to free here */
-	if (!priv) {
-		G_OBJECT_CLASS (parent_class)->dispose (object);
-		return;
-	}
-
-	if (priv->source) {
-		g_signal_handler_disconnect (G_OBJECT (priv->source),
-				             priv->tree_model_pre_change_id);
-		g_signal_handler_disconnect (G_OBJECT (priv->source),
-				             priv->tree_model_no_change_id);
-		g_signal_handler_disconnect (G_OBJECT (priv->source),
-				             priv->tree_model_node_changed_id);
-		g_signal_handler_disconnect (G_OBJECT (priv->source),
-				             priv->tree_model_node_data_changed_id);
-		g_signal_handler_disconnect (G_OBJECT (priv->source),
-				             priv->tree_model_node_col_changed_id);
-		g_signal_handler_disconnect (G_OBJECT (priv->source),
-				             priv->tree_model_node_inserted_id);
-		g_signal_handler_disconnect (G_OBJECT (priv->source),
-				             priv->tree_model_node_removed_id);
-		g_signal_handler_disconnect (G_OBJECT (priv->source),
-				             priv->tree_model_node_deleted_id);
-		g_signal_handler_disconnect (G_OBJECT (priv->source),
-				             priv->tree_model_node_request_collapse_id);
-
-		g_object_unref (priv->source);
-		priv->source = NULL;
-
-		priv->tree_model_pre_change_id = 0;
-		priv->tree_model_no_change_id = 0;
-		priv->tree_model_node_changed_id = 0;
-		priv->tree_model_node_data_changed_id = 0;
-		priv->tree_model_node_col_changed_id = 0;
-		priv->tree_model_node_inserted_id = 0;
-		priv->tree_model_node_removed_id = 0;
-		priv->tree_model_node_deleted_id = 0;
-		priv->tree_model_node_request_collapse_id = 0;
-	}
-
-	if (priv->sort_info) {
-		g_signal_handler_disconnect (G_OBJECT (priv->sort_info),
-				             priv->sort_info_changed_id);
-		priv->sort_info_changed_id = 0;
-
-		g_object_unref (priv->sort_info);
-		priv->sort_info = NULL;
-	}
-
-	ets_stop_sort_idle (ets);
-	if (ets->priv->insert_idle_id) {
-		g_source_remove(ets->priv->insert_idle_id);
-		ets->priv->insert_idle_id = 0;
-	}
-
-	if (priv->full_header)
-		g_object_unref(priv->full_header);
-
-}
-
-static void
-ets_finalize (GObject *object)
-{
-	ETreeSorted *ets = (ETreeSorted *) object;
-
-	if (ets->priv->root)
-		free_path(ets->priv->root);
-
-	g_free (ets->priv);
-	ets->priv = NULL;
-
-	G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-static ETreePath
-ets_get_root (ETreeModel *etm)
-{
-	ETreeSortedPriv *priv = E_TREE_SORTED(etm)->priv;
-	if (priv->root == NULL) {
-		ETreeSorted *ets = E_TREE_SORTED(etm);
-		ETreePath corresponding = e_tree_model_get_root(ets->priv->source);
-
-		if (corresponding) {
-			priv->root = new_path(NULL, corresponding);
-		}
-	}
-	if (priv->root && priv->root->num_children == -1) {
-		generate_children(E_TREE_SORTED(etm), priv->root);
-	}
-
-	return priv->root;
-}
-
-static ETreePath
-ets_get_parent (ETreeModel *etm, ETreePath node)
-{
-	ETreeSortedPath *path = node;
-	return path->parent;
-}
-
-static ETreePath
-ets_get_first_child (ETreeModel *etm, ETreePath node)
-{
-	ETreeSortedPath *path = node;
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-
-	if (path->num_children == -1)
-		generate_children(ets, path);
-
-	if (path->num_children > 0)
-		return path->children[0];
-	else
-		return NULL;
-}
-
-static ETreePath
-ets_get_last_child (ETreeModel *etm, ETreePath node)
-{
-	ETreeSortedPath *path = node;
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-
-	if (path->num_children == -1)
-		generate_children(ets, path);
-
-	if (path->num_children > 0)
-		return path->children[path->num_children - 1];
-	else
-		return NULL;
-}
-
-static ETreePath
-ets_get_next (ETreeModel *etm, ETreePath node)
-{
-	ETreeSortedPath *path = node;
-	ETreeSortedPath *parent = path->parent;
-	if (parent) {
-		if (parent->num_children > path->position + 1)
-			return parent->children[path->position + 1];
-		else
-			return NULL;
-	} else
-		  return NULL;
-}
-
-static ETreePath
-ets_get_prev (ETreeModel *etm, ETreePath node)
-{
-	ETreeSortedPath *path = node;
-	ETreeSortedPath *parent = path->parent;
-	if (parent) {
-		if (path->position - 1 >= 0)
-			return parent->children[path->position - 1];
-		else
-			return NULL;
-	} else
-		  return NULL;
-}
-
-static gboolean
-ets_is_root (ETreeModel *etm, ETreePath node)
-{
- 	ETreeSortedPath *path = node;
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-
-	return e_tree_model_node_is_root (ets->priv->source, path->corresponding);
-}
-
-static gboolean
-ets_is_expandable (ETreeModel *etm, ETreePath node)
-{
- 	ETreeSortedPath *path = node;
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-	gboolean expandable = e_tree_model_node_is_expandable (ets->priv->source, path->corresponding);
-
-	if (path->num_children == -1) {
-		generate_children(ets, node);
-	}
-
-	return expandable;
-}
-
-static guint
-ets_get_children (ETreeModel *etm, ETreePath node, ETreePath **nodes)
-{
-	ETreeSortedPath *path = node;
-	guint n_children;
-
-	if (path->num_children == -1) {
-		generate_children(E_TREE_SORTED(etm), node);
-	}
-
-	n_children = path->num_children;
-
-	if (nodes) {
-		int i;
-
-		(*nodes) = g_malloc (sizeof (ETreePath) * n_children);
-		for (i = 0; i < n_children; i ++) {
-			(*nodes)[i] = path->children[i];
-		}
-	}
-
-	return n_children;
-}
-
-static guint
-ets_depth (ETreeModel *etm, ETreePath node)
-{
-	ETreeSortedPath *path = node;
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-
-	return e_tree_model_node_depth(ets->priv->source, path->corresponding);
-}
-
-static GdkPixbuf *
-ets_icon_at (ETreeModel *etm, ETreePath node)
-{
-	ETreeSortedPath *path = node;
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-
-	return e_tree_model_icon_at(ets->priv->source, path->corresponding);
-}
-
-static gboolean
-ets_get_expanded_default (ETreeModel *etm)
-{
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-
-	return e_tree_model_get_expanded_default(ets->priv->source);
-}
-
-static gint
-ets_column_count (ETreeModel *etm)
-{
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-
-	return e_tree_model_column_count(ets->priv->source);
-}
-
-
-static gboolean
-ets_has_save_id (ETreeModel *etm)
-{
-	return TRUE;
-}
-
-static gchar *
-ets_get_save_id (ETreeModel *etm, ETreePath node)
-{
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-	ETreeSortedPath *path = node;
-
-	if (e_tree_model_has_save_id(ets->priv->source))
-		return e_tree_model_get_save_id(ets->priv->source, path->corresponding);
-	else
-		return g_strdup_printf("%p", path->corresponding);
-}
-
-static gboolean
-ets_has_get_node_by_id (ETreeModel *etm)
-{
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-	return e_tree_model_has_get_node_by_id(ets->priv->source);
-}
-
-static ETreePath
-ets_get_node_by_id (ETreeModel *etm, const char *save_id)
-{
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-	ETreePath node;
-
-	node = e_tree_model_get_node_by_id (ets->priv->source, save_id);
-
-	return find_path(ets, node);
-}
-
-static gboolean
-ets_has_change_pending (ETreeModel *etm)
-{
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-
-	return ets->priv->sort_idle_id != 0;
-}
-
-
-static void *
-ets_value_at (ETreeModel *etm, ETreePath node, int col)
-{
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-	ETreeSortedPath *path = node;
-
-	return e_tree_model_value_at(ets->priv->source, path->corresponding, col);
-}
-
-static void
-ets_set_value_at (ETreeModel *etm, ETreePath node, int col, const void *val)
-{
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-	ETreeSortedPath *path = node;
-
-	e_tree_model_set_value_at (ets->priv->source, path->corresponding, col, val);
-}
-
-static gboolean
-ets_is_editable (ETreeModel *etm, ETreePath node, int col)
-{
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-	ETreeSortedPath *path = node;
-
-	return e_tree_model_node_is_editable (ets->priv->source, path->corresponding, col);
-}
-
-
-/* The default for ets_duplicate_value is to return the raw value. */
-static void *
-ets_duplicate_value (ETreeModel *etm, int col, const void *value)
-{
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-
-	return e_tree_model_duplicate_value (ets->priv->source, col, value);
-}
-
-static void
-ets_free_value (ETreeModel *etm, int col, void *value)
-{
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-
-	e_tree_model_free_value (ets->priv->source, col, value);
-}
-
-static void *
-ets_initialize_value (ETreeModel *etm, int col)
-{
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-	
-	return e_tree_model_initialize_value (ets->priv->source, col);
-}
-
-static gboolean
-ets_value_is_empty (ETreeModel *etm, int col, const void *value)
-{
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-	
-	return e_tree_model_value_is_empty (ets->priv->source, col, value);
-}
-
-static char *
-ets_value_to_string (ETreeModel *etm, int col, const void *value)
-{
-	ETreeSorted *ets = E_TREE_SORTED(etm);
-	
-	return e_tree_model_value_to_string (ets->priv->source, col, value);
-}
-
-/* Proxy functions */
-
-static void
-ets_proxy_pre_change (ETreeModel *etm, ETreeSorted *ets)
-{
-	e_tree_model_pre_change(E_TREE_MODEL(ets));
-}
-
-static void
-ets_proxy_no_change (ETreeModel *etm, ETreeSorted *ets)
-{
-	e_tree_model_no_change(E_TREE_MODEL(ets));
-}
-
-static void
-ets_proxy_node_changed (ETreeModel *etm, ETreePath node, ETreeSorted *ets)
-{
-	ets->priv->last_access = NULL;
-	d(g_print("Setting last access %p. (ets_proxy_node_changed)\n", ets->priv->last_access));
-
-	if (e_tree_model_node_is_root(ets->priv->source, node)) {
-		ets_stop_sort_idle (ets);
-
-		if (ets->priv->root) {
-			free_path(ets->priv->root);
-		}
-		ets->priv->root = new_path(NULL, node);
-		e_tree_model_node_changed(E_TREE_MODEL(ets), ets->priv->root);
-		return;
-	} else {
-		ETreeSortedPath *path = find_path(ets, node);
-
-		if (path) {
-			free_children(path);
-			if (!reposition_path(ets, path)) {
-				e_tree_model_node_changed(E_TREE_MODEL(ets), path);
-			} else {
-				e_tree_model_no_change(E_TREE_MODEL(ets));
-			}
-		} else {
-			e_tree_model_no_change(E_TREE_MODEL(ets));
-		}
-	}
-}
-
-static void
-ets_proxy_node_data_changed (ETreeModel *etm, ETreePath node, ETreeSorted *ets)
-{
-	ETreeSortedPath *path = find_path(ets, node);
-
-	if (path) {
-		if (!reposition_path(ets, path))
-			e_tree_model_node_data_changed(E_TREE_MODEL(ets), path);
-		else
-			e_tree_model_no_change(E_TREE_MODEL(ets));
-	} else
-		e_tree_model_no_change(E_TREE_MODEL(ets));
-}
-
-static void
-ets_proxy_node_col_changed (ETreeModel *etm, ETreePath node, int col, ETreeSorted *ets)
-{
-	ETreeSortedPath *path = find_path(ets, node);
-
-	if (path) {
-		gboolean changed = FALSE;
-		if (e_table_sorting_utils_affects_sort(ets->priv->sort_info, ets->priv->full_header, col))
-			changed = reposition_path(ets, path);
-		if (!changed)
-			e_tree_model_node_col_changed(E_TREE_MODEL(ets), path, col);
-		else
-			e_tree_model_no_change(E_TREE_MODEL(ets));
-	} else
-		e_tree_model_no_change(E_TREE_MODEL(ets));
-}
-
-static void
-ets_proxy_node_inserted (ETreeModel *etm, ETreePath parent, ETreePath child, ETreeSorted *ets)
-{
-	ETreeSortedPath *parent_path = find_path(ets, parent);
-
-	if (parent_path && parent_path->num_children != -1) {
-		int i;
-		int j;
-		ETreeSortedPath *path;
-		int position = parent_path->num_children;
-		ETreePath counter;
-
-		for (counter = e_tree_model_node_get_next(etm, child);
-		     counter;
-		     counter = e_tree_model_node_get_next(etm, counter))
-			position --;
-
-		if (position != parent_path->num_children) {
-			for (i = 0; i < parent_path->num_children; i++) {
-				if (parent_path->children[i]->orig_position >= position)
-					parent_path->children[i]->orig_position++;
-			}
-		}
-
-		i = parent_path->num_children;
-		path = new_path(parent_path, child);
-		path->orig_position = position;
-		if (!ETS_SORT_IDLE_ACTIVATED (ets)) {
-			ets->priv->insert_count++;
-			if (ets->priv->insert_count > ETS_INSERT_MAX) {
-				/* schedule a sort, and append instead */
-				schedule_resort(ets, parent_path, TRUE, FALSE);
-			} else {
-				/* make sure we have an idle handler to reset the count every now and then */
-				if (ets->priv->insert_idle_id == 0) {
-					ets->priv->insert_idle_id = g_idle_add_full(40, (GSourceFunc) ets_insert_idle, ets, NULL);
-				}
-				i = e_table_sorting_utils_tree_insert
-					(ets->priv->source,
-					 ets->priv->sort_info,
-					 ets->priv->full_header,
-					 (ETreePath *) parent_path->children,
-					 parent_path->num_children,
-					 path);
-			}
-		} else {
-			mark_path_needs_resort(ets, parent_path, TRUE, FALSE);
-		}
-		parent_path->num_children ++;
-		parent_path->children = g_renew(ETreeSortedPath *, parent_path->children, parent_path->num_children);
-		memmove(parent_path->children + i + 1, parent_path->children + i, (parent_path->num_children - 1 - i) * sizeof(int));
-		parent_path->children[i] = path;
-		for (j = i; j < parent_path->num_children; j++) {
-			parent_path->children[j]->position = j;
-		}
-		e_tree_model_node_inserted(E_TREE_MODEL(ets), parent_path, parent_path->children[i]);
-	} else if (ets->priv->root == NULL && parent == NULL) {
-		if (child) {
-			ets->priv->root = new_path(NULL, child);
-			e_tree_model_node_inserted(E_TREE_MODEL(ets), NULL, ets->priv->root);
-		} else {
-			e_tree_model_no_change(E_TREE_MODEL(ets));
-		}
-	} else {
-		e_tree_model_no_change(E_TREE_MODEL(ets));
-	}
-}
-
-static void
-ets_proxy_node_removed (ETreeModel *etm, ETreePath parent, ETreePath child, int old_position, ETreeSorted *ets)
-{
-	ETreeSortedPath *parent_path = find_path(ets, parent);
-	ETreeSortedPath *path;
-
-	if (parent_path)
-		path = find_child_path(ets, parent_path, child);
-	else
-		path = find_path(ets, child);
-
-	d(g_print("Setting last access %p. (ets_proxy_node_removed)\n ", ets->priv->last_access));
-	ets->priv->last_access = NULL;
-
-	if (path && parent_path && parent_path->num_children != -1) {
-		int i;
-		for (i = 0; i < parent_path->num_children; i++) {
-			if (parent_path->children[i]->orig_position > old_position)
-				parent_path->children[i]->orig_position --;
-		}
-
-		i = path->position;
-
-		parent_path->num_children --;
-		memmove(parent_path->children + i, parent_path->children + i + 1, sizeof(ETreeSortedPath *) * (parent_path->num_children - i));
-		for (; i < parent_path->num_children; i++) {
-			parent_path->children[i]->position = i;
-		}
-		e_tree_model_node_removed(E_TREE_MODEL(ets), parent_path, path, path->position);
-		free_path(path);
-	} else if (path && path == ets->priv->root) {
-		ets->priv->root = NULL;
-		e_tree_model_node_removed(E_TREE_MODEL(ets), NULL, path, -1);
-		free_path(path);
-	}
-}
-
-static void
-ets_proxy_node_deleted (ETreeModel *etm, ETreePath child, ETreeSorted *ets)
-{
-	e_tree_model_node_deleted(E_TREE_MODEL(ets), NULL);
-}
-
-static void
-ets_proxy_node_request_collapse (ETreeModel *etm, ETreePath node, ETreeSorted *ets)
-{
-	ETreeSortedPath *path = find_path(ets, node);
-	if (path) {
-		e_tree_model_node_request_collapse(E_TREE_MODEL(ets), path);
-	}
-}
-
-static void
-ets_sort_info_changed (ETableSortInfo *sort_info, ETreeSorted *ets)
-{
-	schedule_resort(ets, ets->priv->root, TRUE, TRUE);
-}
-
-
-
-/* Initialization and creation */
-
-static void
-e_tree_sorted_class_init (ETreeSortedClass *klass)
-{
-	ETreeModelClass *tree_class      = E_TREE_MODEL_CLASS (klass);
-	GObjectClass *object_class       = G_OBJECT_CLASS (klass);
-
-	parent_class                     = g_type_class_peek_parent (klass);
-
-	node_chunk                       = g_mem_chunk_create (ETreeSortedPath, TREEPATH_CHUNK_AREA_SIZE, G_ALLOC_AND_FREE);
-
-	klass->node_resorted             = NULL;
-	
-	object_class->dispose            = ets_dispose;
-	object_class->finalize           = ets_finalize;
-
-	tree_class->get_root             = ets_get_root;
-	tree_class->get_parent           = ets_get_parent;
-	tree_class->get_first_child      = ets_get_first_child;
-	tree_class->get_last_child       = ets_get_last_child;
-	tree_class->get_prev             = ets_get_prev;
-	tree_class->get_next             = ets_get_next;
-
-	tree_class->is_root              = ets_is_root;
-	tree_class->is_expandable        = ets_is_expandable;
-	tree_class->get_children         = ets_get_children;
-	tree_class->depth                = ets_depth;
-
-	tree_class->icon_at              = ets_icon_at;
-
-	tree_class->get_expanded_default = ets_get_expanded_default;
-	tree_class->column_count         = ets_column_count;
-
-	tree_class->has_save_id          = ets_has_save_id;
-	tree_class->get_save_id          = ets_get_save_id;
-
-	tree_class->has_get_node_by_id   = ets_has_get_node_by_id;
-	tree_class->get_node_by_id       = ets_get_node_by_id;
-
-	tree_class->has_change_pending   = ets_has_change_pending;
-
-	tree_class->value_at             = ets_value_at;
-	tree_class->set_value_at         = ets_set_value_at;
-	tree_class->is_editable          = ets_is_editable;
-
-	tree_class->duplicate_value      = ets_duplicate_value;
-	tree_class->free_value           = ets_free_value;
-	tree_class->initialize_value     = ets_initialize_value;
-	tree_class->value_is_empty       = ets_value_is_empty;
-	tree_class->value_to_string      = ets_value_to_string;
-
-	signals [NODE_RESORTED] =
-		g_signal_new ("node_resorted",
-			      E_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeSortedClass, node_resorted),
-			      (GSignalAccumulator) NULL, NULL,
-			      g_cclosure_marshal_VOID__POINTER,
-			      G_TYPE_NONE, 1, G_TYPE_POINTER);
-}
-
-static void
-e_tree_sorted_init (GObject *object)
-{
-	ETreeSorted *ets = (ETreeSorted *)object;
-
-	ETreeSortedPriv *priv;
-
-	priv                                      = g_new0 (ETreeSortedPriv, 1);
-	ets->priv                                 = priv;
-
-	priv->root                                = NULL;
-	priv->source                              = NULL;
-
-	priv->sort_info                           = NULL;
-	priv->full_header                         = NULL;
-
-	priv->last_access                         = NULL;
-
-	priv->tree_model_pre_change_id            = 0;
-	priv->tree_model_no_change_id             = 0;
-	priv->tree_model_node_changed_id          = 0;
-	priv->tree_model_node_data_changed_id     = 0;
-	priv->tree_model_node_col_changed_id      = 0;
-	priv->tree_model_node_inserted_id         = 0;
-	priv->tree_model_node_removed_id          = 0;
-	priv->tree_model_node_deleted_id          = 0;
-	priv->tree_model_node_request_collapse_id = 0;
-
-	priv->sort_info_changed_id                = 0;
-	priv->sort_idle_id                        = 0;
-	priv->insert_idle_id                      = 0;
-	priv->insert_count                        = 0;
-
-	priv->in_resort_idle                      = 0;
-	priv->nested_resort_idle                  = 0;
-}
-
-E_MAKE_TYPE(e_tree_sorted, "ETreeSorted", ETreeSorted, e_tree_sorted_class_init, e_tree_sorted_init, E_TREE_MODEL_TYPE)
-
-/**
- * e_tree_sorted_construct:
- * @etree: 
- * 
- * 
- **/
-void
-e_tree_sorted_construct (ETreeSorted *ets, ETreeModel *source, ETableHeader *full_header, ETableSortInfo *sort_info)
-{
-	ets->priv->source                              = source;
-	if (source)
-		g_object_ref(source);
-
-	ets->priv->full_header                         = full_header;
-	if (full_header)
-		g_object_ref(full_header);
-
-	e_tree_sorted_set_sort_info (ets, sort_info);
-
-	ets->priv->tree_model_pre_change_id            = g_signal_connect (G_OBJECT (source), "pre_change",
-									   G_CALLBACK (ets_proxy_pre_change), ets);
-	ets->priv->tree_model_no_change_id             = g_signal_connect (G_OBJECT (source), "no_change",
-									   G_CALLBACK (ets_proxy_no_change), ets);
-	ets->priv->tree_model_node_changed_id          = g_signal_connect (G_OBJECT (source), "node_changed",
-									   G_CALLBACK (ets_proxy_node_changed), ets);
-	ets->priv->tree_model_node_data_changed_id     = g_signal_connect (G_OBJECT (source), "node_data_changed",
-									   G_CALLBACK (ets_proxy_node_data_changed), ets);
-	ets->priv->tree_model_node_col_changed_id      = g_signal_connect (G_OBJECT (source), "node_col_changed",
-									   G_CALLBACK (ets_proxy_node_col_changed), ets);
-	ets->priv->tree_model_node_inserted_id         = g_signal_connect (G_OBJECT (source), "node_inserted",
-									   G_CALLBACK (ets_proxy_node_inserted), ets);
-	ets->priv->tree_model_node_removed_id          = g_signal_connect (G_OBJECT (source), "node_removed",
-									   G_CALLBACK (ets_proxy_node_removed), ets);
-	ets->priv->tree_model_node_deleted_id          = g_signal_connect (G_OBJECT (source), "node_deleted",
-									   G_CALLBACK (ets_proxy_node_deleted), ets);
-	ets->priv->tree_model_node_request_collapse_id = g_signal_connect (G_OBJECT (source), "node_request_collapse",
-									   G_CALLBACK (ets_proxy_node_request_collapse), ets);
-
-}
-
-/**
- * e_tree_sorted_new
- *
- * FIXME docs here.
- *
- * return values: a newly constructed ETreeSorted.
- */
-ETreeSorted *
-e_tree_sorted_new (ETreeModel *source, ETableHeader *full_header, ETableSortInfo *sort_info)
-{
-	ETreeSorted *ets = g_object_new (E_TREE_SORTED_TYPE, NULL);
-
-	e_tree_sorted_construct(ets, source, full_header, sort_info);
-
-	return ets;
-}
-
-ETreePath
-e_tree_sorted_view_to_model_path  (ETreeSorted    *ets,
-				   ETreePath       view_path)
-{
-	ETreeSortedPath *path = view_path;
-	if (path) {
-		ets->priv->last_access = path;
-		d(g_print("Setting last access %p. (e_tree_sorted_view_to_model_path)\n", ets->priv->last_access));
-		return path->corresponding;
-	} else
-		return NULL;
-}
-
-ETreePath
-e_tree_sorted_model_to_view_path  (ETreeSorted    *ets,
-				   ETreePath       model_path)
-{
-	return find_or_create_path(ets, model_path);
-}
-
-int
-e_tree_sorted_orig_position       (ETreeSorted    *ets,
-				   ETreePath       path)
-{
-	ETreeSortedPath *sorted_path = path;
-	return sorted_path->orig_position;
-}
-
-int
-e_tree_sorted_node_num_children   (ETreeSorted    *ets,
-				   ETreePath       path)
-{
-	ETreeSortedPath *sorted_path = path;
-
-	if (sorted_path->num_children == -1) {
-		generate_children(ets, sorted_path);
-	}
-
-	return sorted_path->num_children;
-}
-
-void
-e_tree_sorted_node_resorted  (ETreeSorted *sorted, ETreePath node)
-{
-	g_return_if_fail (sorted != NULL);
-	g_return_if_fail (E_IS_TREE_SORTED (sorted));
-	
-	g_signal_emit (G_OBJECT (sorted), signals [NODE_RESORTED], 0, node);
-}
-
-void
-e_tree_sorted_set_sort_info (ETreeSorted *ets, ETableSortInfo *sort_info)
-{
-
-	g_return_if_fail (ets != NULL);
-
-
-	if (ets->priv->sort_info) {
-		if (ets->priv->sort_info_changed_id != 0)
-			g_signal_handler_disconnect (G_OBJECT (ets->priv->sort_info),
-						     ets->priv->sort_info_changed_id);
-		ets->priv->sort_info_changed_id = 0;
-		g_object_unref (ets->priv->sort_info);
-	}
-
-	ets->priv->sort_info = sort_info;
-	if (sort_info) {
-		g_object_ref(sort_info);
-		ets->priv->sort_info_changed_id = g_signal_connect (G_OBJECT (ets->priv->sort_info), "sort_info_changed",
-								    G_CALLBACK (ets_sort_info_changed), ets);
-	}
-
-	if (ets->priv->root)
-		schedule_resort (ets, ets->priv->root, TRUE, TRUE);
-}
-
-ETableSortInfo*
-e_tree_sorted_get_sort_info (ETreeSorted *ets)
-{
-	return ets->priv->sort_info;
-}
-
diff --git a/widgets/table/e-tree-sorted.h b/widgets/table/e-tree-sorted.h
deleted file mode 100644
index 41f123dc0b..0000000000
--- a/widgets/table/e-tree-sorted.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-tree-sorted.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TREE_SORTED_H_
-#define _E_TREE_SORTED_H_
-
-#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gal/e-table/e-tree-model.h>
-#include <gal/e-table/e-table-sort-info.h>
-#include <gal/e-table/e-table-header.h>
-
-G_BEGIN_DECLS
-
-#define E_TREE_SORTED_TYPE        (e_tree_sorted_get_type ())
-#define E_TREE_SORTED(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TREE_SORTED_TYPE, ETreeSorted))
-#define E_TREE_SORTED_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TREE_SORTED_TYPE, ETreeSortedClass))
-#define E_IS_TREE_SORTED(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TREE_SORTED_TYPE))
-#define E_IS_TREE_SORTED_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TREE_SORTED_TYPE))
-#define E_TREE_SORTED_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), E_TREE_SORTED_TYPE, ETreeSortedClass))
-
-typedef struct ETreeSorted ETreeSorted;
-typedef struct ETreeSortedPriv ETreeSortedPriv;
-typedef struct ETreeSortedClass ETreeSortedClass;
-
-struct ETreeSorted {
-	ETreeModel base;
-
-	ETreeSortedPriv *priv;
-};
-
-struct ETreeSortedClass {
-	ETreeModelClass parent_class;
-
-	/* Signals */
-	void       (*node_resorted)         (ETreeSorted *etm, ETreePath node);
-};
-
-
-GType        e_tree_sorted_get_type            (void);
-void         e_tree_sorted_construct           (ETreeSorted    *etree,
-						ETreeModel     *source,
-						ETableHeader   *full_header,
-						ETableSortInfo *sort_info);
-ETreeSorted *e_tree_sorted_new                 (ETreeModel     *source,
-						ETableHeader   *full_header,
-						ETableSortInfo *sort_info);
-
-ETreePath    e_tree_sorted_view_to_model_path  (ETreeSorted    *ets,
-						ETreePath       view_path);
-ETreePath    e_tree_sorted_model_to_view_path  (ETreeSorted    *ets,
-						ETreePath       model_path);
-int          e_tree_sorted_orig_position       (ETreeSorted    *ets,
-						ETreePath       path);
-int          e_tree_sorted_node_num_children   (ETreeSorted    *ets,
-						ETreePath       path);
-
-void         e_tree_sorted_node_resorted       (ETreeSorted    *tree_model,
-						ETreePath       node);
-
-ETableSortInfo* e_tree_sorted_get_sort_info       (ETreeSorted    *tree_model);
-void            e_tree_sorted_set_sort_info       (ETreeSorted    *tree_model,
-						   ETableSortInfo *sort_info);
-
-G_END_DECLS
-
-#endif /* _E_TREE_SORTED_H */
diff --git a/widgets/table/e-tree-table-adapter.c b/widgets/table/e-tree-table-adapter.c
deleted file mode 100644
index e1bda25eba..0000000000
--- a/widgets/table/e-tree-table-adapter.c
+++ /dev/null
@@ -1,1174 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-tree-table-adapter.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Chris Toshok <toshok@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <libxml/tree.h>
-#include <libxml/parser.h>
-#include "gal/util/e-util.h"
-#include "gal/util/e-xml-utils.h"
-#include "e-tree-table-adapter.h"
-#include "e-table-sorting-utils.h"
-
-#define PARENT_TYPE E_TABLE_MODEL_TYPE
-#define d(x)
-
-#define INCREMENT_AMOUNT 100
-
-static ETableModelClass *parent_class;
-
-typedef struct {
-	ETreePath path;
-	guint32 num_visible_children;
-	guint32 index;
-
-	guint expanded : 1;
-	guint expandable : 1;
-	guint expandable_set : 1;
-} node_t;
-
-struct ETreeTableAdapterPriv {
-	ETreeModel     *source;
-	ETableSortInfo *sort_info;
-	ETableHeader   *header;
-
-	int    	     n_map;
-	int    	     n_vals_allocated;
-	node_t     **map_table;
-	GHashTable  *nodes;
-	GNode       *root;
-
-	guint        root_visible : 1;
-	guint        remap_needed : 1;
-
-	int          last_access;
-
-	int          pre_change_id;
-	int          no_change_id;
-	int          node_changed_id;
-	int          node_data_changed_id;
-	int          node_col_changed_id;
-	int          node_inserted_id;
-	int          node_removed_id;
-	int          node_request_collapse_id;
-	int          sort_info_changed_id;
-};
-
-static GNode *
-lookup_gnode(ETreeTableAdapter *etta, ETreePath path)
-{
-	GNode *gnode;
-
-	if (!path)
-		return NULL;
-
-	gnode = g_hash_table_lookup(etta->priv->nodes, path);
-
-	return gnode;
-}
-
-static void
-resize_map(ETreeTableAdapter *etta, int size)
-{
-        if (size > etta->priv->n_vals_allocated) {
-                etta->priv->n_vals_allocated = MAX(etta->priv->n_vals_allocated + INCREMENT_AMOUNT, size);
-                etta->priv->map_table = g_renew (node_t *, etta->priv->map_table, etta->priv->n_vals_allocated);
-        }
-
-	etta->priv->n_map = size;
-}
-
-static void
-move_map_elements(ETreeTableAdapter *etta, int to, int from, int count)
-{
-	if (count <= 0 || from >= etta->priv->n_map)
-		return;
-	memmove(etta->priv->map_table + to, etta->priv->map_table + from, count * sizeof (node_t *));
-	etta->priv->remap_needed = TRUE;
-}
-
-static gint
-fill_map(ETreeTableAdapter *etta, gint index, GNode *gnode)
-{
-	GNode *p;
-
-	if ((gnode != etta->priv->root) || etta->priv->root_visible)
-		etta->priv->map_table[index++] = gnode->data;
-
-	for (p = gnode->children; p; p = p->next)
-		index = fill_map(etta, index, p);
-
-	etta->priv->remap_needed = TRUE;
-	return index;
-}
-
-static void
-remap_indices(ETreeTableAdapter *etta)
-{
-	int i;
-	for (i = 0; i < etta->priv->n_map; i++)
-		etta->priv->map_table[i]->index = i;
-	etta->priv->remap_needed = FALSE;
-}
-
-static node_t *
-get_node(ETreeTableAdapter *etta, ETreePath path)
-{
-	GNode *gnode = lookup_gnode(etta, path);
-
-	if (!gnode)
-		return NULL;
-
-	return (node_t *)gnode->data;
-}
-
-static void
-resort_node(ETreeTableAdapter *etta, GNode *gnode, gboolean recurse)
-{
-	node_t *node = (node_t *)gnode->data;
-	ETreePath *paths, path;
-	GNode *prev, *curr;
-	int i, count;
-	gboolean sort_needed;
-
-	if (node->num_visible_children == 0)
-		return;
-
-	sort_needed = etta->priv->sort_info && e_table_sort_info_sorting_get_count (etta->priv->sort_info) > 0;
-
-	for (i = 0, path = e_tree_model_node_get_first_child(etta->priv->source, node->path); path; 
-	     path = e_tree_model_node_get_next(etta->priv->source, path), i++); 
-
-	count = i;
-	if (count <= 1)
-		return;
-
-	paths = g_new0(ETreePath, count);
-
-	for (i = 0, path = e_tree_model_node_get_first_child(etta->priv->source, node->path); path; 
-	     path = e_tree_model_node_get_next(etta->priv->source, path), i++)
-		paths[i] = path;
-
-	if (count > 1 && sort_needed)
-		e_table_sorting_utils_tree_sort(etta->priv->source, etta->priv->sort_info, etta->priv->header, paths, count);
-
-	prev = NULL;
-	for (i = 0; i < count; i++) {
-		curr = lookup_gnode(etta, paths[i]);
-		if (!curr)
-			continue;
-
-		if (prev)
-			prev->next = curr;
-		else
-			gnode->children = curr;
-
-		curr->prev = prev;
-		curr->next = NULL;
-		prev = curr;
-		if (recurse)
-			resort_node(etta, curr, recurse);
-	}
-
-	g_free(paths);
-}
-
-static gint
-get_row(ETreeTableAdapter *etta, ETreePath path)
-{
-	node_t *node = get_node(etta, path);
-	if (!node)
-		return -1;
-
-	if (etta->priv->remap_needed)
-		remap_indices(etta);
-
-	return node->index;
-}
-
-static ETreePath
-get_path (ETreeTableAdapter *etta, int row)
-{
-	if (row == -1 && etta->priv->n_map > 0)
-		row = etta->priv->n_map - 1;
-	else if (row < 0 || row >= etta->priv->n_map)
-		return NULL;
-
-	return etta->priv->map_table [row]->path;
-}
-
-static void
-kill_gnode(GNode *node, ETreeTableAdapter *etta)
-{
-	g_hash_table_remove(etta->priv->nodes, ((node_t *)node->data)->path);
-
-	while (node->children) {
-		GNode *next = node->children->next;
-		kill_gnode(node->children, etta);
-		node->children = next;
-	}
-
-	g_free(node->data);
-	if (node == etta->priv->root)
-		etta->priv->root = NULL;
-	g_node_destroy(node);
-}
-
-static void
-update_child_counts(GNode *gnode, gint delta)
-{
-	while (gnode) {
-		node_t *node = (node_t *) gnode->data;
-		node->num_visible_children += delta;
-		gnode = gnode->parent;
-	}
-}
-
-static int
-delete_children(ETreeTableAdapter *etta, GNode *gnode)
-{
-	node_t *node = (node_t *)gnode->data;
-	int to_remove = node ? node->num_visible_children : 0;
-
-	if (to_remove == 0)
-		return 0;
-
-	while (gnode->children) {
-		GNode *next = gnode->children->next;
-		kill_gnode(gnode->children, etta);
-		gnode->children = next;
-	}
-
-	return to_remove;
-}
-
-static void
-delete_node(ETreeTableAdapter *etta, ETreePath parent, ETreePath path)
-{
-	int to_remove = 1;
-	int parent_row = get_row(etta, parent);
-	int row = get_row(etta, path);
-	GNode *gnode = lookup_gnode(etta, path);
-	GNode *parent_gnode = lookup_gnode(etta, parent);
-
-	e_table_model_pre_change(E_TABLE_MODEL(etta));
-
-	if (row == -1) {
-		e_table_model_no_change(E_TABLE_MODEL(etta));
-		return;
-	}
-
-	to_remove += delete_children(etta, gnode);
-	kill_gnode(gnode, etta);
-
-	move_map_elements(etta, row, row + to_remove, etta->priv->n_map - row - to_remove);
-	resize_map(etta, etta->priv->n_map - to_remove);
-
-	if (parent_gnode != NULL) {
-		node_t *parent_node = parent_gnode->data;
-		gboolean expandable = e_tree_model_node_is_expandable(etta->priv->source, parent);
-
-		update_child_counts(parent_gnode, - to_remove);
-		if (parent_node->expandable != expandable) {
-			e_table_model_pre_change(E_TABLE_MODEL(etta));
-			parent_node->expandable = expandable;
-			e_table_model_row_changed(E_TABLE_MODEL(etta), parent_row);
-		}
-
-		resort_node (etta, parent_gnode, FALSE);
-	}
-
-	e_table_model_rows_deleted(E_TABLE_MODEL(etta), row, to_remove);
-}
-
-static GNode *
-create_gnode(ETreeTableAdapter *etta, ETreePath path)
-{
-	GNode *gnode;
-	node_t *node;
-
-	node = g_new0(node_t, 1);
-	node->path = path;
-	node->index = -1;
-	node->expanded = e_tree_model_get_expanded_default(etta->priv->source);
-	node->expandable = e_tree_model_node_is_expandable(etta->priv->source, path);
-	node->expandable_set = 1;
-	node->num_visible_children = 0;
-	gnode = g_node_new(node);
-	g_hash_table_insert(etta->priv->nodes, path, gnode);
-	return gnode;
-}
-
-static gint
-insert_children(ETreeTableAdapter *etta, GNode *gnode)
-{
-	ETreePath path, tmp;
-	int count = 0;
-	int pos = 0;
-
-	path = ((node_t *)gnode->data)->path;
-	for (tmp = e_tree_model_node_get_first_child(etta->priv->source, path);
-	     tmp;
-	     tmp = e_tree_model_node_get_next(etta->priv->source, tmp), pos++) {
-		GNode *child = create_gnode(etta, tmp);
-		node_t *node = (node_t *) child->data;
-		if (node->expanded)
-			node->num_visible_children = insert_children(etta, child);
-		g_node_prepend(gnode, child);
-		count += node->num_visible_children + 1;
-	}
-	g_node_reverse_children(gnode);
-	return count;
-}
-
-static void
-generate_tree(ETreeTableAdapter *etta, ETreePath path)
-{
-	GNode *gnode;
-	node_t *node;
-	int size;
-
-	e_table_model_pre_change(E_TABLE_MODEL(etta));
-
-	g_assert(e_tree_model_node_is_root(etta->priv->source, path));
-
-	if (etta->priv->root)
-		kill_gnode(etta->priv->root, etta);
-	resize_map(etta, 0);
-
-	gnode = create_gnode(etta, path);
-	node = (node_t *) gnode->data;
-	node->expanded = TRUE;
-	node->num_visible_children = insert_children(etta, gnode);
-	if (etta->priv->sort_info && e_table_sort_info_sorting_get_count(etta->priv->sort_info) > 0)
-		resort_node(etta, gnode, TRUE);
-
-	etta->priv->root = gnode;
-	size =  etta->priv->root_visible ? node->num_visible_children + 1 : node->num_visible_children;
-	resize_map(etta, size);
-	fill_map(etta, 0, gnode);
-	e_table_model_changed(E_TABLE_MODEL(etta));
-}
-
-static void
-insert_node(ETreeTableAdapter *etta, ETreePath parent, ETreePath path)
-{
-	GNode *gnode, *parent_gnode;
-	node_t *node, *parent_node;
-	gboolean expandable;
-	int size, row;
-
-	e_table_model_pre_change(E_TABLE_MODEL(etta));
-
-	if (get_node(etta, path)) {
-		e_table_model_no_change(E_TABLE_MODEL(etta));
-		return;
-	}
-
-	parent_gnode = lookup_gnode(etta, parent);
-	if (!parent_gnode) {
-		ETreePath grandparent = e_tree_model_node_get_parent(etta->priv->source, parent);
-		if (e_tree_model_node_is_root(etta->priv->source, parent))
-			generate_tree(etta, parent);
-		else
-			insert_node(etta, grandparent, parent);
-		e_table_model_changed(E_TABLE_MODEL(etta));
-		return;
-	}
-
-	parent_node = (node_t *) parent_gnode->data;
-
-	if (parent_gnode != etta->priv->root) {
-		expandable = e_tree_model_node_is_expandable(etta->priv->source, parent);
-		if (parent_node->expandable != expandable) {
-			e_table_model_pre_change(E_TABLE_MODEL(etta));
-			parent_node->expandable = expandable;
-			parent_node->expandable_set = 1;
-			e_table_model_row_changed(E_TABLE_MODEL(etta), parent_node->index);
-		}
-	}
-
-	if (!e_tree_table_adapter_node_is_expanded (etta, parent)) {
-		e_table_model_no_change(E_TABLE_MODEL(etta));
-		return;
-	}
-
-	gnode = create_gnode(etta, path);
-	node = (node_t *) gnode->data;
-
-	if (node->expanded)
-		node->num_visible_children = insert_children(etta, gnode);
-
-	g_node_append(parent_gnode, gnode);
-	update_child_counts(parent_gnode, node->num_visible_children + 1);
-	resort_node(etta, parent_gnode, FALSE);
-	resort_node(etta, gnode, TRUE);
-
-	size = node->num_visible_children + 1;
-	resize_map(etta, etta->priv->n_map + size);
-	if (parent_gnode == etta->priv->root)
-		row = 0;
-	else {
-		gint new_size = parent_node->num_visible_children + 1;
-		gint old_size = new_size - size;
-		row = parent_node->index;
-		move_map_elements(etta, row + new_size, row + old_size, etta->priv->n_map - row - new_size);
-	}
-	fill_map(etta, row, parent_gnode);
-	e_table_model_rows_inserted(E_TABLE_MODEL(etta), get_row(etta, path), size);
-}
-
-typedef struct {
-	GSList *paths;
-	gboolean expanded;
-} check_expanded_closure;
-
-static gboolean
-check_expanded(GNode *gnode, gpointer data)
-{
-	check_expanded_closure *closure = (check_expanded_closure *) data;
-	node_t *node = (node_t *) gnode->data;
-
-	if (node->expanded != closure->expanded)
-		closure->paths = g_slist_prepend(closure->paths, node->path);
-
-	return FALSE;
-}
-
-static void
-update_node(ETreeTableAdapter *etta, ETreePath path)
-{
-	check_expanded_closure closure;
-	ETreePath parent = e_tree_model_node_get_parent(etta->priv->source, path);
-	GNode *gnode = lookup_gnode(etta, path);
-	GSList *l;
-
-	closure.expanded = e_tree_model_get_expanded_default (etta->priv->source);
-	closure.paths = NULL;
-
-	if (gnode)
-		g_node_traverse(gnode, G_POST_ORDER, G_TRAVERSE_ALL, -1, check_expanded, &closure);
-
-	if (e_tree_model_node_is_root(etta->priv->source, path))
-		generate_tree(etta, path);
-	else {
-		delete_node(etta, parent, path);
-		insert_node(etta, parent, path);
-	}
-
-	for (l = closure.paths; l; l = l->next)
-		if (lookup_gnode(etta, l->data))
-			e_tree_table_adapter_node_set_expanded (etta, l->data, !closure.expanded);
-
-	g_slist_free(closure.paths);
-}
-
-static void
-etta_finalize (GObject *object)
-{
-	ETreeTableAdapter *etta = E_TREE_TABLE_ADAPTER (object);
-
-	if (etta->priv->root) {
-		kill_gnode(etta->priv->root, etta);
-		etta->priv->root = NULL;
-	}
-
-	g_hash_table_destroy (etta->priv->nodes);
-
-	g_free (etta->priv->map_table);
-
-	g_free (etta->priv);
-
-	G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-static void
-etta_dispose (GObject *object)
-{
-	ETreeTableAdapter *etta = E_TREE_TABLE_ADAPTER (object);
-
-	if (etta->priv->sort_info) {
-		g_signal_handler_disconnect(G_OBJECT (etta->priv->sort_info),
-				       etta->priv->sort_info_changed_id);
-		g_object_unref(etta->priv->sort_info);
-		etta->priv->sort_info = NULL;
-	}
-
-	if (etta->priv->header) {
-		g_object_unref(etta->priv->header);
-		etta->priv->header = NULL;
-	}
-
-	if (etta->priv->source) {
-		g_signal_handler_disconnect (G_OBJECT (etta->priv->source),
-				       etta->priv->pre_change_id);
-		g_signal_handler_disconnect (G_OBJECT (etta->priv->source),
-				       etta->priv->no_change_id);
-		g_signal_handler_disconnect (G_OBJECT (etta->priv->source),
-				       etta->priv->node_changed_id);
-		g_signal_handler_disconnect (G_OBJECT (etta->priv->source),
-				       etta->priv->node_data_changed_id);
-		g_signal_handler_disconnect (G_OBJECT (etta->priv->source),
-				       etta->priv->node_col_changed_id);
-		g_signal_handler_disconnect (G_OBJECT (etta->priv->source),
-				       etta->priv->node_inserted_id);
-		g_signal_handler_disconnect (G_OBJECT (etta->priv->source),
-				       etta->priv->node_removed_id);
-		g_signal_handler_disconnect (G_OBJECT (etta->priv->source),
-				       etta->priv->node_request_collapse_id);
-
-		g_object_unref (etta->priv->source);
-		etta->priv->source = NULL;
-	}
-
-	G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static int
-etta_column_count (ETableModel *etm)
-{
-	ETreeTableAdapter *etta = (ETreeTableAdapter *)etm;
-
-	return e_tree_model_column_count (etta->priv->source);
-}
-
-static gboolean
-etta_has_save_id (ETableModel *etm)
-{
-	ETreeTableAdapter *etta = (ETreeTableAdapter *)etm;
-
-	return e_tree_model_has_save_id (etta->priv->source);
-}
-
-static gchar *
-etta_get_save_id (ETableModel *etm, int row)
-{
-	ETreeTableAdapter *etta = (ETreeTableAdapter *)etm;
-
-	return e_tree_model_get_save_id (etta->priv->source, get_path(etta, row));
-}
-
-static gboolean
-etta_has_change_pending (ETableModel *etm)
-{
-	ETreeTableAdapter *etta = (ETreeTableAdapter *)etm;
-
-	return e_tree_model_has_change_pending (etta->priv->source);
-}
-
-
-static int
-etta_row_count (ETableModel *etm)
-{
-	ETreeTableAdapter *etta = (ETreeTableAdapter *)etm;
-
-	return etta->priv->n_map;
-}
-
-static void *
-etta_value_at (ETableModel *etm, int col, int row)
-{
-	ETreeTableAdapter *etta = (ETreeTableAdapter *)etm;
-
-	switch (col) {
-	case -1:
-		if (row == -1)
-			return NULL;
-		return get_path (etta, row);
-	case -2:
-		return etta->priv->source;
-	case -3:
-		return etta;
-	default:
-		return e_tree_model_value_at (etta->priv->source, get_path (etta, row), col);
-	}
-}
-
-static void
-etta_set_value_at (ETableModel *etm, int col, int row, const void *val)
-{
-	ETreeTableAdapter *etta = (ETreeTableAdapter *)etm;
-
-	e_tree_model_set_value_at (etta->priv->source, get_path (etta, row), col, val);
-}
-
-static gboolean
-etta_is_cell_editable (ETableModel *etm, int col, int row)
-{
-	ETreeTableAdapter *etta = (ETreeTableAdapter *)etm;
-
-	return e_tree_model_node_is_editable (etta->priv->source, get_path (etta, row), col);
-}
-
-static void
-etta_append_row (ETableModel *etm, ETableModel *source, int row)
-{
-}
-
-static void *
-etta_duplicate_value (ETableModel *etm, int col, const void *value)
-{
-	ETreeTableAdapter *etta = (ETreeTableAdapter *)etm;
-
-	return e_tree_model_duplicate_value (etta->priv->source, col, value);
-}
-
-static void
-etta_free_value (ETableModel *etm, int col, void *value)
-{
-	ETreeTableAdapter *etta = (ETreeTableAdapter *)etm;
-
-	e_tree_model_free_value (etta->priv->source, col, value);
-}
-
-static void *
-etta_initialize_value (ETableModel *etm, int col)
-{
-	ETreeTableAdapter *etta = (ETreeTableAdapter *)etm;
-
-	return e_tree_model_initialize_value (etta->priv->source, col);
-}
-
-static gboolean
-etta_value_is_empty (ETableModel *etm, int col, const void *value)
-{
-	ETreeTableAdapter *etta = (ETreeTableAdapter *)etm;
-
-	return e_tree_model_value_is_empty (etta->priv->source, col, value);
-}
-
-static char *
-etta_value_to_string (ETableModel *etm, int col, const void *value)
-{
-	ETreeTableAdapter *etta = (ETreeTableAdapter *)etm;
-
-	return e_tree_model_value_to_string (etta->priv->source, col, value);
-}
-
-static void
-etta_class_init (ETreeTableAdapterClass *klass)
-{
-	ETableModelClass *table_class   = (ETableModelClass *) klass;
-	GObjectClass *object_class      = (GObjectClass *) klass;
-
-	parent_class                    = g_type_class_peek_parent (klass);
-	
-	object_class->dispose           = etta_dispose;
-	object_class->finalize          = etta_finalize;
-
-	table_class->column_count       = etta_column_count;
-	table_class->row_count          = etta_row_count;
-	table_class->append_row         = etta_append_row;
-
-	table_class->value_at           = etta_value_at;
-	table_class->set_value_at       = etta_set_value_at;
-	table_class->is_cell_editable   = etta_is_cell_editable;
-
-	table_class->has_save_id        = etta_has_save_id;
-	table_class->get_save_id        = etta_get_save_id;
-
-	table_class->has_change_pending = etta_has_change_pending;
-	table_class->duplicate_value    = etta_duplicate_value;
-	table_class->free_value         = etta_free_value;
-	table_class->initialize_value   = etta_initialize_value;
-	table_class->value_is_empty     = etta_value_is_empty;
-	table_class->value_to_string    = etta_value_to_string;
-}
-
-static void
-etta_init (ETreeTableAdapter *etta)
-{
-	etta->priv                           = g_new(ETreeTableAdapterPriv, 1);
-
-	etta->priv->source                   = NULL;
-	etta->priv->sort_info                = NULL;
-
-	etta->priv->n_map                    = 0;
-	etta->priv->n_vals_allocated         = 0;
-	etta->priv->map_table                = NULL;
-	etta->priv->nodes                    = NULL;
-	etta->priv->root                     = NULL;
-
-	etta->priv->root_visible             = TRUE;
-	etta->priv->remap_needed             = TRUE;
-
-	etta->priv->pre_change_id            = 0;
-	etta->priv->no_change_id             = 0;
-	etta->priv->node_changed_id          = 0;
-	etta->priv->node_data_changed_id     = 0;
-	etta->priv->node_col_changed_id      = 0;
-	etta->priv->node_inserted_id         = 0;
-	etta->priv->node_removed_id          = 0;
-	etta->priv->node_request_collapse_id = 0;
-}
-
-E_MAKE_TYPE(e_tree_table_adapter, "ETreeTableAdapter", ETreeTableAdapter, etta_class_init, etta_init, PARENT_TYPE)
-
-static void
-etta_proxy_pre_change (ETreeModel *etm, ETreeTableAdapter *etta)
-{
-	e_table_model_pre_change(E_TABLE_MODEL(etta));
-}
-
-static void
-etta_proxy_no_change (ETreeModel *etm, ETreeTableAdapter *etta)
-{
-	e_table_model_no_change(E_TABLE_MODEL(etta));
-}
-
-static void
-etta_proxy_node_changed (ETreeModel *etm, ETreePath path, ETreeTableAdapter *etta)
-{
-	update_node(etta, path);
-
-	e_table_model_changed(E_TABLE_MODEL(etta));
-}
-
-static void
-etta_proxy_node_data_changed (ETreeModel *etm, ETreePath path, ETreeTableAdapter *etta)
-{
-	int row = get_row(etta, path);
-
-	if (row == -1) {
-		e_table_model_no_change(E_TABLE_MODEL(etta));
-		return;
-	}
-
-	e_table_model_row_changed(E_TABLE_MODEL(etta), row);
-}
-
-static void
-etta_proxy_node_col_changed (ETreeModel *etm, ETreePath path, int col, ETreeTableAdapter *etta)
-{
-	int row = get_row(etta, path);
-
-	if (row == -1) {
-		e_table_model_no_change(E_TABLE_MODEL(etta));
-		return;
-	}
-
-	e_table_model_cell_changed(E_TABLE_MODEL(etta), col, row);
-}
-
-static void
-etta_proxy_node_inserted (ETreeModel *etm, ETreePath parent, ETreePath child, ETreeTableAdapter *etta)
-{
-	if (e_tree_model_node_is_root(etm, child))
-		generate_tree(etta, child);
-	else
-		insert_node(etta, parent, child);
-	
-	e_table_model_changed(E_TABLE_MODEL(etta));
-}
-
-static void
-etta_proxy_node_removed (ETreeModel *etm, ETreePath parent, ETreePath child, int old_position, ETreeTableAdapter *etta)
-{
-	delete_node(etta, parent, child);
-	e_table_model_changed(E_TABLE_MODEL(etta));
-}
-
-static void
-etta_proxy_node_request_collapse (ETreeModel *etm, ETreePath node, ETreeTableAdapter *etta)
-{
-	e_tree_table_adapter_node_set_expanded(etta, node, FALSE);
-}
-
-static void
-etta_sort_info_changed (ETableSortInfo *sort_info, ETreeTableAdapter *etta)
-{
-	if (!etta->priv->root)
-		return;
-
-	e_table_model_pre_change(E_TABLE_MODEL(etta));
-	resort_node(etta, etta->priv->root, TRUE);
-	fill_map(etta, 0, etta->priv->root);
-	e_table_model_changed(E_TABLE_MODEL(etta));
-}
-
-ETableModel *
-e_tree_table_adapter_construct (ETreeTableAdapter *etta, ETreeModel *source, ETableSortInfo *sort_info, ETableHeader *header)
-{
-	ETreePath root;
-
-	etta->priv->source = source;
-	g_object_ref (source);
-
-	etta->priv->sort_info = sort_info;
-	if (sort_info) {
-		g_object_ref(sort_info);
-		etta->priv->sort_info_changed_id = g_signal_connect (G_OBJECT (sort_info), "sort_info_changed",
-				                                     G_CALLBACK (etta_sort_info_changed), etta);
-	}
-
-	etta->priv->header = header;
-	if (header)
-		g_object_ref(header);
-
-	etta->priv->nodes = g_hash_table_new(NULL, NULL);
-
-	root = e_tree_model_get_root (source);
-
-	if (root)
-		generate_tree(etta, root);
-
-	etta->priv->pre_change_id = g_signal_connect(G_OBJECT(source), "pre_change",
-					G_CALLBACK (etta_proxy_pre_change), etta);
-	etta->priv->no_change_id = g_signal_connect (G_OBJECT (source), "no_change",
-					G_CALLBACK (etta_proxy_no_change), etta);
-	etta->priv->node_changed_id = g_signal_connect (G_OBJECT (source), "node_changed",
-					G_CALLBACK (etta_proxy_node_changed), etta);
-	etta->priv->node_data_changed_id = g_signal_connect (G_OBJECT (source), "node_data_changed",
-					G_CALLBACK (etta_proxy_node_data_changed), etta);
-	etta->priv->node_col_changed_id = g_signal_connect (G_OBJECT (source), "node_col_changed",
-					G_CALLBACK (etta_proxy_node_col_changed), etta);
-	etta->priv->node_inserted_id = g_signal_connect (G_OBJECT (source), "node_inserted",
-					G_CALLBACK (etta_proxy_node_inserted), etta);
-	etta->priv->node_removed_id = g_signal_connect (G_OBJECT (source), "node_removed",
-					G_CALLBACK (etta_proxy_node_removed), etta);
-	etta->priv->node_request_collapse_id = g_signal_connect (G_OBJECT (source), "node_request_collapse",
-					G_CALLBACK (etta_proxy_node_request_collapse), etta);
-
-	return E_TABLE_MODEL (etta);
-}
-
-ETableModel *
-e_tree_table_adapter_new (ETreeModel *source, ETableSortInfo *sort_info, ETableHeader *header)
-{
-	ETreeTableAdapter *etta = g_object_new (E_TREE_TABLE_ADAPTER_TYPE, NULL);
-
-	e_tree_table_adapter_construct (etta, source, sort_info, header);
-
-	return (ETableModel *) etta;
-}
-
-typedef struct {
-	xmlNode *root;
-	gboolean expanded_default;
-	ETreeModel *model;
-} TreeAndRoot;
-
-static void
-save_expanded_state_func (gpointer keyp, gpointer value, gpointer data)
-{
-	ETreePath path = keyp;
-	node_t *node = ((GNode *)value)->data;
-	TreeAndRoot *tar = data;
-	xmlNode *xmlnode;
-
-	if (node->expanded != tar->expanded_default) {
-		gchar *save_id = e_tree_model_get_save_id(tar->model, path);
-		xmlnode = xmlNewChild (tar->root, NULL, "node", NULL);
-		e_xml_set_string_prop_by_name(xmlnode, "id", save_id);
-		g_free(save_id);
-	}
-}
-
-void
-e_tree_table_adapter_save_expanded_state (ETreeTableAdapter *etta, const char *filename)
-{
-	TreeAndRoot tar;
-	xmlDocPtr doc;
-	xmlNode *root;
-	
-	g_return_if_fail(etta != NULL);
-
-	doc = xmlNewDoc ("1.0");
-	root = xmlNewDocNode (doc, NULL, (xmlChar *) "expanded_state", NULL);
-	xmlDocSetRootElement (doc, root);
-
-	tar.model = etta->priv->source;
-	tar.root = root;
-	tar.expanded_default = e_tree_model_get_expanded_default(etta->priv->source);
-	
-	e_xml_set_integer_prop_by_name (root, "vers", 2);
-	e_xml_set_bool_prop_by_name (root, "default", tar.expanded_default);
-
-	g_hash_table_foreach (etta->priv->nodes, save_expanded_state_func, &tar);
-	
-	e_xml_save_file (filename, doc);
-	xmlFreeDoc (doc);
-}
-
-static xmlDoc *
-open_file (ETreeTableAdapter *etta, const char *filename)
-{
-	xmlDoc *doc;
-	xmlNode *root;
-	int vers;
-	gboolean model_default, saved_default;
-
-	if (!g_file_test (filename, G_FILE_TEST_EXISTS))
-		return NULL;
-
-	doc = xmlParseFile (filename);
-	if (!doc)
-		return NULL;
-
-	root = xmlDocGetRootElement (doc);
-	if (root == NULL || strcmp (root->name, "expanded_state")) {
-		xmlFreeDoc (doc);
-		return NULL;
-	}
-
-	vers = e_xml_get_integer_prop_by_name_with_default (root, "vers", 0);
-	if (vers > 2) {
-		xmlFreeDoc (doc);
-		return NULL;
-	}
-	model_default = e_tree_model_get_expanded_default (etta->priv->source);
-	saved_default = e_xml_get_bool_prop_by_name_with_default (root, "default", !model_default);
-	if (saved_default != model_default) {
-		xmlFreeDoc (doc);
-		return NULL;
-	}
-
-	return doc;
-}
-
-void
-e_tree_table_adapter_load_expanded_state (ETreeTableAdapter *etta, const char *filename)
-{
-	xmlDoc *doc;
-	xmlNode *root, *child;
-	gboolean model_default;
-
-	g_return_if_fail(etta != NULL);
-
-	doc = open_file(etta, filename);
-	if (!doc)
-		return;
-
-	root = xmlDocGetRootElement (doc);
-
-	e_table_model_pre_change(E_TABLE_MODEL(etta));
-
-	model_default = e_tree_model_get_expanded_default(etta->priv->source);
-
-	for (child = root->xmlChildrenNode; child; child = child->next) {
-		char *id;
-		ETreePath path;
-
-		if (strcmp (child->name, "node")) {
-			d(g_warning ("unknown node '%s' in %s", child->name, filename));
-			continue;
-		}
-
-		id = e_xml_get_string_prop_by_name_with_default (child, "id", "");
-
-		if (!strcmp(id, "")) {
-			g_free(id);
-			continue;
-		}
-
-		path = e_tree_model_get_node_by_id(etta->priv->source, id);
-		if (path)
-			e_tree_table_adapter_node_set_expanded(etta, path, !model_default);
-
-		g_free (id);
-	}
-
-	xmlFreeDoc (doc);
-
-	e_table_model_changed (E_TABLE_MODEL (etta));
-}
-
-void
-e_tree_table_adapter_root_node_set_visible (ETreeTableAdapter *etta, gboolean visible)
-{
-	int size;
-
-	if (etta->priv->root_visible == visible)
-		return;
-
-	e_table_model_pre_change (E_TABLE_MODEL(etta));
-
-	etta->priv->root_visible = visible;
-	if (!visible) {
-		ETreePath root = e_tree_model_get_root(etta->priv->source);
-		if (root)
-			e_tree_table_adapter_node_set_expanded(etta, root, TRUE);
-	}
-	size = (visible ? 1 : 0) + (etta->priv->root ? ((node_t *)etta->priv->root->data)->num_visible_children : 0);
-	resize_map(etta, size);
-	if (etta->priv->root)
-		fill_map(etta, 0, etta->priv->root);
-	e_table_model_changed(E_TABLE_MODEL(etta));
-}
-
-void
-e_tree_table_adapter_node_set_expanded (ETreeTableAdapter *etta, ETreePath path, gboolean expanded)
-{
-	GNode *gnode = lookup_gnode(etta, path);
-	node_t *node;
-	int row;
-
-	if (!expanded && (!gnode || (e_tree_model_node_is_root (etta->priv->source, path) && !etta->priv->root_visible)))
-		return;
-
-	if (!gnode && expanded) {
-		ETreePath parent = e_tree_model_node_get_parent(etta->priv->source, path);
-		g_return_if_fail(parent != NULL);
-		e_tree_table_adapter_node_set_expanded(etta, parent, expanded);
-		gnode = lookup_gnode(etta, path);
-	}
-	g_return_if_fail(gnode != NULL);
-
-	node = (node_t *) gnode->data;
-
-	if (expanded == node->expanded)
-		return;
-
-	node->expanded = expanded;
-		
-	row = get_row(etta, path);
-	if (row == -1)
-		return;
-
-	e_table_model_pre_change (E_TABLE_MODEL(etta));
-	e_table_model_pre_change (E_TABLE_MODEL(etta));
-	e_table_model_row_changed(E_TABLE_MODEL(etta), row);
-
-
-	if (expanded) {
-		int num_children = insert_children(etta, gnode);
-		update_child_counts(gnode, num_children);
-		if (etta->priv->sort_info && e_table_sort_info_sorting_get_count(etta->priv->sort_info) > 0)
-			resort_node(etta, gnode, TRUE);
-		resize_map(etta, etta->priv->n_map + num_children);
-		move_map_elements(etta, row + 1 + num_children, row + 1, etta->priv->n_map - row - 1 - num_children);
-		fill_map(etta, row, gnode);
-		if (num_children != 0) {
-			e_table_model_rows_inserted(E_TABLE_MODEL(etta), row + 1, num_children);
-		} else
-			e_table_model_no_change(E_TABLE_MODEL(etta));
-	} else {
-		int num_children = delete_children(etta, gnode);
-		if (num_children == 0) {
-			e_table_model_no_change(E_TABLE_MODEL(etta));
-			return;
-		}
-		move_map_elements(etta, row + 1, row + 1 + num_children, etta->priv->n_map - row - 1 - num_children);
-		update_child_counts(gnode, - num_children);
-		resize_map(etta, etta->priv->n_map - num_children);
-		e_table_model_rows_deleted(E_TABLE_MODEL(etta), row + 1, num_children);
-	}
-}
-
-void
-e_tree_table_adapter_node_set_expanded_recurse (ETreeTableAdapter *etta, ETreePath path, gboolean expanded)
-{
-	ETreePath children;
-
-	e_tree_table_adapter_node_set_expanded(etta, path, expanded);
-
-	for (children = e_tree_model_node_get_first_child(etta->priv->source, path); 
-	     children; 
-	     children = e_tree_model_node_get_next(etta->priv->source, children)) {
-		e_tree_table_adapter_node_set_expanded_recurse(etta, children, expanded);
-	}
-}
-
-ETreePath
-e_tree_table_adapter_node_at_row (ETreeTableAdapter *etta, int row)
-{
-	return get_path(etta, row);
-}
-
-int
-e_tree_table_adapter_row_of_node (ETreeTableAdapter *etta, ETreePath path)
-{
-	return get_row(etta, path);
-}
-
-gboolean     
-e_tree_table_adapter_root_node_is_visible(ETreeTableAdapter *etta)
-{
-	return etta->priv->root_visible;
-}
-
-void         
-e_tree_table_adapter_show_node (ETreeTableAdapter *etta, ETreePath path)
-{
-	ETreePath parent;
-
-	parent = e_tree_model_node_get_parent(etta->priv->source, path);
-
-	while (parent) {
-		e_tree_table_adapter_node_set_expanded(etta, parent, TRUE);
-		parent = e_tree_model_node_get_parent(etta->priv->source, parent);
-	}
-}
-
-gboolean     
-e_tree_table_adapter_node_is_expanded (ETreeTableAdapter *etta, ETreePath path)
-{
-	node_t *node = get_node(etta, path);
-	if (!e_tree_model_node_is_expandable (etta->priv->source, path) || !node)
-		return FALSE;
-
-	return node->expanded;
-}
-
-void
-e_tree_table_adapter_set_sort_info (ETreeTableAdapter *etta, ETableSortInfo *sort_info)
-{
-	if (etta->priv->sort_info) {
-		g_signal_handler_disconnect(G_OBJECT(etta->priv->sort_info),
-				            etta->priv->sort_info_changed_id);
-		g_object_unref(etta->priv->sort_info);
-	}
-
-	etta->priv->sort_info = sort_info;
-	if (sort_info) {
-		g_object_ref(sort_info);
-		etta->priv->sort_info_changed_id = g_signal_connect(G_OBJECT(sort_info), "sort_info_changed",
-				                                    G_CALLBACK(etta_sort_info_changed), etta);
-	}
-
-	if (!etta->priv->root)
-		return;
-
-	e_table_model_pre_change(E_TABLE_MODEL(etta));
-	resort_node(etta, etta->priv->root, TRUE);
-	fill_map(etta, 0, etta->priv->root);
-	e_table_model_changed(E_TABLE_MODEL(etta));
-}
-
-ETreePath
-e_tree_table_adapter_node_get_next (ETreeTableAdapter *etta, ETreePath path)
-{
-	GNode *node = lookup_gnode (etta, path);
-
-	if (node && node->next)
-		return ((node_t *)node->next->data)->path;
-
-	return NULL;
-}
diff --git a/widgets/table/e-tree-table-adapter.h b/widgets/table/e-tree-table-adapter.h
deleted file mode 100644
index 8ce1c78097..0000000000
--- a/widgets/table/e-tree-table-adapter.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-tree-table-adapter.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *   Chris Toshok <toshok@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TREE_TABLE_ADAPTER_H_
-#define _E_TREE_TABLE_ADAPTER_H_
-
-#include <glib-object.h>
-#include <gal/e-table/e-table-model.h>
-#include <gal/e-table/e-tree-model.h>
-#include <gal/e-table/e-table-sort-info.h>
-#include <gal/e-table/e-table-header.h>
-
-G_BEGIN_DECLS
-
-#define E_TREE_TABLE_ADAPTER_TYPE        (e_tree_table_adapter_get_type ())
-#define E_TREE_TABLE_ADAPTER(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TREE_TABLE_ADAPTER_TYPE, ETreeTableAdapter))
-#define E_TREE_TABLE_ADAPTER_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TREE_TABLE_ADAPTER_TYPE, ETreeTableAdapterClass))
-#define E_IS_TREE_TABLE_ADAPTER(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TREE_TABLE_ADAPTER_TYPE))
-#define E_IS_TREE_TABLE_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TREE_TABLE_ADAPTER_TYPE))
-#define E_TREE_TABLE_ADAPTER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TREE_TABLE_ADAPTER_TYPE, ETreeTableAdapterClass))
-
-typedef struct ETreeTableAdapterPriv ETreeTableAdapterPriv;
-
-typedef struct {
-	ETableModel  base;
-
-	ETreeTableAdapterPriv *priv;
-} ETreeTableAdapter;
-
-typedef struct {
-	ETableModelClass parent_class;
-} ETreeTableAdapterClass;
-
-GType        e_tree_table_adapter_get_type                   (void);
-ETableModel *e_tree_table_adapter_new                        (ETreeModel        *source,
-							      ETableSortInfo    *sort_info,
-							      ETableHeader	*header);
-ETableModel *e_tree_table_adapter_construct                  (ETreeTableAdapter *ets,
-							      ETreeModel        *source,
-		      					      ETableSortInfo    *sort_info,
-							      ETableHeader	*header);
-
-ETreePath    e_tree_table_adapter_node_get_next              (ETreeTableAdapter *etta,
-							      ETreePath          path);
-gboolean     e_tree_table_adapter_node_is_expanded           (ETreeTableAdapter *etta,
-							      ETreePath          path);
-void         e_tree_table_adapter_node_set_expanded          (ETreeTableAdapter *etta,
-							      ETreePath          path,
-							      gboolean           expanded);
-void         e_tree_table_adapter_node_set_expanded_recurse  (ETreeTableAdapter *etta,
-							      ETreePath          path,
-							      gboolean           expanded);
-void         e_tree_table_adapter_root_node_set_visible      (ETreeTableAdapter *etta,
-							      gboolean           visible);
-ETreePath    e_tree_table_adapter_node_at_row                (ETreeTableAdapter *etta,
-							      int                row);
-int          e_tree_table_adapter_row_of_node                (ETreeTableAdapter *etta,
-							      ETreePath          path);
-gboolean     e_tree_table_adapter_root_node_is_visible       (ETreeTableAdapter *etta);
-
-void         e_tree_table_adapter_show_node                  (ETreeTableAdapter *etta,
-							      ETreePath          path);
-
-void         e_tree_table_adapter_save_expanded_state        (ETreeTableAdapter *etta,
-							      const char        *filename);
-void         e_tree_table_adapter_load_expanded_state        (ETreeTableAdapter *etta,
-							      const char        *filename);
-
-void         e_tree_table_adapter_set_sort_info              (ETreeTableAdapter *etta,
-							      ETableSortInfo    *sort_info);
-
-G_END_DECLS
-
-#endif /* _E_TREE_TABLE_ADAPTER_H_ */
diff --git a/widgets/table/e-tree.c b/widgets/table/e-tree.c
deleted file mode 100644
index fa3dafa2fa..0000000000
--- a/widgets/table/e-tree.c
+++ /dev/null
@@ -1,3324 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * e-tree.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdio.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtksignal.h>
-#include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include <atk/atkregistry.h>
-
-#include <gal/util/e-i18n.h>
-#include <gal/util/e-util.h>
-#include <gal/util/e-marshal.h>
-#include <gal/widgets/e-canvas.h>
-#include <gal/widgets/e-canvas-background.h>
-
-#include <gal/e-table/e-table-column-specification.h>
-#include <gal/e-table/e-table-header-item.h>
-#include <gal/e-table/e-table-header.h>
-#include <gal/e-table/e-table-item.h>
-#include <gal/e-table/e-table-sort-info.h>
-#include <gal/e-table/e-table-utils.h>
-
-#ifdef E_TREE_USE_TREE_SELECTION
-#include <gal/e-table/e-tree-selection-model.h>
-#else
-#include <gal/e-table/e-table-selection-model.h>
-#endif
-
-#include <gal/e-table/e-tree-table-adapter.h>
-
-#include "e-tree.h"
-#include "gal/util/e-marshal.h"
-#include "gal/a11y/e-table/gal-a11y-e-tree.h"
-
-#define COLUMN_HEADER_HEIGHT 16
-
-#define PARENT_TYPE gtk_table_get_type ()
-
-static GtkObjectClass *parent_class;
-
-#define d(x)
-
-#if d(!)0
-#define e_table_item_leave_edit_(x) (e_table_item_leave_edit((x)), g_print ("%s: e_table_item_leave_edit\n", __FUNCTION__))
-#else
-#define e_table_item_leave_edit_(x) (e_table_item_leave_edit((x)))
-#endif
-
-enum {
-	CURSOR_CHANGE,
-	CURSOR_ACTIVATED,
-	SELECTION_CHANGE,
-	DOUBLE_CLICK,
-	RIGHT_CLICK,
-	CLICK,
-	KEY_PRESS,
-	START_DRAG,
-	STATE_CHANGE,
-	WHITE_SPACE_EVENT,
-
-	TREE_DRAG_BEGIN,
-	TREE_DRAG_END,
-	TREE_DRAG_DATA_GET,
-	TREE_DRAG_DATA_DELETE,
-
-	TREE_DRAG_LEAVE,
-	TREE_DRAG_MOTION,
-	TREE_DRAG_DROP,
-	TREE_DRAG_DATA_RECEIVED,
-
-	LAST_SIGNAL
-};
-
-enum {
-	PROP_0,
-	PROP_LENGTH_THRESHOLD,
-	PROP_HORIZONTAL_DRAW_GRID,
-	PROP_VERTICAL_DRAW_GRID,
-	PROP_DRAW_FOCUS,
-	PROP_ETTA,
-	PROP_UNIFORM_ROW_HEIGHT,
-	PROP_ALWAYS_SEARCH
-};
-
-enum {
-	ET_SCROLL_UP = 1 << 0,
-	ET_SCROLL_DOWN = 1 << 1,
-	ET_SCROLL_LEFT = 1 << 2,
-	ET_SCROLL_RIGHT = 1 << 3
-};
-
-struct ETreePriv {
-	ETreeModel *model;
-	ETreeTableAdapter *etta;
-
-	ETableHeader *full_header, *header;
-
-	guint structure_change_id, expansion_change_id;
-
-	ETableSortInfo *sort_info;
-	ESorter   *sorter;
-
-	guint sort_info_change_id, group_info_change_id;
-
-	ESelectionModel *selection;
-	ETableSpecification *spec;
-
-	ETableSearch     *search;
-
-	ETableCol        *current_search_col;
-
-	guint   	  search_search_id;
-	guint   	  search_accept_id;
-
-	int reflow_idle_id;
-	int scroll_idle_id;
-	int hover_idle_id;
-
-	int table_model_change_id;
-	int table_row_change_id;
-	int table_cell_change_id;
-
-	GnomeCanvas *header_canvas, *table_canvas;
-
-	GnomeCanvasItem *header_item, *root;
-
-	GnomeCanvasItem *white_item;
-	GnomeCanvasItem *item;
-
-	gint length_threshold;
-
-	/*
-	 * Configuration settings
-	 */
-	guint alternating_row_colors : 1;
-	guint horizontal_draw_grid : 1;
-	guint vertical_draw_grid : 1;
-	guint draw_focus : 1;
-	guint row_selection_active : 1;
-
-	guint horizontal_scrolling : 1;
-
-	guint scroll_direction : 4;
-
-	guint do_drag : 1;
-
-	guint uniform_row_height : 1;
-
-	guint search_col_set : 1;
-	guint always_search : 1;
-
-	ECursorMode cursor_mode;
-
-	int drop_row;
-	ETreePath drop_path;
-	int drop_col;
-
-	GnomeCanvasItem *drop_highlight;
-	int last_drop_x;
-	int last_drop_y;
-	int last_drop_time;
-	GdkDragContext *last_drop_context;
-
-	int hover_x;
-	int hover_y;
-
-	int drag_row;
-	ETreePath drag_path;
-	int drag_col;
-	ETreeDragSourceSite *site;
-
-	GList *expanded_list;
-};
-
-static guint et_signals [LAST_SIGNAL] = { 0, };
-
-static void et_grab_focus (GtkWidget *widget);
-
-static void et_drag_begin (GtkWidget *widget,
-			   GdkDragContext *context,
-			   ETree *et);
-static void et_drag_end (GtkWidget *widget,
-			 GdkDragContext *context,
-			 ETree *et);
-static void et_drag_data_get(GtkWidget *widget,
-			     GdkDragContext *context,
-			     GtkSelectionData *selection_data,
-			     guint info,
-			     guint time,
-			     ETree *et);
-static void et_drag_data_delete(GtkWidget *widget,
-				GdkDragContext *context,
-				ETree *et);
-
-static void et_drag_leave(GtkWidget *widget,
-			  GdkDragContext *context,
-			  guint time,
-			  ETree *et);
-static gboolean et_drag_motion(GtkWidget *widget,
-			       GdkDragContext *context,
-			       gint x,
-			       gint y,
-			       guint time,
-			       ETree *et);
-static gboolean et_drag_drop(GtkWidget *widget,
-			     GdkDragContext *context,
-			     gint x,
-			     gint y,
-			     guint time,
-			     ETree *et);
-static void et_drag_data_received(GtkWidget *widget,
-				  GdkDragContext *context,
-				  gint x,
-				  gint y,
-				  GtkSelectionData *selection_data,
-				  guint info,
-				  guint time,
-				  ETree *et);
-
-
-static void scroll_off (ETree *et);
-static void scroll_on (ETree *et, guint scroll_direction);
-static void hover_off (ETree *et);
-static void hover_on (ETree *et, int x, int y);
-static void context_destroyed (gpointer data, GObject *ctx);
-
-static void
-et_disconnect_from_etta (ETree *et)
-{
-	if (et->priv->table_model_change_id != 0)
-		g_signal_handler_disconnect (G_OBJECT (et->priv->etta),
-				             et->priv->table_model_change_id);
-	if (et->priv->table_row_change_id != 0)
-		g_signal_handler_disconnect (G_OBJECT (et->priv->etta),
-				             et->priv->table_row_change_id);
-	if (et->priv->table_cell_change_id != 0)
-		g_signal_handler_disconnect (G_OBJECT (et->priv->etta),
-				             et->priv->table_cell_change_id);
-
-	et->priv->table_model_change_id = 0;
-	et->priv->table_row_change_id = 0;
-	et->priv->table_cell_change_id = 0;
-}
-
-static void
-clear_current_search_col (ETree *et)
-{
-	et->priv->search_col_set = FALSE;
-}
-
-static ETableCol *
-current_search_col (ETree *et)
-{
-	if (!et->priv->search_col_set) {
-		et->priv->current_search_col = 
-			e_table_util_calculate_current_search_col (et->priv->header,
-								   et->priv->full_header,
-								   et->priv->sort_info,
-								   et->priv->always_search);
-		et->priv->search_col_set = TRUE;
-	}
-
-	return et->priv->current_search_col;
-}
-
-static void
-e_tree_state_change (ETree *et)
-{
-	g_signal_emit (G_OBJECT (et), et_signals [STATE_CHANGE], 0);
-}
-
-static void
-change_trigger (GtkObject *object, ETree *et)
-{
-	e_tree_state_change (et);
-}
-
-static void
-search_col_change_trigger (GtkObject *object, ETree *et)
-{
-	clear_current_search_col (et);
-	e_tree_state_change (et);
-}
-
-static void
-disconnect_header (ETree *e_tree)
-{
-	if (e_tree->priv->header == NULL)
-		return;
-
-	if (e_tree->priv->structure_change_id)
-		g_signal_handler_disconnect (G_OBJECT (e_tree->priv->header),
-				       	     e_tree->priv->structure_change_id);
-	if (e_tree->priv->expansion_change_id)
-		g_signal_handler_disconnect (G_OBJECT (e_tree->priv->header),
-				       	     e_tree->priv->expansion_change_id);
-	if (e_tree->priv->sort_info) {
-		if (e_tree->priv->sort_info_change_id)
-			g_signal_handler_disconnect (G_OBJECT (e_tree->priv->sort_info),
-					             e_tree->priv->sort_info_change_id);
-		if (e_tree->priv->group_info_change_id)
-			g_signal_handler_disconnect (G_OBJECT (e_tree->priv->sort_info),
-					             e_tree->priv->group_info_change_id);
-
-		g_object_unref(e_tree->priv->sort_info);
-	}
-	g_object_unref(e_tree->priv->header);
-	e_tree->priv->header = NULL;
-	e_tree->priv->sort_info = NULL;
-}
-
-static void
-connect_header (ETree *e_tree, ETableState *state)
-{
-	GValue *val = g_new0 (GValue, 1);
-
-	if (e_tree->priv->header != NULL)
-		disconnect_header (e_tree);
-
-	e_tree->priv->header = e_table_state_to_header (GTK_WIDGET(e_tree), e_tree->priv->full_header, state);
-
-	e_tree->priv->structure_change_id =
-		g_signal_connect (G_OBJECT (e_tree->priv->header), "structure_change",
-				  G_CALLBACK (search_col_change_trigger), e_tree);
-	e_tree->priv->expansion_change_id =
-		g_signal_connect (G_OBJECT (e_tree->priv->header), "expansion_change",
-				  G_CALLBACK (change_trigger), e_tree);
-
-	if (state->sort_info) {
-		e_tree->priv->sort_info = e_table_sort_info_duplicate(state->sort_info);
-		e_table_sort_info_set_can_group (e_tree->priv->sort_info, FALSE);
-		e_tree->priv->sort_info_change_id =
-			g_signal_connect (G_OBJECT (e_tree->priv->sort_info), "sort_info_changed",
-					  G_CALLBACK (search_col_change_trigger), e_tree);
-		e_tree->priv->group_info_change_id =
-			g_signal_connect (G_OBJECT (e_tree->priv->sort_info), "group_info_changed",
-					  G_CALLBACK (search_col_change_trigger), e_tree);
-	} else
-		e_tree->priv->sort_info = NULL;
-
-	g_value_init (val, G_TYPE_OBJECT);
-	g_value_set_object (val, e_tree->priv->sort_info);
-	g_object_set_property (G_OBJECT(e_tree->priv->header), "sort_info", val);
-	g_free (val);
-}
-
-static void
-et_dispose (GObject *object)
-{
-	ETree *et = E_TREE (object);
-
-	if (et->priv) {
-
-		if (et->priv->search) {
-			if (et->priv->search_search_id)
-				g_signal_handler_disconnect (et->priv->search,
-							     et->priv->search_search_id);
-			if (et->priv->search_accept_id)
-				g_signal_handler_disconnect (et->priv->search,
-							     et->priv->search_accept_id);
-			g_object_unref (et->priv->search);
-		}
-
-		if (et->priv->reflow_idle_id)
-			g_source_remove(et->priv->reflow_idle_id);
-		et->priv->reflow_idle_id = 0;
-
-		scroll_off (et);
-		hover_off (et);
-		e_free_string_list (et->priv->expanded_list);
-
-		et_disconnect_from_etta (et);
-
-		g_object_unref (et->priv->etta);
-		g_object_unref (et->priv->model);
-		g_object_unref (et->priv->full_header);
-		disconnect_header (et);
-		g_object_unref (et->priv->selection);
-		if (et->priv->spec)
-			g_object_unref (et->priv->spec);
-		et->priv->spec = NULL;
-
-		if (et->priv->sorter)
-			g_object_unref (et->priv->sorter);
-		et->priv->sorter = NULL;
-
-		if (et->priv->header_canvas)
-			gtk_widget_destroy (GTK_WIDGET (et->priv->header_canvas));
-		et->priv->header_canvas = NULL;
-
-		if (et->priv->site)
-			e_tree_drag_source_unset (et);
-
-		if (et->priv->last_drop_context)
-			g_object_weak_unref (G_OBJECT(et->priv->last_drop_context), context_destroyed, et);
-		et->priv->last_drop_context = NULL;
-
-		gtk_widget_destroy (GTK_WIDGET (et->priv->table_canvas));
-
-		g_free(et->priv);
-		et->priv = NULL;
-	}
-
-	if (G_OBJECT_CLASS (parent_class)->dispose)
-		G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static void
-et_unrealize (GtkWidget *widget)
-{
-	scroll_off (E_TREE (widget));
-	hover_off (E_TREE (widget));
-
-	if (GTK_WIDGET_CLASS (parent_class)->unrealize)
-		GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
-}
-
-typedef struct {
-	ETree *et;
-	char *string;
-} SearchSearchStruct;
-
-static gboolean
-search_search_callback (ETreeModel *model, ETreePath path, gpointer data)
-{
-	SearchSearchStruct *cb_data = data;
-	const void *value;
-	ETableCol *col = current_search_col (cb_data->et);
-
-	value = e_tree_model_value_at (model, path, cb_data->et->priv->current_search_col->col_idx);
-
-	return col->search (value, cb_data->string);
-}
-
-static gboolean
-et_search_search (ETableSearch *search, char *string, ETableSearchFlags flags, ETree *et)
-{
-	ETreePath cursor;
-	ETreePath found;
-	SearchSearchStruct cb_data;
-	ETableCol *col = current_search_col (et);
-
-	if (col == NULL)
-		return FALSE;
-
-	cb_data.et = et;
-	cb_data.string = string;
-
-	cursor = e_tree_get_cursor (et);
-
-	if (cursor && (flags & E_TABLE_SEARCH_FLAGS_CHECK_CURSOR_FIRST)) {
-		const void *value;
-
-		value = e_tree_model_value_at (et->priv->model, cursor, col->col_idx);
-
-		if (col->search (value, string)) {
-			return TRUE;
-		}
-	}
-
-	found = e_tree_model_node_find (et->priv->model, cursor, NULL, E_TREE_FIND_NEXT_FORWARD, search_search_callback, &cb_data);
-	if (found == NULL)
-		found = e_tree_model_node_find (et->priv->model, NULL, cursor, E_TREE_FIND_NEXT_FORWARD, search_search_callback, &cb_data);
-
-	if (found && found != cursor) {
-		int model_row;
-
-		e_tree_table_adapter_show_node (et->priv->etta, found);
-		model_row = e_tree_table_adapter_row_of_node (et->priv->etta, found);
-
-		cursor = found;
-
-		e_selection_model_select_as_key_press(E_SELECTION_MODEL (et->priv->selection), model_row, col->col_idx, GDK_CONTROL_MASK);
-		return TRUE;
-	} else if (cursor && !(flags & E_TABLE_SEARCH_FLAGS_CHECK_CURSOR_FIRST)) {
-		const void *value;
-
-		value = e_tree_model_value_at (et->priv->model, cursor, col->col_idx);
-
-		return col->search (value, string);
-	} else
-		return FALSE;
-}
-
-static void
-et_search_accept (ETableSearch *search, ETree *et)
-{
-	ETableCol *col = current_search_col (et);
-	int cursor;
-
-	if (col == NULL)
-		return;
-
-	g_object_get(et->priv->selection,
-		     "cursor_row", &cursor,
-		     NULL);
-	e_selection_model_select_as_key_press(E_SELECTION_MODEL (et->priv->selection), cursor, col->col_idx, 0);
-}
-
-static void
-e_tree_init (GtkObject *object)
-{
-	ETree *e_tree                                    = E_TREE (object);
-	GtkTable *gtk_table                              = GTK_TABLE (object);
-
-	GTK_WIDGET_SET_FLAGS (e_tree, GTK_CAN_FOCUS);
-
-	gtk_table->homogeneous               = FALSE;
-
-	e_tree->priv                         = g_new(ETreePriv, 1);
-
-	e_tree->priv->model                  = NULL;
-	e_tree->priv->etta                   = NULL;
-
-	e_tree->priv->full_header            = NULL;
-	e_tree->priv->header                 = NULL;
-
-	e_tree->priv->structure_change_id    = 0;
-	e_tree->priv->expansion_change_id    = 0;
-	e_tree->priv->sort_info_change_id    = 0;
-	e_tree->priv->group_info_change_id   = 0;
-
-	e_tree->priv->sort_info              = NULL;
-	e_tree->priv->sorter                 = NULL;
-	e_tree->priv->reflow_idle_id         = 0;
-	e_tree->priv->scroll_idle_id         = 0;
-	e_tree->priv->hover_idle_id          = 0;
-
-	e_tree->priv->table_model_change_id  = 0;
-	e_tree->priv->table_row_change_id    = 0;
-	e_tree->priv->table_cell_change_id   = 0;
-
-	e_tree->priv->alternating_row_colors = 1;
-	e_tree->priv->horizontal_draw_grid   = 1;
-	e_tree->priv->vertical_draw_grid     = 1;
-	e_tree->priv->draw_focus             = 1;
-	e_tree->priv->cursor_mode            = E_CURSOR_SIMPLE;
-	e_tree->priv->length_threshold       = 200;
-	e_tree->priv->uniform_row_height     = FALSE;
-
-	e_tree->priv->row_selection_active   = FALSE;
-	e_tree->priv->horizontal_scrolling   = FALSE;
-	e_tree->priv->scroll_direction       = 0;
-
-	e_tree->priv->drop_row               = -1;
-	e_tree->priv->drop_path              = NULL;
-	e_tree->priv->drop_col               = -1;
-	e_tree->priv->drop_highlight         = NULL;
-
-	e_tree->priv->last_drop_x            = 0;
-	e_tree->priv->last_drop_y            = 0;
-	e_tree->priv->last_drop_time         = 0;
-	e_tree->priv->last_drop_context      = NULL;
-
-	e_tree->priv->hover_x                = 0;
-	e_tree->priv->hover_y                = 0;
-
-	e_tree->priv->drag_row               = -1;
-	e_tree->priv->drag_path              = NULL;
-	e_tree->priv->drag_col               = -1;
-
-	e_tree->priv->expanded_list          = NULL;
-
-	e_tree->priv->site                   = NULL;
-	e_tree->priv->do_drag                = FALSE;
-
-#ifdef E_TREE_USE_TREE_SELECTION
-	e_tree->priv->selection              = E_SELECTION_MODEL(e_tree_selection_model_new());
-#else
-	e_tree->priv->selection              = E_SELECTION_MODEL(e_table_selection_model_new());
-#endif
-	e_tree->priv->spec                   = NULL;
-
-	e_tree->priv->header_canvas          = NULL;
-	e_tree->priv->table_canvas           = NULL;
-
-	e_tree->priv->header_item            = NULL;
-	e_tree->priv->root                   = NULL;
-
-	e_tree->priv->white_item             = NULL;
-	e_tree->priv->item                   = NULL;
-
-	e_tree->priv->search                 = e_table_search_new();
-
-	e_tree->priv->search_search_id       = 
-		g_signal_connect (G_OBJECT (e_tree->priv->search), "search",
-				  G_CALLBACK (et_search_search), e_tree);
-	e_tree->priv->search_accept_id       = 
-		g_signal_connect (G_OBJECT (e_tree->priv->search), "accept",
-				  G_CALLBACK (et_search_accept), e_tree);
-
-	e_tree->priv->current_search_col     = NULL;
-	e_tree->priv->search_col_set         = FALSE;
-	e_tree->priv->always_search          = g_getenv ("GAL_ALWAYS_SEARCH") ? TRUE : FALSE;
-}
-
-/* Grab_focus handler for the ETree */
-static void
-et_grab_focus (GtkWidget *widget)
-{
-	ETree *e_tree;
-
-	e_tree = E_TREE (widget);
-
-	gtk_widget_grab_focus (GTK_WIDGET (e_tree->priv->table_canvas));
-}
-
-/* Focus handler for the ETree */
-static gint
-et_focus (GtkWidget *container, GtkDirectionType direction)
-{
-	ETree *e_tree;
-
-	e_tree = E_TREE (container);
-
-	if (GTK_CONTAINER (container)->focus_child) {
-		gtk_container_set_focus_child (GTK_CONTAINER (container), NULL);
-		return FALSE;
-	}
-
-	return gtk_widget_child_focus (GTK_WIDGET (e_tree->priv->table_canvas), direction);
-}
-
-static void
-set_header_canvas_width (ETree *e_tree)
-{
-	double oldwidth, oldheight, width;
-
-	if (!(e_tree->priv->header_item && e_tree->priv->header_canvas && e_tree->priv->table_canvas))
-		return;
-
-	gnome_canvas_get_scroll_region (GNOME_CANVAS (e_tree->priv->table_canvas),
-					NULL, NULL, &width, NULL);
-	gnome_canvas_get_scroll_region (GNOME_CANVAS (e_tree->priv->header_canvas),
-					NULL, NULL, &oldwidth, &oldheight);
-
-	if (oldwidth != width ||
-	    oldheight != E_TABLE_HEADER_ITEM (e_tree->priv->header_item)->height - 1)
-		gnome_canvas_set_scroll_region (
-						GNOME_CANVAS (e_tree->priv->header_canvas),
-						0, 0, width, /*  COLUMN_HEADER_HEIGHT - 1 */
-						E_TABLE_HEADER_ITEM (e_tree->priv->header_item)->height - 1);
-
-}
-
-static void
-header_canvas_size_allocate (GtkWidget *widget, GtkAllocation *alloc, ETree *e_tree)
-{
-	set_header_canvas_width (e_tree);
-
-	/* When the header item is created ->height == 0,
-	   as the font is only created when everything is realized.
-	   So we set the usize here as well, so that the size of the
-	   header is correct */
-	if (GTK_WIDGET (e_tree->priv->header_canvas)->allocation.height !=
-	    E_TABLE_HEADER_ITEM (e_tree->priv->header_item)->height)
-		gtk_widget_set_usize (GTK_WIDGET (e_tree->priv->header_canvas), -1,
-				      E_TABLE_HEADER_ITEM (e_tree->priv->header_item)->height);
-}
-
-static void
-e_tree_setup_header (ETree *e_tree)
-{
-	char *pointer;
-	e_tree->priv->header_canvas = GNOME_CANVAS (e_canvas_new ());
-	GTK_WIDGET_UNSET_FLAGS (e_tree->priv->header_canvas, GTK_CAN_FOCUS);
-
-	gtk_widget_show (GTK_WIDGET (e_tree->priv->header_canvas));
-
-	pointer = g_strdup_printf("%p", e_tree);
-
-	e_tree->priv->header_item = gnome_canvas_item_new (
-		gnome_canvas_root (e_tree->priv->header_canvas),
-		e_table_header_item_get_type (),
-		"ETableHeader", e_tree->priv->header,
-		"full_header", e_tree->priv->full_header,
-		"sort_info", e_tree->priv->sort_info,
-		"dnd_code", pointer,
-		"tree", e_tree,
-		NULL);
-
-	g_free(pointer);
-
-	g_signal_connect (
-		e_tree->priv->header_canvas, "size_allocate",
-		G_CALLBACK (header_canvas_size_allocate), e_tree);
-
-	gtk_widget_set_usize (GTK_WIDGET (e_tree->priv->header_canvas), -1,
-			      E_TABLE_HEADER_ITEM (e_tree->priv->header_item)->height);
-}
-
-static gboolean
-tree_canvas_reflow_idle (ETree *e_tree)
-{
-	gdouble height, width;
-	gdouble item_height;
-	gdouble oldheight, oldwidth;
-	GtkAllocation *alloc = &(GTK_WIDGET (e_tree->priv->table_canvas)->allocation);
-
-	g_object_get (e_tree->priv->item,
-		      "height", &height,
-		      "width", &width,
-		      NULL);
-	item_height = height;
-	height = MAX ((int)height, alloc->height);
-	width = MAX((int)width, alloc->width);
-	/* I have no idea why this needs to be -1, but it works. */
-	gnome_canvas_get_scroll_region (GNOME_CANVAS (e_tree->priv->table_canvas),
-					NULL, NULL, &oldwidth, &oldheight);
-
-	if (oldwidth != width - 1 ||
-	    oldheight != height - 1) {
-		gnome_canvas_set_scroll_region (GNOME_CANVAS (e_tree->priv->table_canvas),
-						0, 0, width - 1, height - 1);
-		set_header_canvas_width (e_tree);
-	}
-	e_tree->priv->reflow_idle_id = 0;
-	return FALSE;
-}
-
-static void
-tree_canvas_size_allocate (GtkWidget *widget, GtkAllocation *alloc,
-			    ETree *e_tree)
-{
-	gdouble width;
-	gdouble height;
-	gdouble item_height;
-	GtkAdjustment *adj = GTK_LAYOUT(e_tree->priv->table_canvas)->vadjustment;
-	ETreePath path = e_tree_get_cursor (e_tree);
-	gint x, y, w, h;
-	GValue *val = g_new0 (GValue, 1);
-	g_value_init (val, G_TYPE_DOUBLE);
-
-	width = alloc->width;
-	g_value_set_double (val, width);
-	g_object_get (e_tree->priv->item,
-		      "height", &height,
-		      NULL);
-	item_height = height;
-	height = MAX ((int)height, alloc->height);
-
-	g_object_set (e_tree->priv->item,
-		      "width", width,
-		      NULL);
-	g_object_set_property (G_OBJECT (e_tree->priv->header), "width", val);
-	g_free (val);
-
-	if (e_tree->priv->reflow_idle_id)
-		g_source_remove(e_tree->priv->reflow_idle_id);
-	tree_canvas_reflow_idle(e_tree);
-
-	x = y = w = h = 0;
-	if (path) {
-		int row = e_tree_row_of_node(e_tree, path);
-		int col = 0;
-
-		if (row >= 0)
-			e_table_item_get_cell_geometry (E_TABLE_ITEM (e_tree->priv->item),
-							&row, &col, &x, &y, &w, &h);
-	}
-
- 	if (y < adj->value || y + h > adj->value + adj->page_size)
-		gtk_adjustment_set_value(adj, CLAMP(y - adj->page_size / 2, adj->lower, adj->upper - adj->page_size));
-}
-
-static void
-tree_canvas_reflow (GnomeCanvas *canvas, ETree *e_tree)
-{
-	if (!e_tree->priv->reflow_idle_id)
-		e_tree->priv->reflow_idle_id = g_idle_add_full (400, (GSourceFunc) tree_canvas_reflow_idle, e_tree, NULL);
-}
-
-static void
-item_cursor_change (ETableItem *eti, int row, ETree *et)
-{
-	ETreePath path = e_tree_table_adapter_node_at_row(et->priv->etta, row);
-	g_signal_emit (et,
-		       et_signals [CURSOR_CHANGE], 0,
-		       row, path);
-}
-
-static void
-item_cursor_activated (ETableItem *eti, int row, ETree *et)
-{
-	ETreePath path = e_tree_table_adapter_node_at_row(et->priv->etta, row);
-	g_signal_emit (et,
-		       et_signals [CURSOR_ACTIVATED], 0,
-		       row, path);
-	d(g_print("%s: Emitted CURSOR_ACTIVATED signal on row: %d and path: 0x%p\n", __FUNCTION__, row, path));
-}
-
-static void
-item_double_click (ETableItem *eti, int row, int col, GdkEvent *event, ETree *et)
-{
-	ETreePath path = e_tree_table_adapter_node_at_row(et->priv->etta, row);
-	g_signal_emit (et,
-		       et_signals [DOUBLE_CLICK], 0,
-		       row, path, col, event);
-}
-
-static gint
-item_right_click (ETableItem *eti, int row, int col, GdkEvent *event, ETree *et)
-{
-	int return_val = 0;
-	ETreePath path = e_tree_table_adapter_node_at_row(et->priv->etta, row);
-	g_signal_emit (et,
-		       et_signals [RIGHT_CLICK], 0,
-		       row, path, col, event, &return_val);
-	return return_val;
-}
-
-static gint
-item_click (ETableItem *eti, int row, int col, GdkEvent *event, ETree *et)
-{
-	int return_val = 0;
-	ETreePath path = e_tree_table_adapter_node_at_row(et->priv->etta, row);
-	g_signal_emit (et,
-		       et_signals [CLICK], 0,
-		       row, path, col, event, &return_val);
-	return return_val;
-}
-
-static gint
-item_key_press (ETableItem *eti, int row, int col, GdkEvent *event, ETree *et)
-{
-	int return_val = 0;
-	GdkEventKey *key = (GdkEventKey *) event;
-	ETreePath path;
-	int y, row_local, col_local;
-	GtkAdjustment *vadj;
-
-	switch (key->keyval) {
-	case GDK_Page_Down:
-	case GDK_KP_Page_Down:
-		vadj = gtk_layout_get_vadjustment (GTK_LAYOUT (et->priv->table_canvas));
-		y = CLAMP(vadj->value + (2 * vadj->page_size - 50), 0, vadj->upper);
-		y -= vadj->value;
-		e_tree_get_cell_at (et, 30, y, &row_local, &col_local);
-
-		if (row_local == -1)
-			row_local = e_table_model_row_count (E_TABLE_MODEL(et->priv->etta)) - 1;
-
-		row_local = e_tree_view_to_model_row (et, row_local);
-		col_local = e_selection_model_cursor_col (E_SELECTION_MODEL (et->priv->selection));
-		e_selection_model_select_as_key_press (E_SELECTION_MODEL (et->priv->selection), row_local, col_local, key->state);
-
-		return_val = 1;
-		break;
-	case GDK_Page_Up:
-	case GDK_KP_Page_Up:
-		vadj = gtk_layout_get_vadjustment (GTK_LAYOUT (et->priv->table_canvas));
-		y = CLAMP(vadj->value - (vadj->page_size - 50), 0, vadj->upper);
-		y -= vadj->value;
-		e_tree_get_cell_at (et, 30, y, &row_local, &col_local);
-
-		if (row_local == -1)
-			row_local = e_table_model_row_count (E_TABLE_MODEL(et->priv->etta)) - 1;
-
-		row_local = e_tree_view_to_model_row (et, row_local);
-		col_local = e_selection_model_cursor_col (E_SELECTION_MODEL (et->priv->selection));
-		e_selection_model_select_as_key_press (E_SELECTION_MODEL (et->priv->selection), row_local, col_local, key->state);
-
-		return_val = 1;
-		break;
-	case '=':
-	case GDK_Right:
-	case GDK_KP_Right:
-		/* Only allow if the Shift modifier is used -- eg. Ctrl-Equal shouldn't be handled.  */
-		if (key->state & ~(GDK_SHIFT_MASK | GDK_LOCK_MASK))
-			break;
-		if (row != -1) {
-			path = e_tree_table_adapter_node_at_row(et->priv->etta, row);
-			if (path)
-				e_tree_table_adapter_node_set_expanded (et->priv->etta, path, TRUE);
-		}
-		return_val = 1;
-		break;
-	case '-':
-	case GDK_Left:
-	case GDK_KP_Left:
-		/* Only allow if the Shift modifier is used -- eg. Ctrl-Minus shouldn't be handled.  */
-		if (key->state & ~(GDK_SHIFT_MASK | GDK_LOCK_MASK))
-			break;
-		if (row != -1) {
-			path = e_tree_table_adapter_node_at_row(et->priv->etta, row);
-			if (path)
-				e_tree_table_adapter_node_set_expanded (et->priv->etta, path, FALSE);
-		}
-		return_val = 1;
-		break;
-	case GDK_BackSpace:
-		if (e_table_search_backspace (et->priv->search))
-			return TRUE;
-		/* Fallthrough */
-	default:
-		if ((key->state & ~(GDK_SHIFT_MASK | GDK_LOCK_MASK)) == 0
-		    && ((key->keyval >= GDK_a && key->keyval <= GDK_z) ||
-			(key->keyval >= GDK_A && key->keyval <= GDK_Z) ||
-			(key->keyval >= GDK_0 && key->keyval <= GDK_9))) {
-			e_table_search_input_character (et->priv->search, key->keyval);
-		}
-		path = e_tree_table_adapter_node_at_row(et->priv->etta, row);
-		g_signal_emit (et,
-			       et_signals [KEY_PRESS], 0,
-			       row, path, col, event, &return_val);
-		break;
-	}
-	return return_val;
-}
-
-static gint
-item_start_drag (ETableItem *eti, int row, int col, GdkEvent *event, ETree *et)
-{
-	ETreePath path;
-	gint return_val = 0;
-
-	path = e_tree_table_adapter_node_at_row(et->priv->etta, row);
-
-	g_signal_emit (et,
-		       et_signals [START_DRAG], 0,
-		       row, path, col, event, &return_val);
-
-	return return_val;
-}
-
-static void
-et_selection_model_selection_changed (ETableSelectionModel *etsm, ETree *et)
-{
-	g_signal_emit (et,
-		       et_signals [SELECTION_CHANGE], 0);
-}
-
-static void
-et_selection_model_selection_row_changed (ETableSelectionModel *etsm, int row, ETree *et)
-{
-	g_signal_emit (et,
-		       et_signals [SELECTION_CHANGE], 0);
-}
-
-static void
-et_build_item (ETree *et)
-{
-	et->priv->item = gnome_canvas_item_new(GNOME_CANVAS_GROUP (gnome_canvas_root(et->priv->table_canvas)),
-					 e_table_item_get_type(),
-					 "ETableHeader", et->priv->header,
-					 "ETableModel", et->priv->etta,
-					 "selection_model", et->priv->selection,
-					 "alternating_row_colors", et->priv->alternating_row_colors,
-					 "horizontal_draw_grid", et->priv->horizontal_draw_grid,
-					 "vertical_draw_grid", et->priv->vertical_draw_grid,
-					 "drawfocus", et->priv->draw_focus,
-					 "cursor_mode", et->priv->cursor_mode,
-					 "length_threshold", et->priv->length_threshold,
-					 "uniform_row_height", et->priv->uniform_row_height,
-					 NULL);
-
-	g_signal_connect (et->priv->item, "cursor_change",
-			  G_CALLBACK (item_cursor_change), et);
-	g_signal_connect (et->priv->item, "cursor_activated",
-			  G_CALLBACK (item_cursor_activated), et);
-	g_signal_connect (et->priv->item, "double_click",
-			  G_CALLBACK (item_double_click), et);
-	g_signal_connect (et->priv->item, "right_click",
-			  G_CALLBACK (item_right_click), et);
-	g_signal_connect (et->priv->item, "click",
-			  G_CALLBACK (item_click), et);
-	g_signal_connect (et->priv->item, "key_press",
-			  G_CALLBACK (item_key_press), et);
-	g_signal_connect (et->priv->item, "start_drag",
-			  G_CALLBACK (item_start_drag), et);
-}
-
-static void
-et_canvas_style_set (GtkWidget *widget, GtkStyle *prev_style)
-{
-	gnome_canvas_item_set(
-		E_TREE(widget)->priv->white_item,
-		"fill_color_gdk", &widget->style->base[GTK_STATE_NORMAL],
-		NULL);
-}
-
-static gint
-white_item_event (GnomeCanvasItem *white_item, GdkEvent *event, ETree *e_tree)
-{
-	int return_val = 0;
-	g_signal_emit (e_tree,
-		       et_signals [WHITE_SPACE_EVENT], 0,
-		       event, &return_val);
-	return return_val;
-}
-
-static gint
-et_canvas_root_event (GnomeCanvasItem *root, GdkEvent *event, ETree *e_tree)
-{
-	switch (event->type) {
-	case GDK_BUTTON_PRESS:
-	case GDK_2BUTTON_PRESS:
-	case GDK_BUTTON_RELEASE:
-		if (event->button.button != 4 && event->button.button != 5) {
-			if (GTK_WIDGET_HAS_FOCUS(root->canvas)) {
-				GnomeCanvasItem *item = GNOME_CANVAS(root->canvas)->focused_item;
-
-				if (E_IS_TABLE_ITEM(item)) {
-					e_table_item_leave_edit_(E_TABLE_ITEM(item));
-					return TRUE;
-				}
-			}
-		}
-		break;
-	default:
-		break;
-	}
-
-	return FALSE;
-}
-
-/* Handler for focus events in the table_canvas; we have to repaint ourselves
- * and give the focus to some ETableItem.
- */
-static gint
-table_canvas_focus_event_cb (GtkWidget *widget, GdkEventFocus *event, gpointer data)
-{
-	GnomeCanvas *canvas;
-	ETree *tree;
-
-	gtk_widget_queue_draw (widget);
-
-	if (!event->in)
-		return TRUE;
-
-	canvas = GNOME_CANVAS (widget);
-	tree = E_TREE (data);
-
-	if (!canvas->focused_item) {
-		e_table_item_set_cursor (E_TABLE_ITEM (tree->priv->item), 0, 0);
-		gnome_canvas_item_grab_focus (tree->priv->item);
-	}
-
-	return TRUE;
-}
-
-static void
-e_tree_setup_table (ETree *e_tree)
-{
-	e_tree->priv->table_canvas = GNOME_CANVAS (e_canvas_new ());
-	g_signal_connect (
-		e_tree->priv->table_canvas, "size_allocate",
-		G_CALLBACK (tree_canvas_size_allocate), e_tree);
-	g_signal_connect (
-		e_tree->priv->table_canvas, "focus_in_event",
-		G_CALLBACK (table_canvas_focus_event_cb), e_tree);
-	g_signal_connect (
-		e_tree->priv->table_canvas, "focus_out_event",
-		G_CALLBACK (table_canvas_focus_event_cb), e_tree);
-
-	g_signal_connect (
-		e_tree->priv->table_canvas, "drag_begin",
-		G_CALLBACK (et_drag_begin), e_tree);
-	g_signal_connect (
-		e_tree->priv->table_canvas, "drag_end",
-		G_CALLBACK (et_drag_end), e_tree);
-	g_signal_connect (
-		e_tree->priv->table_canvas, "drag_data_get",
-		G_CALLBACK (et_drag_data_get), e_tree);
-	g_signal_connect (
-		e_tree->priv->table_canvas, "drag_data_delete",
-		G_CALLBACK (et_drag_data_delete), e_tree);
-	g_signal_connect (
-		e_tree, "drag_motion",
-		G_CALLBACK (et_drag_motion), e_tree);
-	g_signal_connect (
-		e_tree, "drag_leave",
-		G_CALLBACK (et_drag_leave), e_tree);
-	g_signal_connect (
-		e_tree, "drag_drop",
-		G_CALLBACK (et_drag_drop), e_tree);
-	g_signal_connect (
-		e_tree, "drag_data_received",
-		G_CALLBACK (et_drag_data_received), e_tree);
-
-	g_signal_connect (e_tree->priv->table_canvas, "reflow",
-			  G_CALLBACK (tree_canvas_reflow), e_tree);
-
-	gtk_widget_show (GTK_WIDGET (e_tree->priv->table_canvas));
-
-	e_tree->priv->white_item = gnome_canvas_item_new(
-		gnome_canvas_root(e_tree->priv->table_canvas),
-		e_canvas_background_get_type(),
-		"fill_color_gdk", &GTK_WIDGET(e_tree->priv->table_canvas)->style->base[GTK_STATE_NORMAL],
-		NULL);
-
-	g_signal_connect (e_tree->priv->white_item, "event",
-			  G_CALLBACK (white_item_event), e_tree);
-	g_signal_connect (
-		gnome_canvas_root (e_tree->priv->table_canvas), "event",
-		G_CALLBACK(et_canvas_root_event), e_tree);
-
-	et_build_item(e_tree);
-}
-
-/**
- * e_tree_set_search_column:
- * @e_tree: #ETree object that will be modified
- * @col: Column index to use for searches 
- *
- * This routine sets the current search column to be used for keypress
- * searches of the #ETree. If -1 is passed in for column, the current
- * search column is cleared.
- */
-void
-e_tree_set_search_column (ETree *e_tree, gint  col)
-{
-	if (col == -1) {
-		clear_current_search_col (e_tree);
-		return;
-	}
-
-	e_tree->priv->search_col_set = TRUE;
-	e_tree->priv->current_search_col = e_table_header_get_column (e_tree->priv->full_header, col);
-}
-
-void
-e_tree_set_state_object(ETree *e_tree, ETableState *state)
-{
-	GValue *val = g_new0 (GValue, 1);
-	g_value_init (val, G_TYPE_DOUBLE);
-
-	connect_header (e_tree, state);
-
-	g_value_set_double (val, (double) (GTK_WIDGET(e_tree->priv->table_canvas)->allocation.width));
-	g_object_set_property (G_OBJECT (e_tree->priv->header), "width", val);
-	g_free (val);
-
-	if (e_tree->priv->header_item)
-		g_object_set(e_tree->priv->header_item,
-			     "ETableHeader", e_tree->priv->header,
-			     "sort_info", e_tree->priv->sort_info,
-			     NULL);
-
-	if (e_tree->priv->item)
-		g_object_set(e_tree->priv->item,
-			     "ETableHeader", e_tree->priv->header,
-			     NULL);
-
-	if (e_tree->priv->etta)
-		e_tree_table_adapter_set_sort_info (e_tree->priv->etta, e_tree->priv->sort_info);
-
-	e_tree_state_change (e_tree);
-}
-
-/**
- * e_tree_set_state:
- * @e_tree: #ETree object that will be modified
- * @state_str: a string with the XML representation of the #ETableState.
- *
- * This routine sets the state (as described by #ETableState) of the
- * #ETree object.
- */
-void
-e_tree_set_state (ETree      *e_tree,
-		   const gchar *state_str)
-{
-	ETableState *state;
-
-	g_return_if_fail(e_tree != NULL);
-	g_return_if_fail(E_IS_TREE(e_tree));
-	g_return_if_fail(state_str != NULL);
-
-	state = e_table_state_new();
-	e_table_state_load_from_string(state, state_str);
-
-	if (state->col_count > 0)
-		e_tree_set_state_object(e_tree, state);
-
-	g_object_unref(state);
-}
-
-/**
- * e_tree_load_state:
- * @e_tree: #ETree object that will be modified
- * @filename: name of the file containing the state to be loaded into the #ETree
- *
- * An #ETableState will be loaded form the file pointed by @filename into the
- * @e_tree object.
- */
-void
-e_tree_load_state (ETree      *e_tree,
-		    const gchar *filename)
-{
-	ETableState *state;
-
-	g_return_if_fail(e_tree != NULL);
-	g_return_if_fail(E_IS_TREE(e_tree));
-	g_return_if_fail(filename != NULL);
-
-	state = e_table_state_new();
-	e_table_state_load_from_file(state, filename);
-
-	if (state->col_count > 0)
-		e_tree_set_state_object(e_tree, state);
-
-	g_object_unref(state);
-}
-
-/**
- * e_tree_get_state_object:
- * @e_tree: #ETree object to act on
- *
- * Builds an #ETableState corresponding to the current state of the
- * #ETree.
- *
- * Return value:
- * The %ETableState object generated.
- **/
-ETableState *
-e_tree_get_state_object (ETree *e_tree)
-{
-	ETableState *state;
-	int full_col_count;
-	int i, j;
-
-	state = e_table_state_new();
-	state->sort_info = e_tree->priv->sort_info;
-	if (state->sort_info)
-		g_object_ref(state->sort_info);
-
-	state->col_count = e_table_header_count (e_tree->priv->header);
-	full_col_count = e_table_header_count (e_tree->priv->full_header);
-	state->columns = g_new(int, state->col_count);
-	state->expansions = g_new(double, state->col_count);
-	for (i = 0; i < state->col_count; i++) {
-		ETableCol *col = e_table_header_get_column(e_tree->priv->header, i);
-		state->columns[i] = -1;
-		for (j = 0; j < full_col_count; j++) {
-			if (col->col_idx == e_table_header_index(e_tree->priv->full_header, j)) {
-				state->columns[i] = j;
-				break;
-			}
-		}
-		state->expansions[i] = col->expansion;
-	}
-
-	return state;
-}
-
-/**
- * e_tree_get_state:
- * @e_tree: The #ETree to act on
- * 
- * Builds a state object based on the current state and returns the
- * string corresponding to that state.
- * 
- * Return value: 
- * A string describing the current state of the #ETree.
- **/
-gchar *
-e_tree_get_state (ETree *e_tree)
-{
-	ETableState *state;
-	gchar *string;
-
-	state = e_tree_get_state_object(e_tree);
-	string = e_table_state_save_to_string(state);
-	g_object_unref(state);
-	return string;
-}
-
-/**
- * e_tree_save_state:
- * @e_tree: The #ETree to act on
- * @filename: name of the file to save to
- *
- * Saves the state of the @e_tree object into the file pointed by
- * @filename.
- **/
-void
-e_tree_save_state (ETree      *e_tree,
-		   const gchar *filename)
-{
-	ETableState *state;
-
-	state = e_tree_get_state_object(e_tree);
-	e_table_state_save_to_file(state, filename);
-	g_object_unref(state);
-}
-
-/**
- * e_tree_get_spec:
- * @e_tree: The #ETree to query
- * 
- * Returns the specification object.
- * 
- * Return value:
- **/
-ETableSpecification *
-e_tree_get_spec (ETree *e_tree)
-{
-	return e_tree->priv->spec;
-}
-
-static void
-et_table_model_changed (ETableModel *model, ETree *et)
-{
-	if (et->priv->horizontal_scrolling)
-		e_table_header_update_horizontal(et->priv->header);
-}
-
-static void
-et_table_row_changed (ETableModel *table_model, int row, ETree *et)
-{
-	et_table_model_changed (table_model, et);
-}
-
-static void
-et_table_cell_changed (ETableModel *table_model, int view_col, int row, ETree *et)
-{
-	et_table_model_changed (table_model, et);
-}
-
-static void
-et_connect_to_etta (ETree *et)
-{
-	et->priv->table_model_change_id = g_signal_connect (et->priv->etta, "model_changed",
-							    G_CALLBACK (et_table_model_changed), et);
-
-	et->priv->table_row_change_id = g_signal_connect (et->priv->etta, "model_row_changed",
-							  G_CALLBACK (et_table_row_changed), et);
-
-	et->priv->table_cell_change_id = g_signal_connect (et->priv->etta, "model_cell_changed",
-							   G_CALLBACK (et_table_cell_changed), et);
-
-}
-
-static ETree *
-et_real_construct (ETree *e_tree, ETreeModel *etm, ETableExtras *ete,
-		   ETableSpecification *specification, ETableState *state)
-{
-	int row = 0;
-
-	if (ete)
-		g_object_ref(ete);
-	else
-		ete = e_table_extras_new();
-
-	e_tree->priv->alternating_row_colors = specification->alternating_row_colors;
-	e_tree->priv->horizontal_draw_grid = specification->horizontal_draw_grid;
-	e_tree->priv->vertical_draw_grid = specification->vertical_draw_grid;
-	e_tree->priv->draw_focus = specification->draw_focus;
-	e_tree->priv->cursor_mode = specification->cursor_mode;
-	e_tree->priv->full_header = e_table_spec_to_full_header(specification, ete);
-
-	connect_header (e_tree, state);
-
-	e_tree->priv->horizontal_scrolling = specification->horizontal_scrolling;
-
-	e_tree->priv->model = etm;
-	g_object_ref (etm);
-
-	e_tree->priv->etta = E_TREE_TABLE_ADAPTER(e_tree_table_adapter_new(e_tree->priv->model, e_tree->priv->sort_info, e_tree->priv->full_header));
-
-	et_connect_to_etta (e_tree);
-
-	gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-
-	e_tree->priv->sorter = e_sorter_new();
-
-	g_object_set (e_tree->priv->selection,
-		      "sorter", e_tree->priv->sorter,
-#ifdef E_TREE_USE_TREE_SELECTION
-		      "model", e_tree->priv->model,
-		      "etta", e_tree->priv->etta,
-#else
-		      "model", e_tree->priv->etta,
-#endif
-		      "selection_mode", specification->selection_mode,
-		      "cursor_mode", specification->cursor_mode,
-		      NULL);
-
-	g_signal_connect(e_tree->priv->selection, "selection_changed",
-			 G_CALLBACK (et_selection_model_selection_changed), e_tree);
-	g_signal_connect(e_tree->priv->selection, "selection_row_changed",
-			 G_CALLBACK (et_selection_model_selection_row_changed), e_tree);
-
-	if (!specification->no_headers) {
-		e_tree_setup_header (e_tree);
-	}
-	e_tree_setup_table (e_tree);
-
-	gtk_layout_get_vadjustment (GTK_LAYOUT (e_tree->priv->table_canvas))->step_increment = 20;
-	gtk_adjustment_changed(gtk_layout_get_vadjustment (GTK_LAYOUT (e_tree->priv->table_canvas)));
-	gtk_layout_get_hadjustment (GTK_LAYOUT (e_tree->priv->table_canvas))->step_increment = 20;
-	gtk_adjustment_changed(gtk_layout_get_hadjustment (GTK_LAYOUT (e_tree->priv->table_canvas)));
-
-	if (!specification->no_headers) {
-		/*
-		 * The header
-		 */
-		gtk_table_attach (GTK_TABLE (e_tree), GTK_WIDGET (e_tree->priv->header_canvas),
-				  0, 1, 0 + row, 1 + row,
-				  GTK_FILL | GTK_EXPAND,
-				  GTK_FILL, 0, 0);
-		row ++;
-	}
-	gtk_table_attach (GTK_TABLE (e_tree), GTK_WIDGET (e_tree->priv->table_canvas),
-			  0, 1, 0 + row, 1 + row,
-			  GTK_FILL | GTK_EXPAND,
-			  GTK_FILL | GTK_EXPAND,
-			  0, 0);
-
-	gtk_widget_pop_colormap ();
-
-	g_object_unref(ete);
-
-	return e_tree;
-}
-
-/**
- * e_tree_construct:
- * @e_tree: The newly created #ETree object.
- * @etm: The model for this table.
- * @ete: An optional #ETableExtras.  (%NULL is valid.)
- * @spec_str: The spec.
- * @state_str: An optional state.  (%NULL is valid.)
- * 
- * This is the internal implementation of e_tree_new() for use by
- * subclasses or language bindings.  See e_tree_new() for details.
- * 
- * Return value: 
- * The passed in value @e_tree or %NULL if there's an error.
- **/
-ETree *
-e_tree_construct (ETree *e_tree, ETreeModel *etm, ETableExtras *ete,
-		   const char *spec_str, const char *state_str)
-{
-	ETableSpecification *specification;
-	ETableState *state;
-
-	g_return_val_if_fail(e_tree != NULL, NULL);
-	g_return_val_if_fail(E_IS_TREE(e_tree), NULL);
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TREE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec_str != NULL, NULL);
-
-	specification = e_table_specification_new();
-	e_table_specification_load_from_string(specification, spec_str);
-	if (state_str) {
-		state = e_table_state_new();
-		e_table_state_load_from_string(state, state_str);
-		if (state->col_count <= 0) {
-			g_object_unref(state);
-			state = specification->state;
-			g_object_ref(state);
-		}
-	} else {
-		state = specification->state;
-		g_object_ref(state);
-	}
-
-	e_tree = et_real_construct (e_tree, etm, ete, specification, state);
-
-	e_tree->priv->spec = specification;
-	g_object_unref(state);
-
-	return e_tree;
-}
-
-/**
- * e_tree_construct_from_spec_file:
- * @e_tree: The newly created #ETree object.
- * @etm: The model for this tree
- * @ete: An optional #ETableExtras  (%NULL is valid.)
- * @spec_fn: The filename of the spec
- * @state_fn: An optional state file  (%NULL is valid.)
- *
- * This is the internal implementation of e_tree_new_from_spec_file()
- * for use by subclasses or language bindings.  See
- * e_tree_new_from_spec_file() for details.
- * 
- * Return value: 
- * The passed in value @e_tree or %NULL if there's an error.
- **/
-ETree *
-e_tree_construct_from_spec_file (ETree *e_tree, ETreeModel *etm, ETableExtras *ete,
-				  const char *spec_fn, const char *state_fn)
-{
-	ETableSpecification *specification;
-	ETableState *state;
-
-	g_return_val_if_fail(e_tree != NULL, NULL);
-	g_return_val_if_fail(E_IS_TREE(e_tree), NULL);
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TREE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec_fn != NULL, NULL);
-
-	specification = e_table_specification_new();
-	if (!e_table_specification_load_from_file(specification, spec_fn)) {
-		g_object_unref(specification);
-		return NULL;
-	}
-
-	if (state_fn) {
-		state = e_table_state_new();
-		if (!e_table_state_load_from_file(state, state_fn)) {
-			g_object_unref(state);
-			state = specification->state;
-			g_object_ref(state);
-		}
-		if (state->col_count <= 0) {
-			g_object_unref(state);
-			state = specification->state;
-			g_object_ref(state);
-		}
-	} else {
-		state = specification->state;
-		g_object_ref(state);
-	}
-
-	e_tree = et_real_construct (e_tree, etm, ete, specification, state);
-
-	e_tree->priv->spec = specification;
-	g_object_unref(state);
-
-	return e_tree;
-}
-
-/**
- * e_tree_new:
- * @etm: The model for this tree
- * @ete: An optional #ETableExtras  (%NULL is valid.)
- * @spec: The spec
- * @state: An optional state  (%NULL is valid.)
- * 
- * This function creates an #ETree from the given parameters.  The
- * #ETreeModel is a tree model to be represented.  The #ETableExtras
- * is an optional set of pixbufs, cells, and sorting functions to be
- * used when interpreting the spec.  If you pass in %NULL it uses the
- * default #ETableExtras.  (See e_table_extras_new()).
- *
- * @spec is the specification of the set of viewable columns and the
- * default sorting state and such.  @state is an optional string
- * specifying the current sorting state and such.  If @state is NULL,
- * then the default state from the spec will be used.
- * 
- * Return value: 
- * The newly created #ETree or %NULL if there's an error.
- **/
-GtkWidget *
-e_tree_new (ETreeModel *etm, ETableExtras *ete, const char *spec, const char *state)
-{
-	ETree *e_tree, *ret_val;
-
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TREE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec != NULL, NULL);
-
-	e_tree = g_object_new (E_TREE_TYPE, NULL);
-
-	ret_val = e_tree_construct (e_tree, etm, ete, spec, state);
-
-	if (ret_val == NULL) {
-		g_object_unref (e_tree);
-	}
-
-	return (GtkWidget *) ret_val;
-}
-
-/**
- * e_tree_new_from_spec_file:
- * @etm: The model for this tree.
- * @ete: An optional #ETableExtras.  (%NULL is valid.)
- * @spec_fn: The filename of the spec.
- * @state_fn: An optional state file.  (%NULL is valid.)
- * 
- * This is very similar to e_tree_new(), except instead of passing in
- * strings you pass in the file names of the spec and state to load.
- *
- * @spec_fn is the filename of the spec to load.  If this file doesn't
- * exist, e_tree_new_from_spec_file will return %NULL.
- *
- * @state_fn is the filename of the initial state to load.  If this is
- * %NULL or if the specified file doesn't exist, the default state
- * from the spec file is used.
- * 
- * Return value: 
- * The newly created #ETree or %NULL if there's an error.
- **/
-GtkWidget *
-e_tree_new_from_spec_file (ETreeModel *etm, ETableExtras *ete, const char *spec_fn, const char *state_fn)
-{
-	ETree *e_tree, *ret_val;
-
-	g_return_val_if_fail(etm != NULL, NULL);
-	g_return_val_if_fail(E_IS_TREE_MODEL(etm), NULL);
-	g_return_val_if_fail(ete == NULL || E_IS_TABLE_EXTRAS(ete), NULL);
-	g_return_val_if_fail(spec_fn != NULL, NULL);
-
-	e_tree = g_object_new (E_TREE_TYPE, NULL);
-
-	ret_val = e_tree_construct_from_spec_file (e_tree, etm, ete, spec_fn, state_fn);
-
-	if (ret_val == NULL) {
-		g_object_unref (e_tree);
-	}
-
-	return (GtkWidget *) ret_val;
-}
-
-void
-e_tree_set_cursor (ETree *e_tree, ETreePath path)
-{
-#ifndef E_TREE_USE_TREE_SELECTION
-	int row;
-#endif
-	g_return_if_fail(e_tree != NULL);
-	g_return_if_fail(E_IS_TREE(e_tree));
-	g_return_if_fail(path != NULL);
-
-#ifdef E_TREE_USE_TREE_SELECTION
-	e_tree_selection_model_select_single_path (E_TREE_SELECTION_MODEL(e_tree->priv->selection), path);
-	e_tree_selection_model_change_cursor (E_TREE_SELECTION_MODEL(e_tree->priv->selection), path);
-#else
-	row = e_tree_table_adapter_row_of_node(E_TREE_TABLE_ADAPTER(e_tree->priv->etta), path);
-
-	if (row == -1)
-		return;
-
-	g_object_set(e_tree->priv->selection,
-		     "cursor_row", row,
-		     NULL);
-#endif
-}
-
-ETreePath
-e_tree_get_cursor (ETree *e_tree)
-{
-#ifdef E_TREE_USE_TREE_SELECTION
-	return e_tree_selection_model_get_cursor (E_TREE_SELECTION_MODEL(e_tree->priv->selection));
-#else
-	int row;
-	ETreePath path;
-	g_return_val_if_fail(e_tree != NULL, NULL);
-	g_return_val_if_fail(E_IS_TREE(e_tree), NULL);
-
-	g_object_get(e_tree->priv->selection,
-		     "cursor_row", &row,
-		     NULL);
-	if (row == -1)
-		return NULL;
-	path = e_tree_table_adapter_node_at_row(E_TREE_TABLE_ADAPTER(e_tree->priv->etta), row);
-	return path;
-#endif
-}
-
-void
-e_tree_selected_row_foreach     (ETree *e_tree,
-				  EForeachFunc callback,
-				  gpointer closure)
-{
-	g_return_if_fail(e_tree != NULL);
-	g_return_if_fail(E_IS_TREE(e_tree));
-
-	e_selection_model_foreach(e_tree->priv->selection,
-				  callback,
-				  closure);
-}
-
-#ifdef E_TREE_USE_TREE_SELECTION
-void
-e_tree_selected_path_foreach     (ETree *e_tree,
-				 ETreeForeachFunc callback,
-				 gpointer closure)
-{
-	g_return_if_fail(e_tree != NULL);
-	g_return_if_fail(E_IS_TREE(e_tree));
-
-	e_tree_selection_model_foreach(E_TREE_SELECTION_MODEL (e_tree->priv->selection),
-				       callback,
-				       closure);
-}
-
-/* Standard functions */
-static void
-et_foreach_recurse (ETreeModel *model,
-		    ETreePath path,
-		    ETreeForeachFunc callback,
-		    gpointer closure)
-{
-	ETreePath child;
-
-	callback(path, closure);
-
-	child = e_tree_model_node_get_first_child(E_TREE_MODEL(model), path);
-	for ( ; child; child = e_tree_model_node_get_next(E_TREE_MODEL(model), child))
-		if (child)
-			et_foreach_recurse (model, child, callback, closure);
-}
-
-void
-e_tree_path_foreach (ETree *e_tree,
-		     ETreeForeachFunc callback,
-		     gpointer closure)
-{
-	ETreePath root;
-
-	g_return_if_fail(e_tree != NULL);
-	g_return_if_fail(E_IS_TREE(e_tree));
-
-	root = e_tree_model_get_root (e_tree->priv->model);
-
-	if (root)
-		et_foreach_recurse (e_tree->priv->model,
-				    root,
-				    callback,
-				    closure);
-}
-#endif
-
-EPrintable *
-e_tree_get_printable (ETree *e_tree)
-{
-	g_return_val_if_fail(e_tree != NULL, NULL);
-	g_return_val_if_fail(E_IS_TREE(e_tree), NULL);
-
-	return e_table_item_get_printable(E_TABLE_ITEM(e_tree->priv->item));
-}
-
-static void
-et_get_property (GObject *object,
-		 guint prop_id,
-		 GValue *value,
-		 GParamSpec *pspec)
-{
-	ETree *etree = E_TREE (object);
-
-	switch (prop_id){
-	case PROP_ETTA:
-		g_value_set_object (value, etree->priv->etta);
-		break;
-	case PROP_UNIFORM_ROW_HEIGHT:
-		g_value_set_boolean (value, etree->priv->uniform_row_height);
-		break;
-	case PROP_ALWAYS_SEARCH:
-		g_value_set_boolean (value, etree->priv->always_search);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-typedef struct {
-	char     *arg;
-	gboolean  setting;
-} bool_closure;
-
-static void
-et_set_property (GObject *object,
-		 guint prop_id,
-		 const GValue *value,
-		 GParamSpec *pspec)
-{
-	ETree *etree = E_TREE (object);
-
-	switch (prop_id){
-	case PROP_LENGTH_THRESHOLD:
-		etree->priv->length_threshold = g_value_get_int (value);
-		if (etree->priv->item) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etree->priv->item),
-					       "length_threshold", etree->priv->length_threshold,
-					       NULL);
-		}
-		break;
-
-	case PROP_HORIZONTAL_DRAW_GRID:
-		etree->priv->horizontal_draw_grid = g_value_get_boolean (value);
-		if (etree->priv->item) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etree->priv->item),
-					       "horizontal_draw_grid", etree->priv->horizontal_draw_grid,
-					       NULL);
-		}
-		break;
-
-	case PROP_VERTICAL_DRAW_GRID:
-		etree->priv->vertical_draw_grid = g_value_get_boolean (value);
-		if (etree->priv->item) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etree->priv->item),
-					       "vertical_draw_grid", etree->priv->vertical_draw_grid,
-					       NULL);
-		}
-		break;
-		
-	case PROP_DRAW_FOCUS:
-		etree->priv->draw_focus = g_value_get_boolean (value);
-		if (etree->priv->item) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etree->priv->item),
-					       "drawfocus", etree->priv->draw_focus,
-					       NULL);
-		}
-		break;
-
-	case PROP_UNIFORM_ROW_HEIGHT:
-		etree->priv->uniform_row_height = g_value_get_boolean (value);
-		if (etree->priv->item) {
-			gnome_canvas_item_set (GNOME_CANVAS_ITEM(etree->priv->item),
-					       "uniform_row_height", etree->priv->uniform_row_height,
-					       NULL);
-		}
-		break;
-
-	case PROP_ALWAYS_SEARCH:
-		if (etree->priv->always_search == g_value_get_boolean (value))
-			return;
-		etree->priv->always_search = g_value_get_boolean (value);
-		clear_current_search_col (etree);
-		break;
-	}
-}
-
-static void
-set_scroll_adjustments   (ETree *tree,
-			  GtkAdjustment *hadjustment,
-			  GtkAdjustment *vadjustment)
-{
-	if (vadjustment != NULL) {
-		vadjustment->step_increment = 20;
-		gtk_adjustment_changed(vadjustment);
-	}
-	if (hadjustment != NULL) {
-		hadjustment->step_increment = 20;
-		gtk_adjustment_changed(hadjustment);
-	}
-
-	if (tree->priv) {
-		gtk_layout_set_hadjustment (GTK_LAYOUT(tree->priv->table_canvas),
-					    hadjustment);
-		gtk_layout_set_vadjustment (GTK_LAYOUT(tree->priv->table_canvas),
-					    vadjustment);
-
-		if (tree->priv->header_canvas != NULL)
-			gtk_layout_set_hadjustment (GTK_LAYOUT(tree->priv->header_canvas),
-						    hadjustment);
-	}
-}
-
-gint
-e_tree_get_next_row      (ETree *e_tree,
-			   gint    model_row)
-{
-	g_return_val_if_fail(e_tree != NULL, -1);
-	g_return_val_if_fail(E_IS_TREE(e_tree), -1);
-
-	if (e_tree->priv->sorter) {
-		int i;
-		i = e_sorter_model_to_sorted(E_SORTER (e_tree->priv->sorter), model_row);
-		i++;
-		if (i < e_table_model_row_count(E_TABLE_MODEL(e_tree->priv->etta))) {
-			return e_sorter_sorted_to_model(E_SORTER (e_tree->priv->sorter), i);
-		} else
-			return -1;
-	} else
-		if (model_row < e_table_model_row_count(E_TABLE_MODEL(e_tree->priv->etta)) - 1)
-			return model_row + 1;
-		else
-			return -1;
-}
-
-gint
-e_tree_get_prev_row      (ETree *e_tree,
-			  gint    model_row)
-{
-	g_return_val_if_fail(e_tree != NULL, -1);
-	g_return_val_if_fail(E_IS_TREE(e_tree), -1);
-
-	if (e_tree->priv->sorter) {
-		int i;
-		i = e_sorter_model_to_sorted(E_SORTER (e_tree->priv->sorter), model_row);
-		i--;
-		if (i >= 0)
-			return e_sorter_sorted_to_model(E_SORTER (e_tree->priv->sorter), i);
-		else
-			return -1;
-	} else
-		return model_row - 1;
-}
-
-gint
-e_tree_model_to_view_row        (ETree *e_tree,
-				  gint    model_row)
-{
-	g_return_val_if_fail(e_tree != NULL, -1);
-	g_return_val_if_fail(E_IS_TREE(e_tree), -1);
-
-	if (e_tree->priv->sorter)
-		return e_sorter_model_to_sorted(E_SORTER (e_tree->priv->sorter), model_row);
-	else
-		return model_row;
-}
-
-gint
-e_tree_view_to_model_row        (ETree *e_tree,
-				  gint    view_row)
-{
-	g_return_val_if_fail(e_tree != NULL, -1);
-	g_return_val_if_fail(E_IS_TREE(e_tree), -1);
-
-	if (e_tree->priv->sorter)
-		return e_sorter_sorted_to_model (E_SORTER (e_tree->priv->sorter), view_row);
-	else
-		return view_row;
-}
-
-
-gboolean
-e_tree_node_is_expanded (ETree *et, ETreePath path)
-{
-	g_return_val_if_fail(path, FALSE);
-
-	return e_tree_table_adapter_node_is_expanded (et->priv->etta, path);
-}
-
-void
-e_tree_node_set_expanded (ETree *et, ETreePath path, gboolean expanded)
-{
-	g_return_if_fail (et != NULL);
-	g_return_if_fail (E_IS_TREE(et));
-
-	e_tree_table_adapter_node_set_expanded (et->priv->etta, path, expanded);
-}
-
-void
-e_tree_node_set_expanded_recurse (ETree *et, ETreePath path, gboolean expanded)
-{
-	g_return_if_fail (et != NULL);
-	g_return_if_fail (E_IS_TREE(et));
-
-	e_tree_table_adapter_node_set_expanded_recurse (et->priv->etta, path, expanded);
-}
-
-void
-e_tree_root_node_set_visible (ETree *et, gboolean visible)
-{
-	g_return_if_fail (et != NULL);
-	g_return_if_fail (E_IS_TREE(et));
-
-	e_tree_table_adapter_root_node_set_visible (et->priv->etta, visible);
-}
-
-ETreePath
-e_tree_node_at_row (ETree *et, int row)
-{
-	ETreePath path;
-
-	path = e_tree_table_adapter_node_at_row (et->priv->etta, row);
-
-	return path;
-}
-
-int
-e_tree_row_of_node (ETree *et, ETreePath path)
-{
-	return e_tree_table_adapter_row_of_node (et->priv->etta, path);
-}
-
-gboolean
-e_tree_root_node_is_visible(ETree *et)
-{
-	return e_tree_table_adapter_root_node_is_visible (et->priv->etta);
-}
-
-void
-e_tree_show_node (ETree *et, ETreePath path)
-{
-	g_return_if_fail (et != NULL);
-	g_return_if_fail (E_IS_TREE(et));
-
-	e_tree_table_adapter_show_node (et->priv->etta, path);
-}
-
-void
-e_tree_save_expanded_state (ETree *et, char *filename)
-{
-	g_return_if_fail (et != NULL);
-	g_return_if_fail (E_IS_TREE(et));
-
-	e_tree_table_adapter_save_expanded_state (et->priv->etta, filename);
-}
-
-void
-e_tree_load_expanded_state (ETree *et, char *filename)
-{
-	e_tree_table_adapter_load_expanded_state (et->priv->etta, filename);
-}
-
-gint
-e_tree_row_count (ETree *et)
-{
-	return e_table_model_row_count (E_TABLE_MODEL(et->priv->etta));
-}
-
-GtkWidget *
-e_tree_get_tooltip (ETree *et)
-{
-	return E_CANVAS(et->priv->table_canvas)->tooltip_window;
-}
-
-static ETreePath
-find_next_in_range (ETree *et, gint start, gint end, ETreePathFunc func, gpointer data)
-{
-	ETreePath path;
-	gint row;
-
-	for (row = start; row <= end; row++) {
-		path = e_tree_table_adapter_node_at_row (et->priv->etta, row);
-		if (path && func (et->priv->model, path, data))
-			return path;
-	}
-
-	return NULL;
-}
-
-static ETreePath
-find_prev_in_range (ETree *et, gint start, gint end, ETreePathFunc func, gpointer data)
-{
-	ETreePath path;
-	gint row;
-
-	for (row = start; row >= end; row--) {
-		path = e_tree_table_adapter_node_at_row (et->priv->etta, row);
-		if (path && func (et->priv->model, path, data))
-			return path;
-	}
-
-	return NULL;
-}
-
-gboolean
-e_tree_find_next (ETree *et, ETreeFindNextParams params, ETreePathFunc func, gpointer data)
-{
-	ETreePath cursor, found;
-	gint row, row_count;
-
-	cursor = e_tree_get_cursor (et);
-	row = e_tree_table_adapter_row_of_node (et->priv->etta, cursor);
-	row_count = e_table_model_row_count (E_TABLE_MODEL (et->priv->etta));
-	
-	if (params & E_TREE_FIND_NEXT_FORWARD)
-		found = find_next_in_range (et, row + 1, row_count - 1, func, data);
-	else
-		found = find_prev_in_range (et, row == -1 ? -1 : row - 1, 0, func, data);
-	
-	if (found) {
-		e_tree_table_adapter_show_node (et->priv->etta, found);
-		e_tree_set_cursor (et, found);
-		return TRUE;
-	}
-
-	if (params & E_TREE_FIND_NEXT_WRAP) {
-		if (params & E_TREE_FIND_NEXT_FORWARD)
-			found = find_next_in_range (et, 0, row, func, data);
-		else
-			found = find_prev_in_range (et, row_count - 1, row, func, data);
-
-		if (found && found != cursor) {
-			e_tree_table_adapter_show_node (et->priv->etta, found);
-			e_tree_set_cursor (et, found);
-			return TRUE;
-		}
-	}
-
-	return FALSE;
-}
-
-void
-e_tree_right_click_up (ETree *et)
-{
-	e_selection_model_right_click_up(et->priv->selection);
-}
-
-/**
- * e_tree_get_model:
- * @et: the ETree
- *
- * Returns the model upon which this ETree is based.
- *
- * Returns: the model
- **/
-ETreeModel *
-e_tree_get_model (ETree *et)
-{
-	g_return_val_if_fail (et != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE (et), NULL);
-
-	return et->priv->model;
-}
-
-/**
- * e_tree_get_selection_model:
- * @et: the ETree
- *
- * Returns the selection model of this ETree.
- *
- * Returns: the selection model
- **/
-ESelectionModel *
-e_tree_get_selection_model (ETree *et)
-{
-	g_return_val_if_fail (et != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE (et), NULL);
-
-	return et->priv->selection;
-}
-
-/**
- * e_tree_get_table_adapter:
- * @et: the ETree
- *
- * Returns the table adapter this ETree uses.
- *
- * Returns: the model
- **/
-ETreeTableAdapter *
-e_tree_get_table_adapter (ETree *et)
-{
-	g_return_val_if_fail (et != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE (et), NULL);
-
-	return et->priv->etta;
-}
-
-ETableItem *
-e_tree_get_item(ETree * et)
-{
-	g_return_val_if_fail (et != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE (et), NULL);
-
-	return E_TABLE_ITEM (et->priv->item);
-}
-
-
-struct _ETreeDragSourceSite
-{
-	GdkModifierType    start_button_mask;
-	GtkTargetList     *target_list;        /* Targets for drag data */
-	GdkDragAction      actions;            /* Possible actions */
-	GdkColormap       *colormap;	         /* Colormap for drag icon */
-	GdkPixmap         *pixmap;             /* Icon for drag data */
-	GdkBitmap         *mask;
-
-	/* Stored button press information to detect drag beginning */
-	gint               state;
-	gint               x, y;
-	gint               row, col;
-};
-
-typedef enum
-{
-  GTK_DRAG_STATUS_DRAG,
-  GTK_DRAG_STATUS_WAIT,
-  GTK_DRAG_STATUS_DROP
-} GtkDragStatus;
-
-typedef struct _GtkDragDestInfo GtkDragDestInfo;
-typedef struct _GtkDragSourceInfo GtkDragSourceInfo;
-
-struct _GtkDragDestInfo
-{
-  GtkWidget         *widget;	   /* Widget in which drag is in */
-  GdkDragContext    *context;	   /* Drag context */
-  GtkDragSourceInfo *proxy_source; /* Set if this is a proxy drag */
-  GtkSelectionData  *proxy_data;   /* Set while retrieving proxied data */
-  gboolean           dropped : 1;     /* Set after we receive a drop */
-  guint32            proxy_drop_time; /* Timestamp for proxied drop */
-  gboolean           proxy_drop_wait : 1; /* Set if we are waiting for a
-					   * status reply before sending
-					   * a proxied drop on.
-					   */
-  gint               drop_x, drop_y; /* Position of drop */
-};
-
-struct _GtkDragSourceInfo
-{
-  GtkWidget         *widget;
-  GtkTargetList     *target_list; /* Targets for drag data */
-  GdkDragAction      possible_actions; /* Actions allowed by source */
-  GdkDragContext    *context;	  /* drag context */
-  GtkWidget         *icon_window; /* Window for drag */
-  GtkWidget         *ipc_widget;  /* GtkInvisible for grab, message passing */
-  GdkCursor         *cursor;	  /* Cursor for drag */
-  gint hot_x, hot_y;		  /* Hot spot for drag */
-  gint button;			  /* mouse button starting drag */
-
-  GtkDragStatus      status;	  /* drag status */
-  GdkEvent          *last_event;  /* motion event waiting for response */
-
-  gint               start_x, start_y; /* Initial position */
-  gint               cur_x, cur_y;     /* Current Position */
-
-  GList             *selections;  /* selections we've claimed */
-
-  GtkDragDestInfo   *proxy_dest;  /* Set if this is a proxy drag */
-
-  guint              drop_timeout;     /* Timeout for aborting drop */
-  guint              destroy_icon : 1; /* If true, destroy icon_window
-					*/
-};
-
-/* Drag & drop stuff. */
-/* Target */
-
-void
-e_tree_drag_get_data (ETree         *tree,
-		      int             row,
-		      int             col,
-		      GdkDragContext *context,
-		      GdkAtom         target,
-		      guint32         time)
-{
-	ETreePath path;
-	g_return_if_fail(tree != NULL);
-	g_return_if_fail(E_IS_TREE(tree));
-
-	path = e_tree_table_adapter_node_at_row(tree->priv->etta, row);
-
-	gtk_drag_get_data(GTK_WIDGET(tree),
-			  context,
-			  target,
-			  time);
-
-}
-
-/**
- * e_tree_drag_highlight:
- * @tree:
- * @row:
- * @col:
- *
- * Set col to -1 to highlight the entire row.
- * Set row to -1 to turn off the highlight.
- */
-void
-e_tree_drag_highlight (ETree *tree,
-		       int     row,
-		       int     col)
-{
-	g_return_if_fail(tree != NULL);
-	g_return_if_fail(E_IS_TREE(tree));
-
-	if (row != -1) {
-		int x, y, width, height;
-		if (col == -1) {
-			e_tree_get_cell_geometry (tree, row, 0, &x, &y, &width, &height);
-			x = 0;
-			width = GTK_WIDGET (tree->priv->table_canvas)->allocation.width;
-		} else {
-			e_tree_get_cell_geometry (tree, row, col, &x, &y, &width, &height);
-			x += GTK_LAYOUT(tree->priv->table_canvas)->hadjustment->value;
-		}
-		y += GTK_LAYOUT(tree->priv->table_canvas)->vadjustment->value;
-
-		if (tree->priv->drop_highlight == NULL) {
-			tree->priv->drop_highlight =
-				gnome_canvas_item_new (gnome_canvas_root (tree->priv->table_canvas),
-						       gnome_canvas_rect_get_type (),
-						       "fill_color", NULL,
-						       /*						       "outline_color", "black",
-						       "width_pixels", 1,*/
-						       "outline_color_gdk", &(GTK_WIDGET (tree)->style->fg[GTK_STATE_NORMAL]),
-						       NULL);
-		}
-		gnome_canvas_item_set (tree->priv->drop_highlight,
-				       "x1", (double) x,
-				       "x2", (double) x + width - 1,
-				       "y1", (double) y,
-				       "y2", (double) y + height - 1,
-				       NULL);
-	} else {
-		gtk_object_destroy (GTK_OBJECT (tree->priv->drop_highlight));
-		tree->priv->drop_highlight = NULL;
-	}
-}
-
-void
-e_tree_drag_unhighlight (ETree *tree)
-{
-	g_return_if_fail(tree != NULL);
-	g_return_if_fail(E_IS_TREE(tree));
-
-	if (tree->priv->drop_highlight) {
-		gtk_object_destroy (GTK_OBJECT (tree->priv->drop_highlight));
-		tree->priv->drop_highlight = NULL;
-	}
-}
-
-void e_tree_drag_dest_set   (ETree               *tree,
-			     GtkDestDefaults       flags,
-			     const GtkTargetEntry *targets,
-			     gint                  n_targets,
-			     GdkDragAction         actions)
-{
-	g_return_if_fail(tree != NULL);
-	g_return_if_fail(E_IS_TREE(tree));
-
-	gtk_drag_dest_set(GTK_WIDGET(tree),
-			  flags,
-			  targets,
-			  n_targets,
-			  actions);
-}
-
-void e_tree_drag_dest_set_proxy (ETree         *tree,
-				 GdkWindow      *proxy_window,
-				 GdkDragProtocol protocol,
-				 gboolean        use_coordinates)
-{
-	g_return_if_fail(tree != NULL);
-	g_return_if_fail(E_IS_TREE(tree));
-
-	gtk_drag_dest_set_proxy(GTK_WIDGET(tree),
-				proxy_window,
-				protocol,
-				use_coordinates);
-}
-
-/*
- * There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-
-void
-e_tree_drag_dest_unset (GtkWidget *widget)
-{
-	g_return_if_fail(widget != NULL);
-	g_return_if_fail(E_IS_TREE(widget));
-
-	gtk_drag_dest_unset(widget);
-}
-
-/* Source side */
-
-static gint
-et_real_start_drag (ETree *tree, int row, ETreePath path, int col, GdkEvent *event)
-{
-	GtkDragSourceInfo *info;
-	GdkDragContext *context;
-	ETreeDragSourceSite *site;
-
-	if (tree->priv->do_drag) {
-		site = tree->priv->site;
-
-		site->state = 0;
-		context = e_tree_drag_begin (tree, row, col,
-					     site->target_list,
-					     site->actions,
-					     1, event);
-
-		if (context) {
-			info = g_dataset_get_data (context, "gtk-info");
-
-			if (info && !info->icon_window) {
-				if (site->pixmap)
-					gtk_drag_set_icon_pixmap (context,
-								  site->colormap,
-								  site->pixmap,
-								  site->mask, -2, -2);
-				else
-					gtk_drag_set_icon_default (context);
-			}
-		}
-		return TRUE;
-	}
-	return FALSE;
-}
-
-void
-e_tree_drag_source_set  (ETree               *tree,
-			 GdkModifierType       start_button_mask,
-			 const GtkTargetEntry *targets,
-			 gint                  n_targets,
-			 GdkDragAction         actions)
-{
-	ETreeDragSourceSite *site;
-	GtkWidget *canvas;
-
-	g_return_if_fail(tree != NULL);
-	g_return_if_fail(E_IS_TREE(tree));
-
-	canvas = GTK_WIDGET(tree->priv->table_canvas);
-	site = tree->priv->site;
-
-	tree->priv->do_drag = TRUE;
-
-	gtk_widget_add_events (canvas,
-			       gtk_widget_get_events (canvas) |
-			       GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
-			       GDK_BUTTON_MOTION_MASK | GDK_STRUCTURE_MASK);
-
-	if (site) {
-		if (site->target_list)
-			gtk_target_list_unref (site->target_list);
-	} else {
-		site = g_new0 (ETreeDragSourceSite, 1);
-		tree->priv->site = site;
-	}
-
-	site->start_button_mask = start_button_mask;
-
-	if (targets)
-		site->target_list = gtk_target_list_new (targets, n_targets);
-	else
-		site->target_list = NULL;
-
-	site->actions = actions;
-}
-
-void
-e_tree_drag_source_unset (ETree *tree)
-{
-	ETreeDragSourceSite *site;
-
-	g_return_if_fail (tree != NULL);
-	g_return_if_fail (E_IS_TREE(tree));
-
-	site = tree->priv->site;
-
-	if (site) {
-		if (site->target_list)
-			gtk_target_list_unref (site->target_list);
-		g_free (site);
-		tree->priv->site = NULL;
-	}
-}
-
-/* There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-
-GdkDragContext *
-e_tree_drag_begin (ETree            *tree,
-		   int     	       row,
-		   int     	       col,
-		   GtkTargetList     *targets,
-		   GdkDragAction      actions,
-		   gint               button,
-		   GdkEvent          *event)
-{
-	ETreePath path;
-	g_return_val_if_fail (tree != NULL, NULL);
-	g_return_val_if_fail (E_IS_TREE(tree), NULL);
-
-	path = e_tree_table_adapter_node_at_row(tree->priv->etta, row);
-
-	tree->priv->drag_row = row;
-	tree->priv->drag_path = path;
-	tree->priv->drag_col = col;
-
-	return gtk_drag_begin(GTK_WIDGET (tree->priv->table_canvas),
-			      targets,
-			      actions,
-			      button,
-			      event);
-}
-
-/**
- * e_tree_get_cell_at:
- * @tree: An ETree widget
- * @x: X coordinate for the pixel
- * @y: Y coordinate for the pixel
- * @row_return: Pointer to return the row value
- * @col_return: Pointer to return the column value
- * 
- * Return the row and column for the cell in which the pixel at (@x, @y) is
- * contained.
- **/
-void
-e_tree_get_cell_at (ETree *tree,
-		     int x, int y,
-		     int *row_return, int *col_return)
-{
-	g_return_if_fail (tree != NULL);
-	g_return_if_fail (E_IS_TREE (tree));
-	g_return_if_fail (row_return != NULL);
-	g_return_if_fail (col_return != NULL);
-
-	/* FIXME it would be nice if it could handle a NULL row_return or
-	 * col_return gracefully.  */
-
-	if (row_return)
-		*row_return = -1;
-	if (col_return)
-		*col_return = -1;
-
-	x += GTK_LAYOUT(tree->priv->table_canvas)->hadjustment->value;
-	y += GTK_LAYOUT(tree->priv->table_canvas)->vadjustment->value;
-	e_table_item_compute_location(E_TABLE_ITEM(tree->priv->item), &x, &y, row_return, col_return);
-}
-
-/**
- * e_tree_get_cell_geometry:
- * @tree: The tree.
- * @row: The row to get the geometry of.
- * @col: The col to get the geometry of.
- * @x_return: Returns the x coordinate of the upper right hand corner of the cell with respect to the widget.
- * @y_return: Returns the y coordinate of the upper right hand corner of the cell with respect to the widget.
- * @width_return: Returns the width of the cell.
- * @height_return: Returns the height of the cell.
- * 
- * Computes the data about this cell.
- **/
-void
-e_tree_get_cell_geometry (ETree *tree,
-			  int row, int col,
-			  int *x_return, int *y_return,
-			  int *width_return, int *height_return)
-{
-	g_return_if_fail (tree != NULL);
-	g_return_if_fail (E_IS_TREE (tree));
-	g_return_if_fail (row >= 0);
-	g_return_if_fail (col >= 0);
-
-	/* FIXME it would be nice if it could handle a NULL row_return or
-	 * col_return gracefully.  */
-
-	e_table_item_get_cell_geometry(E_TABLE_ITEM(tree->priv->item), &row, &col, x_return, y_return, width_return, height_return);
-
-	if (x_return)
-		(*x_return) -= GTK_LAYOUT(tree->priv->table_canvas)->hadjustment->value;
-	if (y_return)
-		(*y_return) -= GTK_LAYOUT(tree->priv->table_canvas)->vadjustment->value;
-}
-
-static void
-et_drag_begin (GtkWidget *widget,
-	       GdkDragContext *context,
-	       ETree *et)
-{
-	g_signal_emit (et,
-		       et_signals [TREE_DRAG_BEGIN], 0,
-		       et->priv->drag_row,
-		       et->priv->drag_path,
-		       et->priv->drag_col,
-		       context);
-}
-
-static void
-et_drag_end (GtkWidget *widget,
-	     GdkDragContext *context,
-	     ETree *et)
-{
-	g_signal_emit (et,
-		       et_signals [TREE_DRAG_END], 0,
-		       et->priv->drag_row,
-		       et->priv->drag_path,
-		       et->priv->drag_col,
-		       context);
-}
-
-static void
-et_drag_data_get(GtkWidget *widget,
-		 GdkDragContext *context,
-		 GtkSelectionData *selection_data,
-		 guint info,
-		 guint time,
-		 ETree *et)
-{
-	g_signal_emit (et,
-		       et_signals [TREE_DRAG_DATA_GET], 0,
-		       et->priv->drag_row,
-		       et->priv->drag_path,
-		       et->priv->drag_col,
-		       context,
-		       selection_data,
-		       info,
-		       time);
-}
-
-static void
-et_drag_data_delete(GtkWidget *widget,
-		    GdkDragContext *context,
-		    ETree *et)
-{
-	g_signal_emit (et,
-		       et_signals [TREE_DRAG_DATA_DELETE], 0,
-		       et->priv->drag_row,
-		       et->priv->drag_path,
-		       et->priv->drag_col,
-		       context);
-}
-
-static gboolean
-do_drag_motion(ETree *et,
-	       GdkDragContext *context,
-	       gint x,
-	       gint y,
-	       guint time)
-{
-	gboolean ret_val = FALSE;
-	int row, col;
-	ETreePath path;
-	GtkWidget *widget;
-
-	widget = GTK_WIDGET (et);
-
-	e_tree_get_cell_at (et,
-			    x,
-			    y,
-			    &row,
-			    &col);
-	if (row != et->priv->drop_row && col != et->priv->drop_col) {
-		g_signal_emit (et,
-			       et_signals [TREE_DRAG_LEAVE], 0,
-			       et->priv->drop_row,
-			       et->priv->drop_path,
-			       et->priv->drop_col,
-			       context,
-			       time);
-	}
-
-	path = e_tree_table_adapter_node_at_row(et->priv->etta, row);
-
-	et->priv->drop_row = row;
-	et->priv->drop_path = path;
-	et->priv->drop_col = col;
-	g_signal_emit (et,
-		       et_signals [TREE_DRAG_MOTION], 0,
-		       et->priv->drop_row,
-		       et->priv->drop_path,
-		       et->priv->drop_col,
-		       context,
-		       x,
-		       y,
-		       time,
-		       &ret_val);
-
-	return ret_val;
-}
-
-static gboolean
-scroll_timeout (gpointer data)
-{
-	ETree *et = data;
-	int dx = 0, dy = 0;
-	GtkAdjustment *v, *h;
-	double vvalue, hvalue;
-
-	if (et->priv->scroll_direction & ET_SCROLL_DOWN)
-		dy += 20;
-	if (et->priv->scroll_direction & ET_SCROLL_UP)
-		dy -= 20;
-
-	if (et->priv->scroll_direction & ET_SCROLL_RIGHT)
-		dx += 20;
-	if (et->priv->scroll_direction & ET_SCROLL_LEFT)
-		dx -= 20;
-
-	h = GTK_LAYOUT(et->priv->table_canvas)->hadjustment;
-	v = GTK_LAYOUT(et->priv->table_canvas)->vadjustment;
-
-	hvalue = h->value;
-	vvalue = v->value;
-
-	gtk_adjustment_set_value(h, CLAMP(h->value + dx, h->lower, h->upper - h->page_size));
-	gtk_adjustment_set_value(v, CLAMP(v->value + dy, v->lower, v->upper - v->page_size));
-
-	if (h->value != hvalue ||
-	    v->value != vvalue)
-		do_drag_motion(et,
-			       et->priv->last_drop_context,
-			       et->priv->last_drop_x,
-			       et->priv->last_drop_y,
-			       et->priv->last_drop_time);
-			       
-
-	return TRUE;
-}
-
-static void
-scroll_on (ETree *et, guint scroll_direction)
-{
-	if (et->priv->scroll_idle_id == 0 || scroll_direction != et->priv->scroll_direction) {
-		if (et->priv->scroll_idle_id != 0)
-			g_source_remove (et->priv->scroll_idle_id);
-		et->priv->scroll_direction = scroll_direction;
-		et->priv->scroll_idle_id = g_timeout_add (100, scroll_timeout, et);
-	}
-}
-
-static void
-scroll_off (ETree *et)
-{
-	if (et->priv->scroll_idle_id) {
-		g_source_remove (et->priv->scroll_idle_id);
-		et->priv->scroll_idle_id = 0;
-	}
-}
-
-static gboolean
-hover_timeout (gpointer data)
-{
-	ETree *et = data;
-	int x = et->priv->hover_x;
-	int y = et->priv->hover_y;
-	int row, col;
-	ETreePath path;
-
-	e_tree_get_cell_at (et,
-			    x,
-			    y,
-			    &row,
-			    &col);
-
-	path = e_tree_table_adapter_node_at_row(et->priv->etta, row);
-	if (path && e_tree_model_node_is_expandable (et->priv->model, path)) {
-		if (!e_tree_table_adapter_node_is_expanded (et->priv->etta, path)) {
-			if (e_tree_model_has_save_id (et->priv->model) && e_tree_model_has_get_node_by_id (et->priv->model))
-				et->priv->expanded_list = g_list_prepend (et->priv->expanded_list, e_tree_model_get_save_id (et->priv->model, path));
-			e_tree_table_adapter_node_set_expanded (et->priv->etta, path, TRUE);
-		}
-	}
-
-	return TRUE;
-}
-
-static void
-hover_on (ETree *et, int x, int y)
-{
-	et->priv->hover_x = x;
-	et->priv->hover_y = y;
-	if (et->priv->hover_idle_id != 0)
-		g_source_remove (et->priv->hover_idle_id);
-	et->priv->hover_idle_id = g_timeout_add (500, hover_timeout, et);
-}
-
-static void
-hover_off (ETree *et)
-{
-	if (et->priv->hover_idle_id) {
-		g_source_remove (et->priv->hover_idle_id);
-		et->priv->hover_idle_id = 0;
-	}
-}
-
-static void
-collapse_drag (ETree *et, ETreePath drop)
-{
-	GList *list;
-
-	/* We only want to leave open parents of the node dropped in.  Not the node itself. */
-	if (drop) {
-		drop = e_tree_model_node_get_parent (et->priv->model, drop);
-	}
-
-	for (list = et->priv->expanded_list; list; list = list->next) {
-		char *save_id = list->data;
-		ETreePath path;
-
-		path = e_tree_model_get_node_by_id (et->priv->model, save_id);
-		if (path) {
-			ETreePath search;
-			gboolean found = FALSE;
-
-			for (search = drop; search; search = e_tree_model_node_get_parent (et->priv->model, search)) {
-				if (path == search) {
-					found = TRUE;
-					break;
-				}
-			}
-
-			if (!found)
-				e_tree_table_adapter_node_set_expanded (et->priv->etta, path, FALSE);
-		}
-		g_free (save_id);
-	}
-	g_list_free (et->priv->expanded_list);
-	et->priv->expanded_list = NULL;
-}
-
-static void
-context_destroyed (gpointer data, GObject *ctx)
-{
-	ETree *et = data;
-	if (et->priv) {
-		et->priv->last_drop_x       = 0;
-		et->priv->last_drop_y       = 0;
-		et->priv->last_drop_time    = 0;
-		et->priv->last_drop_context = NULL;
-		collapse_drag (et, NULL);
-		scroll_off (et);
-		hover_off (et);
-	}
-	g_object_unref (et);
-}
-
-static void
-context_connect (ETree *et, GdkDragContext *context)
-{
-	if (context == et->priv->last_drop_context)
-       		return;
-	
-	if (et->priv->last_drop_context) 
-		g_object_weak_unref (G_OBJECT(et->priv->last_drop_context), context_destroyed, et);
-	else
-		g_object_ref (et);
-
-	g_object_weak_ref (G_OBJECT(context), context_destroyed, et);
-}
-
-static void
-et_drag_leave(GtkWidget *widget,
-	      GdkDragContext *context,
-	      guint time,
-	      ETree *et)
-{
-	g_signal_emit (et,
-		       et_signals [TREE_DRAG_LEAVE], 0,
-		       et->priv->drop_row,
-		       et->priv->drop_path,
-		       et->priv->drop_col,
-		       context,
-		       time);
-	et->priv->drop_row = -1;
-	et->priv->drop_col = -1;
-
-	scroll_off (et);
-	hover_off (et);
-}
-
-static gboolean
-et_drag_motion(GtkWidget *widget,
-	       GdkDragContext *context,
-	       gint x,
-	       gint y,
-	       guint time,
-	       ETree *et)
-{
-	int ret_val;
-	guint direction = 0;
-
-	et->priv->last_drop_x = x;
-	et->priv->last_drop_y = y;
-	et->priv->last_drop_time = time;
-	context_connect (et, context);
-	et->priv->last_drop_context = context;
-
-	if (et->priv->hover_idle_id != 0) {
-		if (abs (et->priv->hover_x - x) > 3 ||
-		    abs (et->priv->hover_y - y) > 3) {
-			hover_on (et, x, y);
-		}
-	} else {
-		hover_on (et, x, y);
-	}
-
-	ret_val = do_drag_motion (et,
-				  context,
-				  x,
-				  y,
-				  time);
-
-	if (y < 20)
-		direction |= ET_SCROLL_UP;
-	if (y > widget->allocation.height - 20)
-		direction |= ET_SCROLL_DOWN;
-	if (x < 20)
-		direction |= ET_SCROLL_LEFT;
-	if (x > widget->allocation.width - 20)
-		direction |= ET_SCROLL_RIGHT;
-
-	if (direction != 0)
-		scroll_on (et, direction);
-	else
-		scroll_off (et);
-
-	return ret_val;
-}
-
-static gboolean
-et_drag_drop(GtkWidget *widget,
-	     GdkDragContext *context,
-	     gint x,
-	     gint y,
-	     guint time,
-	     ETree *et)
-{
-	gboolean ret_val = FALSE;
-	int row, col;
-	ETreePath path;
-	e_tree_get_cell_at(et,
-			   x,
-			   y,
-			   &row,
-			   &col);
-	path = e_tree_table_adapter_node_at_row(et->priv->etta, row);
-
-	if (row != et->priv->drop_row && col != et->priv->drop_row) {
-		g_signal_emit (et,
-			       et_signals [TREE_DRAG_LEAVE], 0,
-			       et->priv->drop_row,
-			       et->priv->drop_path,
-			       et->priv->drop_col,
-			       context,
-			       time);
-		g_signal_emit (et,
-			       et_signals [TREE_DRAG_MOTION], 0,
-			       row,
-			       path,
-			       col,
-			       context,
-			       x,
-			       y,
-			       time,
-			       &ret_val);
-	}
-	et->priv->drop_row = row;
-	et->priv->drop_path = path;
-	et->priv->drop_col = col;
-
-	g_signal_emit (et,
-		       et_signals [TREE_DRAG_DROP], 0,
-		       et->priv->drop_row,
-		       et->priv->drop_path,
-		       et->priv->drop_col,
-		       context,
-		       x,
-		       y,
-		       time,
-		       &ret_val);
-
-	et->priv->drop_row = -1;
-	et->priv->drop_path = NULL;
-	et->priv->drop_col = -1;
-
-	collapse_drag (et, path); 
-
-	scroll_off (et);
-	return ret_val;
-}
-
-static void
-et_drag_data_received(GtkWidget *widget,
-		      GdkDragContext *context,
-		      gint x,
-		      gint y,
-		      GtkSelectionData *selection_data,
-		      guint info,
-		      guint time,
-		      ETree *et)
-{
-	int row, col;
-	ETreePath path;
-	e_tree_get_cell_at(et,
-			   x,
-			   y,
-			   &row,
-			   &col);
-	path = e_tree_table_adapter_node_at_row(et->priv->etta, row);
-	g_signal_emit (et,
-		       et_signals [TREE_DRAG_DATA_RECEIVED], 0,
-		       row,
-		       path,
-		       col,
-		       context,
-		       x,
-		       y,
-		       selection_data,
-		       info,
-		       time);
-}
-
-static void
-e_tree_class_init (ETreeClass *class)
-{
-	GObjectClass *object_class;
-	GtkWidgetClass *widget_class;
-	GtkContainerClass *container_class;
-
-	object_class                   = (GObjectClass *) class;
-	widget_class                   = (GtkWidgetClass *) class;
-	container_class                = (GtkContainerClass *) class;
-
-	parent_class                   = g_type_class_ref (PARENT_TYPE);
-
-	object_class->dispose          = et_dispose;
-	object_class->set_property     = et_set_property;
-	object_class->get_property     = et_get_property;
-
-	widget_class->grab_focus       = et_grab_focus;
-	widget_class->unrealize        = et_unrealize;
-	widget_class->style_set        = et_canvas_style_set;
-	widget_class->focus            = et_focus;
-
-	class->cursor_change           = NULL;
-	class->cursor_activated        = NULL;
-	class->selection_change        = NULL;
-	class->double_click            = NULL;
-	class->right_click             = NULL;
-	class->click                   = NULL;
-	class->key_press               = NULL;
-	class->start_drag              = et_real_start_drag;
-	class->state_change            = NULL;
-	class->white_space_event       = NULL;
-
-	class->tree_drag_begin         = NULL;
-	class->tree_drag_end           = NULL;
-	class->tree_drag_data_get      = NULL;
-	class->tree_drag_data_delete   = NULL;
-
-	class->tree_drag_leave         = NULL;
-	class->tree_drag_motion        = NULL;
-	class->tree_drag_drop          = NULL;
-	class->tree_drag_data_received = NULL;
-
-	et_signals [CURSOR_CHANGE] =
-		g_signal_new ("cursor_change",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, cursor_change),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_POINTER,
-			      G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_POINTER);
-
-	et_signals [CURSOR_ACTIVATED] =
-		g_signal_new ("cursor_activated",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, cursor_activated),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_POINTER,
-			      G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_POINTER);
-
-	et_signals [SELECTION_CHANGE] =
-		g_signal_new ("selection_change",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, selection_change),
-			      NULL, NULL,
-			      e_marshal_NONE__NONE,
-			      G_TYPE_NONE, 0);
-
-	et_signals [DOUBLE_CLICK] =
-		g_signal_new ("double_click",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, double_click),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_POINTER_INT_BOXED,
-			      G_TYPE_NONE, 4, G_TYPE_INT,
-			      G_TYPE_POINTER, G_TYPE_INT, GDK_TYPE_EVENT);
-
-	et_signals [RIGHT_CLICK] =
-		g_signal_new ("right_click",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, right_click),
-			      NULL, NULL,
-			      e_marshal_INT__INT_POINTER_INT_BOXED,
-			      G_TYPE_INT, 4, G_TYPE_INT, G_TYPE_POINTER,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	et_signals [CLICK] =
-		g_signal_new ("click",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, click),
-			      NULL, NULL,
-			      e_marshal_INT__INT_POINTER_INT_BOXED,
-			      G_TYPE_INT, 4, G_TYPE_INT, G_TYPE_POINTER,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	et_signals [KEY_PRESS] =
-		g_signal_new ("key_press",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, key_press),
-			      NULL, NULL,
-			      e_marshal_INT__INT_POINTER_INT_BOXED,
-			      G_TYPE_INT, 4, G_TYPE_INT, G_TYPE_POINTER,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	et_signals [START_DRAG] =
-		g_signal_new ("start_drag",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, start_drag),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_POINTER_INT_BOXED,
-			      G_TYPE_NONE, 4, G_TYPE_INT, G_TYPE_POINTER,
-			      G_TYPE_INT, GDK_TYPE_EVENT);
-
-	et_signals [STATE_CHANGE] =
-		g_signal_new ("state_change",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, state_change),
-			      NULL, NULL,
-			      e_marshal_NONE__NONE,
-			      G_TYPE_NONE, 0);
-
-	et_signals [WHITE_SPACE_EVENT] =
-		g_signal_new ("white_space_event",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, white_space_event),
-			      NULL, NULL,
-			      e_marshal_INT__POINTER,
-			      G_TYPE_INT, 1, GDK_TYPE_EVENT);
-
-	et_signals[TREE_DRAG_BEGIN] =
-		g_signal_new ("tree_drag_begin",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, tree_drag_begin),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_POINTER_INT_BOXED,
-			      G_TYPE_NONE, 4,
-			      G_TYPE_INT,
-			      G_TYPE_POINTER,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT);
-	et_signals[TREE_DRAG_END] =
-		g_signal_new ("tree_drag_end",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, tree_drag_end),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_POINTER_INT_BOXED,
-			      G_TYPE_NONE, 4,
-			      G_TYPE_INT,
-			      G_TYPE_POINTER,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT);
-	et_signals[TREE_DRAG_DATA_GET] =
-		g_signal_new ("tree_drag_data_get",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, tree_drag_data_get),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_POINTER_INT_OBJECT_BOXED_UINT_UINT,
-			      G_TYPE_NONE, 7,
-			      G_TYPE_INT,
-			      G_TYPE_POINTER,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT,
-			      GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE,
-			      G_TYPE_UINT,
-			      G_TYPE_UINT);
-	et_signals[TREE_DRAG_DATA_DELETE] =
-		g_signal_new ("tree_drag_data_delete",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, tree_drag_data_delete),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_POINTER_INT_OBJECT,
-			      G_TYPE_NONE, 4,
-			      G_TYPE_INT,
-			      G_TYPE_POINTER,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT);
-	
-	et_signals[TREE_DRAG_LEAVE] =
-		g_signal_new ("tree_drag_leave",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, tree_drag_leave),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_POINTER_INT_OBJECT_UINT,
-			      G_TYPE_NONE, 5,
-			      G_TYPE_INT,
-			      G_TYPE_POINTER,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT,
-			      G_TYPE_UINT);
-	et_signals[TREE_DRAG_MOTION] =
-		g_signal_new ("tree_drag_motion",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, tree_drag_motion),
-			      NULL, NULL,
-			      e_marshal_BOOLEAN__INT_POINTER_INT_OBJECT_INT_INT_UINT,
-			      G_TYPE_BOOLEAN, 7,
-			      G_TYPE_INT,
-			      G_TYPE_POINTER,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT,
-			      G_TYPE_INT,
-			      G_TYPE_INT,
-			      G_TYPE_UINT);
-	et_signals[TREE_DRAG_DROP] =
-		g_signal_new ("tree_drag_drop",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, tree_drag_drop),
-			      NULL, NULL,
-			      e_marshal_BOOLEAN__INT_POINTER_INT_OBJECT_INT_INT_UINT,
-			      G_TYPE_BOOLEAN, 7,
-			      G_TYPE_INT,
-			      G_TYPE_POINTER,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT,
-			      G_TYPE_INT,
-			      G_TYPE_INT,
-			      G_TYPE_UINT);
-	et_signals[TREE_DRAG_DATA_RECEIVED] =
-		g_signal_new ("tree_drag_data_received",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, tree_drag_data_received),
-			      NULL, NULL,
-			      e_marshal_NONE__INT_POINTER_INT_OBJECT_INT_INT_BOXED_UINT_UINT,
-			      G_TYPE_NONE, 9,
-			      G_TYPE_INT,
-			      G_TYPE_POINTER,
-			      G_TYPE_INT,
-			      GDK_TYPE_DRAG_CONTEXT,
-			      G_TYPE_INT,
-			      G_TYPE_INT,
-			      GTK_TYPE_SELECTION_DATA,
-			      G_TYPE_UINT,
-			      G_TYPE_UINT);
-
-	class->set_scroll_adjustments = set_scroll_adjustments;
-
-	widget_class->set_scroll_adjustments_signal =
-		g_signal_new ("set_scroll_adjustments",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (ETreeClass, set_scroll_adjustments),
-			      NULL, NULL,
-			      e_marshal_NONE__POINTER_POINTER,
-			      G_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT,
-			      GTK_TYPE_ADJUSTMENT);
-
-	g_object_class_install_property (object_class, PROP_LENGTH_THRESHOLD,
-					 g_param_spec_int ("length_threshold",
-							   _( "Length Threshold" ),
-							   _( "Length Threshold" ),
-							   0, G_MAXINT, 0,
-							   G_PARAM_WRITABLE));
-	g_object_class_install_property (object_class, PROP_HORIZONTAL_DRAW_GRID,
-					 g_param_spec_boolean ("horizontal_draw_grid",
-							       _( "Horizontal Draw Grid" ),
-							       _( "Horizontal Draw Grid" ),
-							       FALSE,
-							       G_PARAM_WRITABLE));
-	g_object_class_install_property (object_class, PROP_VERTICAL_DRAW_GRID,
-					 g_param_spec_boolean ("vertical_draw_grid",
-							       _( "Vertical Draw Grid" ),
-							       _( "Vertical Draw Grid" ),
-							       FALSE,
-							       G_PARAM_WRITABLE));
-	g_object_class_install_property (object_class, PROP_DRAW_FOCUS,
-					 g_param_spec_boolean ("drawfocus",
-							       _( "Draw focus" ),
-							       _( "Draw focus" ),
-							       FALSE,
-							       G_PARAM_WRITABLE));
-
-	g_object_class_install_property (object_class, PROP_ETTA,
-					 g_param_spec_object ("ETreeTableAdapter",
-							      _( "ETree table adapter" ),
-							      _( "ETree table adapter" ),
-							      E_TREE_TABLE_ADAPTER_TYPE,
-							      G_PARAM_READABLE));
-
-	g_object_class_install_property (object_class, PROP_UNIFORM_ROW_HEIGHT,
-					 g_param_spec_boolean ("uniform_row_height",
-							       _( "Uniform row height" ),
-							       _( "Uniform row height" ),
-							       FALSE,
-							       G_PARAM_READWRITE));
-
-	g_object_class_install_property (object_class, PROP_ALWAYS_SEARCH,
-					 g_param_spec_boolean ("always_search",
-							       _( "Always search" ),
-							       _( "Always search" ),
-							       FALSE,
-							       G_PARAM_READWRITE));
-
-	gtk_widget_class_install_style_property (widget_class,
-			   g_param_spec_boolean ("retro_look",
-						 _("Retro Look"),
-						 _("Draw lines and +/- expanders."),
-						 FALSE,
-						 G_PARAM_READABLE));
-
-	gtk_widget_class_install_style_property (widget_class,
-			   g_param_spec_int ("expander_size",
-					     _("Expander Size"),
-					     _("Size of the expander arrow"),
-					     0,
-					     G_MAXINT,
-					     10,
-					     G_PARAM_READABLE));
-
-	gal_a11y_e_tree_init ();
-}
-
-E_MAKE_TYPE(e_tree, "ETree", ETree, e_tree_class_init, e_tree_init, PARENT_TYPE)
diff --git a/widgets/table/e-tree.h b/widgets/table/e-tree.h
deleted file mode 100644
index 197ef05fef..0000000000
--- a/widgets/table/e-tree.h
+++ /dev/null
@@ -1,312 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * e-tree.h
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Chris Lahey <clahey@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#ifndef _E_TREE_H_
-#define _E_TREE_H_
-
-#include <gtk/gtkdnd.h>
-#include <gtk/gtktable.h>
-#include <libxml/tree.h>
-#include <libgnomecanvas/gnome-canvas.h>
-#include <gal/widgets/e-printable.h>
-
-#include <gal/e-table/e-table-extras.h>
-#include <gal/e-table/e-table-specification.h>
-#include <gal/e-table/e-table-state.h>
-#include <gal/e-table/e-tree-model.h>
-#include <gal/e-table/e-tree-table-adapter.h>
-#include <gal/e-table/e-table-item.h>
-
-#define E_TREE_USE_TREE_SELECTION
-
-#ifdef E_TREE_USE_TREE_SELECTION
-#include <gal/e-table/e-tree-selection-model.h>
-#endif
-
-G_BEGIN_DECLS
-
-#define E_TREE_TYPE        (e_tree_get_type ())
-#define E_TREE(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TREE_TYPE, ETree))
-#define E_TREE_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), E_TREE_TYPE, ETreeClass))
-#define E_IS_TREE(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TREE_TYPE))
-#define E_IS_TREE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TREE_TYPE))
-typedef struct _ETreeDragSourceSite ETreeDragSourceSite;
-typedef struct ETreePriv ETreePriv;
-
-typedef struct {
-	GtkTable parent;
-
-	ETreePriv *priv;
-} ETree;
-
-typedef struct {
-	GtkTableClass parent_class;
-
-	void        (*cursor_change)      (ETree *et, int row, ETreePath path);
-	void        (*cursor_activated)   (ETree *et, int row, ETreePath path);
-	void        (*selection_change)   (ETree *et);
-	void        (*double_click)       (ETree *et, int row, ETreePath path, int col, GdkEvent *event);
-	gint        (*right_click)        (ETree *et, int row, ETreePath path, int col, GdkEvent *event);
-	gint        (*click)              (ETree *et, int row, ETreePath path, int col, GdkEvent *event);
-	gint        (*key_press)          (ETree *et, int row, ETreePath path, int col, GdkEvent *event);
-	gint        (*start_drag)         (ETree *et, int row, ETreePath path, int col, GdkEvent *event);
-	gint        (*state_change)       (ETree *et);
-	gint        (*white_space_event)  (ETree *et, GdkEvent *event);
-
-	void  (*set_scroll_adjustments)   (ETree	 *tree,
-					   GtkAdjustment *hadjustment,
-					   GtkAdjustment *vadjustment);
-
-	/* Source side drag signals */
-	void (* tree_drag_begin)	           (ETree	       *tree,
-						    int                 row,
-						    ETreePath           path,
-						    int                 col,
-						    GdkDragContext     *context);
-	void (* tree_drag_end)	           (ETree	       *tree,
-					    int                 row,
-					    ETreePath           path,
-					    int                 col,
-					    GdkDragContext     *context);
-	void (* tree_drag_data_get)             (ETree             *tree,
-						 int                 row,
-						 ETreePath           path,
-						 int                 col,
-						 GdkDragContext     *context,
-						 GtkSelectionData   *selection_data,
-						 guint               info,
-						 guint               time);
-	void (* tree_drag_data_delete)          (ETree	       *tree,
-						 int                 row,
-						 ETreePath           path,
-						 int                 col,
-						 GdkDragContext     *context);
-	
-	/* Target side drag signals */	   
-	void (* tree_drag_leave)	           (ETree	       *tree,
-						    int                 row,
-						    ETreePath           path,
-						    int                 col,
-						    GdkDragContext     *context,
-						    guint               time);
-	gboolean (* tree_drag_motion)           (ETree	       *tree,
-						 int                 row,
-						 ETreePath           path,
-						 int                 col,
-						 GdkDragContext     *context,
-						 gint                x,
-						 gint                y,
-						 guint               time);
-	gboolean (* tree_drag_drop)             (ETree	       *tree,
-						 int                 row,
-						 ETreePath           path,
-						 int                 col,
-						 GdkDragContext     *context,
-						 gint                x,
-						 gint                y,
-						 guint               time);
-	void (* tree_drag_data_received)        (ETree             *tree,
-						 int                 row,
-						 ETreePath           path,
-						 int                 col,
-						 GdkDragContext     *context,
-						 gint                x,
-						 gint                y,
-						 GtkSelectionData   *selection_data,
-						 guint               info,
-						 guint               time);
-} ETreeClass;
-
-GType           e_tree_get_type                   (void);
-ETree          *e_tree_construct                  (ETree                *e_tree,
-						   ETreeModel           *etm,
-						   ETableExtras         *ete,
-						   const char           *spec,
-						   const char           *state);
-GtkWidget      *e_tree_new                        (ETreeModel           *etm,
-						   ETableExtras         *ete,
-						   const char           *spec,
-						   const char           *state);
-
-/* Create an ETree using files. */
-ETree          *e_tree_construct_from_spec_file   (ETree                *e_tree,
-						   ETreeModel           *etm,
-						   ETableExtras         *ete,
-						   const char           *spec_fn,
-						   const char           *state_fn);
-GtkWidget      *e_tree_new_from_spec_file         (ETreeModel           *etm,
-						   ETableExtras         *ete,
-						   const char           *spec_fn,
-						   const char           *state_fn);
-
-/* To save the state */
-gchar          *e_tree_get_state                  (ETree                *e_tree);
-void            e_tree_save_state                 (ETree                *e_tree,
-						   const gchar          *filename);
-ETableState    *e_tree_get_state_object           (ETree                *e_tree);
-ETableSpecification    *e_tree_get_spec           (ETree                *e_tree);
-
-/* note that it is more efficient to provide the state at creation time */
-void            e_tree_set_search_column          (ETree *e_tree,
-						   gint  col);
-void            e_tree_set_state                  (ETree                *e_tree,
-						   const gchar          *state);
-void            e_tree_set_state_object           (ETree                *e_tree,
-						   ETableState          *state);
-void            e_tree_load_state                 (ETree                *e_tree,
-						   const gchar          *filename);
-void            e_tree_set_cursor                 (ETree                *e_tree,
-						   ETreePath             path);
-
-/* NULL means we don't have the cursor. */
-ETreePath       e_tree_get_cursor                 (ETree                *e_tree);
-void            e_tree_selected_row_foreach       (ETree                *e_tree,
-						   EForeachFunc          callback,
-						   gpointer              closure);
-#ifdef E_TREE_USE_TREE_SELECTION
-void            e_tree_selected_path_foreach      (ETree                *e_tree,
-						   ETreeForeachFunc      callback,
-						   gpointer              closure);
-void            e_tree_path_foreach               (ETree                *e_tree,
-						   ETreeForeachFunc      callback,
-						   gpointer              closure);
-#endif
-gint            e_tree_selected_count             (ETree                *e_tree);
-EPrintable     *e_tree_get_printable              (ETree                *e_tree);
-gint            e_tree_get_next_row               (ETree                *e_tree,
-						   gint                  model_row);
-gint            e_tree_get_prev_row               (ETree                *e_tree,
-						   gint                  model_row);
-gint            e_tree_model_to_view_row          (ETree                *e_tree,
-						   gint                  model_row);
-gint            e_tree_view_to_model_row          (ETree                *e_tree,
-						   gint                  view_row);
-void            e_tree_get_cell_at                (ETree                *tree,
-						   int                   x,
-						   int                   y,
-						   int                  *row_return,
-						   int                  *col_return);
-void            e_tree_get_cell_geometry          (ETree                *tree,
-						   int                   row,
-						   int                   col,
-						   int                  *x_return,
-						   int                  *y_return,
-						   int                  *width_return,
-						   int                  *height_return);
-
-/* Useful accessors */
-ETreeModel *    e_tree_get_model                  (ETree *et);
-ESelectionModel *e_tree_get_selection_model       (ETree *et);
-ETreeTableAdapter *e_tree_get_table_adapter       (ETree *et);
-
-/* Drag & drop stuff. */
-/* Target */
-void            e_tree_drag_get_data              (ETree                *tree,
-						   int                   row,
-						   int                   col,
-						   GdkDragContext       *context,
-						   GdkAtom               target,
-						   guint32               time);
-void            e_tree_drag_highlight             (ETree                *tree,
-						   int                   row,
-						   int                   col); /* col == -1 to highlight entire row. */
-void            e_tree_drag_unhighlight           (ETree                *tree);
-void            e_tree_drag_dest_set              (ETree                *tree,
-						   GtkDestDefaults       flags,
-						   const GtkTargetEntry *targets,
-						   gint                  n_targets,
-						   GdkDragAction         actions);
-void            e_tree_drag_dest_set_proxy        (ETree                *tree,
-						   GdkWindow            *proxy_window,
-						   GdkDragProtocol       protocol,
-						   gboolean              use_coordinates);
-
-/* There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-void            e_tree_drag_dest_unset            (GtkWidget            *widget);
-
-/* Source side */
-void            e_tree_drag_source_set            (ETree                *tree,
-						   GdkModifierType       start_button_mask,
-						   const GtkTargetEntry *targets,
-						   gint                  n_targets,
-						   GdkDragAction         actions);
-void            e_tree_drag_source_unset          (ETree                *tree);
-
-/* There probably should be functions for setting the targets
- * as a GtkTargetList
- */
-GdkDragContext *e_tree_drag_begin                 (ETree                *tree,
-						   int                   row,
-						   int                   col,
-						   GtkTargetList        *targets,
-						   GdkDragAction         actions,
-						   gint                  button,
-                                                   GdkEvent             *event);
-
-/* Adapter functions */
-gboolean        e_tree_node_is_expanded           (ETree                *et,
-						   ETreePath             path);
-void            e_tree_node_set_expanded          (ETree                *et,
-						   ETreePath             path,
-						   gboolean              expanded);
-void            e_tree_node_set_expanded_recurse  (ETree                *et,
-						   ETreePath             path,
-						   gboolean              expanded);
-void            e_tree_root_node_set_visible      (ETree                *et,
-						   gboolean              visible);
-ETreePath       e_tree_node_at_row                (ETree                *et,
-						   int                   row);
-int             e_tree_row_of_node                (ETree                *et,
-						   ETreePath             path);
-gboolean        e_tree_root_node_is_visible       (ETree                *et);
-void            e_tree_show_node                  (ETree                *et,
-						   ETreePath             path);
-void            e_tree_save_expanded_state        (ETree                *et,
-						   char                 *filename);
-void            e_tree_load_expanded_state        (ETree                *et,
-						   char                 *filename);
-int             e_tree_row_count                  (ETree                *et);
-GtkWidget      *e_tree_get_tooltip                (ETree                *et);
-
-typedef enum {
-	E_TREE_FIND_NEXT_BACKWARD = 0,
-	E_TREE_FIND_NEXT_FORWARD  = 1 << 0,
-	E_TREE_FIND_NEXT_WRAP     = 1 << 1
-} ETreeFindNextParams;
-
-gboolean        e_tree_find_next                  (ETree                *et,
-						   ETreeFindNextParams   params,
-						   ETreePathFunc         func,
-						   gpointer              data);
-
-/* This function is only needed in single_selection_mode. */
-void            e_tree_right_click_up             (ETree                *et);
-
-ETableItem *	e_tree_get_item(ETree * et);
-
-G_END_DECLS
-
-#endif /* _E_TREE_H_ */
-
diff --git a/widgets/table/image1.png b/widgets/table/image1.png
deleted file mode 100644
index 8326ac241f..0000000000
Binary files a/widgets/table/image1.png and /dev/null differ
diff --git a/widgets/table/image2.png b/widgets/table/image2.png
deleted file mode 100644
index e6a4c75dbe..0000000000
Binary files a/widgets/table/image2.png and /dev/null differ
diff --git a/widgets/table/image3.png b/widgets/table/image3.png
deleted file mode 100644
index 50e16e8620..0000000000
Binary files a/widgets/table/image3.png and /dev/null differ
diff --git a/widgets/table/remove-col.xpm b/widgets/table/remove-col.xpm
deleted file mode 100644
index ff1024f0c9..0000000000
--- a/widgets/table/remove-col.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * remove_col_xpm[] = {
-"16 16 3 1",
-" 	c None",
-".	c #000000",
-"+	c #FF0000",
-"...          ...",
-".++.        .++.",
-".+++.      .+++.",
-" .+++.    .+++. ",
-"  .+++.  .+++.  ",
-"   .+++..+++.   ",
-"    .++++++.    ",
-"     .++++.     ",
-"     .++++.     ",
-"    .++++++.    ",
-"   .+++..+++.   ",
-"  .+++.  .+++.  ",
-" .+++.    .+++. ",
-".+++.      .+++.",
-".++.        .++.",
-"...          ..."};
diff --git a/widgets/table/sample.table b/widgets/table/sample.table
deleted file mode 100644
index e1909a2bf7..0000000000
--- a/widgets/table/sample.table
+++ /dev/null
@@ -1,45 +0,0 @@
-Col1	Col2	Address		Title	Dorks
-c1.a	c2.a	a.a		tit-1	DorkA
-c1.b	c2.b	a.b		tit-2	DDork
-c1.c	c2.c	a.c		tit-1	DorkB
-c1.d	c2.d	a.d		tit-2	ADork
-c1.e	c2.e	a.e		tit-1	DorkC
-c1.f	c2.f	a.f		tit-2	UDork
-c1.g	c2.g	a.g		tit-3	Dork---
-j	k	k		tit-1	DorkA
-aaa1	bbb	ccc		ddd	eee
-aaa2	bbb	ccc		ddd	eee
-aaa3	bbb	ccc		ddd	eee
-aaa4	bbb	ccc		ddd	eee
-aaa5	bbb	ccc		ddd	eee
-aaa6	bbb	ccc		ddd	eee
-aaa7	bbb	ccc		ddd	eee
-aaa8	bbb	ccc		ddd	eee
-aaa9	bbb	ccc		ddd	eee
-aaa10	bbb	ccc		ddd	eee
-aaa11	bbb	ccc		ddd	eee
-aaa12	bbb	ccc		ddd	eee
-aaa13	bbb	ccc		ddd	eee
-aaa14	bbb	ccc		ddd	eee
-aaa15	bbb	ccc		ddd	eee
-aaa16	bbb	ccc		ddd	eee
-aaa17	bbb	ccc		ddd	eee
-aaa18	bbb	ccc		ddd	eee
-aaa19	bbb	ccc		ddd	eee
-aaa20	bbb	ccc		ddd	eee
-aaa21	bbb	ccc		ddd	eee
-aaa22	bbb	ccc		ddd	eee
-aaa23	bbb	ccc		ddd	eee
-aaa24	bbb	ccc		ddd	eee
-aaa25	bbb	ccc		ddd	eee
-aaa26	bbb	ccc		ddd	eee
-aaa27	bbb	ccc		ddd	eee
-aaa28	bbb	ccc		ddd	eee
-aaa29	bbb	ccc		ddd	eee
-aaa30	bbb	ccc		ddd	eee
-aaa31	bbb	ccc		ddd	eee
-aaa32	bbb	ccc		ddd	eee
-aaa33	bbb	ccc		ddd	eee
-aaa34	bbb	ccc		ddd	eee
-aaa35	bbb	ccc		ddd	eee
-aaa36	bbb	ccc		ddd	eee
diff --git a/widgets/table/spec.xml b/widgets/table/spec.xml
deleted file mode 100644
index a8e524484c..0000000000
--- a/widgets/table/spec.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<ETableSpecification no-headers="false" click-to-add="false"
-		     draw-grid="true" cursor-mode="simple"
-		     _click-to-add-message="">
-  <ETableColumn model_col="0" _title="Email"     expansion="1.0" minimum_width="20" resizable="true" cell="cell_left_just" compare="string"/>
-  <ETableColumn model_col="1" _title="Full Name" expansion="1.0" minimum_width="20" resizable="true" cell="cell_left_just" compare="string"/>
-  <ETableColumn model_col="2" _title="Address"   expansion="1.0" minimum_width="20" resizable="true" cell="cell_left_just" compare="string"/>
-  <ETableColumn model_col="3" _title="Phone"     expansion="1.0" minimum_width="20" resizable="true" cell="cell_left_just" compare="string"/>
-  <ETableState>
-    <column source="0"/>
-    <column source="3"/>
-    <column source="1"/>
-    <column source="2"/>
-    <grouping>
-      <group column="2" ascending="true">
-	<leaf column="1" ascending="true"/>
-      </group>
-    </grouping>
-    <!-- Column that's been added by hand.  Not implemented yet.
-  <ETableColumn model_col="custom-string" _title="Custom" expansion="1.0" minimum_widgth="20" resizable="true" cell="string" compare="string"/> -->
-  </ETableState>
-</ETableSpecification>
diff --git a/widgets/table/table-test.c b/widgets/table/table-test.c
deleted file mode 100644
index fe211e9d21..0000000000
--- a/widgets/table/table-test.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * table-test.c
- * Copyright 1999, 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Miguel de Icaza (miguel@gnu.org)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdio.h>
-#include <string.h>
-#include <fcntl.h>
-#include <gnome.h>
-#include "gal/widgets/e-cursors.h"
-#include "table-test.h"
-
-int
-main (int argc, char *argv [])
-{
-
-	if (isatty (0)){
-		int fd;
-
-		close (0);
-		fd = open ("sample.table", O_RDONLY);
-		if (fd == -1){
-			fprintf (stderr, "Could not find sample.table, try feeding a table on stdin");
-			exit (1);
-		}
-		dup2 (fd, 0);
-	}
-
-	gnome_init ("TableTest", "TableTest", argc, argv);
-	e_cursors_init ();
-
-
-/*  	table_browser_test (); */
-/*  	multi_cols_test (); */
-/*  	check_test (); */
-
-	e_table_test ();
-
-	gtk_main ();
-
-	e_cursors_shutdown ();
-	return 0;
-}
diff --git a/widgets/table/table-test.h b/widgets/table/table-test.h
deleted file mode 100644
index d0442ca64b..0000000000
--- a/widgets/table/table-test.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
- * table-test.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Miguel de Icaza (miguel@gnu.org)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-void table_browser_test (void);
-void multi_cols_test    (void);
-void check_test         (void);
-void e_table_test       (void);
diff --git a/widgets/table/test-check.c b/widgets/table/test-check.c
deleted file mode 100644
index 7fe4c126e6..0000000000
--- a/widgets/table/test-check.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * test-check.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Miguel de Icaza (miguel@gnu.org)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "gal/widgets/e-cursors.h"
-#include "gal/widgets/e-canvas-utils.h"
-#include "gal/widgets/e-canvas.h"
-#include "gal/util/e-util.h"
-#include "e-cell-text.h"
-#include "e-cell-checkbox.h"
-
-#include "table-test.h"
-
-#define LINES 4
-
-static struct {
-	int   value;
-	char *string;
-} my_table [LINES] = {
-	{ 0, "Buy food" },
-	{ 1, "Breathe " },
-	{ 0, "Cancel gdb session with shrink" },
-	{ 1, "Make screenshots" },
-};
-/*
- * ETableSimple callbacks
- */
-static int
-col_count (ETableModel *etc, void *data)
-{
-	return 2;
-}
-
-static int
-row_count (ETableModel *etc, void *data)
-{
-	return LINES;
-}
-
-static void *
-value_at (ETableModel *etc, int col, int row, void *data)
-{
-	g_assert (col < 2);
-	g_assert (row < LINES);
-
-	if (col == 0)
-		return GINT_TO_POINTER (my_table [row].value);
-	else
-		return my_table [row].string;
-	
-}
-
-static void
-set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
-	g_assert (col < 2);
-	g_assert (row < LINES);
-
-	if (col == 0) {
-		my_table [row].value = GPOINTER_TO_INT (val);
-		printf ("Value at %d,%d set to %d\n", col, row, GPOINTER_TO_INT (val));
-	} else {
-		my_table [row].string = g_strdup (val);
-		printf ("Value at %d,%d set to %s\n", col, row, (char *) val);
-	}
-}
-
-static gboolean
-is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
-	return TRUE;
-}
-
-static void *
-duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
-	if (col == 0) {
-		return (void *) value;
-	} else {
-		return g_strdup (value);
-	}
-}
-
-static void
-free_value (ETableModel *etc, int col, void *value, void *data)
-{
-	if (col != 0) {
-		g_free (value);
-	}
-}
-
-static void *
-initialize_value (ETableModel *etc, int col, void *data)
-{
-	if (col == 0)
-		return NULL;
-	else
-		return g_strdup ("");
-}
-
-static gboolean
-value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
-	if (col == 0)
-		return value == NULL;
-	else
-		return !(value && *(char *)value);
-}
-
-static char *
-value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
-	if (col == 0)
-		return g_strdup_printf("%d", (int) value);
-	else
-		return g_strdup(value);
-}
-
-static void
-set_canvas_size (GnomeCanvas *canvas, GtkAllocation *alloc)
-{
-	gnome_canvas_set_scroll_region (canvas, 0, 0, alloc->width, alloc->height);
-}
-
-void
-check_test (void)
-{
-	GtkWidget *canvas, *window;
-	ETableModel *e_table_model;
-	ETableHeader *e_table_header;
-	ETableCol *col_0, *col_1;
-	ECell *cell_left_just, *cell_image_check;
-	GdkPixbuf *pixbuf;
-	GnomeCanvasItem *item;
-
-	gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-	
-	e_table_model = e_table_simple_new (
-		col_count, row_count, value_at,
-		set_value_at, is_cell_editable, 
-		duplicate_value, free_value, 
-		initialize_value, value_is_empty,
-		value_to_string,
-		NULL);
-
-	/*
-	 * Header
-	 */
-	e_table_header = e_table_header_new ();
-
-	cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
-	cell_image_check = e_cell_checkbox_new ();
-	pixbuf = gdk_pixbuf_new_from_file ("clip.png");
-	col_0 = e_table_col_new_with_pixbuf (0, pixbuf, 0.0, 18, cell_image_check, g_int_compare, TRUE);
-	gdk_pixbuf_unref (pixbuf);
-	e_table_header_add_column (e_table_header, col_0, 0);
-	
-	col_1 = e_table_col_new (1, "Item Name", 1.0, 20, cell_left_just, g_str_compare, TRUE);
-	e_table_header_add_column (e_table_header, col_1, 1);
-	e_table_col_set_arrow (col_1, E_TABLE_COL_ARROW_DOWN);
-
-	/*
-	 * GUI
-	 */
-	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-	canvas = e_canvas_new ();
-
-	g_signal_connect (canvas, "size_allocate",
-			  G_CALLBACK (set_canvas_size), NULL);
-	
-	gtk_container_add (GTK_CONTAINER (window), canvas);
-	gtk_widget_show_all (window);
-	gnome_canvas_item_new (
-		gnome_canvas_root (GNOME_CANVAS (canvas)),
-		e_table_header_item_get_type (),
-		"ETableHeader", e_table_header,
-		NULL);
-
-	item = gnome_canvas_item_new (
-		gnome_canvas_root (GNOME_CANVAS (canvas)),
-		e_table_item_get_type (),
-		"ETableHeader", e_table_header,
-		"ETableModel", e_table_model,
-		"drawgrid", TRUE,
-		"drawfocus", TRUE,
-#if 0
-		"spreadsheet", TRUE,
-#endif
-		"cursor_mode", E_TABLE_CURSOR_SIMPLE,
-		NULL);
-	e_canvas_item_move_absolute (item, 0, 30);
-}
-
diff --git a/widgets/table/test-cols.c b/widgets/table/test-cols.c
deleted file mode 100644
index e4873633e5..0000000000
--- a/widgets/table/test-cols.c
+++ /dev/null
@@ -1,265 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * test-cols.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Miguel de Icaza (miguel@gnu.org)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "gal/widgets/e-canvas-utils.h"
-#include "gal/widgets/e-canvas.h"
-#include "gal/widgets/e-cursors.h"
-#include "gal/util/e-util.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-cell-toggle.h"
-
-#include "table-test.h"
-
-#define LINES 4
-
-static struct {
-	int   value;
-	char *string;
-} my_table [LINES] = {
-	{ 0, "You are not" },
-	{ 1, "A beautiful and unique " },
-	{ 0, "Snowflake" },
-	{ 2, "You are not your wallet" },
-};
-/*
- * ETableSimple callbacks
- */
-static int
-col_count (ETableModel *etc, void *data)
-{
-	return 2;
-}
-
-static int
-row_count (ETableModel *etc, void *data)
-{
-	return LINES;
-}
-
-static void *
-value_at (ETableModel *etc, int col, int row, void *data)
-{
-	g_assert (col < 2);
-	g_assert (row < LINES);
-
-	if (col == 0)
-		return GINT_TO_POINTER (my_table [row].value);
-	else
-		return my_table [row].string;
-	
-}
-
-static void
-set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
-	g_assert (col < 2);
-	g_assert (row < LINES);
-
-	if (col == 0){
-		my_table [row].value = GPOINTER_TO_INT (val);
-		printf ("Value at %d,%d set to %d\n", col, row, GPOINTER_TO_INT (val));
-	} else {
-		my_table [row].string = g_strdup (val);
-		printf ("Value at %d,%d set to %s\n", col, row, (char *) val);
-	}
-}
-
-static gboolean
-is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
-	return TRUE;
-}
-
-static void *
-duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
-	if (col == 0){
-		return (void *)value;
-	} else {
-		return g_strdup (value);
-	}
-}
-
-static void
-free_value (ETableModel *etc, int col, void *value, void *data)
-{
-	if (col != 0){
-		g_free (value);
-	}
-}
-
-static void *
-initialize_value (ETableModel *etc, int col, void *data)
-{
-	if (col == 0)
-		return NULL;
-	else
-		return g_strdup ("");
-}
-
-static gboolean
-value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
-	if (col == 0)
-		return value == NULL;
-	else
-		return !(value && *(char *)value);
-}
-
-static char *
-value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
-	if (col == 0)
-		return g_strdup_printf("%d", (int) value);
-	else
-		return g_strdup(value);
-}
-
-static void
-set_canvas_size (GnomeCanvas *canvas, GtkAllocation *alloc)
-{
-	gnome_canvas_set_scroll_region (canvas, 0, 0, alloc->width, alloc->height);
-}
-
-void
-multi_cols_test (void)
-{
-	GtkWidget *canvas, *window;
-	ETableModel *e_table_model;
-	ETableHeader *e_table_header, *e_table_header_multiple;
-	ETableCol *col_0, *col_1;
-	ECell *cell_left_just, *cell_image_toggle;
-	GnomeCanvasItem *item;
-
-	gtk_widget_push_colormap (gdk_rgb_get_cmap ());
-	
-	e_table_model = e_table_simple_new (
-		col_count, row_count, value_at,
-		set_value_at, is_cell_editable,
-		duplicate_value, free_value,
-		initialize_value, value_is_empty,
-		value_to_string,
-		NULL);
-
-	/*
-	 * Header
-	 */
-	e_table_header = e_table_header_new ();
-
-	cell_left_just = e_cell_text_new (e_table_model, NULL, GTK_JUSTIFY_LEFT);
-
-	{
-		GdkPixbuf **images = g_new (GdkPixbuf *, 3);
-		int i;
-		
-		images [0] = gdk_pixbuf_new_from_file ("image1.png");
-		images [1] = gdk_pixbuf_new_from_file ("image2.png");
-		images [2] = gdk_pixbuf_new_from_file ("image3.png");
-
-		cell_image_toggle = e_cell_toggle_new (0, 3, images);
-
-		for (i = 0; i < 3; i++)
-			gdk_pixbuf_unref (images [i]);
-		
-		g_free (images);
-	} 
-					       
-	col_1 = e_table_col_new (1, "Item Name", 1.0, 20, cell_left_just, g_str_compare, TRUE);
-	e_table_header_add_column (e_table_header, col_1, 0);
-
-	col_0 = e_table_col_new (0, "A", 0.0, 48, cell_image_toggle, g_int_compare, TRUE);
-	e_table_header_add_column (e_table_header, col_0, 1);
-
-	/*
-	 * Second test
-	 */
-	e_table_header_multiple = e_table_header_new ();
-	e_table_header_add_column (e_table_header_multiple, col_0, 0);
-	e_table_header_add_column (e_table_header_multiple, col_1, 1);
-	e_table_header_add_column (e_table_header_multiple, col_1, 2);
-	
-	/*
-	 * GUI
-	 */
-	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-	canvas = e_canvas_new ();
-
-	g_signal_connect (canvas, "size_allocate",
-			  G_CALLBACK (set_canvas_size), NULL);
-	
-	gtk_container_add (GTK_CONTAINER (window), canvas);
-	gtk_widget_show_all (window);
-
-	gnome_canvas_item_new (
-		gnome_canvas_root (GNOME_CANVAS (canvas)),
-		e_table_header_item_get_type (),
-		"ETableHeader", e_table_header,
-		NULL);
-
-	item = gnome_canvas_item_new (
-		gnome_canvas_root (GNOME_CANVAS (canvas)),
-		e_table_item_get_type (),
-		"ETableHeader", e_table_header,
-		"ETableModel", e_table_model,
-		"drawgrid", TRUE,
-		"drawfocus", TRUE,
-		"cursor_mode", E_TABLE_CURSOR_SIMPLE,
-#if 0
-		"spreadsheet", TRUE,
-#endif
-		NULL);
-
-	e_canvas_item_move_absolute (item, 0, 30);
-	
-	gnome_canvas_item_new (
-		gnome_canvas_root (GNOME_CANVAS (canvas)),
-		e_table_header_item_get_type (),
-		"ETableHeader", e_table_header_multiple,
-		NULL);
-	item = gnome_canvas_item_new (
-		gnome_canvas_root (GNOME_CANVAS (canvas)),
-		e_table_item_get_type (),
-		"ETableHeader", e_table_header_multiple,
-		"ETableModel", e_table_model,
-		"drawgrid", TRUE,
-		"drawfocus", TRUE,
-#if 0
-		"spreadsheet", TRUE,
-#endif
-		"cursor_mode", E_TABLE_CURSOR_SIMPLE,
-		NULL);
-	e_canvas_item_move_absolute (item, 300, 30);
-}
-
-
-
-
-
diff --git a/widgets/table/test-table.c b/widgets/table/test-table.c
deleted file mode 100644
index b44b62bf42..0000000000
--- a/widgets/table/test-table.c
+++ /dev/null
@@ -1,478 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * test-table.c
- * Copyright 2000, 2001, Ximian, Inc.
- *
- * Authors:
- *   Miguel de Icaza (miguel@gnu.org)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License, version 2, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdio.h>
-#include <string.h>
-#include <gnome.h>
-#include "gal/widgets/e-cursors.h"
-#include "gal/widgets/e-canvas.h"
-#include "e-table-simple.h"
-#include "e-table-header.h"
-#include "e-table-header-item.h"
-#include "e-table-item.h"
-#include "e-cell-text.h"
-#include "e-table.h"
-#include "e-table-config.h"
-
-#include "table-test.h"
-
-
-
-char buffer [1024];
-char **column_labels;
-char ***table_data;
-int cols = 0;
-int lines = 0;
-int lines_alloc = 0;
-
-static void
-parse_headers (void)
-{
-	char *p, *s;
-	int in_value = 0, i;
-
-	fgets (buffer, sizeof (buffer)-1, stdin);
-
-	for (p = buffer; *p; p++){
-		if (*p == ' ' || *p == '\t'){
-			if (in_value){
-				cols++;
-				in_value = 0;
-			}
-		} else
-			in_value = 1;
-	}
-	if (in_value)
-		cols++;
-
-	if (!cols){
-		fprintf (stderr, "No columns in first row\n");
-		exit (1);
-	}
-
-	column_labels = g_new0 (char *, cols);
-
-	p = buffer;
-	for (i = 0; (s = strtok (p, " \t")) != NULL; i++){
-		column_labels [i] = g_strdup (s);
-		if (strchr (column_labels [i], '\n'))
-			*strchr (column_labels [i], '\n') = 0;
-		p = NULL;
-	}
-
-	printf ("%d headers:\n", cols);
-	for (i = 0; i < cols; i++){
-		printf ("header %d: %s\n", i, column_labels [i]);
-	}
-}
-
-static char **
-load_line (char *buffer, int cols)
-{
-	char **line = g_new0 (char *, cols);
-	char *p;
-	int i;
-
-	for (i = 0; i < cols; i++){
-		p = strtok (buffer, " \t\n");
-		if (p == NULL){
-			for (; i < cols; i++)
-				line [i] = g_strdup ("");
-			return line;
-		} else
-			line [i] = g_strdup (p);
-		buffer = NULL;
-	}
-	return line;
-}
-
-static void
-append_line (char **line)
-{
-	if (lines <= lines_alloc){
-		lines_alloc = lines + 50;
-		table_data = g_renew (char **, table_data, lines_alloc);
-	}
-	table_data [lines] = line;
-	lines++;
-}
-
-static void
-load_data (void)
-{
-	int i;
-
-	{
-		static int loaded;
-
-		if (loaded)
-			return;
-
-		loaded = TRUE;
-	}
-
-
-	parse_headers ();
-
-	while (fgets (buffer, sizeof (buffer)-1, stdin) != NULL){
-		char **line;
-
-		if (buffer [0] == '\n')
-			continue;
-		line = load_line (buffer, cols);
-		append_line (line);
-	}
-
-	for (i = 0; i < lines; i++){
-		int j;
-
-		printf ("Line %d: ", i);
-		for (j = 0; j < cols; j++)
-			printf ("[%s] ", table_data [i][j]);
-		printf ("\n");
-	}
-}
-
-/*
- * ETableSimple callbacks
- */
-static int
-col_count (ETableModel *etc, void *data)
-{
-	return cols;
-}
-
-static int
-row_count (ETableModel *etc, void *data)
-{
-	return lines;
-}
-
-static void
-append_row (ETableModel *etm, ETableModel *model, int row, void *data)
-{
-	abort ();
-}
-
-static void *
-value_at (ETableModel *etc, int col, int row, void *data)
-{
-	g_assert (col < cols);
-	g_assert (row < lines);
-
-	fprintf (stderr, "value_at[%d,%d]\n", col, row);
-
-	return (void *) table_data [row][col];
-}
-
-static void
-set_value_at (ETableModel *etc, int col, int row, const void *val, void *data)
-{
-	g_assert (col < cols);
-	g_assert (row < lines);
-
-	g_free (table_data [row][col]);
-	table_data [row][col] = g_strdup (val);
-
-	printf ("Value at %d,%d set to %s\n", col, row, (char *) val);
-}
-
-static gboolean
-is_cell_editable (ETableModel *etc, int col, int row, void *data)
-{
-	return TRUE;
-}
-
-static gboolean
-has_save_id (ETableModel *etm, void *data)
-{
-	return FALSE;
-}
-
-static char *
-get_save_id (ETableModel *etm, int row, void *data)
-{
-	abort ();
-}
-
-static void *
-duplicate_value (ETableModel *etc, int col, const void *value, void *data)
-{
-	return g_strdup (value);
-}
-
-static void
-free_value (ETableModel *etc, int col, void *value, void *data)
-{
-	g_free (value);
-}
-
-static void *
-initialize_value (ETableModel *etc, int col, void *data)
-{
-	return g_strdup ("");
-}
-
-static gboolean
-value_is_empty (ETableModel *etc, int col, const void *value, void *data)
-{
-	return !(value && *(char *)value);
-}
-
-static char *
-value_to_string (ETableModel *etc, int col, const void *value, void *data)
-{
-	return g_strdup(value);
-}
-
-#ifdef BIT_ROT
-static void
-set_canvas_size (GnomeCanvas *canvas, GtkAllocation *alloc)
-{
-	gnome_canvas_set_scroll_region (canvas, 0, 0, alloc->width, alloc->height);
-}
-
-void
-table_browser_test (void)
-{
-	GtkWidget *canvas, *window;
-	ETableModel *e_table_model;
-	ETableHeader *e_table_header;
-	ECell *cell_left_just;
-	GnomeCanvasItem *group;
-	int i;
-	int priority = 20;
-
-	load_data ();
-
-	/*
-	 * Data model
-	 */
-	e_table_model = e_table_simple_new (
-		col_count, row_count, append_row,
-
-		value_at, set_value_at, is_cell_editable,
-
-		has_save_id, get_save_id,
-
-		duplicate_value, free_value,
-		initialize_value, value_is_empty,
-		value_to_string,
-		NULL);
-
-	/*
-	 * Header
-	 */
-	e_table_header = e_table_header_new ();
-	cell_left_just = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
-
-	for (i = 0; i < cols; i++){
-		ETableCol *ecol = e_table_col_new (
-			i, column_labels [i],
-			1.0, 20, cell_left_just,
-			g_str_compare, TRUE,
-			priority);
-
-		e_table_header_add_column (e_table_header, ecol, i);
-	}
-
-	/*
-	 * Setup GUI
-	 */
-	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-	canvas = e_canvas_new ();
-
-	g_signal_connect (canvas, "size_allocate",
-			  G_CALLBACK (set_canvas_size), NULL);
-
-	gtk_container_add (GTK_CONTAINER (window), canvas);
-	gtk_widget_show_all (window);
-	gnome_canvas_item_new (
-		gnome_canvas_root (GNOME_CANVAS (canvas)),
-		e_table_header_item_get_type (),
-		"ETableHeader", e_table_header,
-		NULL);
-
-	group = gnome_canvas_item_new (
-		gnome_canvas_root (GNOME_CANVAS (canvas)),
-		gnome_canvas_group_get_type (),
-		"x", 30.0,
-		"y", 30.0,
-		NULL);
-
-	gnome_canvas_item_new (
-		GNOME_CANVAS_GROUP (group),
-		e_table_item_get_type (),
-		"ETableHeader", e_table_header,
-		"ETableModel", e_table_model,
-		"drawgrid", TRUE,
-		"drawfocus", TRUE,
-#if 0
-		"spreadsheet", TRUE,
-#endif
-		NULL);
-}
-#endif
-
-static void
-save_spec (GtkWidget *button, ETable *e_table)
-{
-#ifdef BIT_ROT
-	e_table_save_specification (e_table, "e-table-test.xml");
-#endif
-}
-
-#ifdef BIT_ROT
-static void
-row_selection_test (ETable *table, int row, gboolean selected)
-{
-	if (selected)
-		g_print ("Row %d selected\n", row);
-	else
-		g_print ("Row %d unselected\n", row);
-}
-#endif
-
-static void
-toggle_grid (void *nothing, ETable *etable)
-{
-	static gboolean shown;
-
-	g_object_get (etable, "drawgrid", &shown, NULL);
-	g_object_set (etable, "drawgrid", !shown, NULL);
-}
-
-static void
-do_e_table_demo (const char *state)
-{
-	GtkWidget *e_table, *window, *frame, *vbox, *button, *bhide;
-	ECell *cell_left_just;
-	ETableHeader *full_header;
-	int i;
-	GString *spec;
-
-	/*
-	 * Data model
-	 */
-	static ETableModel *e_table_model = NULL;
-
-	if (e_table_model == NULL)
-		e_table_model =
-			e_table_simple_new (col_count, row_count, append_row,
-					    value_at, set_value_at, is_cell_editable,
-					    has_save_id, get_save_id,
-					    duplicate_value, free_value,
-					    initialize_value, value_is_empty,
-					    value_to_string,
-					    NULL);
-
-	full_header = e_table_header_new ();
-	cell_left_just = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
-
-	spec = g_string_new ("\
-<ETableSpecification \
-cursor-mode=\"line\" \
-selection-mode=\"browse\" \
-draw-focus=\"true\">");
-	for (i = 0; i < cols; i++) {
-		char *colspec =
-			g_strdup_printf ("\
-  <ETableColumn model_col=\"%d\" \
-_title=\"%s\" \
-minimum_width=\"20\" \
-resizable=\"true\" \
-cell=\"string\" \
-compare=\"string\"/>\n", i, column_labels[i]);
-		g_string_append (spec, colspec);
-		g_free (colspec);
-	}
-	g_string_append (spec, "</ETableSpecification>");
-	e_table = e_table_new (e_table_model, NULL, spec->str, state);
-
-	/* This makes value_at not called just to determine row height.  */
-	g_object_set (e_table,
-		      "uniform_row_height", 1,
-		      NULL);
-
-	g_string_free (spec, TRUE);
-
-	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-	frame = gtk_frame_new (NULL);
-#ifdef BIT_ROT
-	g_signal_connect (e_table, "row_selection",
-			  G_CALLBACK(row_selection_test), NULL);
-#endif
-
-	vbox = gtk_vbox_new (FALSE, 0);
-	gtk_box_pack_start (GTK_BOX (vbox), e_table, TRUE, TRUE, 0);
-	gtk_container_add (GTK_CONTAINER (frame), vbox);
-	gtk_container_add (GTK_CONTAINER (window), frame);
-
-#if 0
-	/*
-	 * gadgets
-	 */
-	button = gtk_button_new_with_label ("Save spec");
-	g_signal_connect (button, "clicked",
-			  G_CALLBACK (save_spec), e_table);
-	gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
-
-	bhide = gtk_button_new_with_label ("Toggle Grid");
-	g_signal_connect (bhide, "clicked",
-			  G_CALLBACk (toggle_grid), e_table);
-	gtk_box_pack_start (GTK_BOX (vbox), bhide, FALSE, FALSE, 0);
-#endif
-
-	gtk_widget_set_usize (window, 400, 200);
-	gtk_widget_show_all (window);
-
-#ifdef BIT_ROT
-	if (getenv ("TEST")){
-		e_table_do_gui_config (NULL, E_TABLE(e_table));
-	}
-#endif
-}
-
-void
-e_table_test (void)
-{
-	load_data ();
-
-	if (1){/*getenv ("DO")){*/
-	  do_e_table_demo ("\
-<ETableState>\n\
-    <column source=\"0\"/>\n\
-    <column source=\"1\"/>\n\
-    <column source=\"2\"/>\n\
-    <column source=\"3\"/>\n\
-    <column source=\"4\"/>\n\
-    <grouping></grouping>\n\
-</ETableState>");
-#if 0
-	  do_e_table_demo ("<ETableSpecification> <columns-shown> <column> 0 </column> <column> 0 </column> <column> 1 </column> <column> 2 </column> <column> 3 </column> <column> 4 </column> </columns-shown> <grouping> <group column=\"3\" ascending=\"true\"> <group column=\"4\" ascending=\"false\"> <leaf column=\"2\" ascending=\"true\"/> </group> </group> </grouping> </ETableSpecification>");
-	  do_e_table_demo ("<ETableSpecification> <columns-shown> <column> 0 </column> <column> 1 </column> <column> 2 </column> <column> 3 </column> <column> 4 </column> </columns-shown> <grouping> <group column=\"4\" ascending=\"true\"> <leaf column=\"2\" ascending=\"true\"/> </group> </grouping> </ETableSpecification>");
-	  do_e_table_demo ("<ETableSpecification> <columns-shown> <column> 0 </column> <column> 1 </column> <column> 2 </column> <column> 3 </column> <column> 4 </column> </columns-shown> <grouping> <group column=\"3\" ascending=\"true\"> <leaf column=\"2\" ascending=\"true\"/> </group> </grouping> </ETableSpecification>");
-#endif
-	}
-}
diff --git a/widgets/table/tree-expanded.xpm b/widgets/table/tree-expanded.xpm
deleted file mode 100644
index d9bda3694d..0000000000
--- a/widgets/table/tree-expanded.xpm
+++ /dev/null
@@ -1,23 +0,0 @@
-/* XPM */
-static char * tree_expanded_xpm[] = {
-"16 16 4 1",
-" 	c None",
-".	c #FFFFFF",
-"*      c #000000",
-"+	c #666666",
-"                ",
-"                ",
-"                ",
-"                ",
-"    +++++++++   ",
-"    +.......+   ",
-"    +.......+   ",
-"    +.......+   ",
-"    +.*****.+   ",
-"    +.......+   ",
-"    +.......+   ",
-"    +.......+   ",
-"    +++++++++   ",
-"                ",
-"                ",
-"                "};
diff --git a/widgets/table/tree-unexpanded.xpm b/widgets/table/tree-unexpanded.xpm
deleted file mode 100644
index e1b48448ba..0000000000
--- a/widgets/table/tree-unexpanded.xpm
+++ /dev/null
@@ -1,23 +0,0 @@
-/* XPM */
-static char * tree_unexpanded_xpm[] = {
-"16 16 4 1",
-" 	c None",
-".	c #FFFFFF",
-"*      c #000000",
-"+	c #666666",
-"                ",
-"                ",
-"                ",
-"                ",
-"    +++++++++   ",
-"    +.......+   ",
-"    +...*...+   ",
-"    +...*...+   ",
-"    +.*****.+   ",
-"    +...*...+   ",
-"    +...*...+   ",
-"    +.......+   ",
-"    +++++++++   ",
-"                ",
-"                ",
-"                "};
-- 
cgit