1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 * Copyright (C) Naba Kumar <naba@gnome.org>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Library General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 #include <libgnome/gnome-macros.h>
22 #include <libanjuta/anjuta-utils.h>
23 #include <libanjuta/anjuta-debug.h>
24 #include <libanjuta/interfaces/ianjuta-symbol.h>
25 #include <libanjuta/interfaces/ianjuta-iterable.h>
26 #include "an_symbol_iter.h"
27 #include "an_symbol.h"
29 struct _AnjutaSymbolIterPriv
32 const GPtrArray
*tm_tags_array
;
35 static gpointer parent_class
;
37 static gboolean
isymbol_iter_set_position (IAnjutaIterable
*iterable
,
38 gint position
, GError
**err
);
40 /* Anjuta symbol iter class */
43 anjuta_symbol_iter_finalize (GObject
* obj
)
45 AnjutaSymbolIter
*si
= ANJUTA_SYMBOL_ITER (obj
);
48 GNOME_CALL_PARENT (G_OBJECT_CLASS
, finalize
, (obj
));
52 anjuta_symbol_iter_dispose (GObject
* obj
)
54 /* AnjutaSymbolIter *si = ANJUTA_SYMBOL_ITER (obj); */
55 GNOME_CALL_PARENT (G_OBJECT_CLASS
, dispose
, (obj
));
59 anjuta_symbol_iter_instance_init (GObject
* obj
)
63 si
= ANJUTA_SYMBOL_ITER (obj
);
64 si
->priv
= g_new0 (AnjutaSymbolIterPriv
, 1);
65 si
->priv
->current_pos
= 0;
69 anjuta_symbol_iter_class_init (AnjutaSymbolIterClass
* klass
)
71 AnjutaSymbolIterClass
*sic
;
72 GObjectClass
*object_class
= G_OBJECT_CLASS (klass
);
74 parent_class
= g_type_class_peek_parent (klass
);
75 sic
= ANJUTA_SYMBOL_ITER_CLASS (klass
);
76 object_class
->finalize
= anjuta_symbol_iter_finalize
;
77 object_class
->dispose
= anjuta_symbol_iter_dispose
;
81 anjuta_symbol_iter_new (const GPtrArray
*tm_tags_array
)
85 g_return_val_if_fail (tm_tags_array
!= NULL
, NULL
);
87 si
= g_object_new (ANJUTA_TYPE_SYMBOL_ITER
, NULL
);
88 si
->priv
->tm_tags_array
= tm_tags_array
;
89 ianjuta_iterable_first (IANJUTA_ITERABLE (si
), NULL
);
93 /* IAnjutaIterable implementation */
96 isymbol_iter_first (IAnjutaIterable
*iterable
, GError
**err
)
98 AnjutaSymbolIter
*si
= ANJUTA_SYMBOL_ITER (iterable
);
100 si
->priv
->current_pos
= 0;
101 if (si
->priv
->tm_tags_array
->len
<= 0)
103 anjuta_symbol_set_tag (ANJUTA_SYMBOL (iterable
),
107 /* g_assert (si->priv->tm_tags_array->pdata[si->priv->current_pos]); */
108 anjuta_symbol_set_tag (ANJUTA_SYMBOL (iterable
),
109 si
->priv
->tm_tags_array
->pdata
[0]);
114 isymbol_iter_next (IAnjutaIterable
*iterable
, GError
**err
)
116 AnjutaSymbolIter
*si
= ANJUTA_SYMBOL_ITER (iterable
);
118 if (si
->priv
->current_pos
>= (si
->priv
->tm_tags_array
->len
- 1))
120 anjuta_symbol_set_tag (ANJUTA_SYMBOL (iterable
),
121 si
->priv
->tm_tags_array
->pdata
[si
->priv
->tm_tags_array
->len
- 1]);
124 si
->priv
->current_pos
++;
125 /* g_assert (si->priv->tm_tags_array->pdata[si->priv->current_pos]); */
126 anjuta_symbol_set_tag (ANJUTA_SYMBOL (iterable
),
127 si
->priv
->tm_tags_array
->pdata
[si
->priv
->current_pos
]);
132 isymbol_iter_previous (IAnjutaIterable
*iterable
, GError
**err
)
134 AnjutaSymbolIter
*si
= ANJUTA_SYMBOL_ITER (iterable
);
136 if (si
->priv
->current_pos
<= 0)
138 anjuta_symbol_set_tag (ANJUTA_SYMBOL (iterable
),
139 si
->priv
->tm_tags_array
->pdata
[0]);
142 si
->priv
->current_pos
--;
143 /* g_assert (si->priv->tm_tags_array->pdata[si->priv->current_pos]); */
144 anjuta_symbol_set_tag (ANJUTA_SYMBOL (iterable
),
145 si
->priv
->tm_tags_array
->pdata
[si
->priv
->current_pos
]);
150 isymbol_iter_last (IAnjutaIterable
*iterable
, GError
**err
)
152 AnjutaSymbolIter
*si
= ANJUTA_SYMBOL_ITER (iterable
);
154 si
->priv
->current_pos
= 0;
155 if (si
->priv
->tm_tags_array
->len
<= 0)
157 anjuta_symbol_set_tag (ANJUTA_SYMBOL (iterable
),
158 si
->priv
->tm_tags_array
->pdata
[0]);
161 si
->priv
->current_pos
= si
->priv
->tm_tags_array
->len
- 1;
162 /* g_assert (si->priv->tm_tags_array->pdata[si->priv->current_pos]); */
163 anjuta_symbol_set_tag (ANJUTA_SYMBOL (iterable
),
164 si
->priv
->tm_tags_array
->pdata
[si
->priv
->current_pos
]);
169 isymbol_iter_foreach (IAnjutaIterable
*iterable
, GFunc callback
,
170 gpointer user_data
, GError
**err
)
172 AnjutaSymbolIter
*si
= ANJUTA_SYMBOL_ITER (iterable
);
173 gint saved_pos
= si
->priv
->current_pos
;
175 isymbol_iter_first (iterable
, NULL
);
176 while (!isymbol_iter_next (iterable
, NULL
))
177 callback (iterable
, user_data
);
178 isymbol_iter_set_position (iterable
, saved_pos
, NULL
);
182 isymbol_iter_set_position (IAnjutaIterable
*iterable
,
183 gint position
, GError
**err
)
185 AnjutaSymbolIter
*si
= ANJUTA_SYMBOL_ITER (iterable
);
188 if (position
> (si
->priv
->tm_tags_array
->len
- 1))
190 si
->priv
->current_pos
= position
;
191 /* g_assert (si->priv->tm_tags_array->pdata[si->priv->current_pos]); */
192 anjuta_symbol_set_tag (ANJUTA_SYMBOL (iterable
),
193 si
->priv
->tm_tags_array
->pdata
[si
->priv
->current_pos
]);
198 isymbol_iter_get_position (IAnjutaIterable
*iterable
, GError
**err
)
200 AnjutaSymbolIter
*si
= ANJUTA_SYMBOL_ITER (iterable
);
201 return si
->priv
->current_pos
;
205 isymbol_iter_get_length (IAnjutaIterable
*iterable
, GError
**err
)
207 AnjutaSymbolIter
*si
= ANJUTA_SYMBOL_ITER (iterable
);
208 return si
->priv
->tm_tags_array
->len
;
212 isymbol_iter_iface_init (IAnjutaIterableIface
*iface
, GError
**err
)
214 iface
->first
= isymbol_iter_first
;
215 iface
->next
= isymbol_iter_next
;
216 iface
->previous
= isymbol_iter_previous
;
217 iface
->last
= isymbol_iter_last
;
218 iface
->foreach
= isymbol_iter_foreach
;
219 iface
->set_position
= isymbol_iter_set_position
;
220 iface
->get_position
= isymbol_iter_get_position
;
221 iface
->get_length
= isymbol_iter_get_length
;
224 ANJUTA_TYPE_BEGIN (AnjutaSymbolIter
, anjuta_symbol_iter
, ANJUTA_TYPE_SYMBOL
);
225 ANJUTA_TYPE_ADD_INTERFACE (isymbol_iter
, IANJUTA_TYPE_ITERABLE
);