gtkfilechooserutils.c 12.1 KB
Newer Older
Owen Taylor's avatar
Owen Taylor committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/* GTK - The GIMP Toolkit
 * gtkfilechooserutils.c: Private utility functions useful for
 *                        implementing a GtkFileChooser interface
 * Copyright (C) 2003, Red Hat, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

22
#include <config.h>
Owen Taylor's avatar
Owen Taylor committed
23 24
#include "gtkfilechooserutils.h"
#include "gtkfilechooser.h"
25
#include "gtkfilesystem.h"
26
#include "gtktypebuiltins.h"
Matthias Clasen's avatar
Matthias Clasen committed
27
#include "gtkintl.h"
28
#include "gtkalias.h"
Owen Taylor's avatar
Owen Taylor committed
29

30 31 32
static gboolean       delegate_set_current_folder     (GtkFileChooser    *chooser,
						       const GtkFilePath *path,
						       GError           **error);
33
static GtkFilePath *  delegate_get_current_folder     (GtkFileChooser    *chooser);
34 35
static void           delegate_set_current_name       (GtkFileChooser    *chooser,
						       const gchar       *name);
36 37 38
static gboolean       delegate_select_path            (GtkFileChooser    *chooser,
						       const GtkFilePath *path,
						       GError           **error);
39 40 41 42 43
static void           delegate_unselect_path          (GtkFileChooser    *chooser,
						       const GtkFilePath *path);
static void           delegate_select_all             (GtkFileChooser    *chooser);
static void           delegate_unselect_all           (GtkFileChooser    *chooser);
static GSList *       delegate_get_paths              (GtkFileChooser    *chooser);
44
static GtkFilePath *  delegate_get_preview_path       (GtkFileChooser    *chooser);
45
static GtkFileSystem *delegate_get_file_system        (GtkFileChooser    *chooser);
Owen Taylor's avatar
Owen Taylor committed
46 47 48 49 50
static void           delegate_add_filter             (GtkFileChooser    *chooser,
						       GtkFileFilter     *filter);
static void           delegate_remove_filter          (GtkFileChooser    *chooser,
						       GtkFileFilter     *filter);
static GSList *       delegate_list_filters           (GtkFileChooser    *chooser);
51 52 53 54 55 56 57
static gboolean       delegate_add_shortcut_folder    (GtkFileChooser    *chooser,
						       const GtkFilePath *path,
						       GError           **error);
static gboolean       delegate_remove_shortcut_folder (GtkFileChooser    *chooser,
						       const GtkFilePath *path,
						       GError           **error);
static GSList *       delegate_list_shortcut_folders  (GtkFileChooser    *chooser);
Owen Taylor's avatar
Owen Taylor committed
58 59 60
static void           delegate_notify                 (GObject           *object,
						       GParamSpec        *pspec,
						       gpointer           data);
61 62 63 64
static void           delegate_current_folder_changed (GtkFileChooser    *chooser,
						       gpointer           data);
static void           delegate_selection_changed      (GtkFileChooser    *chooser,
						       gpointer           data);
65 66
static void           delegate_update_preview         (GtkFileChooser    *chooser,
						       gpointer           data);
67 68
static void           delegate_file_activated         (GtkFileChooser    *chooser,
						       gpointer           data);
Owen Taylor's avatar
Owen Taylor committed
69

70 71 72
static GtkFileChooserConfirmation delegate_confirm_overwrite (GtkFileChooser    *chooser,
							      gpointer           data);

73 74 75
/**
 * _gtk_file_chooser_install_properties:
 * @klass: the class structure for a type deriving from #GObject
76
 *
77 78 79 80 81 82 83
 * Installs the necessary properties for a class implementing
 * #GtkFileChooser. A #GtkParamSpecOverride property is installed
 * for each property, using the values from the #GtkFileChooserProp
 * enumeration. The caller must make sure itself that the enumeration
 * values don't collide with some other property values they
 * are using.
 **/
Owen Taylor's avatar
Owen Taylor committed
84 85 86
void
_gtk_file_chooser_install_properties (GObjectClass *klass)
{
Owen Taylor's avatar
Owen Taylor committed
87 88 89 90 91 92 93
  g_object_class_override_property (klass,
				    GTK_FILE_CHOOSER_PROP_ACTION,
				    "action");
  g_object_class_override_property (klass,
				    GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET,
				    "extra-widget");
  g_object_class_override_property (klass,
94 95
				    GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND,
				    "file-system-backend");
Owen Taylor's avatar
Owen Taylor committed
96 97 98 99 100 101 102 103 104 105 106 107
  g_object_class_override_property (klass,
				    GTK_FILE_CHOOSER_PROP_FILTER,
				    "filter");
  g_object_class_override_property (klass,
				    GTK_FILE_CHOOSER_PROP_LOCAL_ONLY,
				    "local-only");
  g_object_class_override_property (klass,
				    GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET,
				    "preview-widget");
  g_object_class_override_property (klass,
				    GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET_ACTIVE,
				    "preview-widget-active");
108 109 110
  g_object_class_override_property (klass,
				    GTK_FILE_CHOOSER_PROP_USE_PREVIEW_LABEL,
				    "use-preview-label");
Owen Taylor's avatar
Owen Taylor committed
111 112 113 114 115 116
  g_object_class_override_property (klass,
				    GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE,
				    "select-multiple");
  g_object_class_override_property (klass,
				    GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN,
				    "show-hidden");
117 118 119
  g_object_class_override_property (klass,
				    GTK_FILE_CHOOSER_PROP_DO_OVERWRITE_CONFIRMATION,
				    "do-overwrite-confirmation");
Owen Taylor's avatar
Owen Taylor committed
120 121
}

122 123 124
/**
 * _gtk_file_chooser_delegate_iface_init:
 * @iface: a #GtkFileChoserIface structure
125
 *
126 127 128 129 130 131 132
 * An interface-initialization function for use in cases where
 * an object is simply delegating the methods, signals of
 * the #GtkFileChooser interface to another object.
 * _gtk_file_chooser_set_delegate() must be called on each
 * instance of the object so that the delegate object can
 * be found.
 **/
Owen Taylor's avatar
Owen Taylor committed
133 134 135 136 137
void
_gtk_file_chooser_delegate_iface_init (GtkFileChooserIface *iface)
{
  iface->set_current_folder = delegate_set_current_folder;
  iface->get_current_folder = delegate_get_current_folder;
138
  iface->set_current_name = delegate_set_current_name;
139 140
  iface->select_path = delegate_select_path;
  iface->unselect_path = delegate_unselect_path;
Owen Taylor's avatar
Owen Taylor committed
141 142
  iface->select_all = delegate_select_all;
  iface->unselect_all = delegate_unselect_all;
143
  iface->get_paths = delegate_get_paths;
144
  iface->get_preview_path = delegate_get_preview_path;
145
  iface->get_file_system = delegate_get_file_system;
Owen Taylor's avatar
Owen Taylor committed
146 147 148
  iface->add_filter = delegate_add_filter;
  iface->remove_filter = delegate_remove_filter;
  iface->list_filters = delegate_list_filters;
149 150 151
  iface->add_shortcut_folder = delegate_add_shortcut_folder;
  iface->remove_shortcut_folder = delegate_remove_shortcut_folder;
  iface->list_shortcut_folders = delegate_list_shortcut_folders;
Owen Taylor's avatar
Owen Taylor committed
152 153
}

154 155
/**
 * _gtk_file_chooser_set_delegate:
156 157
 * @receiver: a #GObject implementing #GtkFileChooser
 * @delegate: another #GObject implementing #GtkFileChooser
158 159 160 161
 *
 * Establishes that calls on @receiver for #GtkFileChooser
 * methods should be delegated to @delegate, and that
 * #GtkFileChooser signals emitted on @delegate should be
Matthias Clasen's avatar
Matthias Clasen committed
162
 * forwarded to @receiver. Must be used in conjunction with
163 164
 * _gtk_file_chooser_delegate_iface_init().
 **/
Owen Taylor's avatar
Owen Taylor committed
165 166 167 168 169 170
void
_gtk_file_chooser_set_delegate (GtkFileChooser *receiver,
				GtkFileChooser *delegate)
{
  g_return_if_fail (GTK_IS_FILE_CHOOSER (receiver));
  g_return_if_fail (GTK_IS_FILE_CHOOSER (delegate));
171

Matthias Clasen's avatar
Matthias Clasen committed
172
  g_object_set_data (G_OBJECT (receiver), I_("gtk-file-chooser-delegate"), delegate);
Owen Taylor's avatar
Owen Taylor committed
173 174
  g_signal_connect (delegate, "notify",
		    G_CALLBACK (delegate_notify), receiver);
175
  g_signal_connect (delegate, "current-folder-changed",
Owen Taylor's avatar
Owen Taylor committed
176
		    G_CALLBACK (delegate_current_folder_changed), receiver);
177
  g_signal_connect (delegate, "selection-changed",
Owen Taylor's avatar
Owen Taylor committed
178
		    G_CALLBACK (delegate_selection_changed), receiver);
179 180
  g_signal_connect (delegate, "update-preview",
		    G_CALLBACK (delegate_update_preview), receiver);
181 182
  g_signal_connect (delegate, "file-activated",
		    G_CALLBACK (delegate_file_activated), receiver);
183 184
  g_signal_connect (delegate, "confirm-overwrite",
		    G_CALLBACK (delegate_confirm_overwrite), receiver);
Owen Taylor's avatar
Owen Taylor committed
185 186
}

187 188 189 190 191 192 193 194 195 196 197
GQuark
_gtk_file_chooser_delegate_get_quark (void)
{
  static GQuark quark = 0;

  if (G_UNLIKELY (quark == 0))
    quark = g_quark_from_static_string ("gtk-file-chooser-delegate");
  
  return quark;
}

198
static GtkFileChooser *
Owen Taylor's avatar
Owen Taylor committed
199 200
get_delegate (GtkFileChooser *receiver)
{
201 202
  return g_object_get_qdata (G_OBJECT (receiver),
			     GTK_FILE_CHOOSER_DELEGATE_QUARK);
Owen Taylor's avatar
Owen Taylor committed
203 204
}

205
static gboolean
206
delegate_select_path (GtkFileChooser    *chooser,
207 208
		      const GtkFilePath *path,
		      GError           **error)
Owen Taylor's avatar
Owen Taylor committed
209
{
210
  return _gtk_file_chooser_select_path (get_delegate (chooser), path, error);
Owen Taylor's avatar
Owen Taylor committed
211 212 213
}

static void
214 215
delegate_unselect_path (GtkFileChooser    *chooser,
			const GtkFilePath *path)
Owen Taylor's avatar
Owen Taylor committed
216
{
217
  _gtk_file_chooser_unselect_path (get_delegate (chooser), path);
Owen Taylor's avatar
Owen Taylor committed
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
}

static void
delegate_select_all (GtkFileChooser *chooser)
{
  gtk_file_chooser_select_all (get_delegate (chooser));
}

static void
delegate_unselect_all (GtkFileChooser *chooser)
{
  gtk_file_chooser_unselect_all (get_delegate (chooser));
}

static GSList *
233
delegate_get_paths (GtkFileChooser *chooser)
Owen Taylor's avatar
Owen Taylor committed
234
{
235 236 237
  return _gtk_file_chooser_get_paths (get_delegate (chooser));
}

238 239 240 241 242 243
static GtkFilePath *
delegate_get_preview_path (GtkFileChooser *chooser)
{
  return _gtk_file_chooser_get_preview_path (get_delegate (chooser));
}

244 245 246 247
static GtkFileSystem *
delegate_get_file_system (GtkFileChooser *chooser)
{
  return _gtk_file_chooser_get_file_system (get_delegate (chooser));
Owen Taylor's avatar
Owen Taylor committed
248 249
}

Owen Taylor's avatar
Owen Taylor committed
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
static void
delegate_add_filter (GtkFileChooser *chooser,
		     GtkFileFilter  *filter)
{
  gtk_file_chooser_add_filter (get_delegate (chooser), filter);
}

static void
delegate_remove_filter (GtkFileChooser *chooser,
			GtkFileFilter  *filter)
{
  gtk_file_chooser_remove_filter (get_delegate (chooser), filter);
}

static GSList *
delegate_list_filters (GtkFileChooser *chooser)
{
  return gtk_file_chooser_list_filters (get_delegate (chooser));
}

270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
static gboolean
delegate_add_shortcut_folder (GtkFileChooser    *chooser,
			      const GtkFilePath *path,
			      GError           **error)
{
  return _gtk_file_chooser_add_shortcut_folder (get_delegate (chooser), path, error);
}

static gboolean
delegate_remove_shortcut_folder (GtkFileChooser    *chooser,
				 const GtkFilePath *path,
				 GError           **error)
{
  return _gtk_file_chooser_remove_shortcut_folder (get_delegate (chooser), path, error);
}

static GSList *
delegate_list_shortcut_folders (GtkFileChooser *chooser)
{
  return gtk_file_chooser_list_shortcut_folders (get_delegate (chooser));
}

292
static gboolean
293
delegate_set_current_folder (GtkFileChooser    *chooser,
294 295
			     const GtkFilePath *path,
			     GError           **error)
Owen Taylor's avatar
Owen Taylor committed
296
{
297
  return _gtk_file_chooser_set_current_folder_path (get_delegate (chooser), path, error);
Owen Taylor's avatar
Owen Taylor committed
298 299
}

300
static GtkFilePath *
Owen Taylor's avatar
Owen Taylor committed
301 302
delegate_get_current_folder (GtkFileChooser *chooser)
{
303 304 305 306 307 308 309 310
  return _gtk_file_chooser_get_current_folder_path (get_delegate (chooser));
}

static void
delegate_set_current_name (GtkFileChooser *chooser,
			   const gchar    *name)
{
  gtk_file_chooser_set_current_name (get_delegate (chooser), name);
Owen Taylor's avatar
Owen Taylor committed
311 312
}

Owen Taylor's avatar
Owen Taylor committed
313 314 315 316 317
static void
delegate_notify (GObject    *object,
		 GParamSpec *pspec,
		 gpointer    data)
{
318 319 320 321 322 323
  gpointer iface;

  iface = g_type_interface_peek (g_type_class_peek (G_OBJECT_TYPE (object)),
				 gtk_file_chooser_get_type ());
  if (g_object_interface_find_property (iface, pspec->name))
    g_object_notify (data, pspec->name);
Owen Taylor's avatar
Owen Taylor committed
324 325
}

Owen Taylor's avatar
Owen Taylor committed
326 327 328 329
static void
delegate_selection_changed (GtkFileChooser *chooser,
			    gpointer        data)
{
330
  g_signal_emit_by_name (data, "selection-changed");
Owen Taylor's avatar
Owen Taylor committed
331 332 333 334 335 336
}

static void
delegate_current_folder_changed (GtkFileChooser *chooser,
				 gpointer        data)
{
337 338 339 340 341 342 343 344
  g_signal_emit_by_name (data, "current-folder-changed");
}

static void
delegate_update_preview (GtkFileChooser    *chooser,
			 gpointer           data)
{
  g_signal_emit_by_name (data, "update-preview");
Owen Taylor's avatar
Owen Taylor committed
345
}
346 347 348 349 350 351 352

static void
delegate_file_activated (GtkFileChooser    *chooser,
			 gpointer           data)
{
  g_signal_emit_by_name (data, "file-activated");
}
353

354 355 356 357 358 359 360 361 362
static GtkFileChooserConfirmation
delegate_confirm_overwrite (GtkFileChooser    *chooser,
			    gpointer           data)
{
  GtkFileChooserConfirmation conf;

  g_signal_emit_by_name (data, "confirm-overwrite", &conf);
  return conf;
}