1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 * Copyright (C) Massimo Cora' 2007 <maxcvs@email.it>
6 * anjuta is free software.
8 * You may redistribute it and/or modify it under the terms of the
9 * GNU General Public License, as published by the Free Software
10 * Foundation; either version 2 of the License, or (at your option)
13 * anjuta 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.
16 * See the GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with anjuta. If not, write to:
20 * The Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor
22 * Boston, MA 02110-1301, USA.
25 #include <libanjuta/interfaces/ianjuta-symbol.h>
26 #include <libanjuta/anjuta-utils.h>
27 #include <libanjuta/anjuta-debug.h>
29 #include "symbol-db-engine-iterator-node.h"
30 #include "symbol-db-engine.h"
31 #include "symbol-db-view.h"
33 struct _SymbolDBEngineIteratorNodePriv
35 GdaDataModelIter
*data_iter
;
36 const GHashTable
*sym_type_conversion_hash
;
40 static GObjectClass
* parent_class
= NULL
;
43 SymbolDBEngineIteratorNode
*
44 symbol_db_engine_iterator_node_new (const GdaDataModelIter
*data
)
46 /* DEBUG_PRINT ("sdb_engine_iterator_node_new ()");*/
47 SymbolDBEngineIteratorNode
*s
;
48 s
= g_object_new (SYMBOL_TYPE_DB_ENGINE_ITERATOR_NODE
, NULL
);
49 s
->priv
->data_iter
= (GdaDataModelIter
*)data
;
56 sdb_engine_iterator_node_instance_init (SymbolDBEngineIteratorNode
*object
)
58 SymbolDBEngineIteratorNode
*sdbin
;
59 /* DEBUG_PRINT ("sdb_engine_iterator_node_instance_init ()");*/
61 sdbin
= SYMBOL_DB_ENGINE_ITERATOR_NODE (object
);
63 sdbin
->priv
= g_new0 (SymbolDBEngineIteratorNodePriv
, 1);
64 sdbin
->priv
->sym_type_conversion_hash
= NULL
;
65 sdbin
->priv
->uri
= NULL
;
69 sdb_engine_iterator_node_finalize (GObject
*object
)
71 /* TODO: Add deinitalization code here */
72 SymbolDBEngineIteratorNode
*dbin
;
73 SymbolDBEngineIteratorNodePriv
*priv
;
75 /* DEBUG_PRINT ("sdb_engine_iterator_node_finalize ()");*/
77 dbin
= SYMBOL_DB_ENGINE_ITERATOR_NODE (object
);
84 G_OBJECT_CLASS (parent_class
)->finalize (object
);
88 sdb_engine_iterator_node_class_init (SymbolDBEngineIteratorNodeClass
*klass
)
90 GObjectClass
* object_class
= G_OBJECT_CLASS (klass
);
91 parent_class
= G_OBJECT_CLASS (g_type_class_peek_parent (klass
));
93 object_class
->finalize
= sdb_engine_iterator_node_finalize
;
97 * Symbol name must be always on column 0
100 symbol_db_engine_iterator_node_get_symbol_id (SymbolDBEngineIteratorNode
*dbin
)
102 SymbolDBEngineIteratorNodePriv
*priv
;
106 g_return_val_if_fail (dbin
!= NULL
, -1);
109 par
= gda_data_model_iter_get_param_for_column (priv
->data_iter
, 0);
110 value
= gda_parameter_get_value (par
);
112 return value
!= NULL
&& G_VALUE_HOLDS_INT (value
)
113 ? g_value_get_int (value
) : -1;
117 * Symbol name must be always on column 1
120 symbol_db_engine_iterator_node_get_symbol_name (SymbolDBEngineIteratorNode
*dbin
)
122 SymbolDBEngineIteratorNodePriv
*priv
;
126 g_return_val_if_fail (dbin
!= NULL
, NULL
);
129 par
= gda_data_model_iter_get_param_for_column (priv
->data_iter
, 1);
130 value
= gda_parameter_get_value (par
);
132 return value
!= NULL
&& G_VALUE_HOLDS_STRING (value
)
133 ? g_value_get_string (value
) : NULL
;
137 * File pos must be always on column 2
140 symbol_db_engine_iterator_node_get_symbol_file_pos (SymbolDBEngineIteratorNode
*dbin
)
142 SymbolDBEngineIteratorNodePriv
*priv
;
146 g_return_val_if_fail (dbin
!= NULL
, -1);
149 par
= gda_data_model_iter_get_param_for_column (priv
->data_iter
, 2);
150 value
= gda_parameter_get_value (par
);
152 return value
!= NULL
&& G_VALUE_HOLDS_INT (value
)
153 ? g_value_get_int (value
) : -1;
157 * 'Is File Scope' must be always on column 3
160 symbol_db_engine_iterator_node_get_symbol_is_file_scope (SymbolDBEngineIteratorNode
*dbin
)
162 SymbolDBEngineIteratorNodePriv
*priv
;
167 g_return_val_if_fail (dbin
!= NULL
, FALSE
);
170 par
= gda_data_model_iter_get_param_for_column (priv
->data_iter
, 3);
171 value
= gda_parameter_get_value (par
);
174 return g_value_get_int (value
) == 1 ? TRUE
: FALSE
;
180 * Signature must be always on column 4
183 symbol_db_engine_iterator_node_get_symbol_signature (SymbolDBEngineIteratorNode
*dbin
)
185 SymbolDBEngineIteratorNodePriv
*priv
;
189 g_return_val_if_fail (dbin
!= NULL
, NULL
);
192 par
= gda_data_model_iter_get_param_for_column (priv
->data_iter
, 4);
193 value
= gda_parameter_get_value (par
);
195 return value
!= NULL
&& G_VALUE_HOLDS_STRING (value
)
196 ? g_value_get_string (value
) : NULL
;
200 symbol_db_engine_iterator_node_get_symbol_extra_string (SymbolDBEngineIteratorNode
*dbin
,
203 SymbolDBEngineIteratorNodePriv
*priv
;
204 GdaParameter
*par
= NULL
;
205 GdaParameter
*res
= NULL
;
208 g_return_val_if_fail (dbin
!= NULL
, NULL
);
211 DEBUG_PRINT ("symbol_db_engine_iterator_node_get_symbol_extra_string () for %d",
214 if (GDA_PARAMETER_LIST(priv
->data_iter
)) {
215 g_print ("-Parameter(s):\n");
217 for (params
= GDA_PARAMETER_LIST(priv
->data_iter
)->parameters
; params
;
218 params
= params
->next
) {
219 GdaParameter
*parameter
= GDA_PARAMETER (params
->data
);
220 g_print (" - name:%s type:%s\n",
221 gda_object_get_name (GDA_OBJECT (parameter
)),
222 g_type_name (gda_parameter_get_g_type (parameter
)));
226 if (sym_info
& SYMINFO_FILE_PATH
)
228 par
= gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv
->data_iter
),
231 else if (sym_info
& SYMINFO_LANGUAGE
)
233 par
= gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv
->data_iter
),
236 else if (sym_info
& SYMINFO_IMPLEMENTATION
)
238 par
= gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv
->data_iter
),
239 "implementation_name");
241 else if (sym_info
& SYMINFO_ACCESS
)
243 par
= gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv
->data_iter
),
246 else if (sym_info
& SYMINFO_KIND
)
248 par
= gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv
->data_iter
),
251 else if (sym_info
& SYMINFO_TYPE
)
253 par
= gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv
->data_iter
),
256 else if (sym_info
& SYMINFO_TYPE_NAME
)
258 par
= gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv
->data_iter
),
261 else if (sym_info
& SYMINFO_PROJECT_NAME
)
263 par
= gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv
->data_iter
),
266 else if (sym_info
& SYMINFO_FILE_IGNORE
)
268 par
= gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv
->data_iter
),
271 else if (sym_info
& SYMINFO_FILE_INCLUDE
)
273 par
= gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv
->data_iter
),
274 "file_include_type");
279 column
= gda_data_model_iter_get_column_for_param (priv
->data_iter
, par
);
280 res
= gda_data_model_iter_get_param_for_column (priv
->data_iter
, column
);
281 return gda_parameter_get_value_str (res
);
288 symbol_db_engine_iterator_node_set_conversion_hash (SymbolDBEngineIteratorNode
*dbin
,
289 const GHashTable
*sym_type_conversion_hash
)
291 g_return_if_fail (dbin
!= NULL
);
292 g_return_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR_NODE (dbin
));
294 SymbolDBEngineIteratorNodePriv
*priv
;
297 priv
->sym_type_conversion_hash
= sym_type_conversion_hash
;
301 symbol_db_engine_iterator_node_set_data (SymbolDBEngineIteratorNode
*dbin
,
302 const GdaDataModelIter
*data
)
304 g_return_if_fail (dbin
!= NULL
);
305 g_return_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR_NODE (dbin
));
307 SymbolDBEngineIteratorNodePriv
*priv
;
310 priv
->data_iter
= GDA_DATA_MODEL_ITER (data
);
311 if (priv
->uri
!= NULL
)
319 /* IAnjutaSymbol implementation */
320 static IAnjutaSymbolType
321 isymbol_type (IAnjutaSymbol
*isymbol
, GError
**err
)
323 SymbolDBEngineIteratorNode
*s
;
324 SymbolDBEngineIteratorNodePriv
*priv
;
326 const gchar
* find_str
;
328 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR_NODE (isymbol
),
329 IANJUTA_SYMBOL_TYPE_UNDEF
);
331 s
= SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol
);
334 find_str
= symbol_db_engine_iterator_node_get_symbol_extra_string (s
,
336 if (find_str
== NULL
) {
337 DEBUG_PRINT ("isymbol_type (): find_str is NULL");
338 return IANJUTA_SYMBOL_TYPE_UNDEF
;
341 tag_found
= g_hash_table_lookup (priv
->sym_type_conversion_hash
, find_str
);
343 if (tag_found
== NULL
) {
344 DEBUG_PRINT ("isymbol_type (): nothing matching ");
345 return IANJUTA_SYMBOL_TYPE_UNDEF
;
348 return (IAnjutaSymbolType
)tag_found
;
353 isymbol_type_str (IAnjutaSymbol
*isymbol
, GError
**err
)
355 SymbolDBEngineIteratorNode
*s
;
357 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol
), NULL
);
358 s
= SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol
);
359 return symbol_db_engine_iterator_node_get_symbol_extra_string (s
,
364 isymbol_type_name (IAnjutaSymbol
*isymbol
, GError
**err
)
366 SymbolDBEngineIteratorNode
*s
;
368 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol
), NULL
);
369 s
= SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol
);
370 return symbol_db_engine_iterator_node_get_symbol_extra_string (s
,
376 isymbol_name (IAnjutaSymbol
*isymbol
, GError
**err
)
378 SymbolDBEngineIteratorNode
*s
;
380 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol
), NULL
);
381 s
= SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol
);
383 return symbol_db_engine_iterator_node_get_symbol_name (s
);
387 isymbol_args (IAnjutaSymbol
*isymbol
, GError
**err
)
389 SymbolDBEngineIteratorNode
*s
;
391 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol
), NULL
);
392 s
= SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol
);
393 return symbol_db_engine_iterator_node_get_symbol_signature (s
);
397 isymbol_scope (IAnjutaSymbol
*isymbol
, GError
**err
)
399 SymbolDBEngineIteratorNode
*s
;
401 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol
), NULL
);
402 s
= SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol
);
403 // g_return_val_if_fail (s->priv->tm_tag != NULL, NULL);
404 // return s->priv->tm_tag->atts.entry.scope;
409 isymbol_inheritance (IAnjutaSymbol
*isymbol
, GError
**err
)
411 SymbolDBEngineIteratorNode
*s
;
413 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol
), NULL
);
414 s
= SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol
);
415 // g_return_val_if_fail (s->priv->tm_tag != NULL, NULL);
416 // return s->priv->tm_tag->atts.entry.inheritance;
422 isymbol_access (IAnjutaSymbol
*isymbol
, GError
**err
)
424 SymbolDBEngineIteratorNode
*s
;
426 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol
), NULL
);
427 s
= SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol
);
428 return symbol_db_engine_iterator_node_get_symbol_extra_string (s
,
433 isymbol_impl (IAnjutaSymbol
*isymbol
, GError
**err
)
435 SymbolDBEngineIteratorNode
*s
;
437 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol
), NULL
);
438 s
= SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol
);
439 return symbol_db_engine_iterator_node_get_symbol_extra_string (s
,
440 SYMINFO_IMPLEMENTATION
);
444 isymbol_uri (IAnjutaSymbol
*isymbol
, GError
**err
)
446 SymbolDBEngineIteratorNode
*s
;
448 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol
), NULL
);
449 s
= SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol
);
450 if (s
->priv
->uri
== NULL
)
452 const cgchar
* file_path
;
453 file_path
= symbol_db_engine_iterator_node_get_symbol_extra_string (s
,
455 s
->priv
->uri
= gnome_vfs_get_uri_from_local_path (file_path
);
461 isymbol_line (IAnjutaSymbol
*isymbol
, GError
**err
)
463 SymbolDBEngineIteratorNode
*s
;
465 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol
), 0);
466 s
= SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol
);
467 return symbol_db_engine_iterator_node_get_symbol_file_pos (s
);
471 isymbol_is_local (IAnjutaSymbol
*isymbol
, GError
**err
)
473 SymbolDBEngineIteratorNode
*s
;
475 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol
), FALSE
);
476 s
= SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol
);
477 return symbol_db_engine_iterator_node_get_symbol_is_file_scope (s
);
480 static const GdkPixbuf
*
481 isymbol_icon (IAnjutaSymbol
*isymbol
, GError
**err
)
483 SymbolDBEngineIteratorNode
*s
;
485 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol
), FALSE
);
486 s
= SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol
);
488 return symbol_db_view_get_pixbuf (
489 symbol_db_engine_iterator_node_get_symbol_extra_string (s
,
491 symbol_db_engine_iterator_node_get_symbol_extra_string (s
,
496 isymbol_iface_init (IAnjutaSymbolIface
*iface
)
498 iface
->type
= isymbol_type
;
499 iface
->type_str
= isymbol_type_str
;
500 iface
->type_name
= isymbol_type_name
;
501 iface
->name
= isymbol_name
;
502 iface
->args
= isymbol_args
;
503 iface
->scope
= isymbol_scope
;
504 iface
->inheritance
= isymbol_inheritance
;
505 iface
->access
= isymbol_access
;
506 iface
->impl
= isymbol_impl
;
507 iface
->uri
= isymbol_uri
;
508 iface
->line
= isymbol_line
;
509 iface
->is_local
= isymbol_is_local
;
510 iface
->icon
= isymbol_icon
;
513 ANJUTA_TYPE_BEGIN (SymbolDBEngineIteratorNode
, sdb_engine_iterator_node
, G_TYPE_OBJECT
);
514 ANJUTA_TYPE_ADD_INTERFACE (isymbol
, IANJUTA_TYPE_SYMBOL
);