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