2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2011 Hiroyuki Yamamoto & the Claws Mail team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
27 #include <glib/gi18n.h>
29 #include <gdk/gdkkeysyms.h>
31 #include "prefs_gtk.h"
32 #include "prefs_common.h"
33 #include "prefs_folder_column.h"
34 #include "manage_window.h"
35 #include "folderview.h"
36 #include "mainwindow.h"
41 static void prefs_folder_column_set_config(FolderColumnState *state);
49 #define TARGET_INFO_SUMCOL (0xFEEDBABE)
51 static const GtkTargetEntry row_targets[] = {
52 { "PREFS_SUM_COL_MODEL_ROW", GTK_TARGET_SAME_APP, TARGET_INFO_SUMCOL }
56 static struct _FolderColumnDialog
60 GtkWidget *stock_list_view;
61 GtkWidget *shown_list_view;
64 GtkWidget *remove_btn;
68 GtkWidget *default_btn;
71 GtkWidget *cancel_btn;
76 static const gchar *const col_name[N_FOLDER_COLS] = {
77 N_("Folder"), /* F_COL_FOLDER */
78 N_("New"), /* F_COL_NEW */
79 N_("Unread"), /* F_COL_UNREAD */
80 N_("Total"), /* F_COL_TOTAL */
83 static FolderColumnState default_state[N_FOLDER_COLS] = {
84 { F_COL_FOLDER , TRUE },
86 { F_COL_UNREAD , TRUE },
87 { F_COL_TOTAL , TRUE },
90 static void prefs_folder_column_create (void);
92 static void prefs_folder_column_set_dialog (FolderColumnState *state);
93 static void prefs_folder_column_set_view (void);
95 /* callback functions */
96 static void prefs_folder_column_add (void);
97 static void prefs_folder_column_remove (void);
99 static void prefs_folder_column_up (void);
100 static void prefs_folder_column_down (void);
102 static void prefs_folder_column_set_to_default (void);
104 static void prefs_folder_column_ok (void);
105 static void prefs_folder_column_cancel (void);
107 static gint prefs_folder_column_delete_event (GtkWidget *widget,
110 static gboolean prefs_folder_column_key_pressed(GtkWidget *widget,
114 static GtkListStore *prefs_folder_column_create_store (void);
116 static void prefs_folder_column_insert_column (GtkListStore *store,
119 FolderColumnType type);
121 static FolderColumnType prefs_folder_column_get_column (GtkWidget *list,
124 static GtkWidget *prefs_folder_column_list_view_create (const gchar *name);
126 static void prefs_filtering_create_list_view_columns (GtkWidget *list_view,
129 static void drag_data_get (GtkTreeView *tree_view,
130 GdkDragContext *context,
131 GtkSelectionData *data,
134 GtkTreeModel *model);
136 static void drag_data_received (GtkTreeView *tree_view,
137 GdkDragContext *context,
139 GtkSelectionData *data,
142 GtkTreeModel *model);
144 static void prefs_folder_column_shown_set_btn_sensitivity(void);
145 static void prefs_folder_column_shown_set_active(const gboolean active);
146 static void prefs_folder_column_stock_set_active(const gboolean active);
147 static void prefs_folder_column_shown_sel_changed(void);
148 static void prefs_folder_column_stock_sel_changed(void);
151 void prefs_folder_column_open(void)
155 if (!folder_col.window)
156 prefs_folder_column_create();
158 manage_window_set_transient(GTK_WINDOW(folder_col.window));
159 gtk_widget_grab_focus(folder_col.ok_btn);
161 prefs_folder_column_set_dialog(NULL);
163 gtk_widget_show(folder_col.window);
164 gtk_window_set_modal(GTK_WINDOW(folder_col.window), TRUE);
166 folder_col.finished = FALSE;
167 while (folder_col.finished == FALSE)
168 gtk_main_iteration();
170 gtk_widget_hide(folder_col.window);
171 gtk_window_set_modal(GTK_WINDOW(folder_col.window), FALSE);
176 static void prefs_folder_column_create(void)
181 GtkWidget *label_hbox;
187 GtkWidget *clist_hbox;
188 GtkWidget *scrolledwin;
189 GtkWidget *stock_list_view;
190 GtkWidget *shown_list_view;
194 GtkWidget *remove_btn;
199 GtkWidget *default_btn;
200 GtkWidget *confirm_area;
202 GtkWidget *cancel_btn;
204 debug_print("Creating folder column setting window...\n");
206 window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "prefs_folder_column");
207 gtk_container_set_border_width(GTK_CONTAINER(window), 8);
208 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
209 gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
210 gtk_window_set_title(GTK_WINDOW(window),
211 _("Folder list columns configuration"));
212 g_signal_connect(G_OBJECT(window), "delete_event",
213 G_CALLBACK(prefs_folder_column_delete_event),
215 g_signal_connect(G_OBJECT(window), "key_press_event",
216 G_CALLBACK(prefs_folder_column_key_pressed),
219 vbox = gtk_vbox_new(FALSE, 6);
220 gtk_widget_show(vbox);
221 gtk_container_add(GTK_CONTAINER(window), vbox);
223 label_hbox = gtk_hbox_new(FALSE, 0);
224 gtk_widget_show(label_hbox);
225 gtk_box_pack_start(GTK_BOX(vbox), label_hbox, FALSE, FALSE, 4);
227 label = gtk_label_new
228 (_("Select columns to be displayed in the folder list. You can modify\n"
229 "the order by using the Up / Down buttons or by dragging the items."));
230 gtk_widget_show(label);
231 gtk_box_pack_start(GTK_BOX(label_hbox), label, FALSE, FALSE, 4);
232 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
234 vbox1 = gtk_vbox_new(FALSE, VSPACING);
235 gtk_widget_show(vbox1);
236 gtk_box_pack_start(GTK_BOX(vbox), vbox1, TRUE, TRUE, 0);
237 gtk_container_set_border_width(GTK_CONTAINER(vbox1), 2);
239 hbox1 = gtk_hbox_new(FALSE, 8);
240 gtk_widget_show(hbox1);
241 gtk_box_pack_start(GTK_BOX(vbox1), hbox1, FALSE, TRUE, 0);
243 clist_hbox = gtk_hbox_new(FALSE, 8);
244 gtk_widget_show(clist_hbox);
245 gtk_box_pack_start(GTK_BOX(hbox1), clist_hbox, TRUE, TRUE, 0);
247 scrolledwin = gtk_scrolled_window_new(NULL, NULL);
248 gtk_widget_set_size_request(scrolledwin, 180, 210);
249 gtk_widget_show(scrolledwin);
250 gtk_box_pack_start(GTK_BOX(clist_hbox), scrolledwin, TRUE, TRUE, 0);
251 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
252 GTK_POLICY_AUTOMATIC,
253 GTK_POLICY_AUTOMATIC);
256 stock_list_view = prefs_folder_column_list_view_create
257 (_("Hidden columns"));
258 g_signal_connect(G_OBJECT(stock_list_view), "cursor-changed",
259 G_CALLBACK(prefs_folder_column_stock_sel_changed),
261 gtk_widget_show(stock_list_view);
262 gtk_container_add(GTK_CONTAINER(scrolledwin), stock_list_view);
264 /* add/remove button */
265 btn_vbox = gtk_vbox_new(FALSE, 8);
266 gtk_widget_show(btn_vbox);
267 gtk_box_pack_start(GTK_BOX(hbox1), btn_vbox, FALSE, FALSE, 0);
269 add_btn = gtk_button_new_from_stock(GTK_STOCK_ADD);
270 gtk_widget_show(add_btn);
271 gtk_box_pack_start(GTK_BOX(btn_vbox), add_btn, FALSE, TRUE, 0);
273 g_signal_connect(G_OBJECT(add_btn), "clicked",
274 G_CALLBACK(prefs_folder_column_add), NULL);
276 clist_hbox = gtk_hbox_new(FALSE, 8);
277 gtk_widget_show(clist_hbox);
278 gtk_box_pack_start(GTK_BOX(hbox1), clist_hbox, TRUE, TRUE, 0);
280 scrolledwin = gtk_scrolled_window_new(NULL, NULL);
281 gtk_widget_set_size_request(scrolledwin, 180, 210);
282 gtk_widget_show(scrolledwin);
283 gtk_box_pack_start(GTK_BOX(clist_hbox), scrolledwin, TRUE, TRUE, 0);
284 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
285 GTK_POLICY_AUTOMATIC,
286 GTK_POLICY_AUTOMATIC);
288 shown_list_view = prefs_folder_column_list_view_create
289 (_("Displayed columns"));
290 g_signal_connect(G_OBJECT(shown_list_view), "cursor-changed",
291 G_CALLBACK(prefs_folder_column_shown_sel_changed),
293 gtk_widget_show(shown_list_view);
294 gtk_container_add(GTK_CONTAINER(scrolledwin), shown_list_view);
297 btn_vbox = gtk_vbox_new(FALSE, 8);
298 gtk_widget_show(btn_vbox);
299 gtk_box_pack_start(GTK_BOX(hbox1), btn_vbox, FALSE, FALSE, 0);
301 remove_btn = gtk_button_new_from_stock(GTK_STOCK_REMOVE);
302 gtk_widget_show(remove_btn);
303 gtk_box_pack_start(GTK_BOX(btn_vbox), remove_btn, FALSE, TRUE, 0);
305 up_btn = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
306 gtk_widget_show(up_btn);
307 gtk_box_pack_start(GTK_BOX(btn_vbox), up_btn, FALSE, TRUE, 0);
309 down_btn = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
310 gtk_widget_show(down_btn);
311 gtk_box_pack_start(GTK_BOX(btn_vbox), down_btn, FALSE, TRUE, 0);
313 g_signal_connect(G_OBJECT(remove_btn), "clicked",
314 G_CALLBACK(prefs_folder_column_remove), NULL);
315 g_signal_connect(G_OBJECT(up_btn), "clicked",
316 G_CALLBACK(prefs_folder_column_up), NULL);
317 g_signal_connect(G_OBJECT(down_btn), "clicked",
318 G_CALLBACK(prefs_folder_column_down), NULL);
320 btn_hbox = gtk_hbox_new(FALSE, 8);
321 gtk_widget_show(btn_hbox);
322 gtk_box_pack_end(GTK_BOX(vbox), btn_hbox, FALSE, FALSE, 0);
324 btn_vbox = gtk_vbox_new(FALSE, 0);
325 gtk_widget_show(btn_vbox);
326 gtk_box_pack_start(GTK_BOX(btn_hbox), btn_vbox, FALSE, FALSE, 0);
328 default_btn = gtk_button_new_with_label(_(" Use default "));
329 gtk_widget_show(default_btn);
330 gtk_box_pack_start(GTK_BOX(btn_vbox), default_btn, TRUE, FALSE, 0);
331 g_signal_connect(G_OBJECT(default_btn), "clicked",
332 G_CALLBACK(prefs_folder_column_set_to_default),
335 gtkut_stock_button_set_create(&confirm_area,
336 &cancel_btn, GTK_STOCK_CANCEL,
337 &ok_btn, GTK_STOCK_OK,
339 gtk_widget_show(confirm_area);
340 gtk_box_pack_end(GTK_BOX(btn_hbox), confirm_area, FALSE, FALSE, 0);
341 gtk_widget_grab_default(ok_btn);
343 g_signal_connect(G_OBJECT(ok_btn), "clicked",
344 G_CALLBACK(prefs_folder_column_ok), NULL);
345 g_signal_connect(G_OBJECT(cancel_btn), "clicked",
346 G_CALLBACK(prefs_folder_column_cancel), NULL);
348 folder_col.window = window;
349 folder_col.add_btn = add_btn;
350 folder_col.remove_btn = remove_btn;
351 folder_col.up_btn = up_btn;
352 folder_col.down_btn = down_btn;
353 folder_col.ok_btn = ok_btn;
354 folder_col.cancel_btn = cancel_btn;
355 folder_col.stock_list_view = stock_list_view;
356 folder_col.shown_list_view = shown_list_view;
358 prefs_folder_column_shown_set_active(FALSE);
359 prefs_folder_column_stock_set_active(FALSE);
362 FolderColumnState *prefs_folder_column_get_config(void)
364 static FolderColumnState state[N_FOLDER_COLS];
365 FolderColumnType type;
368 for (pos = 0; pos < N_FOLDER_COLS; pos++)
369 state[pos].type = -1;
371 for (type = 0; type < N_FOLDER_COLS; type++) {
372 pos = prefs_common.folder_col_pos[type];
373 if (pos < 0 || pos >= N_FOLDER_COLS ||
374 state[pos].type != -1) {
375 g_warning("Wrong column position\n");
376 prefs_folder_column_set_config(default_state);
377 return default_state;
380 state[pos].type = type;
381 state[pos].visible = prefs_common.folder_col_visible[type];
387 static void prefs_folder_column_set_config(FolderColumnState *state)
389 FolderColumnType type;
392 for (pos = 0; pos < N_FOLDER_COLS; pos++) {
393 type = state[pos].type;
394 prefs_common.folder_col_visible[type] = state[pos].visible;
395 prefs_common.folder_col_pos[type] = pos;
399 static void prefs_folder_column_set_dialog(FolderColumnState *state)
401 GtkListStore *stock_store, *shown_store;
403 FolderColumnType type;
406 stock_store = GTK_LIST_STORE(gtk_tree_view_get_model
407 (GTK_TREE_VIEW(folder_col.stock_list_view)));
408 shown_store = GTK_LIST_STORE(gtk_tree_view_get_model
409 (GTK_TREE_VIEW(folder_col.shown_list_view)));
411 gtk_list_store_clear(stock_store);
412 gtk_list_store_clear(shown_store);
415 state = prefs_folder_column_get_config();
417 for (pos = 0; pos < N_FOLDER_COLS; pos++) {
418 type = state[pos].type;
419 name = gettext(col_name[type]);
421 if (state[pos].visible)
422 prefs_folder_column_insert_column(shown_store,
426 prefs_folder_column_insert_column(stock_store,
432 static void prefs_folder_column_set_view(void)
434 gint stock_n_rows, shown_n_rows;
435 FolderColumnState state[N_FOLDER_COLS];
436 FolderColumnType type;
439 stock_n_rows = gtk_tree_model_iter_n_children
440 (gtk_tree_view_get_model(GTK_TREE_VIEW
441 (folder_col.stock_list_view)), NULL);
442 shown_n_rows = gtk_tree_model_iter_n_children
443 (gtk_tree_view_get_model(GTK_TREE_VIEW
444 (folder_col.shown_list_view)), NULL);
447 (stock_n_rows + shown_n_rows == N_FOLDER_COLS);
449 for (row = 0; row < stock_n_rows; row++) {
450 type = prefs_folder_column_get_column
451 (folder_col.stock_list_view, row);
452 state[row].type = type;
453 state[row].visible = FALSE;
457 for (row = 0; row < shown_n_rows; row++) {
458 type = prefs_folder_column_get_column
459 (folder_col.shown_list_view, row);
460 state[pos + row].type = type;
461 state[pos + row].visible = TRUE;
464 prefs_folder_column_set_config(state);
465 main_window_set_folder_column();
468 static void prefs_folder_column_add(void)
470 GtkListStore *stock_store, *shown_store;
471 GtkTreeIter stock_sel, shown_sel, shown_add;
472 gboolean shown_sel_valid;
474 FolderColumnType type;
476 stock_store = GTK_LIST_STORE(gtk_tree_view_get_model
477 (GTK_TREE_VIEW(folder_col.stock_list_view)));
478 shown_store = GTK_LIST_STORE(gtk_tree_view_get_model
479 (GTK_TREE_VIEW(folder_col.shown_list_view)));
481 if (!gtk_tree_selection_get_selected
482 (gtk_tree_view_get_selection
483 (GTK_TREE_VIEW(folder_col.stock_list_view)),
488 shown_sel_valid = gtk_tree_selection_get_selected
489 (gtk_tree_view_get_selection
490 (GTK_TREE_VIEW(folder_col.shown_list_view)),
494 gtk_tree_model_get(GTK_TREE_MODEL(stock_store), &stock_sel,
498 gtk_list_store_remove(stock_store, &stock_sel);
500 gtk_list_store_insert_after(shown_store, &shown_add,
501 shown_sel_valid ? &shown_sel : NULL);
503 name = gettext(col_name[type]);
505 gtk_list_store_set(shown_store, &shown_add,
510 gtk_tree_selection_select_iter(gtk_tree_view_get_selection
511 (GTK_TREE_VIEW(folder_col.shown_list_view)),
513 prefs_folder_column_shown_set_active(TRUE);
514 prefs_folder_column_stock_set_active(FALSE);
517 static void prefs_folder_column_remove(void)
519 GtkListStore *stock_store, *shown_store;
520 GtkTreeIter shown_sel, stock_sel, stock_add;
521 gboolean stock_sel_valid;
523 FolderColumnType type;
525 stock_store = GTK_LIST_STORE(gtk_tree_view_get_model
526 (GTK_TREE_VIEW(folder_col.stock_list_view)));
527 shown_store = GTK_LIST_STORE(gtk_tree_view_get_model
528 (GTK_TREE_VIEW(folder_col.shown_list_view)));
530 if (!gtk_tree_selection_get_selected
531 (gtk_tree_view_get_selection
532 (GTK_TREE_VIEW(folder_col.shown_list_view)),
537 stock_sel_valid = gtk_tree_selection_get_selected
538 (gtk_tree_view_get_selection
539 (GTK_TREE_VIEW(folder_col.stock_list_view)),
543 gtk_tree_model_get(GTK_TREE_MODEL(shown_store), &shown_sel,
547 gtk_list_store_remove(shown_store, &shown_sel);
549 gtk_list_store_insert_after(stock_store, &stock_add,
550 stock_sel_valid ? &stock_sel : NULL);
552 name = gettext(col_name[type]);
554 gtk_list_store_set(stock_store, &stock_add,
559 gtk_tree_selection_select_iter(gtk_tree_view_get_selection
560 (GTK_TREE_VIEW(folder_col.stock_list_view)),
562 prefs_folder_column_shown_set_active(FALSE);
563 prefs_folder_column_stock_set_active(TRUE);
566 static void prefs_folder_column_up(void)
568 GtkTreePath *prev, *sel;
570 GtkListStore *shown_store;
573 if (!gtk_tree_selection_get_selected
574 (gtk_tree_view_get_selection
575 (GTK_TREE_VIEW(folder_col.shown_list_view)),
580 shown_store = GTK_LIST_STORE(gtk_tree_view_get_model
581 (GTK_TREE_VIEW(folder_col.shown_list_view)));
583 sel = gtk_tree_model_get_path(GTK_TREE_MODEL(shown_store),
588 prev = gtk_tree_path_copy(sel);
589 if (!gtk_tree_path_prev(prev)) {
590 gtk_tree_path_free(prev);
591 gtk_tree_path_free(sel);
595 gtk_tree_model_get_iter(GTK_TREE_MODEL(shown_store),
597 gtk_tree_path_free(sel);
598 gtk_tree_path_free(prev);
600 gtk_list_store_swap(shown_store, &iprev, &isel);
601 prefs_folder_column_shown_set_btn_sensitivity();
604 static void prefs_folder_column_down(void)
606 GtkListStore *shown_store;
607 GtkTreeIter next, sel;
609 if (!gtk_tree_selection_get_selected
610 (gtk_tree_view_get_selection
611 (GTK_TREE_VIEW(folder_col.shown_list_view)),
616 shown_store = GTK_LIST_STORE(gtk_tree_view_get_model
617 (GTK_TREE_VIEW(folder_col.shown_list_view)));
620 if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(shown_store), &next))
623 gtk_list_store_swap(shown_store, &next, &sel);
624 prefs_folder_column_shown_set_btn_sensitivity();
627 static void prefs_folder_column_set_to_default(void)
629 prefs_folder_column_set_dialog(default_state);
630 prefs_folder_column_shown_set_active(FALSE);
631 prefs_folder_column_stock_set_active(FALSE);
634 static void prefs_folder_column_ok(void)
636 if (!folder_col.finished) {
637 folder_col.finished = TRUE;
638 prefs_folder_column_set_view();
642 static void prefs_folder_column_cancel(void)
644 folder_col.finished = TRUE;
647 static gint prefs_folder_column_delete_event(GtkWidget *widget,
651 folder_col.finished = TRUE;
655 static gboolean prefs_folder_column_key_pressed(GtkWidget *widget,
659 if (event && event->keyval == GDK_KEY_Escape)
660 folder_col.finished = TRUE;
664 static GtkListStore *prefs_folder_column_create_store(void)
666 return gtk_list_store_new(N_SUMCOL_COLUMNS,
672 static void prefs_folder_column_insert_column(GtkListStore *store,
675 FolderColumnType type)
680 if (!gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store),
686 gtk_list_store_append(store, &iter);
687 gtk_list_store_set(store, &iter,
693 /* change existing */
694 gtk_list_store_set(store, &iter,
702 *\brief Return the columnn type for a row
704 static FolderColumnType prefs_folder_column_get_column(GtkWidget *list, gint row)
706 GtkTreeView *list_view = GTK_TREE_VIEW(list);
707 GtkTreeModel *model = gtk_tree_view_get_model(list_view);
709 FolderColumnType result;
711 if (!gtk_tree_model_iter_nth_child(model, &iter, NULL, row))
714 gtk_tree_model_get(model, &iter,
715 SUMCOL_TYPE, &result,
721 static GtkWidget *prefs_folder_column_list_view_create(const gchar *name)
723 GtkWidget *list_view;
724 GtkTreeSelection *selector;
727 model = GTK_TREE_MODEL(prefs_folder_column_create_store());
728 list_view = gtk_tree_view_new_with_model(model);
729 g_object_unref(G_OBJECT(model));
731 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(list_view),
732 prefs_common.use_stripes_everywhere);
734 selector = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
735 gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE);
737 prefs_filtering_create_list_view_columns(GTK_WIDGET(list_view), name);
739 gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(list_view),
742 G_N_ELEMENTS(row_targets),
745 gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(list_view),
747 G_N_ELEMENTS(row_targets),
750 g_signal_connect(G_OBJECT(list_view), "drag_data_get",
751 G_CALLBACK(drag_data_get),
754 g_signal_connect(G_OBJECT(list_view), "drag_data_received",
755 G_CALLBACK(drag_data_received),
761 static void prefs_filtering_create_list_view_columns(GtkWidget *list_view,
764 GtkTreeViewColumn *column;
765 GtkCellRenderer *renderer;
767 renderer = gtk_cell_renderer_text_new();
768 column = gtk_tree_view_column_new_with_attributes
769 (name, renderer, "text", SUMCOL_NAME, NULL);
770 gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column);
773 static void drag_data_get(GtkTreeView *tree_view, GdkDragContext *context,
774 GtkSelectionData *data, guint info,
775 guint time, GtkTreeModel *model)
778 FolderColumnType type;
779 GtkTreeModel *source_model;
781 if (info != TARGET_INFO_SUMCOL)
784 if (!gtk_tree_selection_get_selected
785 (gtk_tree_view_get_selection(tree_view),
786 &source_model, &iter))
789 gtk_tree_model_get(source_model, &iter,
794 gtk_selection_data_set(data, gtk_selection_data_get_target(data), 8,
795 (gchar *) &type, sizeof type);
798 static void drag_data_received(GtkTreeView *tree_view, GdkDragContext *context,
799 gint x, gint y, GtkSelectionData *data,
800 guint info, guint time, GtkTreeModel *model)
803 GtkTreePath *dst = NULL, *sel = NULL;
804 GtkTreeIter isel, idst;
805 GtkTreeViewDropPosition pos;
806 FolderColumnType type;
807 GtkTreeModel *sel_model;
810 source = gtk_drag_get_source_widget(context);
812 if (source == GTK_WIDGET(tree_view)) {
815 * Same widget: re-order
818 gtk_tree_selection_get_selected(gtk_tree_view_get_selection(tree_view),
820 sel = gtk_tree_model_get_path(model, &isel);
821 gtk_tree_view_get_dest_row_at_pos(tree_view, x, y,
824 /* NOTE: dst is invalid if selection beyond last row, in that
825 * case move beyond last one (XXX_move_before(..., NULL)) */
828 gtk_tree_model_get_iter(model, &idst, dst);
830 gtk_list_store_move_before(GTK_LIST_STORE(model),
834 /* we do not drag if no valid dst and sel, and when
835 * dst and sel are the same (moving after or before
836 * itself doesn't change order...) */
837 if ((dst && sel) && gtk_tree_path_compare(sel, dst) != 0) {
838 if (pos == GTK_TREE_VIEW_DROP_BEFORE
839 || pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE)
840 gtk_list_store_move_before(GTK_LIST_STORE(model),
844 gtk_list_store_move_after(GTK_LIST_STORE(model),
849 gtk_tree_path_free(dst);
850 gtk_tree_path_free(sel);
851 gtk_drag_finish(context, TRUE, FALSE, time);
853 } else if (source == folder_col.stock_list_view
854 || source == folder_col.shown_list_view) {
857 * Other widget: change and update
861 /* get source information and remove */
862 gtk_tree_selection_get_selected(gtk_tree_view_get_selection(
863 GTK_TREE_VIEW(source)),
865 type = *((gint *) gtk_selection_data_get_data(data));
866 name = gettext(col_name[type]);
867 gtk_list_store_remove(GTK_LIST_STORE(sel_model), &isel);
869 /* get insertion position */
870 gtk_tree_view_get_dest_row_at_pos(tree_view, x, y, &dst, &pos);
872 /* NOTE: dst is invalid if insertion point beyond last row,
873 * just append to list in that case (XXX_store_append()) */
876 gtk_tree_model_get_iter(model, &idst, dst);
878 if (pos == GTK_TREE_VIEW_DROP_BEFORE
879 || pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE)
880 gtk_list_store_insert_before(GTK_LIST_STORE(model),
884 gtk_list_store_insert_after(GTK_LIST_STORE(model),
888 gtk_list_store_append(GTK_LIST_STORE(model),
891 gtk_list_store_set(GTK_LIST_STORE(model), &isel,
893 SUMCOL_TYPE, type, -1);
894 gtk_tree_path_free(dst);
895 gtk_drag_finish(context, TRUE, FALSE, time);
898 prefs_folder_column_shown_set_active(FALSE);
899 prefs_folder_column_stock_set_active(FALSE);
901 /* XXXX: should we call gtk_drag_finish() for other code paths? */
904 static void prefs_folder_column_shown_set_btn_sensitivity(void)
906 GtkTreeModel *model = GTK_TREE_MODEL(gtk_tree_view_get_model(
907 GTK_TREE_VIEW(folder_col.shown_list_view)));
908 GtkTreeSelection *selection = gtk_tree_view_get_selection(
909 GTK_TREE_VIEW(folder_col.shown_list_view));
913 if(!gtk_tree_selection_get_selected(selection, NULL, &iter)) {
914 gtk_widget_set_sensitive(folder_col.remove_btn, FALSE);
915 gtk_widget_set_sensitive(folder_col.up_btn, FALSE);
916 gtk_widget_set_sensitive(folder_col.down_btn, FALSE);
920 path = gtk_tree_model_get_path(model, &iter);
922 gtk_widget_set_sensitive(folder_col.up_btn, gtk_tree_path_prev(path));
923 gtk_widget_set_sensitive(folder_col.down_btn,
924 gtk_tree_model_iter_next(model, &iter));
925 gtk_tree_path_free(path);
928 static void prefs_folder_column_shown_set_active(const gboolean active)
930 GtkTreeSelection *selection = NULL;
932 gtk_widget_set_sensitive(folder_col.remove_btn, active);
934 if(active == FALSE) {
935 selection = gtk_tree_view_get_selection(
936 GTK_TREE_VIEW(folder_col.shown_list_view));
937 gtk_tree_selection_unselect_all(selection);
939 gtk_widget_set_sensitive(folder_col.up_btn, FALSE);
940 gtk_widget_set_sensitive(folder_col.down_btn, FALSE);
942 prefs_folder_column_shown_set_btn_sensitivity();
946 static void prefs_folder_column_stock_set_active(const gboolean active)
948 GtkTreeSelection *selection = NULL;
950 gtk_widget_set_sensitive(folder_col.add_btn, active);
952 if(active == FALSE) {
953 selection = gtk_tree_view_get_selection(
954 GTK_TREE_VIEW(folder_col.stock_list_view));
955 gtk_tree_selection_unselect_all(selection);
959 static void prefs_folder_column_stock_sel_changed(void)
961 GtkTreeSelection *selection = gtk_tree_view_get_selection(
962 GTK_TREE_VIEW(folder_col.stock_list_view));
963 prefs_folder_column_stock_set_active(
964 (selection != NULL) ? TRUE : FALSE);
965 prefs_folder_column_shown_set_active(
966 (selection != NULL) ? FALSE : TRUE);
969 static void prefs_folder_column_shown_sel_changed(void)
971 GtkTreeSelection *selection = gtk_tree_view_get_selection(
972 GTK_TREE_VIEW(folder_col.shown_list_view));
973 prefs_folder_column_shown_set_active(
974 (selection != NULL) ? TRUE : FALSE);
975 prefs_folder_column_stock_set_active(
976 (selection != NULL) ? FALSE : TRUE);