1 /* -*- Mode: C; indent-tabs-mode: f; c-basic-offset: 4; tab-width: 4 -*- */
2 
3 /* gnome-icon-container.h - Icon container widget.
4 
5    Copyright (C) 1999, 2000 Free Software Foundation
6    Copyright (C) 2000 Eazel, Inc.
7 
8    The Gnome Library is free software; you can redistribute it and/or
9    modify it under the terms of the GNU Library General Public License as
10    published by the Free Software Foundation; either version 2 of the
11    License, or (at your option) any later version.
12 
13    The Gnome Library is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    Library General Public License for more details.
17 
18    You should have received a copy of the GNU Library General Public
19    License along with the Gnome Library; see the file COPYING.LIB.  If not,
20    write to the Free Software Foundation, Inc., 51 Franklin Street - Suite 500,
21    Boston, MA 02110-1335, USA.
22 
23    Authors: Ettore Perazzoli <ettore@gnu.org>, Darin Adler <darin@bentspoon.com>
24 */
25 
26 #ifndef NEMO_ICON_CONTAINER_H
27 #define NEMO_ICON_CONTAINER_H
28 
29 #include <eel/eel-canvas.h>
30 #include <libnemo-private/nemo-icon-info.h>
31 #include <libnemo-private/nemo-icon.h>
32 
33 #define NEMO_TYPE_ICON_CONTAINER nemo_icon_container_get_type()
34 #define NEMO_ICON_CONTAINER(obj) \
35   (G_TYPE_CHECK_INSTANCE_CAST ((obj), NEMO_TYPE_ICON_CONTAINER, NemoIconContainer))
36 #define NEMO_ICON_CONTAINER_CLASS(klass) \
37   (G_TYPE_CHECK_CLASS_CAST ((klass), NEMO_TYPE_ICON_CONTAINER, NemoIconContainerClass))
38 #define NEMO_IS_ICON_CONTAINER(obj) \
39   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NEMO_TYPE_ICON_CONTAINER))
40 #define NEMO_IS_ICON_CONTAINER_CLASS(klass) \
41   (G_TYPE_CHECK_CLASS_TYPE ((klass), NEMO_TYPE_ICON_CONTAINER))
42 #define NEMO_ICON_CONTAINER_GET_CLASS(obj) \
43   (G_TYPE_INSTANCE_GET_CLASS ((obj), NEMO_TYPE_ICON_CONTAINER, NemoIconContainerClass))
44 
45 /* Initial unpositioned icon value */
46 #define ICON_UNPOSITIONED_VALUE -1
47 
48 typedef struct {
49 	int x;
50 	int y;
51 	double scale;
52     int monitor;
53 } NemoIconPosition;
54 
55 typedef enum {
56 	NEMO_ICON_LAYOUT_L_R_T_B,
57 	NEMO_ICON_LAYOUT_R_L_T_B,
58 	NEMO_ICON_LAYOUT_T_B_L_R,
59 	NEMO_ICON_LAYOUT_T_B_R_L
60 } NemoIconLayoutMode;
61 
62 typedef enum {
63 	NEMO_ICON_LABEL_POSITION_UNDER,
64 	NEMO_ICON_LABEL_POSITION_BESIDE
65 } NemoIconLabelPosition;
66 
67 #define	NEMO_ICON_CONTAINER_TYPESELECT_FLUSH_DELAY 1000000
68 
69 typedef struct NemoIconContainerDetails NemoIconContainerDetails;
70 
71 typedef struct {
72 	EelCanvas canvas;
73 	NemoIconContainerDetails *details;
74 } NemoIconContainer;
75 
76 typedef struct {
77 	EelCanvasClass parent_slot;
78     gboolean is_grid_container;
79 
80 	/* Operations on the container. */
81 	int          (* button_press) 	          (NemoIconContainer *container,
82 						   GdkEventButton *event);
83 	void         (* context_click_background) (NemoIconContainer *container,
84 						   GdkEventButton *event);
85 	void         (* middle_click) 		  (NemoIconContainer *container,
86 						   GdkEventButton *event);
87 
88 	/* Operations on icons. */
89 	void         (* activate)	  	  (NemoIconContainer *container,
90 						   NemoIconData *data);
91 	void         (* activate_alternate)       (NemoIconContainer *container,
92 						   NemoIconData *data);
93 	void         (* activate_previewer)       (NemoIconContainer *container,
94 						   GList *files,
95 						   GArray *locations);
96 	void         (* context_click_selection)  (NemoIconContainer *container,
97 						   GdkEventButton *event);
98 	void	     (* move_copy_items)	  (NemoIconContainer *container,
99 						   const GList *item_uris,
100 						   GdkPoint *relative_item_points,
101 						   const char *target_uri,
102 						   GdkDragAction action,
103 						   int x,
104 						   int y);
105 	void	     (* handle_netscape_url)	  (NemoIconContainer *container,
106 						   const char *url,
107 						   const char *target_uri,
108 						   GdkDragAction action,
109 						   int x,
110 						   int y);
111 	void	     (* handle_uri_list)    	  (NemoIconContainer *container,
112 						   const char *uri_list,
113 						   const char *target_uri,
114 						   GdkDragAction action,
115 						   int x,
116 						   int y);
117 	void	     (* handle_text)		  (NemoIconContainer *container,
118 						   const char *text,
119 						   const char *target_uri,
120 						   GdkDragAction action,
121 						   int x,
122 						   int y);
123 	void	     (* handle_raw)		  (NemoIconContainer *container,
124 						   char *raw_data,
125 						   int length,
126 						   const char *target_uri,
127 						   const char *direct_save_uri,
128 						   GdkDragAction action,
129 						   int x,
130 						   int y);
131 
132 	/* Queries on the container for subclass/client.
133 	 * These must be implemented. The default "do nothing" is not good enough.
134 	 */
135 	char *	     (* get_container_uri)	  (NemoIconContainer *container);
136 
137 	/* Queries on icons for subclass/client.
138 	 * These must be implemented. The default "do nothing" is not
139 	 * good enough, these are _not_ signals.
140 	 */
141 	NemoIconInfo *(* get_icon_images)     (NemoIconContainer *container,
142 						   NemoIconData *data,
143 						   int icon_size,
144 						   gboolean for_drag_accept,
145 						   gboolean *has_window_open,
146                            gboolean visible);
147 	void         (* get_icon_text)            (NemoIconContainer *container,
148 						   NemoIconData *data,
149 						   char **editable_text,
150 						   char **additional_text,
151                            gboolean *pinned,
152                            gboolean *fav_unavailable,
153 						   gboolean include_invisible);
154     void         (* update_icon)              (NemoIconContainer *container,
155                                                NemoIcon          *icon,
156                                                gboolean           visible);
157 	char *       (* get_icon_description)     (NemoIconContainer *container,
158 						   NemoIconData *data);
159 	int          (* compare_icons)            (NemoIconContainer *container,
160 						   NemoIconData *icon_a,
161 						   NemoIconData *icon_b);
162 	void         (* freeze_updates)           (NemoIconContainer *container);
163 	void         (* unfreeze_updates)         (NemoIconContainer *container);
164 
165 	void         (* prioritize_thumbnailing)  (NemoIconContainer *container,
166 						   NemoIconData *data);
167     gint         (* get_max_layout_lines_for_pango) (NemoIconContainer *container);
168     gint         (* get_max_layout_lines)           (NemoIconContainer *container);
169     gint         (* get_additional_text_line_count) (NemoIconContainer *container);
170 
171 	/* Queries on icons for subclass/client.
172 	 * These must be implemented => These are signals !
173 	 * The default "do nothing" is not good enough.
174 	 */
175 	gboolean     (* can_accept_item)	  (NemoIconContainer *container,
176 						   NemoIconData *target,
177 						   const char *item_uri);
178 	char *       (* get_icon_uri)             (NemoIconContainer *container,
179 						   NemoIconData *data);
180 	char *       (* get_icon_drop_target_uri) (NemoIconContainer *container,
181 						   NemoIconData *data);
182 
183 	/* If icon data is NULL, the layout timestamp of the container should be retrieved.
184 	 * That is the time when the container displayed a fully loaded directory with
185 	 * all icon positions assigned.
186 	 *
187 	 * If icon data is not NULL, the position timestamp of the icon should be retrieved.
188 	 * That is the time when the file (i.e. icon data payload) was last displayed in a
189 	 * fully loaded directory with all icon positions assigned.
190 	 */
191 	gboolean     (* get_stored_layout_timestamp) (NemoIconContainer *container,
192 						      NemoIconData *data,
193 						      time_t *time);
194 	/* If icon data is NULL, the layout timestamp of the container should be stored.
195 	 * If icon data is not NULL, the position timestamp of the container should be stored.
196 	 */
197 	gboolean     (* store_layout_timestamp) (NemoIconContainer *container,
198 						 NemoIconData *data,
199 						 const time_t *time);
200 
201     void         (*lay_down_icons) (NemoIconContainer *container, GList *icons, double start_y);
202     void         (*icon_set_position) (NemoIconContainer *container, NemoIcon *icon, double x, double y);
203     void         (*move_icon) (NemoIconContainer *container, NemoIcon *icon, int x, int y,
204                                double scale, gboolean raise, gboolean snap, gboolean update_position);
205     void         (*align_icons) (NemoIconContainer *container);
206     void         (*finish_adding_new_icons) (NemoIconContainer *container);
207     void         (*reload_icon_positions) (NemoIconContainer *container);
208     void         (*icon_get_bounding_box) (NemoIcon *icon,
209                                            int *x1_return, int *y1_return,
210                                            int *x2_return, int *y2_return,
211                                            NemoIconCanvasItemBoundsUsage usage);
212     void         (*set_zoom_level)        (NemoIconContainer *container, gint new_level);
213 	/* Notifications for the whole container. */
214 	void	     (* band_select_started)	  (NemoIconContainer *container);
215 	void	     (* band_select_ended)	  (NemoIconContainer *container);
216 	void         (* selection_changed) 	  (NemoIconContainer *container);
217 	void         (* layout_changed)           (NemoIconContainer *container);
218 
219 	/* Notifications for icons. */
220 	void         (* icon_position_changed)    (NemoIconContainer *container,
221 						   NemoIconData *data,
222 						   const NemoIconPosition *position);
223 	void         (* icon_rename_started)      (NemoIconContainer *container,
224 						   GtkWidget *renaming_widget);
225 	void         (* icon_rename_ended)        (NemoIconContainer *container,
226 						   NemoIconData *data,
227 						   const char *text);
228 	void	     (* icon_stretch_started)     (NemoIconContainer *container,
229 						   NemoIconData *data);
230 	void	     (* icon_stretch_ended)       (NemoIconContainer *container,
231 						   NemoIconData *data);
232 	int	     (* preview)		  (NemoIconContainer *container,
233 						   NemoIconData *data,
234 						   gboolean start_flag);
235         void         (* icon_added)               (NemoIconContainer *container,
236                                                    NemoIconData *data);
237         void         (* icon_removed)             (NemoIconContainer *container,
238                                                    NemoIconData *data);
239         void         (* cleared)                  (NemoIconContainer *container);
240 	gboolean     (* start_interactive_search) (NemoIconContainer *container);
241 } NemoIconContainerClass;
242 
243 /* GtkObject */
244 GType             nemo_icon_container_get_type                      (void);
245 GtkWidget *       nemo_icon_container_new                           (void);
246 
247 
248 /* adding, removing, and managing icons */
249 void              nemo_icon_container_clear                         (NemoIconContainer  *view);
250 gboolean          nemo_icon_container_icon_is_new_for_monitor       (NemoIconContainer *container,
251                                                                      NemoIcon          *icon,
252                                                                      gint               current_monitor);
253 gboolean          nemo_icon_container_add                           (NemoIconContainer  *view,
254 									 NemoIconData       *data);
255 void              nemo_icon_container_layout_now                    (NemoIconContainer *container);
256 gboolean          nemo_icon_container_remove                        (NemoIconContainer  *view,
257 									 NemoIconData       *data);
258 void              nemo_icon_container_for_each                      (NemoIconContainer  *view,
259 									 NemoIconCallback    callback,
260 									 gpointer                callback_data);
261 void              nemo_icon_container_request_update                (NemoIconContainer  *view,
262 									 NemoIconData       *data);
263 void              nemo_icon_container_invalidate_labels             (NemoIconContainer  *container);
264 void              nemo_icon_container_request_update_all            (NemoIconContainer  *container);
265 void              nemo_icon_container_reveal                        (NemoIconContainer  *container,
266 									 NemoIconData       *data);
267 gboolean          nemo_icon_container_is_empty                      (NemoIconContainer  *container);
268 NemoIconData *nemo_icon_container_get_first_visible_icon        (NemoIconContainer  *container);
269 void              nemo_icon_container_scroll_to_icon                (NemoIconContainer  *container,
270 									 NemoIconData       *data);
271 
272 void              nemo_icon_container_begin_loading                 (NemoIconContainer  *container);
273 void              nemo_icon_container_end_loading                   (NemoIconContainer  *container,
274 									 gboolean                all_icons_added);
275 
276 /* control the layout */
277 gboolean          nemo_icon_container_is_auto_layout                (NemoIconContainer  *container);
278 void              nemo_icon_container_set_auto_layout               (NemoIconContainer  *container,
279 									 gboolean                auto_layout);
280 
281 gboolean          nemo_icon_container_is_keep_aligned               (NemoIconContainer  *container);
282 void              nemo_icon_container_set_keep_aligned              (NemoIconContainer  *container,
283 									 gboolean                keep_aligned);
284 void              nemo_icon_container_set_layout_mode               (NemoIconContainer  *container,
285 									 NemoIconLayoutMode  mode);
286 void              nemo_icon_container_set_horizontal_layout (NemoIconContainer *container,
287                                                              gboolean           horizontal);
288 gboolean          nemo_icon_container_get_horizontal_layout (NemoIconContainer *container);
289 void              nemo_icon_container_set_grid_adjusts (NemoIconContainer *container,
290                                                         gint               h_adjust,
291                                                         gint               v_adjust);
292 
293 void              nemo_icon_container_set_label_position            (NemoIconContainer  *container,
294 									 NemoIconLabelPosition pos);
295 void              nemo_icon_container_sort                          (NemoIconContainer  *container);
296 void              nemo_icon_container_freeze_icon_positions         (NemoIconContainer  *container);
297 
298 gint               nemo_icon_container_get_max_layout_lines           (NemoIconContainer  *container);
299 gint               nemo_icon_container_get_max_layout_lines_for_pango (NemoIconContainer  *container);
300 
301 void              nemo_icon_container_set_highlighted_for_clipboard (NemoIconContainer  *container,
302 									 GList                  *clipboard_icon_data);
303 
304 /* operations on all icons */
305 void              nemo_icon_container_unselect_all                  (NemoIconContainer  *view);
306 void              nemo_icon_container_select_all                    (NemoIconContainer  *view);
307 
308 
309 /* operations on the selection */
310 void              nemo_icon_container_update_selection              (NemoIconContainer *container);
311 GList     *       nemo_icon_container_get_selection                 (NemoIconContainer  *view);
312 GList     *       nemo_icon_container_peek_selection                (NemoIconContainer  *view);
313 gint              nemo_icon_container_get_selection_count           (NemoIconContainer  *container);
314 void			  nemo_icon_container_invert_selection				(NemoIconContainer  *view);
315 void              nemo_icon_container_set_selection                 (NemoIconContainer  *view,
316 									 GList                  *selection);
317 GArray    *       nemo_icon_container_get_selected_icon_locations   (NemoIconContainer  *view);
318 gboolean          nemo_icon_container_has_stretch_handles           (NemoIconContainer  *container);
319 gboolean          nemo_icon_container_is_stretched                  (NemoIconContainer  *container);
320 void              nemo_icon_container_show_stretch_handles          (NemoIconContainer  *container);
321 void              nemo_icon_container_unstretch                     (NemoIconContainer  *container);
322 void              nemo_icon_container_start_renaming_selected_item  (NemoIconContainer  *container,
323 									 gboolean                select_all);
324 /* options */
325 NemoZoomLevel nemo_icon_container_get_zoom_level                (NemoIconContainer  *view);
326 void              nemo_icon_container_set_zoom_level                (NemoIconContainer  *view,
327 									 int                     new_zoom_level);
328 void              nemo_icon_container_set_single_click_mode         (NemoIconContainer  *container,
329 									 gboolean                single_click_mode);
330 void              nemo_icon_container_set_click_to_rename_enabled (NemoIconContainer *container,
331                                                                              gboolean enabled);
332 void              nemo_icon_container_enable_linger_selection       (NemoIconContainer  *view,
333 									 gboolean                enable);
334 gboolean          nemo_icon_container_get_is_fixed_size             (NemoIconContainer  *container);
335 void              nemo_icon_container_set_is_fixed_size             (NemoIconContainer  *container,
336 									 gboolean                is_fixed_size);
337 gboolean          nemo_icon_container_get_is_desktop                (NemoIconContainer  *container);
338 void              nemo_icon_container_set_is_desktop                (NemoIconContainer  *container,
339 									 gboolean                is_desktop);
340 gboolean          nemo_icon_container_get_show_desktop_tooltips     (NemoIconContainer *container);
341 void              nemo_icon_container_set_show_desktop_tooltips     (NemoIconContainer *container,
342                                                                               gboolean  show_tooltips);
343 void              nemo_icon_container_reset_scroll_region           (NemoIconContainer  *container);
344 void              nemo_icon_container_set_font                      (NemoIconContainer  *container,
345 									 const char             *font);
346 void              nemo_icon_container_set_font_size_table           (NemoIconContainer  *container,
347 									 const int               font_size_table[NEMO_ZOOM_LEVEL_LARGEST + 1]);
348 void              nemo_icon_container_set_margins                   (NemoIconContainer  *container,
349 									 int                     left_margin,
350 									 int                     right_margin,
351 									 int                     top_margin,
352 									 int                     bottom_margin);
353 void              nemo_icon_container_set_use_drop_shadows          (NemoIconContainer  *container,
354 									 gboolean                use_drop_shadows);
355 char*             nemo_icon_container_get_icon_description          (NemoIconContainer  *container,
356                                                                          NemoIconData       *data);
357 gboolean          nemo_icon_container_get_allow_moves               (NemoIconContainer  *container);
358 void              nemo_icon_container_set_allow_moves               (NemoIconContainer  *container,
359 									 gboolean                allow_moves);
360 void		  nemo_icon_container_set_forced_icon_size		(NemoIconContainer  *container,
361 									 int                     forced_icon_size);
362 void		  nemo_icon_container_set_all_columns_same_width	(NemoIconContainer  *container,
363 									 gboolean                all_columns_same_width);
364 
365 gboolean	  nemo_icon_container_is_layout_rtl			(NemoIconContainer  *container);
366 gboolean	  nemo_icon_container_is_layout_vertical		(NemoIconContainer  *container);
367 
368 gboolean          nemo_icon_container_get_store_layout_timestamps   (NemoIconContainer  *container);
369 void              nemo_icon_container_set_store_layout_timestamps   (NemoIconContainer  *container,
370 									 gboolean                store_layout);
371 
372 void              nemo_icon_container_widget_to_file_operation_position (NemoIconContainer *container,
373 									     GdkPoint              *position);
374 
375 void         nemo_icon_container_setup_tooltip_preference_callback (NemoIconContainer *container);
376 void         nemo_icon_container_update_tooltip_text (NemoIconContainer  *container,
377                                                       NemoIconCanvasItem *item);
378 gint         nemo_icon_container_get_additional_text_line_count (NemoIconContainer *container);
379 void         nemo_icon_container_set_ok_to_load_deferred_attrs (NemoIconContainer *container,
380                                                                 gboolean           ok);
381 #endif /* NEMO_ICON_CONTAINER_H */
382