testfilechooserbutton.c 12.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 2 -*- */

/* GTK+: gtkfilechooserbutton.c
 * 
 * Copyright (c) 2004 James M. Cape <jcape@ignore-your.tv>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
Javier Jardón's avatar
Javier Jardón committed
18
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
19 20
 */

21
#include "config.h"
22 23 24 25

#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
26 27 28 29 30 31 32 33 34 35

#include <sys/types.h>
#include <sys/stat.h>

#include <string.h>

#include <gtk/gtk.h>

#include "prop-editor.h"

36 37 38 39 40 41 42 43 44 45
static gchar *backend = "gtk+";
static gboolean rtl = FALSE;
static GOptionEntry entries[] = {
  { "backend", 'b', 0, G_OPTION_ARG_STRING, &backend, "The filesystem backend to use.", "gtk+" },
  { "right-to-left", 'r', 0, G_OPTION_ARG_NONE, &rtl, "Force right-to-left layout.", NULL },
  { NULL }
};

static gchar *gtk_src_dir = NULL;

46 47 48 49

static void
win_style_set_cb (GtkWidget *win)
{
50 51 52 53 54 55 56 57 58
  GtkWidget *content_area, *action_area;

  content_area = gtk_dialog_get_content_area (GTK_DIALOG (win));
  action_area = gtk_dialog_get_action_area (GTK_DIALOG (win));

  gtk_container_set_border_width (GTK_CONTAINER (content_area), 12);
  gtk_box_set_spacing (GTK_BOX (content_area), 24);
  gtk_container_set_border_width (GTK_CONTAINER (action_area), 0);
  gtk_box_set_spacing (GTK_BOX (action_area), 6);
59 60 61
}

static gboolean
62 63 64
delete_event_cb (GtkWidget *editor,
		 gint       response,
		 gpointer   user_data)
65 66 67 68 69 70 71 72
{
  gtk_widget_hide (editor);

  return TRUE;
}


static void
73 74
properties_button_clicked_cb (GtkWidget *button,
			      GObject   *entry)
75 76 77 78 79 80 81 82
{
  GtkWidget *editor;

  editor = g_object_get_data (entry, "properties-dialog");

  if (editor == NULL)
    {
      editor = create_prop_editor (G_OBJECT (entry), G_TYPE_INVALID);
83
      gtk_container_set_border_width (GTK_CONTAINER (editor), 12);
84 85
      gtk_window_set_transient_for (GTK_WINDOW (editor),
				    GTK_WINDOW (gtk_widget_get_toplevel (button)));
86
      g_signal_connect (editor, "delete-event", G_CALLBACK (delete_event_cb), NULL);
87 88 89 90 91 92 93 94
      g_object_set_data (entry, "properties-dialog", editor);
    }

  gtk_window_present (GTK_WINDOW (editor));
}


static void
95 96 97 98 99 100 101 102 103 104 105 106 107 108
print_selected_path_clicked_cb (GtkWidget *button,
				gpointer   user_data)
{
  gchar *folder, *filename;

  folder = gtk_file_chooser_get_current_folder (user_data);
  filename = gtk_file_chooser_get_filename (user_data);
  g_message ("Currently Selected:\n\tFolder: `%s'\n\tFilename: `%s'\nDone.\n",
	     folder, filename);
  g_free (folder);
  g_free (filename);
}

static void
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
add_pwds_parent_as_shortcut_clicked_cb (GtkWidget *button,
					gpointer   user_data)
{
  GError *err = NULL;

  if (!gtk_file_chooser_add_shortcut_folder (user_data, gtk_src_dir, &err))
    {
      g_message ("Couldn't add `%s' as shortcut folder: %s", gtk_src_dir,
		 err->message);
      g_error_free (err);
    }
  else
    {
      g_message ("Added `%s' as shortcut folder.", gtk_src_dir);
    }
}

static void
del_pwds_parent_as_shortcut_clicked_cb (GtkWidget *button,
					gpointer   user_data)
{
  GError *err = NULL;

  if (!gtk_file_chooser_remove_shortcut_folder (user_data, gtk_src_dir, &err))
    {
      g_message ("Couldn't remove `%s' as shortcut folder: %s", gtk_src_dir,
		 err->message);
      g_error_free (err);
    }
  else
    {
      g_message ("Removed `%s' as shortcut folder.", gtk_src_dir);
    }
}

144 145 146 147 148 149 150
static void
unselect_all_clicked_cb (GtkWidget *button,
                         gpointer   user_data)
{
  gtk_file_chooser_unselect_all (user_data);
}

151 152
static void
tests_button_clicked_cb (GtkButton *real_button,
153 154 155 156 157 158 159 160
			 gpointer   user_data)
{
  GtkWidget *tests;

  tests = g_object_get_data (user_data, "tests-dialog");

  if (tests == NULL)
    {
161
      GtkWidget *box, *button;
162 163 164 165 166 167

      tests = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_window_set_title (GTK_WINDOW (tests),
			    "Tests - TestFileChooserButton");
      gtk_container_set_border_width (GTK_CONTAINER (tests), 12);
      gtk_window_set_transient_for (GTK_WINDOW (tests),
168
				    GTK_WINDOW (gtk_widget_get_toplevel (user_data)));
169

170
      box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
171 172 173
      gtk_container_add (GTK_CONTAINER (tests), box);
      gtk_widget_show (box);

174 175
      button = gtk_button_new_with_label ("Print Selected Path");
      g_signal_connect (button, "clicked",
176
			G_CALLBACK (print_selected_path_clicked_cb), user_data);
177 178 179 180 181 182 183 184 185 186 187 188 189 190
      gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
      gtk_widget_show (button);

      button = gtk_button_new_with_label ("Add $PWD's Parent as Shortcut");
      g_signal_connect (button, "clicked",
			G_CALLBACK (add_pwds_parent_as_shortcut_clicked_cb), user_data);
      gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
      gtk_widget_show (button);

      button = gtk_button_new_with_label ("Remove $PWD's Parent as Shortcut");
      g_signal_connect (button, "clicked",
			G_CALLBACK (del_pwds_parent_as_shortcut_clicked_cb), user_data);
      gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
      gtk_widget_show (button);
191

192 193 194 195 196 197
      button = gtk_button_new_with_label ("Unselect all");
      g_signal_connect (button, "clicked",
			G_CALLBACK (unselect_all_clicked_cb), user_data);
      gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
      gtk_widget_show (button);

198 199 200 201 202 203 204 205 206 207
      g_signal_connect (tests, "delete-event", G_CALLBACK (delete_event_cb), NULL);
      g_object_set_data (user_data, "tests-dialog", tests);
    }

  gtk_window_present (GTK_WINDOW (tests));
}

static void
chooser_current_folder_changed_cb (GtkFileChooser *chooser,
				   gpointer        user_data)
208 209 210
{
  gchar *folder, *filename;

211 212
  folder = gtk_file_chooser_get_current_folder_uri (chooser);
  filename = gtk_file_chooser_get_uri (chooser);
213
  g_message ("%s::current-folder-changed\n\tFolder: `%s'\n\tFilename: `%s'\nDone.\n",
214 215 216 217 218 219
	     G_OBJECT_TYPE_NAME (chooser), folder, filename);
  g_free (folder);
  g_free (filename);
}

static void
220 221
chooser_selection_changed_cb (GtkFileChooser *chooser,
			      gpointer        user_data)
222
{
223
  gchar *filename;
224

225
  filename = gtk_file_chooser_get_uri (chooser);
226 227 228
  g_message ("%s::selection-changed\n\tSelection:`%s'\nDone.\n",
	     G_OBJECT_TYPE_NAME (chooser), filename);
  g_free (filename);
229 230 231
}

static void
232 233
chooser_file_activated_cb (GtkFileChooser *chooser,
			   gpointer        user_data)
234 235 236
{
  gchar *folder, *filename;

237 238
  folder = gtk_file_chooser_get_current_folder_uri (chooser);
  filename = gtk_file_chooser_get_uri (chooser);
239 240
  g_message ("%s::file-activated\n\tFolder: `%s'\n\tFilename: `%s'\nDone.\n",
	     G_OBJECT_TYPE_NAME (chooser), folder, filename);
241 242 243 244 245
  g_free (folder);
  g_free (filename);
}

static void
246 247
chooser_update_preview_cb (GtkFileChooser *chooser,
			   gpointer        user_data)
248 249 250
{
  gchar *filename;

251
  filename = gtk_file_chooser_get_preview_uri (chooser);
252 253 254 255 256 257
  if (filename != NULL)
    {
      g_message ("%s::update-preview\n\tPreview Filename: `%s'\nDone.\n",
		 G_OBJECT_TYPE_NAME (chooser), filename);
      g_free (filename);
    }
258 259
}

260

261
int
262 263
main (int   argc,
      char *argv[])
264
{
265 266
  GtkWidget *win, *vbox, *frame, *alignment, *group_box;
  GtkWidget *hbox, *label, *chooser, *button;
267
  GtkSizeGroup *label_group;
268
  GOptionContext *context;
Javier Jardón's avatar
Javier Jardón committed
269
  gchar *cwd;
270 271 272 273 274 275 276

  context = g_option_context_new ("- test GtkFileChooserButton widget");
  g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
  g_option_context_add_group (context, gtk_get_option_group (TRUE));
  g_option_context_parse (context, &argc, &argv, NULL);
  g_option_context_free (context);

277 278
  gtk_init (&argc, &argv);

279 280
  /* to test rtl layout, use "--right-to-left" */
  if (rtl)
281 282
    gtk_widget_set_default_direction (GTK_TEXT_DIR_RTL);

Javier Jardón's avatar
Javier Jardón committed
283
  cwd = g_get_current_dir();
284
  gtk_src_dir = g_path_get_dirname (cwd);
Javier Jardón's avatar
Javier Jardón committed
285
  g_free (cwd);
286

287
  win = gtk_dialog_new_with_buttons ("TestFileChooserButton", NULL, 0,
288 289 290 291
				     GTK_STOCK_QUIT, GTK_RESPONSE_CLOSE, NULL);
  g_signal_connect (win, "style-set", G_CALLBACK (win_style_set_cb), NULL);
  g_signal_connect (win, "response", G_CALLBACK (gtk_main_quit), NULL);

292
  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 18);
293
  gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (win))), vbox);
294 295 296 297 298 299 300 301 302 303 304 305

  frame = gtk_frame_new ("<b>GtkFileChooserButton</b>");
  gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
  gtk_label_set_use_markup (GTK_LABEL (gtk_frame_get_label_widget (GTK_FRAME (frame))), TRUE);
  gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);

  alignment = gtk_alignment_new (0.0, 0.0, 1.0, 1.0);
  gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 0, 12, 0);
  gtk_container_add (GTK_CONTAINER (frame), alignment);
  
  label_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
  
306
  group_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
307 308
  gtk_container_add (GTK_CONTAINER (alignment), group_box);

309
  /* OPEN */
310
  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
311
  gtk_box_pack_start (GTK_BOX (group_box), hbox, FALSE, FALSE, 0);
312

Matthias Clasen's avatar
Matthias Clasen committed
313
  label = gtk_label_new_with_mnemonic ("_Open:");
314 315 316 317
  gtk_size_group_add_widget (GTK_SIZE_GROUP (label_group), label);
  gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);

318 319
  chooser = gtk_file_chooser_button_new ("Select A File - testfilechooserbutton",
                                         GTK_FILE_CHOOSER_ACTION_OPEN);
320 321
  gtk_file_chooser_add_shortcut_folder (GTK_FILE_CHOOSER (chooser), gtk_src_dir, NULL);
  gtk_file_chooser_remove_shortcut_folder (GTK_FILE_CHOOSER (chooser), gtk_src_dir, NULL);
322 323 324 325 326 327
  gtk_label_set_mnemonic_widget (GTK_LABEL (label), chooser);
  g_signal_connect (chooser, "current-folder-changed",
		    G_CALLBACK (chooser_current_folder_changed_cb), NULL);
  g_signal_connect (chooser, "selection-changed", G_CALLBACK (chooser_selection_changed_cb), NULL);
  g_signal_connect (chooser, "file-activated", G_CALLBACK (chooser_file_activated_cb), NULL);
  g_signal_connect (chooser, "update-preview", G_CALLBACK (chooser_update_preview_cb), NULL);
328
  gtk_box_pack_start (GTK_BOX (hbox), chooser, TRUE, TRUE, 0);
329

330
  button = gtk_button_new_from_stock (GTK_STOCK_PROPERTIES);
331 332 333
  g_signal_connect (button, "clicked", G_CALLBACK (properties_button_clicked_cb), chooser);
  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);

334 335 336 337
  button = gtk_button_new_with_label ("Tests");
  g_signal_connect (button, "clicked", G_CALLBACK (tests_button_clicked_cb), chooser);
  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);

338
  /* SELECT_FOLDER */
339
  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
340 341 342 343 344 345 346
  gtk_box_pack_start (GTK_BOX (group_box), hbox, FALSE, FALSE, 0);

  label = gtk_label_new_with_mnemonic ("Select _Folder:");
  gtk_size_group_add_widget (GTK_SIZE_GROUP (label_group), label);
  gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);

347 348
  chooser = gtk_file_chooser_button_new ("Select A Folder - testfilechooserbutton",
                                         GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
349 350 351
  gtk_file_chooser_add_shortcut_folder (GTK_FILE_CHOOSER (chooser), gtk_src_dir, NULL);
  gtk_file_chooser_remove_shortcut_folder (GTK_FILE_CHOOSER (chooser), gtk_src_dir, NULL);
  gtk_file_chooser_add_shortcut_folder (GTK_FILE_CHOOSER (chooser), gtk_src_dir, NULL);
352 353 354 355 356 357
  gtk_label_set_mnemonic_widget (GTK_LABEL (label), chooser);
  g_signal_connect (chooser, "current-folder-changed",
		    G_CALLBACK (chooser_current_folder_changed_cb), NULL);
  g_signal_connect (chooser, "selection-changed", G_CALLBACK (chooser_selection_changed_cb), NULL);
  g_signal_connect (chooser, "file-activated", G_CALLBACK (chooser_file_activated_cb), NULL);
  g_signal_connect (chooser, "update-preview", G_CALLBACK (chooser_update_preview_cb), NULL);
358
  gtk_box_pack_start (GTK_BOX (hbox), chooser, TRUE, TRUE, 0);
359

360
  button = gtk_button_new_from_stock (GTK_STOCK_PROPERTIES);
361 362 363
  g_signal_connect (button, "clicked", G_CALLBACK (properties_button_clicked_cb), chooser);
  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);

364 365
  button = gtk_button_new_with_label ("Tests");
  g_signal_connect (button, "clicked", G_CALLBACK (tests_button_clicked_cb), chooser);
366 367 368 369 370 371 372 373 374 375 376
  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);

  g_object_unref (label_group);

  gtk_widget_show_all (win);
  gtk_window_present (GTK_WINDOW (win));

  gtk_main ();

  return 0;
}