1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2
3 /* fm-empty-view.c - implementation of empty view of directory.
4
5 Copyright (C) 2006 Free Software Foundation, Inc.
6
7 The Mate Library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public License as
9 published by the Free Software Foundation; either version 2 of the
10 License, or (at your option) any later version.
11
12 The Mate Library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details.
16
17 You should have received a copy of the GNU Library General Public
18 License along with the Mate Library; see the file COPYING.LIB. If not,
19 write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
20 Boston, MA 02110-1301, USA.
21
22 Authors: Christian Neumair <chris@mate-de.org>
23 */
24
25 #include <config.h>
26 #include <string.h>
27 #include <glib/gi18n.h>
28
29 #include <eel/eel-glib-extensions.h>
30 #include <eel/eel-gtk-macros.h>
31 #include <eel/eel-vfs-extensions.h>
32
33 #include <libcaja-private/caja-file-utilities.h>
34 #include <libcaja-private/caja-view.h>
35 #include <libcaja-private/caja-view-factory.h>
36
37 #include "fm-empty-view.h"
38
39 struct FMEmptyViewDetails
40 {
41 int number_of_files;
42 };
43
44 static GList *fm_empty_view_get_selection (FMDirectoryView *view);
45 static GList *fm_empty_view_get_selection_for_file_transfer (FMDirectoryView *view);
46 static void fm_empty_view_scroll_to_file (CajaView *view,
47 const char *uri);
48 static void fm_empty_view_iface_init (CajaViewIface *iface);
49
50 G_DEFINE_TYPE_WITH_CODE (FMEmptyView, fm_empty_view, FM_TYPE_DIRECTORY_VIEW,
51 G_IMPLEMENT_INTERFACE (CAJA_TYPE_VIEW,
52 fm_empty_view_iface_init));
53
54 /* for EEL_CALL_PARENT */
55 #define parent_class fm_empty_view_parent_class
56
57 static void
fm_empty_view_add_file(FMDirectoryView * view,CajaFile * file,CajaDirectory * directory)58 fm_empty_view_add_file (FMDirectoryView *view, CajaFile *file, CajaDirectory *directory)
59 {
60 static GTimer *timer = NULL;
61 static gdouble cumu = 0, elaps;
62 FM_EMPTY_VIEW (view)->details->number_of_files++;
63 cairo_surface_t *icon;
64
65 if (!timer) timer = g_timer_new ();
66
67 g_timer_start (timer);
68 icon = caja_file_get_icon_surface (file, caja_get_icon_size_for_zoom_level (CAJA_ZOOM_LEVEL_STANDARD),
69 TRUE, gtk_widget_get_scale_factor (GTK_WIDGET(view)), 0);
70
71 elaps = g_timer_elapsed (timer, NULL);
72 g_timer_stop (timer);
73
74 cairo_surface_destroy (icon);
75
76 cumu += elaps;
77 g_message ("entire loading: %.3f, cumulative %.3f", elaps, cumu);
78 }
79
80
81 static void
fm_empty_view_begin_loading(FMDirectoryView * view)82 fm_empty_view_begin_loading (FMDirectoryView *view)
83 {
84 }
85
86 static void
fm_empty_view_clear(FMDirectoryView * view)87 fm_empty_view_clear (FMDirectoryView *view)
88 {
89 }
90
91
92 static void
fm_empty_view_file_changed(FMDirectoryView * view,CajaFile * file,CajaDirectory * directory)93 fm_empty_view_file_changed (FMDirectoryView *view, CajaFile *file, CajaDirectory *directory)
94 {
95 }
96
97 static GtkWidget *
fm_empty_view_get_background_widget(FMDirectoryView * view)98 fm_empty_view_get_background_widget (FMDirectoryView *view)
99 {
100 return GTK_WIDGET (view);
101 }
102
103 static GList *
fm_empty_view_get_selection(FMDirectoryView * view)104 fm_empty_view_get_selection (FMDirectoryView *view)
105 {
106 return NULL;
107 }
108
109
110 static GList *
fm_empty_view_get_selection_for_file_transfer(FMDirectoryView * view)111 fm_empty_view_get_selection_for_file_transfer (FMDirectoryView *view)
112 {
113 return NULL;
114 }
115
116 static guint
fm_empty_view_get_item_count(FMDirectoryView * view)117 fm_empty_view_get_item_count (FMDirectoryView *view)
118 {
119 return FM_EMPTY_VIEW (view)->details->number_of_files;
120 }
121
122 static gboolean
fm_empty_view_is_empty(FMDirectoryView * view)123 fm_empty_view_is_empty (FMDirectoryView *view)
124 {
125 return FM_EMPTY_VIEW (view)->details->number_of_files == 0;
126 }
127
128 static void
fm_empty_view_end_file_changes(FMDirectoryView * view)129 fm_empty_view_end_file_changes (FMDirectoryView *view)
130 {
131 }
132
133 static void
fm_empty_view_remove_file(FMDirectoryView * view,CajaFile * file,CajaDirectory * directory)134 fm_empty_view_remove_file (FMDirectoryView *view, CajaFile *file, CajaDirectory *directory)
135 {
136 FM_EMPTY_VIEW (view)->details->number_of_files--;
137 g_assert (FM_EMPTY_VIEW (view)->details->number_of_files >= 0);
138 }
139
140 static void
fm_empty_view_set_selection(FMDirectoryView * view,GList * selection)141 fm_empty_view_set_selection (FMDirectoryView *view, GList *selection)
142 {
143 fm_directory_view_notify_selection_changed (view);
144 }
145
146 static void
fm_empty_view_select_all(FMDirectoryView * view)147 fm_empty_view_select_all (FMDirectoryView *view)
148 {
149 }
150
151 static void
fm_empty_view_reveal_selection(FMDirectoryView * view)152 fm_empty_view_reveal_selection (FMDirectoryView *view)
153 {
154 }
155
156 static void
fm_empty_view_merge_menus(FMDirectoryView * view)157 fm_empty_view_merge_menus (FMDirectoryView *view)
158 {
159 EEL_CALL_PARENT (FM_DIRECTORY_VIEW_CLASS, merge_menus, (view));
160 }
161
162 static void
fm_empty_view_update_menus(FMDirectoryView * view)163 fm_empty_view_update_menus (FMDirectoryView *view)
164 {
165 EEL_CALL_PARENT (FM_DIRECTORY_VIEW_CLASS, update_menus, (view));
166 }
167
168 /* Reset sort criteria and zoom level to match defaults */
169 static void
fm_empty_view_reset_to_defaults(FMDirectoryView * view)170 fm_empty_view_reset_to_defaults (FMDirectoryView *view)
171 {
172 }
173
174 static void
fm_empty_view_bump_zoom_level(FMDirectoryView * view,int zoom_increment)175 fm_empty_view_bump_zoom_level (FMDirectoryView *view, int zoom_increment)
176 {
177 }
178
179 static CajaZoomLevel
fm_empty_view_get_zoom_level(FMDirectoryView * view)180 fm_empty_view_get_zoom_level (FMDirectoryView *view)
181 {
182 return CAJA_ZOOM_LEVEL_STANDARD;
183 }
184
185 static void
fm_empty_view_zoom_to_level(FMDirectoryView * view,CajaZoomLevel zoom_level)186 fm_empty_view_zoom_to_level (FMDirectoryView *view,
187 CajaZoomLevel zoom_level)
188 {
189 }
190
191 static void
fm_empty_view_restore_default_zoom_level(FMDirectoryView * view)192 fm_empty_view_restore_default_zoom_level (FMDirectoryView *view)
193 {
194 }
195
196 static gboolean
fm_empty_view_can_zoom_in(FMDirectoryView * view)197 fm_empty_view_can_zoom_in (FMDirectoryView *view)
198 {
199 return FALSE;
200 }
201
202 static gboolean
fm_empty_view_can_zoom_out(FMDirectoryView * view)203 fm_empty_view_can_zoom_out (FMDirectoryView *view)
204 {
205 return FALSE;
206 }
207
208 static void
fm_empty_view_start_renaming_file(FMDirectoryView * view,CajaFile * file,gboolean select_all)209 fm_empty_view_start_renaming_file (FMDirectoryView *view,
210 CajaFile *file,
211 gboolean select_all)
212 {
213 }
214
215 static void
fm_empty_view_click_policy_changed(FMDirectoryView * directory_view)216 fm_empty_view_click_policy_changed (FMDirectoryView *directory_view)
217 {
218 }
219
220
221 static int
fm_empty_view_compare_files(FMDirectoryView * view,CajaFile * file1,CajaFile * file2)222 fm_empty_view_compare_files (FMDirectoryView *view, CajaFile *file1, CajaFile *file2)
223 {
224 if (file1 < file2)
225 {
226 return -1;
227 }
228
229 if (file1 > file2)
230 {
231 return +1;
232 }
233
234 return 0;
235 }
236
237 static gboolean
fm_empty_view_using_manual_layout(FMDirectoryView * view)238 fm_empty_view_using_manual_layout (FMDirectoryView *view)
239 {
240 return FALSE;
241 }
242
243 static void
fm_empty_view_end_loading(FMDirectoryView * view,gboolean all_files_seen)244 fm_empty_view_end_loading (FMDirectoryView *view,
245 gboolean all_files_seen)
246 {
247 }
248
249 static void
fm_empty_view_finalize(GObject * object)250 fm_empty_view_finalize (GObject *object)
251 {
252 FMEmptyView *empty_view;
253
254 empty_view = FM_EMPTY_VIEW (object);
255 g_free (empty_view->details);
256
257 G_OBJECT_CLASS (parent_class)->finalize (object);
258 }
259
260 static void
fm_empty_view_emblems_changed(FMDirectoryView * directory_view)261 fm_empty_view_emblems_changed (FMDirectoryView *directory_view)
262 {
263 }
264
265 static char *
fm_empty_view_get_first_visible_file(CajaView * view)266 fm_empty_view_get_first_visible_file (CajaView *view)
267 {
268 return NULL;
269 }
270
271 static void
fm_empty_view_scroll_to_file(CajaView * view,const char * uri)272 fm_empty_view_scroll_to_file (CajaView *view,
273 const char *uri)
274 {
275 }
276
277 static void
fm_empty_view_grab_focus(CajaView * view)278 fm_empty_view_grab_focus (CajaView *view)
279 {
280 gtk_widget_grab_focus (GTK_WIDGET (view));
281 }
282
283 static void
fm_empty_view_sort_directories_first_changed(FMDirectoryView * view)284 fm_empty_view_sort_directories_first_changed (FMDirectoryView *view)
285 {
286 }
287
288 static void
fm_empty_view_class_init(FMEmptyViewClass * class)289 fm_empty_view_class_init (FMEmptyViewClass *class)
290 {
291 FMDirectoryViewClass *fm_directory_view_class;
292
293 fm_directory_view_class = FM_DIRECTORY_VIEW_CLASS (class);
294
295 G_OBJECT_CLASS (class)->finalize = fm_empty_view_finalize;
296
297 fm_directory_view_class->add_file = fm_empty_view_add_file;
298 fm_directory_view_class->begin_loading = fm_empty_view_begin_loading;
299 fm_directory_view_class->bump_zoom_level = fm_empty_view_bump_zoom_level;
300 fm_directory_view_class->can_zoom_in = fm_empty_view_can_zoom_in;
301 fm_directory_view_class->can_zoom_out = fm_empty_view_can_zoom_out;
302 fm_directory_view_class->click_policy_changed = fm_empty_view_click_policy_changed;
303 fm_directory_view_class->clear = fm_empty_view_clear;
304 fm_directory_view_class->file_changed = fm_empty_view_file_changed;
305 fm_directory_view_class->get_background_widget = fm_empty_view_get_background_widget;
306 fm_directory_view_class->get_selection = fm_empty_view_get_selection;
307 fm_directory_view_class->get_selection_for_file_transfer = fm_empty_view_get_selection_for_file_transfer;
308 fm_directory_view_class->get_item_count = fm_empty_view_get_item_count;
309 fm_directory_view_class->is_empty = fm_empty_view_is_empty;
310 fm_directory_view_class->remove_file = fm_empty_view_remove_file;
311 fm_directory_view_class->merge_menus = fm_empty_view_merge_menus;
312 fm_directory_view_class->update_menus = fm_empty_view_update_menus;
313 fm_directory_view_class->reset_to_defaults = fm_empty_view_reset_to_defaults;
314 fm_directory_view_class->restore_default_zoom_level = fm_empty_view_restore_default_zoom_level;
315 fm_directory_view_class->reveal_selection = fm_empty_view_reveal_selection;
316 fm_directory_view_class->select_all = fm_empty_view_select_all;
317 fm_directory_view_class->set_selection = fm_empty_view_set_selection;
318 fm_directory_view_class->compare_files = fm_empty_view_compare_files;
319 fm_directory_view_class->sort_directories_first_changed = fm_empty_view_sort_directories_first_changed;
320 fm_directory_view_class->start_renaming_file = fm_empty_view_start_renaming_file;
321 fm_directory_view_class->get_zoom_level = fm_empty_view_get_zoom_level;
322 fm_directory_view_class->zoom_to_level = fm_empty_view_zoom_to_level;
323 fm_directory_view_class->emblems_changed = fm_empty_view_emblems_changed;
324 fm_directory_view_class->end_file_changes = fm_empty_view_end_file_changes;
325 fm_directory_view_class->using_manual_layout = fm_empty_view_using_manual_layout;
326 fm_directory_view_class->end_loading = fm_empty_view_end_loading;
327 }
328
329 static const char *
fm_empty_view_get_id(CajaView * view)330 fm_empty_view_get_id (CajaView *view)
331 {
332 return FM_EMPTY_VIEW_ID;
333 }
334
335
336 static void
fm_empty_view_iface_init(CajaViewIface * iface)337 fm_empty_view_iface_init (CajaViewIface *iface)
338 {
339 fm_directory_view_init_view_iface (iface);
340
341 iface->get_view_id = fm_empty_view_get_id;
342 iface->get_first_visible_file = fm_empty_view_get_first_visible_file;
343 iface->scroll_to_file = fm_empty_view_scroll_to_file;
344 iface->get_title = NULL;
345 iface->grab_focus = fm_empty_view_grab_focus;
346 }
347
348
349 static void
fm_empty_view_init(FMEmptyView * empty_view)350 fm_empty_view_init (FMEmptyView *empty_view)
351 {
352 empty_view->details = g_new0 (FMEmptyViewDetails, 1);
353 }
354
355 static CajaView *
fm_empty_view_create(CajaWindowSlotInfo * slot)356 fm_empty_view_create (CajaWindowSlotInfo *slot)
357 {
358 FMEmptyView *view;
359
360 g_assert (CAJA_IS_WINDOW_SLOT_INFO (slot));
361
362 view = g_object_new (FM_TYPE_EMPTY_VIEW,
363 "window-slot", slot,
364 NULL);
365
366 return CAJA_VIEW (view);
367 }
368
369 static gboolean
fm_empty_view_supports_uri(const char * uri,GFileType file_type,const char * mime_type)370 fm_empty_view_supports_uri (const char *uri,
371 GFileType file_type,
372 const char *mime_type)
373 {
374 if (file_type == G_FILE_TYPE_DIRECTORY)
375 {
376 return TRUE;
377 }
378 if (strcmp (mime_type, CAJA_SAVED_SEARCH_MIMETYPE) == 0)
379 {
380 return TRUE;
381 }
382 if (g_str_has_prefix (uri, "trash:"))
383 {
384 return TRUE;
385 }
386 if (g_str_has_prefix (uri, EEL_SEARCH_URI))
387 {
388 return TRUE;
389 }
390
391 return FALSE;
392 }
393
394 static CajaViewInfo fm_empty_view =
395 {
396 .id = FM_EMPTY_VIEW_ID,
397 .view_combo_label = N_("Empty View"),
398 .view_menu_label_with_mnemonic = N_("_Empty"),
399 .error_label = N_("Empty View"),
400 .startup_error_label = N_("The empty view encountered an error."),
401 .display_location_label = N_("Display this location with the empty view."),
402 .create = fm_empty_view_create,
403 .supports_uri =fm_empty_view_supports_uri
404 };
405
406 void
fm_empty_view_register(void)407 fm_empty_view_register (void)
408 {
409 fm_empty_view.id = fm_empty_view.id;
410 fm_empty_view.view_combo_label = fm_empty_view.view_combo_label;
411 fm_empty_view.view_menu_label_with_mnemonic = fm_empty_view.view_menu_label_with_mnemonic;
412 fm_empty_view.error_label = fm_empty_view.error_label;
413 fm_empty_view.display_location_label = fm_empty_view.display_location_label;
414
415 caja_view_factory_register (&fm_empty_view);
416 }
417