]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * viking -- GPS Data and Topo Analyzer, Explorer, and Manager | |
3 | * | |
4 | * Copyright (C) 2003-2005, Evan Battaglia <gtoevan@gmx.net> | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License as published by | |
8 | * the Free Software Foundation; either version 2 of the License, or | |
9 | * (at your option) any later version. | |
10 | * | |
11 | * This program is distributed in the hope that it will be useful, | |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | * GNU General Public License for more details. | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License | |
17 | * along with this program; if not, write to the Free Software | |
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 | * | |
20 | */ | |
21 | ||
22 | #ifdef HAVE_CONFIG_H | |
23 | #include "config.h" | |
24 | #endif | |
25 | ||
26 | #include <gtk/gtk.h> | |
27 | #include <glib/gi18n.h> | |
28 | ||
29 | #include "vikfilelist.h" | |
30 | ||
31 | struct _VikFileList { | |
32 | GtkVBox parent; | |
33 | GtkWidget *treeview; | |
34 | GtkWidget *file_selector; | |
35 | GtkTreeModel *model; | |
36 | }; | |
37 | ||
38 | static void file_list_add ( VikFileList *vfl ) | |
39 | { | |
40 | GSList *files = NULL; | |
41 | GSList *fiter = NULL; | |
42 | ||
43 | if ( ! vfl->file_selector ) | |
44 | { | |
45 | GtkWidget *win; | |
46 | g_assert ( (win = gtk_widget_get_toplevel(GTK_WIDGET(vfl))) ); | |
47 | vfl->file_selector = gtk_file_chooser_dialog_new (_("Choose file(s)"), | |
48 | GTK_WINDOW(win), | |
49 | GTK_FILE_CHOOSER_ACTION_OPEN, | |
50 | GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | |
51 | GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, | |
52 | NULL); | |
53 | gtk_file_chooser_set_select_multiple ( GTK_FILE_CHOOSER(vfl->file_selector), TRUE ); | |
54 | gtk_window_set_transient_for ( GTK_WINDOW(vfl->file_selector), GTK_WINDOW(win) ); | |
55 | gtk_window_set_destroy_with_parent ( GTK_WINDOW(vfl->file_selector), TRUE ); | |
56 | } | |
57 | ||
58 | if ( gtk_dialog_run ( GTK_DIALOG(vfl->file_selector) ) == GTK_RESPONSE_ACCEPT ) { | |
59 | files = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER(vfl->file_selector) ); | |
60 | fiter = files; | |
61 | GtkTreeIter iter; | |
62 | while ( fiter ) { | |
63 | gchar *file_name = fiter->data; | |
64 | ||
65 | gtk_list_store_append ( GTK_LIST_STORE(vfl->model), &iter ); | |
66 | gtk_list_store_set ( GTK_LIST_STORE(vfl->model), &iter, 0, file_name, -1 ); | |
67 | ||
68 | g_free (file_name); | |
69 | ||
70 | fiter = g_slist_next (fiter); | |
71 | } | |
72 | g_slist_free (files); | |
73 | } | |
74 | gtk_widget_hide ( vfl->file_selector ); | |
75 | } | |
76 | ||
77 | static void file_list_del ( VikFileList *vfl ) | |
78 | { | |
79 | GtkTreeSelection *ts = gtk_tree_view_get_selection (GTK_TREE_VIEW(vfl->treeview)); | |
80 | GtkTreeIter iter; | |
81 | if ( gtk_tree_selection_get_selected(ts, NULL, &iter) ) | |
82 | gtk_list_store_remove(GTK_LIST_STORE(vfl->model), &iter); | |
83 | } | |
84 | ||
85 | GType vik_file_list_get_type (void) | |
86 | { | |
87 | static GType vs_type = 0; | |
88 | ||
89 | if (!vs_type) | |
90 | { | |
91 | static const GTypeInfo vs_info = | |
92 | { | |
93 | sizeof (VikFileListClass), | |
94 | NULL, /* base_init */ | |
95 | NULL, /* base_finalize */ | |
96 | NULL, /* class init */ | |
97 | NULL, /* class_finalize */ | |
98 | NULL, /* class_data */ | |
99 | sizeof (VikFileList), | |
100 | 0, | |
101 | NULL /* instance init */ | |
102 | }; | |
103 | vs_type = g_type_register_static ( GTK_TYPE_VBOX, "VikFileList", &vs_info, 0 ); | |
104 | } | |
105 | ||
106 | return vs_type; | |
107 | } | |
108 | ||
109 | GtkWidget *vik_file_list_new ( const gchar *title ) | |
110 | { | |
111 | GtkWidget *add_btn, *del_btn; | |
112 | GtkWidget *hbox, *scrolledwindow; | |
113 | VikFileList *vfl = VIK_FILE_LIST ( g_object_new ( VIK_FILE_LIST_TYPE, NULL ) ); | |
114 | ||
115 | GtkTreeViewColumn *column; | |
116 | ||
117 | vfl->model = GTK_TREE_MODEL ( gtk_list_store_new(1, G_TYPE_STRING) ); | |
118 | ||
119 | vfl->treeview = gtk_tree_view_new ( ); | |
120 | gtk_tree_view_set_model ( GTK_TREE_VIEW(vfl->treeview), vfl->model ); | |
121 | column = gtk_tree_view_column_new_with_attributes ( title, gtk_cell_renderer_text_new (), "text", 0, NULL); | |
122 | gtk_tree_view_append_column (GTK_TREE_VIEW (vfl->treeview), column); | |
123 | ||
124 | gtk_widget_set_size_request ( vfl->treeview, 200, 100); | |
125 | ||
126 | add_btn = gtk_button_new_with_label(_("Add...")); | |
127 | del_btn = gtk_button_new_with_label(_("Delete")); | |
128 | ||
129 | g_signal_connect_swapped ( G_OBJECT(add_btn), "clicked", G_CALLBACK(file_list_add), vfl ); | |
130 | g_signal_connect_swapped ( G_OBJECT(del_btn), "clicked", G_CALLBACK(file_list_del), vfl ); | |
131 | ||
132 | hbox = gtk_hbox_new(FALSE, 2); | |
133 | ||
134 | scrolledwindow = gtk_scrolled_window_new ( NULL, NULL ); | |
135 | gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); | |
136 | gtk_container_add ( GTK_CONTAINER(scrolledwindow), GTK_WIDGET(vfl->treeview) ); | |
137 | ||
138 | gtk_box_pack_start ( GTK_BOX(vfl), scrolledwindow, TRUE, TRUE, 3 ); | |
139 | ||
140 | ||
141 | gtk_box_pack_start ( GTK_BOX(hbox), add_btn, TRUE, TRUE, 3 ); | |
142 | gtk_box_pack_start ( GTK_BOX(hbox), del_btn, TRUE, TRUE, 3 ); | |
143 | gtk_box_pack_start ( GTK_BOX(vfl), hbox, FALSE, FALSE, 3 ); | |
144 | gtk_widget_show_all(GTK_WIDGET(vfl)); | |
145 | ||
146 | vfl->file_selector = NULL; | |
147 | ||
148 | return GTK_WIDGET(vfl); | |
149 | } | |
150 | ||
151 | static gboolean get_file_name(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, GList **list) | |
152 | { | |
153 | gchar *str; | |
154 | gtk_tree_model_get ( model, iter, 0, &str, -1 ); | |
155 | g_debug ("%s: %s", __FUNCTION__, str); | |
156 | (*list) = g_list_append((*list), g_strdup(str)); | |
157 | return FALSE; | |
158 | } | |
159 | ||
160 | GList *vik_file_list_get_files ( VikFileList *vfl ) | |
161 | { | |
162 | GList *list = NULL; | |
163 | gtk_tree_model_foreach (vfl->model, (GtkTreeModelForeachFunc) get_file_name, &list); | |
164 | return list; | |
165 | } | |
166 | ||
167 | void vik_file_list_set_files ( VikFileList *vfl, GList *files ) | |
168 | { | |
169 | while (files) { | |
170 | GtkTreeIter iter; | |
171 | gtk_list_store_append ( GTK_LIST_STORE(vfl->model), &iter ); | |
172 | gtk_list_store_set ( GTK_LIST_STORE(vfl->model), &iter, 0, files->data, -1 ); | |
173 | files = files->next; | |
174 | } | |
175 | } |