Initial German translation of the build tutorial
[anjuta.git] / plugins / symbol-db / symbol-db-model-file.c
blob2e9a87d0aa9747d71cfc0bb30bc935bf06b1a428
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * symbol-db-model-file.c
4 * Copyright (C) Naba Kumar 2010 <naba@gnome.org>
5 *
6 * anjuta is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * anjuta is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 * See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include "symbol-db-engine.h"
21 #include "symbol-db-model-file.h"
23 #define SDB_MODEL_FILE_SQL " \
24 SELECT \
25 symbol.symbol_id, \
26 symbol.name, \
27 symbol.file_position, \
28 symbol.scope_definition_id, \
29 symbol.signature, \
30 symbol.returntype, \
31 symbol.type_type, \
32 symbol.type_name, \
33 file.file_path, \
34 sym_access.access_name, \
35 sym_kind.is_container \
36 FROM symbol \
37 LEFT JOIN file ON symbol.file_defined_id = file.file_id \
38 LEFT JOIN sym_access ON symbol.access_kind_id = sym_access.access_kind_id \
39 LEFT JOIN sym_kind ON symbol.kind_id = sym_kind.sym_kind_id \
40 WHERE \
41 ( \
42 file.file_path = ## /* name:'filepath' type:gchararray */ \
43 AND symbol.scope_id = ## /* name:'parent' type:gint */ \
44 AND symbol.kind_id NOT IN \
45 ( \
46 SELECT sym_kind_id \
47 FROM sym_kind \
48 WHERE sym_kind.kind_name = 'namespace' \
49 ) \
50 ) \
51 OR \
52 ( \
53 symbol.symbol_id IN \
54 ( \
55 SELECT symbol_id \
56 FROM symbol \
57 LEFT JOIN file ON symbol.file_defined_id = file.file_id \
58 WHERE \
59 file.file_path = ## /* name:'filepath' type:gchararray */ \
60 AND symbol.scope_id = ## /* name:'parent' type:gint */ \
61 AND symbol.kind_id IN \
62 ( \
63 SELECT sym_kind_id \
64 FROM sym_kind \
65 WHERE sym_kind.kind_name = 'namespace' \
66 ) \
67 GROUP BY symbol.scope_definition_id \
69 ) \
70 ) \
71 OR \
72 ( \
73 symbol.scope_id = ## /* name:'parent' type:gint */ \
74 AND symbol.kind_id IN \
75 ( \
76 SELECT sym_kind_id \
77 FROM sym_kind \
78 WHERE sym_kind.kind_name = 'class' \
79 ) \
80 AND symbol.scope_definition_id IN \
81 ( \
82 SELECT scope_id \
83 FROM symbol \
84 JOIN file ON symbol.file_defined_id = file.file_id \
85 WHERE file.file_path = ## /* name:'filepath' type:gchararray */ \
86 GROUP BY symbol.scope_id \
87 ) \
88 ) \
89 ORDER BY symbol.name \
90 LIMIT ## /* name:'limit' type:gint */ \
91 OFFSET ## /* name:'offset' type:gint */ \
94 struct _SymbolDBModelFilePriv
96 gchar *file_path;
97 guint refresh_queue_id;
98 GdaStatement *stmt;
99 GdaSet *params;
100 GdaHolder *param_file_path, *param_parent_id, *param_limit, *param_offset;
103 enum
105 PROP_0,
106 PROP_SYMBOL_DB_FILE_PATH
109 G_DEFINE_TYPE (SymbolDBModelFile, sdb_model_file,
110 SYMBOL_DB_TYPE_MODEL_PROJECT);
112 static void
113 sdb_model_file_update_sql_stmt (SymbolDBModel *model)
115 SymbolDBEngine *dbe;
116 SymbolDBModelFilePriv *priv;
118 g_return_if_fail (SYMBOL_DB_IS_MODEL_FILE (model));
119 priv = SYMBOL_DB_MODEL_FILE (model)->priv;
121 g_object_get (model, "symbol-db-engine", &dbe, NULL);
122 priv->stmt = symbol_db_engine_get_statement (dbe, SDB_MODEL_FILE_SQL);
123 gda_statement_get_parameters (priv->stmt, &priv->params, NULL);
124 priv->param_file_path = gda_set_get_holder (priv->params, "filepath");
125 priv->param_parent_id = gda_set_get_holder (priv->params, "parent");
126 priv->param_limit = gda_set_get_holder (priv->params, "limit");
127 priv->param_offset = gda_set_get_holder (priv->params, "offset");
130 static GdaDataModel*
131 sdb_model_file_get_children (SymbolDBModel *model, gint tree_level,
132 GValue column_values[], gint offset,
133 gint limit)
135 SymbolDBEngine *dbe;
136 SymbolDBModelFilePriv *priv;
137 gint parent_id = 0;
138 const gchar *relative_path = NULL;
139 GValue ival = {0};
140 GValue sval = {0};
142 g_return_val_if_fail (SYMBOL_DB_IS_MODEL_FILE (model), 0);
143 priv = SYMBOL_DB_MODEL_FILE (model)->priv;
145 g_object_get (model, "symbol-db-engine", &dbe, NULL);
147 /* If engine is not connected, there is nothing we can show */
148 if (!dbe || !symbol_db_engine_is_connected (dbe) || !priv->file_path)
149 return NULL;
151 /* Determin node parent */
152 switch (tree_level)
154 case 0:
155 parent_id = 0;
156 break;
157 default:
158 parent_id = g_value_get_int
159 (&column_values[SYMBOL_DB_MODEL_PROJECT_COL_SCOPE_DEFINITION_ID]);
162 if (!priv->stmt)
163 sdb_model_file_update_sql_stmt (model);
165 relative_path = symbol_db_util_get_file_db_path (dbe, priv->file_path);
167 /* Initialize parameters */
168 g_value_init (&ival, G_TYPE_INT);
169 g_value_init (&sval, G_TYPE_STRING);
170 g_value_set_int (&ival, parent_id);
171 gda_holder_set_value (priv->param_parent_id, &ival, NULL);
172 g_value_set_int (&ival, limit);
173 gda_holder_set_value (priv->param_limit, &ival, NULL);
174 g_value_set_int (&ival, offset);
175 gda_holder_set_value (priv->param_offset, &ival, NULL);
176 g_value_set_static_string (&sval, relative_path);
177 gda_holder_set_value (priv->param_file_path, &sval, NULL);
178 g_value_reset (&sval);
180 return symbol_db_engine_execute_select (dbe, priv->stmt, priv->params);
183 static gint
184 sdb_model_file_get_n_children (SymbolDBModel *model, gint tree_level,
185 GValue column_values[])
187 gint n_children = 0;
188 GdaDataModel *data_model;
190 data_model = sdb_model_file_get_children (model, tree_level,
191 column_values, 0,
192 INT_MAX);
193 if (GDA_IS_DATA_MODEL (data_model))
195 n_children = gda_data_model_get_n_rows (data_model);
196 g_object_unref (data_model);
198 return n_children;
201 static gboolean
202 sdb_model_file_refresh_idle (gpointer object)
204 SymbolDBModelFilePriv *priv;
205 priv = SYMBOL_DB_MODEL_FILE (object)->priv;
206 symbol_db_model_update (SYMBOL_DB_MODEL (object));
207 priv->refresh_queue_id = 0;
208 return FALSE;
211 static void
212 sdb_model_file_set_property (GObject *object, guint prop_id,
213 const GValue *value, GParamSpec *pspec)
215 gchar *old_file_path;
216 SymbolDBModelFilePriv *priv;
218 g_return_if_fail (SYMBOL_DB_IS_MODEL_FILE (object));
219 priv = SYMBOL_DB_MODEL_FILE (object)->priv;
221 switch (prop_id)
223 case PROP_SYMBOL_DB_FILE_PATH:
224 old_file_path = priv->file_path;
225 priv->file_path = g_value_dup_string (value);
226 if (g_strcmp0 (old_file_path, priv->file_path) != 0)
228 if (!priv->refresh_queue_id)
229 priv->refresh_queue_id =
230 g_idle_add (sdb_model_file_refresh_idle, object);
232 g_free (old_file_path);
233 break;
234 default:
235 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
236 break;
240 static void
241 sdb_model_file_get_property (GObject *object, guint prop_id,
242 GValue *value, GParamSpec *pspec)
244 SymbolDBModelFilePriv *priv;
246 g_return_if_fail (SYMBOL_DB_IS_MODEL_FILE (object));
247 priv = SYMBOL_DB_MODEL_FILE (object)->priv;
249 switch (prop_id)
251 case PROP_SYMBOL_DB_FILE_PATH:
252 g_value_set_string (value, priv->file_path);
253 break;
254 default:
255 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
256 break;
260 static void
261 sdb_model_file_finalize (GObject *object)
263 SymbolDBModelFilePriv *priv;
265 g_return_if_fail (SYMBOL_DB_IS_MODEL_FILE (object));
266 priv = SYMBOL_DB_MODEL_FILE (object)->priv;
267 g_free (priv->file_path);
268 if (priv->stmt)
270 g_object_unref (priv->stmt);
271 g_object_unref (priv->params);
273 if (priv->refresh_queue_id)
274 g_source_remove (priv->refresh_queue_id);
275 g_free (priv);
277 G_OBJECT_CLASS (sdb_model_file_parent_class)->finalize (object);
280 static void
281 sdb_model_file_init (SymbolDBModelFile *object)
283 SymbolDBModelFilePriv *priv;
285 g_return_if_fail (SYMBOL_DB_IS_MODEL_FILE (object));
287 priv = g_new0 (SymbolDBModelFilePriv, 1);
288 object->priv = priv;
290 priv->file_path = NULL;
293 static void
294 sdb_model_file_class_init (SymbolDBModelFileClass *klass)
296 GObjectClass* object_class = G_OBJECT_CLASS (klass);
297 SymbolDBModelClass* model_class = SYMBOL_DB_MODEL_CLASS (klass);
299 object_class->finalize = sdb_model_file_finalize;
300 object_class->set_property = sdb_model_file_set_property;
301 object_class->get_property = sdb_model_file_get_property;
303 model_class->get_n_children = sdb_model_file_get_n_children;
304 model_class->get_children = sdb_model_file_get_children;
306 g_object_class_install_property
307 (object_class, PROP_SYMBOL_DB_FILE_PATH,
308 g_param_spec_string ("file-path",
309 "File Path",
310 "Absolute file path for which symbols are shown",
311 NULL, G_PARAM_READABLE | G_PARAM_WRITABLE));
314 GtkTreeModel*
315 symbol_db_model_file_new (SymbolDBEngine* dbe)
317 return GTK_TREE_MODEL (g_object_new (SYMBOL_DB_TYPE_MODEL_FILE,
318 "symbol-db-engine", dbe, NULL));