source: trunk/third/ggv/src/ggv-file-sel.c @ 18703

Revision 18703, 4.8 KB checked in by ghudson, 21 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18702, which included commits to RCS files with non-trunk default branches.
Line 
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
2/*
3 * ggv-file-sel.c: a file selector for ggv
4 *
5 * Copyright (C) 2002 the Free Software Foundation
6 *
7 * Author: Jaka Mocnik  <jaka@gnu.org>
8 */
9
10#include <config.h>
11
12#include <libgnomevfs/gnome-vfs-utils.h>
13
14#include "ggv-file-sel.h"
15#include "ggvutils.h"
16
17static GtkFileSelectionClass *parent_class;
18
19static void
20ggv_file_sel_finalize(GObject *object)
21{
22        GgvFileSel *sel;
23
24        g_return_if_fail(object != NULL);
25        g_return_if_fail(GGV_IS_FILE_SEL(object));
26
27        sel = GGV_FILE_SEL(object);
28
29        if(sel->uri)
30                g_free(sel->uri);
31
32        if(G_OBJECT_CLASS(parent_class)->finalize)
33                G_OBJECT_CLASS(parent_class)->finalize(object);
34}
35
36static void
37ggv_file_sel_destroy(GtkObject *object)
38{
39        GgvFileSel *sel;
40
41        g_return_if_fail(object != NULL);
42        g_return_if_fail(GGV_IS_FILE_SEL(object));
43
44        sel = GGV_FILE_SEL(object);
45
46        if(GTK_OBJECT_CLASS(parent_class)->destroy)
47                GTK_OBJECT_CLASS(parent_class)->destroy(object);
48}
49
50static void
51ggv_file_sel_class_init(GgvFileSelClass *klass)
52{
53        GtkObjectClass *object_class;
54        GtkWidgetClass *widget_class;
55        GObjectClass *gobject_class;
56
57        gobject_class = (GObjectClass *) klass;
58        object_class = (GtkObjectClass *) klass;
59        widget_class = (GtkWidgetClass *) klass;
60
61        parent_class = g_type_class_peek_parent (klass);
62
63        gobject_class->finalize = ggv_file_sel_finalize;
64        object_class->destroy = ggv_file_sel_destroy;
65}
66
67static void
68ggv_file_sel_init (GgvFileSel *sel)
69{
70        sel->uri = NULL;
71}
72
73GType
74ggv_file_sel_get_type (void)
75{
76        static GType ggv_file_sel_type = 0;
77       
78        if(!ggv_file_sel_type) {
79                static const GTypeInfo ggv_file_sel_info =
80                {
81                        sizeof(GgvFileSelClass),
82                        NULL,           /* base_init */
83                        NULL,           /* base_finalize */
84                        (GClassInitFunc) ggv_file_sel_class_init,
85                        NULL,           /* class_finalize */
86                        NULL,           /* class_data */
87                        sizeof(GgvFileSel),
88                        0,              /* n_preallocs */
89                        (GInstanceInitFunc) ggv_file_sel_init,
90                };
91               
92                ggv_file_sel_type = g_type_register_static(GTK_TYPE_FILE_SELECTION,
93                                                         "GgvFileSel",
94                                                         &ggv_file_sel_info, 0);
95        }
96
97        return ggv_file_sel_type;
98}
99
100GtkWidget *
101ggv_file_sel_new(void)
102{
103        GgvFileSel *sel;
104
105        sel = GGV_FILE_SEL(g_object_new(GGV_TYPE_FILE_SEL, NULL));
106
107        return GTK_WIDGET(sel);
108}
109
110void
111ggv_file_sel_set_uri(GgvFileSel *sel, const gchar *uri)
112{
113        gchar *fname;
114
115        if((fname = gnome_vfs_get_local_path_from_uri(uri)) == NULL)
116                return;
117
118        gtk_file_selection_set_filename(GTK_FILE_SELECTION(sel),
119                                        fname);
120        g_free(fname);
121}
122
123gchar *
124ggv_file_sel_get_uri(GgvFileSel *sel)
125{
126        const gchar *fname;
127        gchar *uri = NULL;
128
129        fname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(sel));
130        if(!g_file_test(fname, G_FILE_TEST_EXISTS) ||
131           g_file_test(fname,
132                       G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_SYMLINK)) {
133                uri = ggv_filename_to_uri(fname);
134        }
135        return uri;
136}
137
138static void
139ggv_file_sel_ok_clicked(GtkWidget *w, gpointer data)
140{
141        GgvFileSel *sel = GGV_FILE_SEL(data);
142
143        if(sel->uri)
144                g_free(sel->uri);
145        sel->uri = ggv_file_sel_get_uri(sel);
146        gtk_main_quit();
147}
148
149static void
150ggv_file_sel_cancel_clicked(GtkWidget *w, gpointer data)
151{
152        GgvFileSel *sel = GGV_FILE_SEL(data);
153
154        if(sel->uri)
155                g_free(sel->uri);
156        sel->uri = NULL;
157        gtk_main_quit();
158}
159
160static gboolean
161ggv_file_sel_delete_event(GtkWidget *w, GdkEventAny *e, gpointer data)
162{
163        GgvFileSel *sel = GGV_FILE_SEL(data);
164
165        if(sel->uri)
166                g_free(sel->uri);
167        sel->uri = NULL;
168        gtk_main_quit();
169        return TRUE;
170}
171
172gchar *
173ggv_file_sel_request_uri(const gchar *title, const gchar *def_uri)
174{
175        GtkWidget *sel;
176        GtkFileSelection *fsel;
177        gchar *uri;
178
179        sel = ggv_file_sel_new();
180        fsel = GTK_FILE_SELECTION(sel);
181        gtk_window_set_title(GTK_WINDOW(sel), title);
182        if(def_uri != NULL)
183                ggv_file_sel_set_uri(GGV_FILE_SEL(sel), def_uri);
184        g_signal_connect(G_OBJECT(fsel->ok_button), "clicked",
185                         G_CALLBACK(ggv_file_sel_ok_clicked), sel);
186        g_signal_connect(G_OBJECT(fsel->cancel_button), "clicked",
187                         G_CALLBACK(ggv_file_sel_cancel_clicked), sel);
188        g_signal_connect(G_OBJECT(sel), "delete-event",
189                         G_CALLBACK(ggv_file_sel_delete_event), sel);
190        gtk_widget_show(sel);
191        gtk_main();
192        if(GGV_FILE_SEL(sel)->uri != NULL)
193                uri = g_strdup(GGV_FILE_SEL(sel)->uri);
194        else
195                uri = NULL;
196        gtk_widget_destroy(sel);
197        return uri;
198}
Note: See TracBrowser for help on using the repository browser.