1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2 
3 /* mate-icon-container.h - Icon container widget.
4 
5    Copyright (C) 1999, 2000 Free Software Foundation
6    Copyright (C) 2000 Eazel, Inc.
7 
8    The Mate 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 Mate 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 Mate Library; see the file COPYING.LIB.  If not,
20    write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
21    Boston, MA 02110-1301, USA.
22 
23    Authors: Ettore Perazzoli <ettore@gnu.org>, Darin Adler <darin@bentspoon.com>
24 */
25 
26 #ifndef CAJA_ICON_CONTAINER_H
27 #define CAJA_ICON_CONTAINER_H
28 
29 #include <eel/eel-canvas.h>
30 
31 #include "caja-icon-info.h"
32 
33 #define CAJA_TYPE_ICON_CONTAINER caja_icon_container_get_type()
34 #define CAJA_ICON_CONTAINER(obj) \
35   (G_TYPE_CHECK_INSTANCE_CAST ((obj), CAJA_TYPE_ICON_CONTAINER, CajaIconContainer))
36 #define CAJA_ICON_CONTAINER_CLASS(klass) \
37   (G_TYPE_CHECK_CLASS_CAST ((klass), CAJA_TYPE_ICON_CONTAINER, CajaIconContainerClass))
38 #define CAJA_IS_ICON_CONTAINER(obj) \
39   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CAJA_TYPE_ICON_CONTAINER))
40 #define CAJA_IS_ICON_CONTAINER_CLASS(klass) \
41   (G_TYPE_CHECK_CLASS_TYPE ((klass), CAJA_TYPE_ICON_CONTAINER))
42 #define CAJA_ICON_CONTAINER_GET_CLASS(obj) \
43   (G_TYPE_INSTANCE_GET_CLASS ((obj), CAJA_TYPE_ICON_CONTAINER, CajaIconContainerClass))
44 
45 
46 #define CAJA_ICON_CONTAINER_ICON_DATA(pointer) \
47 	((CajaIconData *) (pointer))
48 
49 typedef struct CajaIconData CajaIconData;
50 
51 typedef void (* CajaIconCallback) (CajaIconData *icon_data,
52                                    gpointer callback_data);
53 
54 typedef struct
55 {
56     int x;
57     int y;
58     double scale;
59 } CajaIconPosition;
60 
61 typedef enum
62 {
63     CAJA_ICON_LAYOUT_L_R_T_B,
64     CAJA_ICON_LAYOUT_R_L_T_B,
65     CAJA_ICON_LAYOUT_T_B_L_R,
66     CAJA_ICON_LAYOUT_T_B_R_L
67 } CajaIconLayoutMode;
68 
69 typedef enum
70 {
71     CAJA_ICON_LABEL_POSITION_UNDER,
72     CAJA_ICON_LABEL_POSITION_BESIDE
73 } CajaIconLabelPosition;
74 
75 #define	CAJA_ICON_CONTAINER_TYPESELECT_FLUSH_DELAY 1000000
76 
77 typedef struct CajaIconContainerDetails CajaIconContainerDetails;
78 
79 typedef struct
80 {
81     EelCanvas canvas;
82     CajaIconContainerDetails *details;
83 } CajaIconContainer;
84 
85 typedef struct
86 {
87     EelCanvasClass parent_slot;
88 
89     /* Operations on the container. */
90     int          (* button_press) 	          (CajaIconContainer *container,
91             GdkEventButton *event);
92     void         (* context_click_background) (CajaIconContainer *container,
93             GdkEventButton *event);
94     void         (* middle_click) 		  (CajaIconContainer *container,
95                                            GdkEventButton *event);
96 
97     /* Operations on icons. */
98     void         (* activate)	  	  (CajaIconContainer *container,
99                                        CajaIconData *data);
100     void         (* activate_alternate)       (CajaIconContainer *container,
101             CajaIconData *data);
102     void         (* context_click_selection)  (CajaIconContainer *container,
103             GdkEventButton *event);
104     void	     (* move_copy_items)	  (CajaIconContainer *container,
105                                            const GList *item_uris,
106                                            GdkPoint *relative_item_points,
107                                            const char *target_uri,
108                                            GdkDragAction action,
109                                            int x,
110                                            int y);
111     void	     (* handle_netscape_url)	  (CajaIconContainer *container,
112             const char *url,
113             const char *target_uri,
114             GdkDragAction action,
115             int x,
116             int y);
117     void	     (* handle_uri_list)    	  (CajaIconContainer *container,
118             const char *uri_list,
119             const char *target_uri,
120             GdkDragAction action,
121             int x,
122             int y);
123     void	     (* handle_text)		  (CajaIconContainer *container,
124                                            const char *text,
125                                            const char *target_uri,
126                                            GdkDragAction action,
127                                            int x,
128                                            int y);
129     void	     (* handle_raw)		  (CajaIconContainer *container,
130                                        char *raw_data,
131                                        int length,
132                                        const char *target_uri,
133                                        const char *direct_save_uri,
134                                        GdkDragAction action,
135                                        int x,
136                                        int y);
137 
138     /* Queries on the container for subclass/client.
139      * These must be implemented. The default "do nothing" is not good enough.
140      */
141     char *	     (* get_container_uri)	  (CajaIconContainer *container);
142 
143     /* Queries on icons for subclass/client.
144      * These must be implemented. The default "do nothing" is not
145      * good enough, these are _not_ signals.
146      */
147     CajaIconInfo *(* get_icon_images)     (CajaIconContainer *container,
148                                            CajaIconData *data,
149                                            int icon_size,
150                                            GList **emblem_pixbufs,
151                                            char **embedded_text,
152                                            gboolean for_drag_accept,
153                                            gboolean need_large_embeddded_text,
154                                            gboolean *embedded_text_needs_loading,
155                                            gboolean *has_window_open);
156     void         (* get_icon_text)            (CajaIconContainer *container,
157             CajaIconData *data,
158             char **editable_text,
159             char **additional_text,
160             gboolean include_invisible);
161     char *       (* get_icon_description)     (CajaIconContainer *container,
162             CajaIconData *data);
163     int          (* compare_icons)            (CajaIconContainer *container,
164             CajaIconData *icon_a,
165             CajaIconData *icon_b);
166     int          (* compare_icons_by_name)    (CajaIconContainer *container,
167             CajaIconData *icon_a,
168             CajaIconData *icon_b);
169     void         (* freeze_updates)           (CajaIconContainer *container);
170     void         (* unfreeze_updates)         (CajaIconContainer *container);
171     void         (* start_monitor_top_left)   (CajaIconContainer *container,
172             CajaIconData *data,
173             gconstpointer client,
174             gboolean large_text);
175     void         (* stop_monitor_top_left)    (CajaIconContainer *container,
176             CajaIconData *data,
177             gconstpointer client);
178     void         (* prioritize_thumbnailing)  (CajaIconContainer *container,
179             CajaIconData *data);
180 
181     /* Queries on icons for subclass/client.
182      * These must be implemented => These are signals !
183      * The default "do nothing" is not good enough.
184      */
185     gboolean     (* can_accept_item)	  (CajaIconContainer *container,
186                                            CajaIconData *target,
187                                            const char *item_uri);
188     gboolean     (* get_stored_icon_position) (CajaIconContainer *container,
189             CajaIconData *data,
190             CajaIconPosition *position);
191     char *       (* get_icon_uri)             (CajaIconContainer *container,
192             CajaIconData *data);
193     char *       (* get_icon_drop_target_uri) (CajaIconContainer *container,
194             CajaIconData *data);
195 
196     /* If icon data is NULL, the layout timestamp of the container should be retrieved.
197      * That is the time when the container displayed a fully loaded directory with
198      * all icon positions assigned.
199      *
200      * If icon data is not NULL, the position timestamp of the icon should be retrieved.
201      * That is the time when the file (i.e. icon data payload) was last displayed in a
202      * fully loaded directory with all icon positions assigned.
203      */
204     gboolean     (* get_stored_layout_timestamp) (CajaIconContainer *container,
205             CajaIconData *data,
206             time_t *time);
207     /* If icon data is NULL, the layout timestamp of the container should be stored.
208      * If icon data is not NULL, the position timestamp of the container should be stored.
209      */
210     gboolean     (* store_layout_timestamp) (CajaIconContainer *container,
211             CajaIconData *data,
212             const time_t *time);
213 
214     /* Notifications for the whole container. */
215     void	     (* band_select_started)	  (CajaIconContainer *container);
216     void	     (* band_select_ended)	  (CajaIconContainer *container);
217     void         (* selection_changed) 	  (CajaIconContainer *container);
218     void         (* layout_changed)           (CajaIconContainer *container);
219 
220     /* Notifications for icons. */
221     void         (* icon_position_changed)    (CajaIconContainer *container,
222             CajaIconData *data,
223             const CajaIconPosition *position);
224     void         (* icon_text_changed)        (CajaIconContainer *container,
225             CajaIconData *data,
226             const char *text);
227     void         (* renaming_icon)            (CajaIconContainer *container,
228             GtkWidget *renaming_widget);
229     void	     (* icon_stretch_started)     (CajaIconContainer *container,
230             CajaIconData *data);
231     void	     (* icon_stretch_ended)       (CajaIconContainer *container,
232             CajaIconData *data);
233     int	     (* preview)		  (CajaIconContainer *container,
234                                    CajaIconData *data,
235                                    gboolean start_flag);
236     void         (* icon_added)               (CajaIconContainer *container,
237             CajaIconData *data);
238     void         (* icon_removed)             (CajaIconContainer *container,
239             CajaIconData *data);
240     void         (* cleared)                  (CajaIconContainer *container);
241     gboolean     (* start_interactive_search) (CajaIconContainer *container);
242 } CajaIconContainerClass;
243 
244 /* GtkObject */
245 GType             caja_icon_container_get_type                      (void);
246 GtkWidget *       caja_icon_container_new                           (void);
247 
248 
249 /* adding, removing, and managing icons */
250 void              caja_icon_container_clear                         (CajaIconContainer  *view);
251 gboolean          caja_icon_container_add                           (CajaIconContainer  *view,
252         CajaIconData       *data);
253 void              caja_icon_container_layout_now                    (CajaIconContainer *container);
254 gboolean          caja_icon_container_remove                        (CajaIconContainer  *view,
255         CajaIconData       *data);
256 void              caja_icon_container_for_each                      (CajaIconContainer  *view,
257         CajaIconCallback    callback,
258         gpointer                callback_data);
259 void              caja_icon_container_request_update                (CajaIconContainer  *view,
260         CajaIconData       *data);
261 void              caja_icon_container_request_update_all            (CajaIconContainer  *container);
262 void              caja_icon_container_reveal                        (CajaIconContainer  *container,
263         CajaIconData       *data);
264 gboolean          caja_icon_container_is_empty                      (CajaIconContainer  *container);
265 CajaIconData *caja_icon_container_get_first_visible_icon        (CajaIconContainer  *container);
266 void              caja_icon_container_scroll_to_icon                (CajaIconContainer  *container,
267         CajaIconData       *data);
268 
269 void              caja_icon_container_begin_loading                 (CajaIconContainer  *container);
270 void              caja_icon_container_end_loading                   (CajaIconContainer  *container,
271         gboolean                all_icons_added);
272 
273 /* control the layout */
274 gboolean          caja_icon_container_is_auto_layout                (CajaIconContainer  *container);
275 void              caja_icon_container_set_auto_layout               (CajaIconContainer  *container,
276         gboolean                auto_layout);
277 gboolean          caja_icon_container_is_tighter_layout             (CajaIconContainer  *container);
278 void              caja_icon_container_set_tighter_layout            (CajaIconContainer  *container,
279         gboolean                tighter_layout);
280 
281 gboolean          caja_icon_container_is_keep_aligned               (CajaIconContainer  *container);
282 void              caja_icon_container_set_keep_aligned              (CajaIconContainer  *container,
283         gboolean                keep_aligned);
284 gboolean          caja_icon_container_is_lock_icons_position        (CajaIconContainer  *container);
285 void              caja_icon_container_set_lock_icons_position       (CajaIconContainer *container,
286         gboolean lock_icons_position);
287 void              caja_icon_container_set_layout_mode               (CajaIconContainer  *container,
288         CajaIconLayoutMode  mode);
289 void              caja_icon_container_set_label_position            (CajaIconContainer  *container,
290         CajaIconLabelPosition pos);
291 void              caja_icon_container_sort                          (CajaIconContainer  *container);
292 void              caja_icon_container_freeze_icon_positions         (CajaIconContainer  *container);
293 
294 int               caja_icon_container_get_max_layout_lines           (CajaIconContainer  *container);
295 int               caja_icon_container_get_max_layout_lines_for_pango (CajaIconContainer  *container);
296 
297 void              caja_icon_container_set_highlighted_for_clipboard (CajaIconContainer  *container,
298         GList                  *clipboard_icon_data);
299 
300 /* operations on all icons */
301 void              caja_icon_container_unselect_all                  (CajaIconContainer  *view);
302 void              caja_icon_container_select_all                    (CajaIconContainer  *view);
303 
304 
305 /* operations on the selection */
306 GList     *       caja_icon_container_get_selection                 (CajaIconContainer  *view);
307 void			  caja_icon_container_invert_selection				(CajaIconContainer  *view);
308 void              caja_icon_container_set_selection                 (CajaIconContainer  *view,
309         GList                  *selection);
310 GArray    *       caja_icon_container_get_selected_icon_locations   (CajaIconContainer  *view);
311 gboolean          caja_icon_container_has_stretch_handles           (CajaIconContainer  *container);
312 gboolean          caja_icon_container_is_stretched                  (CajaIconContainer  *container);
313 void              caja_icon_container_show_stretch_handles          (CajaIconContainer  *container);
314 void              caja_icon_container_unstretch                     (CajaIconContainer  *container);
315 void              caja_icon_container_start_renaming_selected_item  (CajaIconContainer  *container,
316         gboolean                select_all);
317 
318 /* options */
319 CajaZoomLevel caja_icon_container_get_zoom_level                (CajaIconContainer  *view);
320 void              caja_icon_container_set_zoom_level                (CajaIconContainer  *view,
321         int                     new_zoom_level);
322 void              caja_icon_container_set_single_click_mode         (CajaIconContainer  *container,
323         gboolean                single_click_mode);
324 void              caja_icon_container_enable_linger_selection       (CajaIconContainer  *view,
325         gboolean                enable);
326 gboolean          caja_icon_container_get_is_fixed_size             (CajaIconContainer  *container);
327 void              caja_icon_container_set_is_fixed_size             (CajaIconContainer  *container,
328         gboolean                is_fixed_size);
329 gboolean          caja_icon_container_get_is_desktop                (CajaIconContainer  *container);
330 void              caja_icon_container_set_is_desktop                (CajaIconContainer  *container,
331         gboolean                is_desktop);
332 void              caja_icon_container_reset_scroll_region           (CajaIconContainer  *container);
333 void              caja_icon_container_set_font                      (CajaIconContainer  *container,
334         const char             *font);
335 void              caja_icon_container_set_font_size_table           (CajaIconContainer  *container,
336         const int               font_size_table[CAJA_ZOOM_LEVEL_LARGEST + 1]);
337 void              caja_icon_container_set_margins                   (CajaIconContainer  *container,
338         int                     left_margin,
339         int                     right_margin,
340         int                     top_margin,
341         int                     bottom_margin);
342 void              caja_icon_container_set_use_drop_shadows          (CajaIconContainer  *container,
343         gboolean                use_drop_shadows);
344 char*             caja_icon_container_get_icon_description          (CajaIconContainer  *container,
345         CajaIconData       *data);
346 gboolean          caja_icon_container_get_allow_moves               (CajaIconContainer  *container);
347 void              caja_icon_container_set_allow_moves               (CajaIconContainer  *container,
348         gboolean                allow_moves);
349 void		  caja_icon_container_set_forced_icon_size		(CajaIconContainer  *container,
350         int                     forced_icon_size);
351 void		  caja_icon_container_set_all_columns_same_width	(CajaIconContainer  *container,
352         gboolean                all_columns_same_width);
353 
354 gboolean	  caja_icon_container_is_layout_rtl			(CajaIconContainer  *container);
355 gboolean	  caja_icon_container_is_layout_vertical		(CajaIconContainer  *container);
356 
357 gboolean          caja_icon_container_get_store_layout_timestamps   (CajaIconContainer  *container);
358 void              caja_icon_container_set_store_layout_timestamps   (CajaIconContainer  *container,
359         gboolean                store_layout);
360 
361 void              caja_icon_container_widget_to_file_operation_position (CajaIconContainer *container,
362         GdkPoint              *position);
363 
364 
365 #define CANVAS_WIDTH(container,allocation) ((allocation.width	  \
366 				- container->details->left_margin \
367 				- container->details->right_margin) \
368 				/  EEL_CANVAS (container)->pixels_per_unit)
369 
370 #define CANVAS_HEIGHT(container,allocation) ((allocation.height \
371 			 - container->details->top_margin \
372 			 - container->details->bottom_margin) \
373 			 / EEL_CANVAS (container)->pixels_per_unit)
374 
375 #endif /* CAJA_ICON_CONTAINER_H */
376