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