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 Gnome 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 Gnome 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 Gnome Library; see the file COPYING.LIB.  If not,
19    write to the Free Software Foundation, Inc., 51 Franklin Street - Suite 500,
20    Boston, MA 02110-1335, USA.
21 
22    Authors: Christian Neumair <chris@gnome-de.org>
23 */
24 
25 #include <config.h>
26 
27 #include "nemo-empty-view.h"
28 
29 #include "nemo-view.h"
30 #include "nemo-view-factory.h"
31 
32 #include <string.h>
33 #include <libnemo-private/nemo-file-utilities.h>
34 #include <eel/eel-vfs-extensions.h>
35 
36 struct NemoEmptyViewDetails {
37 	int number_of_files;
38 };
39 
40 static GList *nemo_empty_view_get_selection                   (NemoView   *view);
41 static GList *nemo_empty_view_get_selection_for_file_transfer (NemoView   *view);
42 static void   nemo_empty_view_scroll_to_file                  (NemoView      *view,
43 								   const char        *uri);
44 
G_DEFINE_TYPE(NemoEmptyView,nemo_empty_view,NEMO_TYPE_VIEW)45 G_DEFINE_TYPE (NemoEmptyView, nemo_empty_view, NEMO_TYPE_VIEW)
46 
47 static void
48 nemo_empty_view_add_file (NemoView *view, NemoFile *file, NemoDirectory *directory)
49 {
50 	static GTimer *timer = NULL;
51 	static gdouble cumu = 0, elaps;
52 	NEMO_EMPTY_VIEW (view)->details->number_of_files++;
53 	GdkPixbuf *icon;
54 
55 	if (!timer) timer = g_timer_new ();
56 
57 	g_timer_start (timer);
58 	icon = nemo_file_get_icon_pixbuf (file, nemo_get_icon_size_for_zoom_level (NEMO_ZOOM_LEVEL_STANDARD), TRUE, 0, NEMO_FILE_ICON_FLAGS_NONE);
59 
60 	elaps = g_timer_elapsed (timer, NULL);
61 	g_timer_stop (timer);
62 
63 	g_object_unref (icon);
64 
65 	cumu += elaps;
66 	g_message ("entire loading: %.3f, cumulative %.3f", elaps, cumu);
67 }
68 
69 
70 static void
nemo_empty_view_begin_loading(NemoView * view)71 nemo_empty_view_begin_loading (NemoView *view)
72 {
73 }
74 
75 static void
nemo_empty_view_clear(NemoView * view)76 nemo_empty_view_clear (NemoView *view)
77 {
78 }
79 
80 
81 static void
nemo_empty_view_file_changed(NemoView * view,NemoFile * file,NemoDirectory * directory)82 nemo_empty_view_file_changed (NemoView *view, NemoFile *file, NemoDirectory *directory)
83 {
84 }
85 
86 static GList *
nemo_empty_view_get_selection(NemoView * view)87 nemo_empty_view_get_selection (NemoView *view)
88 {
89 	return NULL;
90 }
91 
92 
93 static GList *
nemo_empty_view_get_selection_for_file_transfer(NemoView * view)94 nemo_empty_view_get_selection_for_file_transfer (NemoView *view)
95 {
96 	return NULL;
97 }
98 
99 static guint
nemo_empty_view_get_item_count(NemoView * view)100 nemo_empty_view_get_item_count (NemoView *view)
101 {
102 	return NEMO_EMPTY_VIEW (view)->details->number_of_files;
103 }
104 
105 static gboolean
nemo_empty_view_is_empty(NemoView * view)106 nemo_empty_view_is_empty (NemoView *view)
107 {
108 	return NEMO_EMPTY_VIEW (view)->details->number_of_files == 0;
109 }
110 
111 static void
nemo_empty_view_end_file_changes(NemoView * view)112 nemo_empty_view_end_file_changes (NemoView *view)
113 {
114 }
115 
116 static void
nemo_empty_view_remove_file(NemoView * view,NemoFile * file,NemoDirectory * directory)117 nemo_empty_view_remove_file (NemoView *view, NemoFile *file, NemoDirectory *directory)
118 {
119 	NEMO_EMPTY_VIEW (view)->details->number_of_files--;
120 	g_assert (NEMO_EMPTY_VIEW (view)->details->number_of_files >= 0);
121 }
122 
123 static void
nemo_empty_view_set_selection(NemoView * view,GList * selection)124 nemo_empty_view_set_selection (NemoView *view, GList *selection)
125 {
126 	nemo_view_notify_selection_changed (view);
127 }
128 
129 static void
nemo_empty_view_select_all(NemoView * view)130 nemo_empty_view_select_all (NemoView *view)
131 {
132 }
133 
134 static void
nemo_empty_view_reveal_selection(NemoView * view)135 nemo_empty_view_reveal_selection (NemoView *view)
136 {
137 }
138 
139 static void
nemo_empty_view_merge_menus(NemoView * view)140 nemo_empty_view_merge_menus (NemoView *view)
141 {
142 	NEMO_VIEW_CLASS (nemo_empty_view_parent_class)->merge_menus (view);
143 }
144 
145 static void
nemo_empty_view_update_menus(NemoView * view)146 nemo_empty_view_update_menus (NemoView *view)
147 {
148 	NEMO_VIEW_CLASS (nemo_empty_view_parent_class)->update_menus (view);
149 }
150 
151 /* Reset sort criteria and zoom level to match defaults */
152 static void
nemo_empty_view_reset_to_defaults(NemoView * view)153 nemo_empty_view_reset_to_defaults (NemoView *view)
154 {
155 }
156 
157 static void
nemo_empty_view_bump_zoom_level(NemoView * view,int zoom_increment)158 nemo_empty_view_bump_zoom_level (NemoView *view, int zoom_increment)
159 {
160 }
161 
162 static NemoZoomLevel
nemo_empty_view_get_zoom_level(NemoView * view)163 nemo_empty_view_get_zoom_level (NemoView *view)
164 {
165 	return NEMO_ZOOM_LEVEL_STANDARD;
166 }
167 
168 static void
nemo_empty_view_zoom_to_level(NemoView * view,NemoZoomLevel zoom_level)169 nemo_empty_view_zoom_to_level (NemoView *view,
170 			    NemoZoomLevel zoom_level)
171 {
172 }
173 
174 static void
nemo_empty_view_restore_default_zoom_level(NemoView * view)175 nemo_empty_view_restore_default_zoom_level (NemoView *view)
176 {
177 }
178 
179 static gboolean
nemo_empty_view_can_zoom_in(NemoView * view)180 nemo_empty_view_can_zoom_in (NemoView *view)
181 {
182 	return FALSE;
183 }
184 
185 static gboolean
nemo_empty_view_can_zoom_out(NemoView * view)186 nemo_empty_view_can_zoom_out (NemoView *view)
187 {
188 	return FALSE;
189 }
190 
191 static void
nemo_empty_view_start_renaming_file(NemoView * view,NemoFile * file,gboolean select_all)192 nemo_empty_view_start_renaming_file (NemoView *view,
193 				  NemoFile *file,
194 				  gboolean select_all)
195 {
196 }
197 
198 static void
nemo_empty_view_click_policy_changed(NemoView * directory_view)199 nemo_empty_view_click_policy_changed (NemoView *directory_view)
200 {
201 }
202 
203 
204 static int
nemo_empty_view_compare_files(NemoView * view,NemoFile * file1,NemoFile * file2)205 nemo_empty_view_compare_files (NemoView *view, NemoFile *file1, NemoFile *file2)
206 {
207 	if (file1 < file2) {
208 		return -1;
209 	}
210 
211 	if (file1 > file2) {
212 		return +1;
213 	}
214 
215 	return 0;
216 }
217 
218 static gboolean
nemo_empty_view_using_manual_layout(NemoView * view)219 nemo_empty_view_using_manual_layout (NemoView *view)
220 {
221 	return FALSE;
222 }
223 
224 static void
nemo_empty_view_end_loading(NemoView * view,gboolean all_files_seen)225 nemo_empty_view_end_loading (NemoView *view,
226 			   gboolean all_files_seen)
227 {
228 }
229 
230 static char *
nemo_empty_view_get_first_visible_file(NemoView * view)231 nemo_empty_view_get_first_visible_file (NemoView *view)
232 {
233 	return NULL;
234 }
235 
236 static void
nemo_empty_view_scroll_to_file(NemoView * view,const char * uri)237 nemo_empty_view_scroll_to_file (NemoView *view,
238 			      const char *uri)
239 {
240 }
241 
242 static void
nemo_empty_view_sort_directories_first_changed(NemoView * view)243 nemo_empty_view_sort_directories_first_changed (NemoView *view)
244 {
245 }
246 
247 static const char *
nemo_empty_view_get_id(NemoView * view)248 nemo_empty_view_get_id (NemoView *view)
249 {
250 	return NEMO_EMPTY_VIEW_ID;
251 }
252 
253 static void
nemo_empty_view_class_init(NemoEmptyViewClass * class)254 nemo_empty_view_class_init (NemoEmptyViewClass *class)
255 {
256 	NemoViewClass *nemo_view_class;
257 
258 	g_type_class_add_private (class, sizeof (NemoEmptyViewDetails));
259 
260 	nemo_view_class = NEMO_VIEW_CLASS (class);
261 
262 	nemo_view_class->add_file = nemo_empty_view_add_file;
263 	nemo_view_class->begin_loading = nemo_empty_view_begin_loading;
264 	nemo_view_class->bump_zoom_level = nemo_empty_view_bump_zoom_level;
265 	nemo_view_class->can_zoom_in = nemo_empty_view_can_zoom_in;
266 	nemo_view_class->can_zoom_out = nemo_empty_view_can_zoom_out;
267         nemo_view_class->click_policy_changed = nemo_empty_view_click_policy_changed;
268 	nemo_view_class->clear = nemo_empty_view_clear;
269 	nemo_view_class->file_changed = nemo_empty_view_file_changed;
270 	nemo_view_class->get_selection = nemo_empty_view_get_selection;
271 	nemo_view_class->get_selection_for_file_transfer = nemo_empty_view_get_selection_for_file_transfer;
272 	nemo_view_class->get_item_count = nemo_empty_view_get_item_count;
273 	nemo_view_class->is_empty = nemo_empty_view_is_empty;
274 	nemo_view_class->remove_file = nemo_empty_view_remove_file;
275 	nemo_view_class->merge_menus = nemo_empty_view_merge_menus;
276 	nemo_view_class->update_menus = nemo_empty_view_update_menus;
277 	nemo_view_class->reset_to_defaults = nemo_empty_view_reset_to_defaults;
278 	nemo_view_class->restore_default_zoom_level = nemo_empty_view_restore_default_zoom_level;
279 	nemo_view_class->reveal_selection = nemo_empty_view_reveal_selection;
280 	nemo_view_class->select_all = nemo_empty_view_select_all;
281 	nemo_view_class->set_selection = nemo_empty_view_set_selection;
282 	nemo_view_class->compare_files = nemo_empty_view_compare_files;
283 	nemo_view_class->sort_directories_first_changed = nemo_empty_view_sort_directories_first_changed;
284 	nemo_view_class->start_renaming_file = nemo_empty_view_start_renaming_file;
285 	nemo_view_class->get_zoom_level = nemo_empty_view_get_zoom_level;
286 	nemo_view_class->zoom_to_level = nemo_empty_view_zoom_to_level;
287 	nemo_view_class->end_file_changes = nemo_empty_view_end_file_changes;
288 	nemo_view_class->using_manual_layout = nemo_empty_view_using_manual_layout;
289 	nemo_view_class->end_loading = nemo_empty_view_end_loading;
290 	nemo_view_class->get_view_id = nemo_empty_view_get_id;
291 	nemo_view_class->get_first_visible_file = nemo_empty_view_get_first_visible_file;
292 	nemo_view_class->scroll_to_file = nemo_empty_view_scroll_to_file;
293 }
294 
295 static void
nemo_empty_view_init(NemoEmptyView * empty_view)296 nemo_empty_view_init (NemoEmptyView *empty_view)
297 {
298 	empty_view->details = G_TYPE_INSTANCE_GET_PRIVATE (empty_view, NEMO_TYPE_EMPTY_VIEW,
299 							   NemoEmptyViewDetails);
300 }
301 
302 static NemoView *
nemo_empty_view_create(NemoWindowSlot * slot)303 nemo_empty_view_create (NemoWindowSlot *slot)
304 {
305 	NemoEmptyView *view;
306 
307 	g_assert (NEMO_IS_WINDOW_SLOT (slot));
308 
309 	view = g_object_new (NEMO_TYPE_EMPTY_VIEW,
310 			     "window-slot", slot,
311 			     NULL);
312 
313 	return NEMO_VIEW (view);
314 }
315 
316 static gboolean
nemo_empty_view_supports_uri(const char * uri,GFileType file_type,const char * mime_type)317 nemo_empty_view_supports_uri (const char *uri,
318 				  GFileType file_type,
319 				  const char *mime_type)
320 {
321 	if (file_type == G_FILE_TYPE_DIRECTORY) {
322 		return TRUE;
323 	}
324 	if (strcmp (mime_type, NEMO_SAVED_SEARCH_MIMETYPE) == 0){
325 		return TRUE;
326 	}
327 	if (g_str_has_prefix (uri, "trash:")) {
328 		return TRUE;
329 	}
330 	if (g_str_has_prefix (uri, EEL_SEARCH_URI)) {
331 		return TRUE;
332 	}
333 
334 	return FALSE;
335 }
336 
337 static NemoViewInfo nemo_empty_view = {
338 	NEMO_EMPTY_VIEW_ID,
339 	"Empty",
340 	"Empty View",
341 	"_Empty View",
342 	"The empty view encountered an error.",
343 	"Display this location with the empty view.",
344 	nemo_empty_view_create,
345 	nemo_empty_view_supports_uri
346 };
347 
348 void
nemo_empty_view_register(void)349 nemo_empty_view_register (void)
350 {
351 	nemo_empty_view.id = nemo_empty_view.id;
352 	nemo_empty_view.view_combo_label = nemo_empty_view.view_combo_label;
353 	nemo_empty_view.view_menu_label_with_mnemonic = nemo_empty_view.view_menu_label_with_mnemonic;
354 	nemo_empty_view.error_label = nemo_empty_view.error_label;
355 	nemo_empty_view.display_location_label = nemo_empty_view.display_location_label;
356 
357 	nemo_view_factory_register (&nemo_empty_view);
358 }
359