fix bug 4239, 'Preferences: Text Options Header Display modal is not modal' (sic)
[claws.git] / src / prefs_summary_column.c
index 61d6801ae75884fde7bf6f7673d678f677734646..11ac67df5190dfa0c2db6ec19b4c09d636b820d7 100644 (file)
@@ -1,10 +1,10 @@
 /*
- * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2005 Hiroyuki Yamamoto
+ * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2017 Hiroyuki Yamamoto and the Claws Mail team
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #ifdef HAVE_CONFIG_H
 #  include "config.h"
+#include "claws-features.h"
 #endif
 
 #include "defs.h"
 
 #include <glib.h>
 #include <glib/gi18n.h>
-#include <gtk/gtkmain.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtkhbox.h>
-#include <gtk/gtkbutton.h>
+#include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 
 #include "prefs_gtk.h"
@@ -42,6 +38,8 @@
 #include "gtkutils.h"
 #include "utils.h"
 
+static void prefs_summary_column_set_config(SummaryColumnState *state);
+
 enum {
        SUMCOL_NAME,
        SUMCOL_TYPE,
@@ -81,11 +79,13 @@ static const gchar *const col_name[N_SUMMARY_COLS] = {
        N_("Attachment"),       /* S_COL_MIME    */
        N_("Subject"),          /* S_COL_SUBJECT */
        N_("From"),             /* S_COL_FROM    */
+       N_("To"),               /* S_COL_TO      */
        N_("Date"),             /* S_COL_DATE    */
        N_("Size"),             /* S_COL_SIZE    */
        N_("Number"),           /* S_COL_NUMBER  */
-        N_("Score"),           /* S_COL_SCORE   */
+       N_("Score"),            /* S_COL_SCORE   */
        N_("Locked"),           /* S_COL_LOCKED  */
+       N_("Tags"),             /* S_COL_TAGS  */
 };
 
 static SummaryColumnState default_state[N_SUMMARY_COLS] = {
@@ -94,11 +94,13 @@ static SummaryColumnState default_state[N_SUMMARY_COLS] = {
        { S_COL_MIME   , TRUE  },
        { S_COL_SUBJECT, TRUE  },
        { S_COL_FROM   , TRUE  },
+       { S_COL_TO     , FALSE },
        { S_COL_DATE   , TRUE  },
        { S_COL_SIZE   , TRUE  },
        { S_COL_NUMBER , FALSE },
-        { S_COL_SCORE  , FALSE },
-       { S_COL_LOCKED , FALSE  },
+       { S_COL_SCORE  , FALSE },
+       { S_COL_LOCKED , FALSE },
+       { S_COL_TAGS   , FALSE },
 };
 
 static void prefs_summary_column_create        (void);
@@ -127,7 +129,7 @@ static gboolean prefs_summary_column_key_pressed(GtkWidget  *widget,
 
 static GtkListStore *prefs_summary_column_create_store (void);
 
-static gint prefs_summary_column_insert_column (GtkListStore *store,
+static void prefs_summary_column_insert_column (GtkListStore *store,
                                                 gint row,
                                                 const gchar *name,
                                                 SummaryColumnType type);
@@ -155,6 +157,12 @@ static void drag_data_received     (GtkTreeView *tree_view,
                                 guint time, 
                                 GtkTreeModel *model);
 
+static void prefs_summary_column_shown_set_btn_sensitivity(void);
+static void prefs_summary_column_shown_set_active(const gboolean active);
+static void prefs_summary_column_stock_set_active(const gboolean active);
+static void prefs_summary_column_shown_sel_changed(void);
+static void prefs_summary_column_stock_sel_changed(void);
+
 void prefs_summary_column_open(void)
 {
        inc_lock();
@@ -168,13 +176,14 @@ void prefs_summary_column_open(void)
        prefs_summary_column_set_dialog(NULL);
 
        gtk_widget_show(summary_col.window);
+       gtk_window_set_modal(GTK_WINDOW(summary_col.window), TRUE);
 
        summary_col.finished = FALSE;
        while (summary_col.finished == FALSE)
                gtk_main_iteration();
 
        gtk_widget_hide(summary_col.window);
-
+       gtk_window_set_modal(GTK_WINDOW(summary_col.window), FALSE);
        inc_unlock();
 }
 
@@ -195,7 +204,6 @@ static void prefs_summary_column_create(void)
        GtkWidget *shown_list_view;
 
        GtkWidget *btn_vbox;
-       GtkWidget *btn_vbox1;
        GtkWidget *add_btn;
        GtkWidget *remove_btn;
        GtkWidget *up_btn;
@@ -209,13 +217,13 @@ static void prefs_summary_column_create(void)
 
        debug_print("Creating summary column setting window...\n");
 
-       window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+       window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "prefs_summary_column");
        gtk_container_set_border_width(GTK_CONTAINER(window), 8);
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
-       gtk_window_set_modal(GTK_WINDOW(window), TRUE);
        gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
+       gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG);
        gtk_window_set_title(GTK_WINDOW(window),
-                            _("Displayed items configuration"));
+                            _("Message list columns configuration"));
        g_signal_connect(G_OBJECT(window), "delete_event",
                         G_CALLBACK(prefs_summary_column_delete_event),
                         NULL);
@@ -232,7 +240,7 @@ static void prefs_summary_column_create(void)
        gtk_box_pack_start(GTK_BOX(vbox), label_hbox, FALSE, FALSE, 4);
 
        label = gtk_label_new
-               (_("Select items to be displayed in the summary view. You can modify\n"
+               (_("Select columns to be displayed in the message list. You can modify\n"
                   "the order by using the Up / Down buttons or by dragging the items."));
        gtk_widget_show(label);
        gtk_box_pack_start(GTK_BOX(label_hbox), label, FALSE, FALSE, 4);
@@ -258,32 +266,33 @@ static void prefs_summary_column_create(void)
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
                                       GTK_POLICY_AUTOMATIC,
                                       GTK_POLICY_AUTOMATIC);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin),
+                                          GTK_SHADOW_IN);
 
-                                      
        stock_list_view = prefs_summary_column_list_view_create
-                               (_("Available items"));
+                               (_("Hidden columns"));
+       g_signal_connect(G_OBJECT(stock_list_view), "cursor-changed",
+                          G_CALLBACK(prefs_summary_column_stock_sel_changed),
+                          NULL);
        gtk_widget_show(stock_list_view);
        gtk_container_add(GTK_CONTAINER(scrolledwin), stock_list_view);
 
        /* add/remove button */
-       btn_vbox = gtk_vbox_new(FALSE, 0);
+       btn_vbox = gtk_vbox_new(FALSE, 8);
        gtk_widget_show(btn_vbox);
        gtk_box_pack_start(GTK_BOX(hbox1), btn_vbox, FALSE, FALSE, 0);
 
-       btn_vbox1 = gtk_vbox_new(FALSE, 8);
-       gtk_widget_show(btn_vbox1);
-       gtk_box_pack_start(GTK_BOX(btn_vbox), btn_vbox1, TRUE, FALSE, 0);
-
-       add_btn = gtk_button_new_with_label(_("  ->  "));
+       add_btn = gtk_button_new_from_stock(GTK_STOCK_ADD);
        gtk_widget_show(add_btn);
-       gtk_box_pack_start(GTK_BOX(btn_vbox1), add_btn, FALSE, FALSE, 0);
-
-       remove_btn = gtk_button_new_with_label(_("  <-  "));
-       gtk_widget_show(remove_btn);
-       gtk_box_pack_start(GTK_BOX(btn_vbox1), remove_btn, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(btn_vbox), add_btn, FALSE, TRUE, 0);
 
        g_signal_connect(G_OBJECT(add_btn), "clicked",
                         G_CALLBACK(prefs_summary_column_add), NULL);
+
+       remove_btn = gtk_button_new_from_stock(GTK_STOCK_REMOVE);
+       gtk_widget_show(remove_btn);
+       gtk_box_pack_start(GTK_BOX(btn_vbox), remove_btn, FALSE, TRUE, 0);
+
        g_signal_connect(G_OBJECT(remove_btn), "clicked",
                         G_CALLBACK(prefs_summary_column_remove), NULL);
 
@@ -298,28 +307,29 @@ static void prefs_summary_column_create(void)
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
                                       GTK_POLICY_AUTOMATIC,
                                       GTK_POLICY_AUTOMATIC);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin),
+                                          GTK_SHADOW_IN);
 
        shown_list_view = prefs_summary_column_list_view_create
-                               (_("Displayed items"));
+                               (_("Displayed columns"));
+       g_signal_connect(G_OBJECT(shown_list_view), "cursor-changed",
+                          G_CALLBACK(prefs_summary_column_shown_sel_changed),
+                          NULL);
        gtk_widget_show(shown_list_view);
        gtk_container_add(GTK_CONTAINER(scrolledwin), shown_list_view);
 
        /* up/down button */
-       btn_vbox = gtk_vbox_new(FALSE, 0);
+       btn_vbox = gtk_vbox_new(FALSE, 8);
        gtk_widget_show(btn_vbox);
        gtk_box_pack_start(GTK_BOX(hbox1), btn_vbox, FALSE, FALSE, 0);
 
-       btn_vbox1 = gtk_vbox_new(FALSE, 8);
-       gtk_widget_show(btn_vbox1);
-       gtk_box_pack_start(GTK_BOX(btn_vbox), btn_vbox1, TRUE, FALSE, 0);
-
        up_btn = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
        gtk_widget_show(up_btn);
-       gtk_box_pack_start(GTK_BOX(btn_vbox1), up_btn, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(btn_vbox), up_btn, FALSE, TRUE, 0);
 
        down_btn = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
        gtk_widget_show(down_btn);
-       gtk_box_pack_start(GTK_BOX(btn_vbox1), down_btn, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(btn_vbox), down_btn, FALSE, TRUE, 0);
 
        g_signal_connect(G_OBJECT(up_btn), "clicked",
                         G_CALLBACK(prefs_summary_column_up), NULL);
@@ -341,8 +351,9 @@ static void prefs_summary_column_create(void)
                         G_CALLBACK(prefs_summary_column_set_to_default),
                         NULL);
 
-       gtkut_stock_button_set_create(&confirm_area, &ok_btn, GTK_STOCK_OK,
+       gtkut_stock_button_set_create(&confirm_area,
                                      &cancel_btn, GTK_STOCK_CANCEL,
+                                     &ok_btn, GTK_STOCK_OK,
                                      NULL, NULL);
        gtk_widget_show(confirm_area);
        gtk_box_pack_end(GTK_BOX(btn_hbox), confirm_area, FALSE, FALSE, 0);
@@ -363,6 +374,9 @@ static void prefs_summary_column_create(void)
        summary_col.cancel_btn  = cancel_btn;
        summary_col.stock_list_view = stock_list_view;
        summary_col.shown_list_view = shown_list_view;
+       
+       prefs_summary_column_shown_set_active(FALSE);
+       prefs_summary_column_stock_set_active(FALSE);
 }
 
 SummaryColumnState *prefs_summary_column_get_config(void)
@@ -378,7 +392,7 @@ SummaryColumnState *prefs_summary_column_get_config(void)
                pos = prefs_common.summary_col_pos[type];
                if (pos < 0 || pos >= N_SUMMARY_COLS ||
                    state[pos].type != -1) {
-                       g_warning("Wrong column position\n");
+                       g_warning("Wrong column position");
                        prefs_summary_column_set_config(default_state);
                        return default_state;
                }
@@ -390,7 +404,7 @@ SummaryColumnState *prefs_summary_column_get_config(void)
        return state;
 }
 
-void prefs_summary_column_set_config(SummaryColumnState *state)
+static void prefs_summary_column_set_config(SummaryColumnState *state)
 {
        SummaryColumnType type;
        gint pos;
@@ -421,7 +435,6 @@ static void prefs_summary_column_set_dialog(SummaryColumnState *state)
                state = prefs_summary_column_get_config();
 
        for (pos = 0; pos < N_SUMMARY_COLS; pos++) {
-               gint row;
                type = state[pos].type;
                name = gettext(col_name[type]);
 
@@ -450,7 +463,7 @@ static void prefs_summary_column_set_view(void)
                (gtk_tree_view_get_model(GTK_TREE_VIEW
                        (summary_col.shown_list_view)), NULL);
 
-       g_return_if_fail
+       cm_return_if_fail
                (stock_n_rows + shown_n_rows == N_SUMMARY_COLS);
 
        for (row = 0; row < stock_n_rows; row++) {
@@ -517,6 +530,8 @@ static void prefs_summary_column_add(void)
        gtk_tree_selection_select_iter(gtk_tree_view_get_selection
                (GTK_TREE_VIEW(summary_col.shown_list_view)),
                 &shown_add);
+       prefs_summary_column_shown_set_active(TRUE);
+       prefs_summary_column_stock_set_active(FALSE);
 }
 
 static void prefs_summary_column_remove(void)
@@ -564,6 +579,8 @@ static void prefs_summary_column_remove(void)
        gtk_tree_selection_select_iter(gtk_tree_view_get_selection
                (GTK_TREE_VIEW(summary_col.stock_list_view)),
                &stock_add);
+       prefs_summary_column_shown_set_active(FALSE);
+       prefs_summary_column_stock_set_active(TRUE);
 }
 
 static void prefs_summary_column_up(void)
@@ -601,6 +618,7 @@ static void prefs_summary_column_up(void)
        gtk_tree_path_free(prev);
 
        gtk_list_store_swap(shown_store, &iprev, &isel);
+       prefs_summary_column_shown_set_btn_sensitivity();
 }
 
 static void prefs_summary_column_down(void)
@@ -623,11 +641,14 @@ static void prefs_summary_column_down(void)
                return;
 
        gtk_list_store_swap(shown_store, &next, &sel);
+       prefs_summary_column_shown_set_btn_sensitivity();
 }
 
 static void prefs_summary_column_set_to_default(void)
 {
        prefs_summary_column_set_dialog(default_state);
+       prefs_summary_column_shown_set_active(FALSE);
+       prefs_summary_column_stock_set_active(FALSE);
 }
 
 static void prefs_summary_column_ok(void)
@@ -655,7 +676,7 @@ static gboolean prefs_summary_column_key_pressed(GtkWidget *widget,
                                                 GdkEventKey *event,
                                                 gpointer data)
 {
-       if (event && event->keyval == GDK_Escape)
+       if (event && event->keyval == GDK_KEY_Escape)
                summary_col.finished = TRUE;
        return FALSE;
 }
@@ -668,7 +689,7 @@ static GtkListStore *prefs_summary_column_create_store(void)
                                  -1);
 }
 
-static gint prefs_summary_column_insert_column(GtkListStore *store,
+static void prefs_summary_column_insert_column(GtkListStore *store,
                                               gint row,
                                               const gchar *name,
                                               SummaryColumnType type)
@@ -687,8 +708,7 @@ static gint prefs_summary_column_insert_column(GtkListStore *store,
                                   SUMCOL_NAME, name,
                                   SUMCOL_TYPE, type,
                                   -1);
-               return -1 + gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store),
-                                                          NULL);
+               return;
        } else {
                /* change existing */
                gtk_list_store_set(store, &iter, 
@@ -729,7 +749,7 @@ static GtkWidget *prefs_summary_column_list_view_create(const gchar *name)
        g_object_unref(G_OBJECT(model));
        
        gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(list_view),
-                                    prefs_common.enable_rules_hint);
+                                    prefs_common.use_stripes_everywhere);
        
        selector = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
        gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE);
@@ -774,7 +794,6 @@ static void drag_data_get(GtkTreeView *tree_view, GdkDragContext *context,
                          GtkSelectionData *data, guint info, 
                          guint time, GtkTreeModel *model)
 {
-       GtkWidget *source;
        GtkTreeIter iter;
        SummaryColumnType type;
        GtkTreeModel *source_model;
@@ -792,7 +811,8 @@ static void drag_data_get(GtkTreeView *tree_view, GdkDragContext *context,
                           -1);
 
        /* send the type */
-       gtk_selection_data_set(data, data->target, 8, (gchar *) &type, sizeof type);
+       gtk_selection_data_set(data, gtk_selection_data_get_target(data), 8,
+               (gchar *) &type, sizeof type);
 }
 
 static void drag_data_received(GtkTreeView *tree_view, GdkDragContext *context,
@@ -803,52 +823,51 @@ static void drag_data_received(GtkTreeView *tree_view, GdkDragContext *context,
        GtkTreePath *dst = NULL, *sel = NULL;
        GtkTreeIter isel, idst;
        GtkTreeViewDropPosition pos;
-       gboolean before;
        SummaryColumnType type;
        GtkTreeModel *sel_model;
        gchar *name;
-       
+
        source = gtk_drag_get_source_widget(context);
-       
+
        if (source == GTK_WIDGET(tree_view)) {
        
                /*
                 * Same widget: re-order
                 */
-                
-               gtk_tree_selection_get_selected(gtk_tree_view_get_selection(tree_view),
-                                          NULL, &isel);
-               sel = gtk_tree_model_get_path(model, &isel);
-               gtk_tree_view_get_dest_row_at_pos(tree_view, x, y,
-                                                 &dst, &pos);
-
-               /* NOTE: dst is invalid if selection beyond last row, in that
-                * case move beyond last one (XXX_move_before(..., NULL)) */                                              
-
-               if (dst)                                                  
-                       gtk_tree_model_get_iter(model, &idst, dst);
-               else 
-                       gtk_list_store_move_before(GTK_LIST_STORE(model),
-                                                  &isel,
-                                                  NULL);
-
-               /* we do not drag if no valid dst and sel, and when
-                * dst and sel are the same (moving after or before
-                * itself doesn't change order...) */
-               if ((dst && sel) && gtk_tree_path_compare(sel, dst) != 0) {
-                       if (pos == GTK_TREE_VIEW_DROP_BEFORE
-                       ||  pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE)
+
+               if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(tree_view),
+                                          NULL, &isel)) {
+                       sel = gtk_tree_model_get_path(model, &isel);
+                       gtk_tree_view_get_dest_row_at_pos(tree_view, x, y,
+                                                         &dst, &pos);
+
+                       /* NOTE: dst is invalid if selection beyond last row, in that
+                        * case move beyond last one (XXX_move_before(..., NULL)) */
+
+                       if (dst)
+                               gtk_tree_model_get_iter(model, &idst, dst);
+                       else 
                                gtk_list_store_move_before(GTK_LIST_STORE(model),
                                                           &isel,
-                                                          &idst);
-                       else
-                               gtk_list_store_move_after(GTK_LIST_STORE(model),
-                                                         &isel,
-                                                         &idst);
-                       
-               } 
-               gtk_tree_path_free(dst);                                          
-               gtk_tree_path_free(sel);
+                                                          NULL);
+
+                       /* we do not drag if no valid dst and sel, and when
+                        * dst and sel are the same (moving after or before
+                        * itself doesn't change order...) */
+                       if ((dst && sel) && gtk_tree_path_compare(sel, dst) != 0) {
+                               if (pos == GTK_TREE_VIEW_DROP_BEFORE
+                               ||  pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE)
+                                       gtk_list_store_move_before(GTK_LIST_STORE(model),
+                                                                  &isel,
+                                                                  &idst);
+                               else
+                                       gtk_list_store_move_after(GTK_LIST_STORE(model),
+                                                                 &isel,
+                                                                 &idst);
+                       } 
+                       gtk_tree_path_free(dst);
+                       gtk_tree_path_free(sel);
+               }
                gtk_drag_finish(context, TRUE, FALSE, time);
                
        } else if (source == summary_col.stock_list_view 
@@ -858,44 +877,121 @@ static void drag_data_received(GtkTreeView *tree_view, GdkDragContext *context,
                 * Other widget: change and update
                 */
 
-               
                /* get source information and remove */
-               gtk_tree_selection_get_selected(gtk_tree_view_get_selection(
+               if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(
                                                GTK_TREE_VIEW(source)),
-                                               &sel_model, &isel);
-               type = *((gint *) data->data);
-               name = gettext(col_name[type]);
-               gtk_list_store_remove(GTK_LIST_STORE(sel_model), &isel);
-
-               /* get insertion position */
-               gtk_tree_view_get_dest_row_at_pos(tree_view, x, y, &dst, &pos);
-
-               /* NOTE: dst is invalid if insertion point beyond last row, 
-                * just append to list in that case (XXX_store_append()) */
-
-               if (dst) {
-                       gtk_tree_model_get_iter(model, &idst, dst);
-
-                       if (pos == GTK_TREE_VIEW_DROP_BEFORE
-                       ||  pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE)
-                               gtk_list_store_insert_before(GTK_LIST_STORE(model),
-                                                            &isel,
-                                                            &idst);
-                       else
-                               gtk_list_store_insert_after(GTK_LIST_STORE(model),
-                                                           &isel,
-                                                           &idst);
-               } else
-                       gtk_list_store_append(GTK_LIST_STORE(model),
-                                             &isel);
-               
-               gtk_list_store_set(GTK_LIST_STORE(model), &isel,
-                                  SUMCOL_NAME, name,
-                                  SUMCOL_TYPE, type, -1);
-               gtk_tree_path_free(dst);
+                                               &sel_model, &isel)) {
+                       type = *((gint *) gtk_selection_data_get_data(data));
+                       name = gettext(col_name[type]);
+                       gtk_list_store_remove(GTK_LIST_STORE(sel_model), &isel);
+
+                       /* get insertion position */
+                       gtk_tree_view_get_dest_row_at_pos(tree_view, x, y, &dst, &pos);
+
+                       /* NOTE: dst is invalid if insertion point beyond last row, 
+                        * just append to list in that case (XXX_store_append()) */
+
+                       if (dst) {
+                               gtk_tree_model_get_iter(model, &idst, dst);
+
+                               if (pos == GTK_TREE_VIEW_DROP_BEFORE
+                               ||  pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE)
+                                       gtk_list_store_insert_before(GTK_LIST_STORE(model),
+                                                                    &isel,
+                                                                    &idst);
+                               else
+                                       gtk_list_store_insert_after(GTK_LIST_STORE(model),
+                                                                   &isel,
+                                                                   &idst);
+                       } else
+                               gtk_list_store_append(GTK_LIST_STORE(model),
+                                                     &isel);
+
+                       gtk_list_store_set(GTK_LIST_STORE(model), &isel,
+                                          SUMCOL_NAME, name,
+                                          SUMCOL_TYPE, type, -1);
+                       gtk_tree_path_free(dst);
+               }
                gtk_drag_finish(context, TRUE, FALSE, time);
        }
 
+       prefs_summary_column_shown_set_active(FALSE);
+       prefs_summary_column_stock_set_active(FALSE);
+       
        /* XXXX: should we call gtk_drag_finish() for other code paths? */
 }
 
+static void prefs_summary_column_shown_set_btn_sensitivity(void)
+{
+       GtkTreeModel *model = GTK_TREE_MODEL(gtk_tree_view_get_model(
+               GTK_TREE_VIEW(summary_col.shown_list_view)));
+       GtkTreeSelection *selection = gtk_tree_view_get_selection(
+               GTK_TREE_VIEW(summary_col.shown_list_view));
+       GtkTreeIter iter;
+       GtkTreePath *path;
+       
+       if(!gtk_tree_selection_get_selected(selection, NULL, &iter)) {
+               gtk_widget_set_sensitive(summary_col.remove_btn, FALSE);
+               gtk_widget_set_sensitive(summary_col.up_btn, FALSE);
+               gtk_widget_set_sensitive(summary_col.down_btn, FALSE);
+               return;
+       }
+       
+       path = gtk_tree_model_get_path(model, &iter);
+
+       gtk_widget_set_sensitive(summary_col.up_btn, gtk_tree_path_prev(path));
+       gtk_widget_set_sensitive(summary_col.down_btn,
+                                gtk_tree_model_iter_next(model, &iter));
+       gtk_tree_path_free(path);
+}
+
+static void prefs_summary_column_shown_set_active(const gboolean active)
+{
+       GtkTreeSelection *selection = NULL;
+       
+       gtk_widget_set_sensitive(summary_col.remove_btn, active);
+       
+       if(active == FALSE) {
+               selection = gtk_tree_view_get_selection(
+                       GTK_TREE_VIEW(summary_col.shown_list_view));
+               gtk_tree_selection_unselect_all(selection);
+               
+               gtk_widget_set_sensitive(summary_col.up_btn, FALSE);
+               gtk_widget_set_sensitive(summary_col.down_btn, FALSE);
+       } else {
+               prefs_summary_column_shown_set_btn_sensitivity();
+       }
+}
+
+static void prefs_summary_column_stock_set_active(const gboolean active)
+{
+       GtkTreeSelection *selection = NULL;
+       
+       gtk_widget_set_sensitive(summary_col.add_btn, active);
+       
+       if(active == FALSE) {
+               selection = gtk_tree_view_get_selection(
+                       GTK_TREE_VIEW(summary_col.stock_list_view));
+               gtk_tree_selection_unselect_all(selection);
+       }
+}
+
+static void prefs_summary_column_stock_sel_changed(void)
+{
+       GtkTreeSelection *selection = gtk_tree_view_get_selection(
+               GTK_TREE_VIEW(summary_col.stock_list_view));
+       prefs_summary_column_stock_set_active(
+               (selection != NULL) ? TRUE : FALSE);
+       prefs_summary_column_shown_set_active(
+               (selection != NULL) ? FALSE : TRUE);
+}
+
+static void prefs_summary_column_shown_sel_changed(void)
+{
+       GtkTreeSelection *selection = gtk_tree_view_get_selection(
+               GTK_TREE_VIEW(summary_col.shown_list_view));
+       prefs_summary_column_shown_set_active(
+               (selection != NULL) ? TRUE : FALSE);
+       prefs_summary_column_stock_set_active(
+               (selection != NULL) ? FALSE : TRUE);
+}