Fix #314: Remote commands for thumbnail maintenance
[geeqie.git] / src / desktop_file.c
1 /*
2  * Copyright (C) 2004 John Ellis
3  * Copyright (C) 2008 - 2016 The Geeqie Team
4  *
5  * Author: Vladimir Nadvornik
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21
22 #include "main.h"
23 #include "desktop_file.h"
24
25 #include "editors.h"
26 #include "filedata.h"
27 #include "misc.h"
28 #include "ui_misc.h"
29 #include "ui_fileops.h"
30 #include "ui_utildlg.h"
31 #include "pixbuf_util.h"
32 #include "window.h"
33 #include "utilops.h"
34 #include "layout_util.h"
35
36 #define CONFIG_WINDOW_DEF_WIDTH         700
37 #define CONFIG_WINDOW_DEF_HEIGHT        400
38
39
40
41 typedef struct _EditorWindow EditorWindow;
42 struct _EditorWindow
43 {
44         GtkWidget *window;
45         GtkWidget *entry;
46         GtkWidget *save_button;
47         GtkTextBuffer *buffer;
48         gchar *desktop_name;
49         gboolean modified;
50 };
51
52 typedef struct _EditorListWindow EditorListWindow;
53 struct _EditorListWindow
54 {
55         GtkWidget *window;
56         GtkWidget *view;
57         GenericDialog *gd;      /* any open confirm dialogs ? */
58         GtkWidget *delete_button;
59         GtkWidget *edit_button;
60 };
61
62 typedef struct _EditorWindowDel_Data EditorWindowDel_Data;
63 struct _EditorWindowDel_Data
64 {
65         EditorListWindow *ewl;
66         gchar *path;
67 };
68
69 static EditorListWindow *editor_list_window = NULL;
70
71 static gboolean editor_window_save(EditorWindow *ew)
72 {
73         gchar *dir;
74         gchar *path;
75         gchar *text;
76         GtkTextIter start, end;
77         GError *error = NULL;
78         gboolean ret = TRUE;
79         const gchar *name = gtk_entry_get_text(GTK_ENTRY(ew->entry));
80
81         if (!name || !name[0])
82                 {
83                 file_util_warning_dialog(_("Can't save"), _("Please specify file name."), GTK_STOCK_DIALOG_ERROR, NULL);
84                 return FALSE;
85                 }
86
87         gtk_text_buffer_get_bounds(ew->buffer, &start, &end);
88         text = gtk_text_buffer_get_text(ew->buffer, &start, &end, FALSE);
89
90         dir = g_build_filename(get_rc_dir(), "applications", NULL);
91         path = g_build_filename(dir, name, NULL);
92
93         if (!recursive_mkdir_if_not_exists(dir, 0755))
94                 {
95                 file_util_warning_dialog(_("Can't save"), _("Could not create directory"), GTK_STOCK_DIALOG_ERROR, NULL);
96                 ret = FALSE;
97                 }
98
99         if (ret && !g_file_set_contents(path, text, -1, &error))
100                 {
101                 file_util_warning_dialog(_("Can't save"), error->message, GTK_STOCK_DIALOG_ERROR, NULL);
102                 g_error_free(error);
103                 ret = FALSE;
104                 }
105
106         g_free(path);
107         g_free(dir);
108         g_free(text);
109         layout_editors_reload_start();
110         /* idle function is not needed, everything should be cached */
111         layout_editors_reload_finish();
112         return ret;
113 }
114
115 static void editor_window_close_cb(GtkWidget *widget, gpointer data)
116 {
117         EditorWindow *ew = data;
118
119         g_free(ew->desktop_name);
120         gtk_widget_destroy(ew->window);
121         g_free(ew);
122 }
123
124 static gint editor_window_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
125 {
126         editor_window_close_cb(w, data);
127         return TRUE;
128 }
129
130 static void editor_window_save_cb(GtkWidget *widget, gpointer data)
131 {
132         EditorWindow *ew = data;
133
134         if (ew->modified)
135                 {
136                 editor_window_save(ew);
137                 }
138
139         gtk_widget_set_sensitive(ew->save_button, FALSE);
140         gtk_text_buffer_set_modified(ew->buffer, FALSE);
141         ew->modified = FALSE;
142 }
143
144 static void editor_window_text_modified_cb(GtkWidget *widget, gpointer data)
145 {
146         EditorWindow *ew = data;
147
148         if (gtk_text_buffer_get_modified(ew->buffer))
149                 {
150                 gtk_widget_set_sensitive(ew->save_button, TRUE);
151                 ew->modified = TRUE;
152                 }
153 }
154
155 static void editor_window_entry_changed_cb(GtkWidget *widget, gpointer data)
156 {
157         EditorWindow *ew = data;
158         const gchar *content = gtk_entry_get_text(GTK_ENTRY(ew->entry));
159         gboolean modified = ew->modified;
160
161         if (!modified)
162                 {
163                 modified = (!ew->desktop_name && *content);
164                 }
165
166         if (!modified)
167                 {
168                 modified = strcmp(ew->desktop_name, content);
169                 }
170
171         gtk_widget_set_sensitive(ew->save_button, modified);
172         ew->modified = modified;
173 }
174
175 static void editor_window_new(const gchar *src_path, const gchar *desktop_name)
176 {
177         EditorWindow *ew;
178         GtkWidget *win_vbox;
179         GtkWidget *hbox;
180         GtkWidget *button;
181         GtkWidget *ct_button;
182         GtkWidget *button_hbox;
183         GtkWidget *scrolled;
184         GtkWidget *text_view;
185         gchar *text;
186         gsize size;
187
188         ew = g_new0(EditorWindow, 1);
189
190
191         ew->window = window_new(GTK_WINDOW_TOPLEVEL, "Desktop", PIXBUF_INLINE_ICON_CONFIG, NULL, _("Desktop file"));
192         gtk_window_set_type_hint(GTK_WINDOW(ew->window), GDK_WINDOW_TYPE_HINT_DIALOG);
193
194         g_signal_connect(G_OBJECT(ew->window), "delete_event",
195                          G_CALLBACK(editor_window_delete_cb), ew);
196
197         gtk_window_set_default_size(GTK_WINDOW(ew->window), CONFIG_WINDOW_DEF_WIDTH, CONFIG_WINDOW_DEF_HEIGHT);
198         gtk_window_set_resizable(GTK_WINDOW(ew->window), TRUE);
199         gtk_container_set_border_width(GTK_CONTAINER(ew->window), PREF_PAD_BORDER);
200
201         win_vbox = gtk_vbox_new(FALSE, PREF_PAD_SPACE);
202         gtk_container_add(GTK_CONTAINER(ew->window), win_vbox);
203         gtk_widget_show(win_vbox);
204
205         hbox = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
206         gtk_box_pack_end(GTK_BOX(win_vbox), hbox, FALSE, FALSE, 0);
207         gtk_widget_show(hbox);
208
209         ew->entry = gtk_entry_new();
210         gtk_box_pack_start(GTK_BOX(hbox), ew->entry, TRUE, TRUE, 0);
211         ew->desktop_name = NULL;
212         if (desktop_name)
213                 {
214                 gtk_entry_set_text(GTK_ENTRY(ew->entry), desktop_name);
215                 ew->desktop_name = g_strdup(desktop_name);
216                 }
217         gtk_widget_show(ew->entry);
218         g_signal_connect(G_OBJECT(ew->entry), "changed", G_CALLBACK(editor_window_entry_changed_cb), ew);
219
220         button_hbox = gtk_hbutton_box_new();
221         gtk_button_box_set_layout(GTK_BUTTON_BOX(button_hbox), GTK_BUTTONBOX_END);
222         gtk_box_set_spacing(GTK_BOX(button_hbox), PREF_PAD_BUTTON_GAP);
223         gtk_box_pack_end(GTK_BOX(hbox), button_hbox, FALSE, FALSE, 0);
224         gtk_widget_show(button_hbox);
225
226         ew->save_button = pref_button_new(NULL, GTK_STOCK_SAVE, NULL, FALSE,
227                                  G_CALLBACK(editor_window_save_cb), ew);
228         gtk_container_add(GTK_CONTAINER(button_hbox), ew->save_button);
229         gtk_widget_set_can_default(ew->save_button, TRUE);
230         gtk_widget_set_sensitive(ew->save_button, FALSE);
231         gtk_widget_show(ew->save_button);
232         ct_button = ew->save_button;
233
234         button = pref_button_new(NULL, GTK_STOCK_CLOSE, NULL, FALSE,
235                                  G_CALLBACK(editor_window_close_cb), ew);
236         gtk_container_add(GTK_CONTAINER(button_hbox), button);
237         gtk_widget_set_can_default(button, TRUE);
238         gtk_widget_show(button);
239
240         if (!generic_dialog_get_alternative_button_order(ew->window))
241                 {
242                 gtk_box_reorder_child(GTK_BOX(button_hbox), ct_button, -1);
243                 }
244
245
246         scrolled = gtk_scrolled_window_new(NULL, NULL);
247         gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
248         gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
249                                        GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
250         gtk_box_pack_start(GTK_BOX(win_vbox), scrolled, TRUE, TRUE, 5);
251         gtk_widget_show(scrolled);
252
253         text_view = gtk_text_view_new();
254         gtk_container_add(GTK_CONTAINER(scrolled), text_view);
255         gtk_widget_show(text_view);
256
257         ew->buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
258         if (g_file_get_contents(src_path, &text, &size, NULL))
259                 {
260                 gtk_text_buffer_set_text(ew->buffer, text, size);
261                 }
262         gtk_text_buffer_set_modified(ew->buffer, FALSE);
263         g_signal_connect(G_OBJECT(ew->buffer), "modified-changed",
264                          G_CALLBACK(editor_window_text_modified_cb), ew);
265
266         gtk_widget_show(ew->window);
267 }
268
269
270 static void editor_list_window_close_cb(GtkWidget *widget, gpointer data)
271 {
272         gtk_widget_destroy(editor_list_window->window);
273         g_free(editor_list_window);
274         editor_list_window = NULL;
275 }
276
277 static gboolean editor_list_window_delete(GtkWidget *widget, GdkEventAny *event, gpointer data)
278 {
279         editor_list_window_close_cb(NULL, NULL);
280         return TRUE;
281 }
282
283 static void editor_list_window_delete_dlg_cancel(GenericDialog *gd, gpointer data);
284
285 static void editor_list_window_delete_dlg_cancel(GenericDialog *gd, gpointer data)
286 {
287         EditorWindowDel_Data *ewdl = data;
288
289         ewdl->ewl->gd = NULL;
290         g_free(ewdl->path);
291         g_free(ewdl);
292 }
293
294 static void editor_list_window_delete_dlg_ok_cb(GenericDialog *gd, gpointer data)
295 {
296         EditorWindowDel_Data *ewdl = data;
297
298         if (!unlink_file(ewdl->path))
299                 {
300                 gchar *text = g_strdup_printf(_("Unable to delete file:\n%s"), ewdl->path);
301                 warning_dialog(_("File deletion failed"), text, GTK_STOCK_DIALOG_WARNING, NULL);
302                 g_free(text);
303                 }
304         else
305                 {
306                 /* refresh list */
307                 layout_editors_reload_start();
308                 /* idle function is not needed, everything should be cached */
309                 layout_editors_reload_finish();
310                 }
311
312         editor_list_window_delete_dlg_cancel(gd, data);
313 }
314
315 static void editor_list_window_delete_cb(GtkWidget *widget, gpointer data)
316 {
317         EditorListWindow *ewl = data;
318         GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(ewl->view));
319         GtkTreeIter iter;
320
321         if (gtk_tree_selection_get_selected(sel, NULL, &iter))
322                 {
323                 GtkTreeModel *store = gtk_tree_view_get_model(GTK_TREE_VIEW(ewl->view));
324                 gchar *path;
325                 gchar *key;
326                 gchar *text;
327                 EditorWindowDel_Data *ewdl;
328
329                 gtk_tree_model_get(store, &iter,
330                                    DESKTOP_FILE_COLUMN_PATH, &path,
331                                    DESKTOP_FILE_COLUMN_KEY, &key, -1);
332
333
334                 ewdl = g_new(EditorWindowDel_Data, 1);
335                 ewdl->ewl = ewl;
336                 ewdl->path = path;
337
338                 if (ewl->gd)
339                         {
340                         GenericDialog *gd = ewl->gd;
341                         editor_list_window_delete_dlg_cancel(ewl->gd, ewl->gd->data);
342                         generic_dialog_close(gd);
343                         }
344
345                 ewl->gd = generic_dialog_new(_("Delete file"), "dlg_confirm",
346                                             NULL, TRUE,
347                                             editor_list_window_delete_dlg_cancel, ewdl);
348
349                 generic_dialog_add_button(ewl->gd, GTK_STOCK_DELETE, NULL, editor_list_window_delete_dlg_ok_cb, TRUE);
350
351                 text = g_strdup_printf(_("About to delete the file:\n %s"), path);
352                 generic_dialog_add_message(ewl->gd, GTK_STOCK_DIALOG_QUESTION,
353                                            _("Delete file"), text);
354                 g_free(text);
355
356                 gtk_widget_show(ewl->gd->dialog);
357                 }
358 }
359
360 static void editor_list_window_edit_cb(GtkWidget *widget, gpointer data)
361 {
362         EditorListWindow *ewl = data;
363         GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(ewl->view));
364         GtkTreeIter iter;
365
366         if (gtk_tree_selection_get_selected(sel, NULL, &iter))
367                 {
368                 GtkTreeModel *store = gtk_tree_view_get_model(GTK_TREE_VIEW(ewl->view));
369                 gchar *path;
370                 gchar *key;
371
372                 gtk_tree_model_get(store, &iter,
373                                    DESKTOP_FILE_COLUMN_PATH, &path,
374                                    DESKTOP_FILE_COLUMN_KEY, &key, -1);
375                 editor_window_new(path, key);
376                 g_free(key);
377                 g_free(path);
378                 }
379 }
380
381 static void editor_list_window_new_cb(GtkWidget *widget, gpointer data)
382 {
383         editor_window_new(DESKTOP_FILE_TEMPLATE, _("new.desktop"));
384 }
385
386 static void editor_list_window_help_cb(GtkWidget *widget, gpointer data)
387 {
388         help_window_show("GuideEditorsConfig.html");
389 }
390
391 static void editor_list_window_selection_changed_cb(GtkWidget *widget, gpointer data)
392 {
393         EditorListWindow *ewl = data;
394         GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(ewl->view));
395         GtkTreeIter iter;
396
397         if (gtk_tree_selection_get_selected(sel, NULL, &iter))
398                 {
399                 GtkTreeModel *store = gtk_tree_view_get_model(GTK_TREE_VIEW(ewl->view));
400                 gchar *path;
401
402                 gtk_tree_model_get(store, &iter,
403                                                    DESKTOP_FILE_COLUMN_PATH, &path,
404                                                    -1);
405
406                 gtk_widget_set_sensitive(ewl->delete_button, access_file(path, W_OK));
407                 gtk_widget_set_sensitive(ewl->edit_button, TRUE);
408                 g_free(path);
409                 }
410
411 }
412
413 static gint editor_list_window_sort_cb(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data)
414 {
415         gint n = GPOINTER_TO_INT(data);
416         gint ret = 0;
417
418         switch (n)
419                 {
420                 case DESKTOP_FILE_COLUMN_KEY:
421                 case DESKTOP_FILE_COLUMN_NAME:
422                 case DESKTOP_FILE_COLUMN_PATH:
423                 case DESKTOP_FILE_COLUMN_HIDDEN:
424                         {
425                         gchar *s1, *s2;
426
427                         gtk_tree_model_get(model, a, n, &s1, -1);
428                         gtk_tree_model_get(model, b, n, &s2, -1);
429
430                         if (!s1 || !s2)
431                                 {
432                                 if (!s1 && !s2) break;
433                                 ret = s1 ? 1 : -1;
434                                 }
435                         else
436                                 {
437                                 ret = g_utf8_collate(s1, s2);
438                                 }
439
440                         g_free(s1);
441                         g_free(s2);
442                         }
443                         break;
444
445                 default:
446                         g_return_val_if_reached(0);
447                 }
448
449         return ret;
450 }
451
452 static void editor_list_window_create(void)
453 {
454         GtkWidget *win_vbox;
455         GtkWidget *hbox;
456         GtkWidget *button;
457         GtkWidget *scrolled;
458         GtkCellRenderer *renderer;
459         GtkTreeSelection *selection;
460         GtkTreeViewColumn *column;
461         GtkTreeModel *store;
462         GtkTreeSortable *sortable;
463         EditorListWindow *ewl;
464
465         editor_list_window = ewl = g_new0(EditorListWindow, 1);
466
467         ewl->window = window_new(GTK_WINDOW_TOPLEVEL, "editors", PIXBUF_INLINE_ICON_CONFIG, NULL, _("Editors"));
468         gtk_window_set_type_hint(GTK_WINDOW(ewl->window), GDK_WINDOW_TYPE_HINT_DIALOG);
469         g_signal_connect(G_OBJECT(ewl->window), "delete_event",
470                          G_CALLBACK(editor_list_window_delete), NULL);
471         gtk_window_set_default_size(GTK_WINDOW(ewl->window), CONFIG_WINDOW_DEF_WIDTH, CONFIG_WINDOW_DEF_HEIGHT);
472         gtk_window_set_resizable(GTK_WINDOW(ewl->window), TRUE);
473         gtk_container_set_border_width(GTK_CONTAINER(ewl->window), PREF_PAD_BORDER);
474
475         win_vbox = gtk_vbox_new(FALSE, PREF_PAD_SPACE);
476         gtk_container_add(GTK_CONTAINER(ewl->window), win_vbox);
477         gtk_widget_show(win_vbox);
478
479         hbox = gtk_hbutton_box_new();
480         gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
481         gtk_box_set_spacing(GTK_BOX(hbox), PREF_PAD_BUTTON_GAP);
482         gtk_box_pack_end(GTK_BOX(win_vbox), hbox, FALSE, FALSE, 0);
483         gtk_widget_show(hbox);
484
485
486         button = pref_button_new(NULL, GTK_STOCK_HELP, NULL, FALSE,
487                                  G_CALLBACK(editor_list_window_help_cb), ewl);
488         gtk_container_add(GTK_CONTAINER(hbox), button);
489         gtk_widget_set_can_default(button, TRUE);
490         gtk_widget_show(button);
491
492         button = pref_button_new(NULL, GTK_STOCK_NEW, NULL, FALSE,
493                                  G_CALLBACK(editor_list_window_new_cb), ewl);
494         gtk_container_add(GTK_CONTAINER(hbox), button);
495         gtk_widget_set_can_default(button, TRUE);
496         gtk_widget_show(button);
497
498         button = pref_button_new(NULL, GTK_STOCK_EDIT, NULL, FALSE,
499                                  G_CALLBACK(editor_list_window_edit_cb), ewl);
500         gtk_container_add(GTK_CONTAINER(hbox), button);
501         gtk_widget_set_can_default(button, TRUE);
502         gtk_widget_set_sensitive(button, FALSE);
503         gtk_widget_show(button);
504         ewl->edit_button = button;
505
506         button = pref_button_new(NULL, GTK_STOCK_DELETE, NULL, FALSE,
507                                  G_CALLBACK(editor_list_window_delete_cb), ewl);
508         gtk_container_add(GTK_CONTAINER(hbox), button);
509         gtk_widget_set_can_default(button, TRUE);
510         gtk_widget_set_sensitive(button, FALSE);
511         gtk_widget_show(button);
512         ewl->delete_button = button;
513
514         button = pref_button_new(NULL, GTK_STOCK_CLOSE, NULL, FALSE,
515                                  G_CALLBACK(editor_list_window_close_cb), ewl);
516         gtk_container_add(GTK_CONTAINER(hbox), button);
517         gtk_widget_set_can_default(button, TRUE);
518         gtk_widget_show(button);
519
520         scrolled = gtk_scrolled_window_new(NULL, NULL);
521         gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
522         gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
523                                        GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
524         gtk_box_pack_start(GTK_BOX(win_vbox), scrolled, TRUE, TRUE, 5);
525         gtk_widget_show(scrolled);
526
527         ewl->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(desktop_file_list));
528         selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(ewl->view));
529         gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_SINGLE);
530         g_signal_connect(selection, "changed", G_CALLBACK(editor_list_window_selection_changed_cb), ewl);
531
532         gtk_tree_view_set_enable_search(GTK_TREE_VIEW(ewl->view), FALSE);
533
534         column = gtk_tree_view_column_new();
535         gtk_tree_view_column_set_title(column, _("Name"));
536         gtk_tree_view_column_set_resizable(column, TRUE);
537         renderer = gtk_cell_renderer_text_new();
538         gtk_tree_view_column_pack_start(column, renderer, FALSE);
539         gtk_tree_view_column_add_attribute(column, renderer, "text", DESKTOP_FILE_COLUMN_NAME);
540         gtk_tree_view_append_column(GTK_TREE_VIEW(ewl->view), column);
541         gtk_tree_view_column_set_sort_column_id(column, DESKTOP_FILE_COLUMN_NAME);
542
543         column = gtk_tree_view_column_new();
544         gtk_tree_view_column_set_title(column, _("Hidden"));
545         gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
546         renderer = gtk_cell_renderer_text_new();
547         gtk_tree_view_column_pack_start(column, renderer, FALSE);
548         gtk_tree_view_column_add_attribute(column, renderer, "text", DESKTOP_FILE_COLUMN_HIDDEN);
549         gtk_tree_view_append_column(GTK_TREE_VIEW(ewl->view), column);
550         gtk_tree_view_column_set_sort_column_id(column, DESKTOP_FILE_COLUMN_HIDDEN);
551         gtk_tree_view_column_set_alignment(column, 0.5);
552
553         column = gtk_tree_view_column_new();
554         gtk_tree_view_column_set_title(column, _("Desktop file"));
555         gtk_tree_view_column_set_resizable(column, TRUE);
556         renderer = gtk_cell_renderer_text_new();
557         gtk_tree_view_column_pack_start(column, renderer, FALSE);
558         gtk_tree_view_column_add_attribute(column, renderer, "text", DESKTOP_FILE_COLUMN_KEY);
559         gtk_tree_view_append_column(GTK_TREE_VIEW(ewl->view), column);
560         gtk_tree_view_column_set_sort_column_id(column, DESKTOP_FILE_COLUMN_KEY);
561
562         column = gtk_tree_view_column_new();
563         gtk_tree_view_column_set_title(column, _("Path"));
564         gtk_tree_view_column_set_resizable(column, TRUE);
565         renderer = gtk_cell_renderer_text_new();
566         gtk_tree_view_column_pack_start(column, renderer, FALSE);
567         gtk_tree_view_column_add_attribute(column, renderer, "text", DESKTOP_FILE_COLUMN_PATH);
568         gtk_tree_view_append_column(GTK_TREE_VIEW(ewl->view), column);
569         gtk_tree_view_column_set_sort_column_id(column, DESKTOP_FILE_COLUMN_PATH);
570
571         /* set up sorting */
572         store = gtk_tree_view_get_model(GTK_TREE_VIEW(ewl->view));
573         sortable = GTK_TREE_SORTABLE(store);
574         gtk_tree_sortable_set_sort_func(sortable, DESKTOP_FILE_COLUMN_KEY, editor_list_window_sort_cb,
575                                         GINT_TO_POINTER(DESKTOP_FILE_COLUMN_KEY), NULL);
576         gtk_tree_sortable_set_sort_func(sortable, DESKTOP_FILE_COLUMN_HIDDEN, editor_list_window_sort_cb,
577                                         GINT_TO_POINTER(DESKTOP_FILE_COLUMN_HIDDEN), NULL);
578         gtk_tree_sortable_set_sort_func(sortable, DESKTOP_FILE_COLUMN_NAME, editor_list_window_sort_cb,
579                                         GINT_TO_POINTER(DESKTOP_FILE_COLUMN_NAME), NULL);
580         gtk_tree_sortable_set_sort_func(sortable, DESKTOP_FILE_COLUMN_PATH, editor_list_window_sort_cb,
581                                         GINT_TO_POINTER(DESKTOP_FILE_COLUMN_PATH), NULL);
582
583         /* set initial sort order */
584         //gtk_tree_sortable_set_sort_column_id(sortable, DESKTOP_FILE_COLUMN_KEY, GTK_SORT_ASCENDING);
585
586         gtk_container_add(GTK_CONTAINER(scrolled), ewl->view);
587         gtk_widget_show(ewl->view);
588
589         gtk_widget_show(ewl->window);
590 }
591
592 /*
593  *-----------------------------------------------------------------------------
594  * config window show (public)
595  *-----------------------------------------------------------------------------
596  */
597
598 void show_editor_list_window(void)
599 {
600         if (editor_list_window)
601                 {
602                 gtk_window_present(GTK_WINDOW(editor_list_window));
603                 return;
604                 }
605
606         editor_list_window_create();
607 }
608 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */