+/* ******************************* *
+ * GtkFileChooserIface Functions *
+ * ******************************* */
+static void
+gtk_file_chooser_button_file_chooser_iface_init (GtkFileChooserIface *iface)
+{
+ _gtk_file_chooser_delegate_iface_init (iface);
+
+ iface->add_shortcut_folder = gtk_file_chooser_button_add_shortcut_folder;
+ iface->remove_shortcut_folder = gtk_file_chooser_button_remove_shortcut_folder;
+}
+
+static gboolean
+gtk_file_chooser_button_add_shortcut_folder (GtkFileChooser *chooser,
+ const GtkFilePath *path,
+ GError **error)
+{
+ GtkFileChooser *delegate;
+ gboolean retval;
+
+ delegate = g_object_get_qdata (G_OBJECT (chooser),
+ GTK_FILE_CHOOSER_DELEGATE_QUARK);
+ retval = _gtk_file_chooser_add_shortcut_folder (delegate, path, error);
+
+ if (retval)
+ {
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (chooser);
+ GtkFileChooserButtonPrivate *priv = button->priv;
+ GtkTreeIter iter;
+ gint pos;
+
+ pos = model_get_type_position (button, ROW_TYPE_SHORTCUT);
+ pos += priv->n_shortcuts;
+
+ gtk_list_store_insert (GTK_LIST_STORE (priv->model), &iter, pos);
+ gtk_list_store_set (GTK_LIST_STORE (priv->model), &iter,
+ ICON_COLUMN, NULL,
+ DISPLAY_NAME_COLUMN, _(FALLBACK_DISPLAY_NAME),
+ TYPE_COLUMN, ROW_TYPE_SHORTCUT,
+ DATA_COLUMN, gtk_file_path_copy (path),
+ IS_FOLDER_COLUMN, FALSE,
+ -1);
+ set_info_for_path_at_iter (button, path, &iter);
+ priv->n_shortcuts++;
+
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter_model));
+ }
+
+ return retval;
+}
+
+static gboolean
+gtk_file_chooser_button_remove_shortcut_folder (GtkFileChooser *chooser,
+ const GtkFilePath *path,
+ GError **error)
+{
+ GtkFileChooser *delegate;
+ gboolean retval;
+
+ delegate = g_object_get_qdata (G_OBJECT (chooser),
+ GTK_FILE_CHOOSER_DELEGATE_QUARK);
+
+ retval = _gtk_file_chooser_remove_shortcut_folder (delegate, path, error);
+
+ if (retval)
+ {
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (chooser);
+ GtkFileChooserButtonPrivate *priv = button->priv;
+ GtkTreeIter iter;
+ gint pos;
+ gchar type;
+
+ pos = model_get_type_position (button, ROW_TYPE_SHORTCUT);
+ gtk_tree_model_iter_nth_child (priv->model, &iter, NULL, pos);
+
+ do
+ {
+ gpointer data;
+
+ gtk_tree_model_get (priv->model, &iter,
+ TYPE_COLUMN, &type,
+ DATA_COLUMN, &data,
+ -1);
+
+ if (type == ROW_TYPE_SHORTCUT &&
+ data &&
+ gtk_file_path_compare (data, path) == 0)
+ {
+ model_free_row_data (GTK_FILE_CHOOSER_BUTTON (chooser), &iter);
+ gtk_list_store_remove (GTK_LIST_STORE (priv->model), &iter);
+ priv->n_shortcuts--;
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter_model));
+ update_combo_box (GTK_FILE_CHOOSER_BUTTON (chooser));
+ break;
+ }
+ }
+ while (type == ROW_TYPE_SHORTCUT &&
+ gtk_tree_model_iter_next (priv->model, &iter));
+ }
+
+ return retval;
+}
+
+