1 /* abstract base class for containers
2  */
3 
4 /*
5 
6     Copyright (C) 1991-2003 The National Gallery
7 
8     This program is free software; you can redistribute it and/or modify
9     it under the terms of the GNU General Public License as published by
10     the Free Software Foundation; either version 2 of the License, or
11     (at your option) any later version.
12 
13     This program 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
16     GNU General Public License for more details.
17 
18     You should have received a copy of the GNU General Public License along
19     with this program; if not, write to the Free Software Foundation, Inc.,
20     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21 
22  */
23 
24 /*
25 
26     These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
27 
28  */
29 
30 #define TYPE_ICONTAINER (icontainer_get_type())
31 #define ICONTAINER( obj ) \
32 	(G_TYPE_CHECK_INSTANCE_CAST( (obj), TYPE_ICONTAINER, iContainer ))
33 #define ICONTAINER_CLASS( klass ) \
34 	(G_TYPE_CHECK_CLASS_CAST( (klass), TYPE_ICONTAINER, iContainerClass))
35 #define IS_ICONTAINER( obj ) \
36 	(G_TYPE_CHECK_INSTANCE_TYPE( (obj), TYPE_ICONTAINER ))
37 #define IS_ICONTAINER_CLASS( klass ) \
38 	(G_TYPE_CHECK_CLASS_TYPE( (klass), TYPE_ICONTAINER ))
39 #define ICONTAINER_GET_CLASS( obj ) \
40 	(G_TYPE_INSTANCE_GET_CLASS( (obj), TYPE_ICONTAINER, iContainerClass ))
41 
42 /* Test for is C a child of P.
43  */
44 #define ICONTAINER_IS_CHILD( P, C ) \
45 	(g_slist_find( ICONTAINER( P )->children, ICONTAINER( C ) ) && \
46 	ICONTAINER( C )->parent == ICONTAINER( P ))
47 
48 struct _iContainer {
49 	iObject parent_object;
50 
51 	/* My instance vars.
52 	 */
53 	GSList *children;	/* iContainers which are inside this one */
54 	int pos;		/* Position in parent */
55 	iContainer *parent;	/* iContainer we are inside */
56 	GHashTable *child_hash;	/* Optional: hash of children by their name */
57 
58 	/* Can have a currently selected child ... eg. the
59 	 * current column in a workspace, or the current tab in a
60 	 * workspacegroup.
61 	 *
62 	 * NULL if not relevant.
63 	 */
64 	iContainer *current;
65 
66 	/* Track the view here during reparent.
67 	 */
68 	View *temp_view;
69 };
70 
71 typedef struct _iContainerClass {
72 	iObjectClass parent_class;
73 
74 	/*
75 
76 		pos_changed	our pos has changed
77 
78 		child_add	a child has been added to us
79 
80 		child_remove	a child is about be removed from us
81 
82 		parent_add	parent has been attached
83 
84 		parent_remove	parent is about to be removed
85 
86 		current		make the current of parent
87 
88 		child_detach	on old parent, unlink child
89 		child_attach  	on new_paerent, link on child
90 
91 					there are used as a pair to do
92 					reparent -- the old parent gets a
93 					chance to detach in ::parent_detach,
94 					the new parent attaches in
95 					::child_attach
96 
97 	 */
98 
99 	void (*pos_changed)( iContainer *icontainer );
100 	void (*child_add)( iContainer *parent, iContainer *child, int );
101 	void (*child_remove)( iContainer *parent, iContainer *child );
102 	void (*parent_add)( iContainer *child );
103 	void (*parent_remove)( iContainer *child );
104 	void (*current)( iContainer *parent, iContainer *child );
105 	void (*child_detach)( iContainer *parent, iContainer *child );
106 	void (*child_attach)( iContainer *parent, iContainer *child, int );
107 } iContainerClass;
108 
109 typedef void *(*icontainer_map_fn)( iContainer *,
110 	void *, void * );
111 typedef void *(*icontainer_map3_fn)( iContainer *,
112 	void *, void *, void * );
113 typedef void *(*icontainer_map4_fn)( iContainer *,
114 	void *, void *, void *, void * );
115 typedef void *(*icontainer_map5_fn)( iContainer *,
116 	void *, void *, void *, void *, void * );
117 
118 typedef gint (*icontainer_sort_fn)( iContainer *a, iContainer *b );
119 
120 int icontainer_get_n_children( iContainer *icontainer );
121 iContainer *icontainer_get_nth_child( iContainer *icontainer, int n );
122 GSList *icontainer_get_children( iContainer *icontainer );
123 void *icontainer_map( iContainer *icontainer,
124 	icontainer_map_fn fn, void *a, void *b );
125 void *icontainer_map3( iContainer *icontainer,
126 	icontainer_map3_fn fn, void *a, void *b, void *c );
127 void *icontainer_map4( iContainer *icontainer,
128 	icontainer_map4_fn fn, void *a, void *b, void *c, void *d );
129 void *icontainer_map5( iContainer *icontainer,
130 	icontainer_map5_fn fn, void *a, void *b, void *c, void *d, void *e );
131 void *icontainer_map_rev( iContainer *icontainer,
132 	icontainer_map_fn fn, void *a, void *b );
133 void *icontainer_map_all( iContainer *icontainer,
134 	icontainer_map_fn fn, void *a );
135 void *icontainer_map2_all( iContainer *icontainer,
136 	icontainer_map_fn fn, void *a, void *b );
137 void *icontainer_map3_all( iContainer *icontainer,
138 	icontainer_map3_fn fn, void *a, void *b, void *c );
139 void *icontainer_map4_all( iContainer *icontainer,
140 	icontainer_map4_fn fn, void *a, void *b, void *c, void *d );
141 void *icontainer_map_all_intrans( iContainer *icontainer,
142 	icontainer_map_fn fn, void *a );
143 
144 void icontainer_sanity( iContainer *icontainer );
145 
146 void icontainer_pos_sort( iContainer *icontainer );
147 int icontainer_pos_last( iContainer *icontainer );
148 void icontainer_pos_renumber( iContainer *icontainer );
149 void icontainer_custom_sort( iContainer *icontainer, GCompareFunc fn );
150 gint icontainer_name_compare( iContainer *a, iContainer *b );
151 
152 void icontainer_child_add( iContainer *icontainer, iContainer *child, int pos );
153 void icontainer_child_add_before( iContainer *parent,
154 	iContainer *child, iContainer *before );
155 void icontainer_child_move( iContainer *child, int pos );
156 void *icontainer_child_remove( iContainer *child );
157 void icontainer_current( iContainer *parent, iContainer *child );
158 iContainer *icontainer_next( iContainer *parent );
159 void icontainer_reparent( iContainer *parent, iContainer *child, int pos );
160 
161 GType icontainer_get_type( void );
162 
163 void icontainer_set_hash( iContainer *icontainer );
164 iContainer *icontainer_child_lookup( iContainer *parent, const char *name );
165