2 * (c) 2010 Cyrill Gorcunov, gorcunov@gmail.com
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or (at
7 * your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
18 * handle queries (id-utils, cscope, text, etc...)
29 #include <sys/param.h>
30 #include <sys/types.h>
37 #include "backend-proto.h"
38 #include "sourceview.h"
54 int query_switch_or_read_source_into_notebook(struct gscope_info
*info
, struct backend_proto_item
*item
)
56 struct notebook_page
*page
;
57 struct source_view
*sv
;
62 * search thru all sourceview pages
63 * and highlight the name found
66 list_for_each_entry(page
, &info
->notebook_source
->pages
, siblings
) {
67 sv
= (struct source_view
*)page
->private;
68 //debug("(%s : %s) : %s", sv->file_name, sv->file_path, item->file);
69 if (!strcmp(item
->file
, sv
->file_path
)) {
71 source_view_scroll_to_line(sv
, item
->line
);
72 notebook_activate_page(info
->notebook_source
, page
);
76 /* not found, create new one */
77 read_file_into_notebook(info
, item
->file
);
79 warning("Too many attempts too read file: %s", item
->file
);
83 static int item_from_row(GtkTreeView
*view
, GtkTreePath
*path
, struct query_result
*query
,
84 struct backend_proto_item
*item
)
89 model
= gtk_tree_view_get_model(view
);
90 if (gtk_tree_model_get_iter(model
, &iter
, path
)) {
92 gtk_tree_model_get(model
, &iter
, COL_INDEX
, &key
, -1);
93 if (query
->proto
->backend_proto_lookup(query
->head
, item
, key
)) {
94 warning("%s: Lookup for key %lu failed",
95 query
->proto
->protocol_name
, key
);
98 /* FIXME: free or unreference */
105 on_query_tree_widget_button_press_event(GtkWidget
*widget
,
106 GdkEventButton
*event
,
109 struct query_view
*query_view
= (struct query_view
*)data
;
110 GtkTreeViewColumn
*focus_column
= NULL
;
111 GtkTreePath
*path
= NULL
;
113 if (event
->button
!= 1 || event
->type
!= GDK_2BUTTON_PRESS
)
116 gtk_tree_view_get_cursor(GTK_TREE_VIEW(query_view
->query_tree_widget
), &path
, &focus_column
);
118 struct notebook_page
*page
;
119 struct source_view
*sv
;
120 struct backend_proto_item item
;
121 if (item_from_row(GTK_TREE_VIEW(widget
), path
, &query_view
->query
, &item
)) {
122 //debug("item_from_row failed");
125 query_switch_or_read_source_into_notebook(&gscope_info
, &item
);
127 gtk_tree_path_free(path
);
133 struct query_view
*query_view_create(struct query_result
*query_result
)
135 GtkWidget
*scroll_tree
;
136 GtkCellRenderer
*renderer
;
137 GtkTreeViewColumn
*column
;
141 struct query_view
*query_view
;
142 struct backend_proto_item item
;
145 if (!(is_valid_query_result(query_result
)))
148 query_view
= xzalloc(sizeof(*query_view
));
149 memcpy(&query_view
->query
, query_result
, sizeof(query_view
->query
));
154 query_view
->me
= gtk_hpaned_new();
156 scroll_tree
= gtk_scrolled_window_new(NULL
, NULL
);
157 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_tree
),
158 GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
160 query_view
->query_tree_widget
= gtk_tree_view_new();
161 gtk_container_add(GTK_CONTAINER(scroll_tree
), query_view
->query_tree_widget
);
163 renderer
= gtk_cell_renderer_text_new();
164 column
= gtk_tree_view_column_new_with_attributes("File",
165 renderer
, "text", COL_FILE
, NULL
);
166 gtk_tree_view_column_set_resizable(column
, TRUE
);
167 gtk_tree_view_column_set_sort_column_id(column
, COL_FILE
);
168 gtk_tree_view_append_column(GTK_TREE_VIEW(query_view
->query_tree_widget
), column
);
170 renderer
= gtk_cell_renderer_text_new();
171 column
= gtk_tree_view_column_new_with_attributes("Line",
172 renderer
, "text", COL_LINE
, NULL
);
173 gtk_tree_view_column_set_resizable(column
, TRUE
);
174 gtk_tree_view_column_set_sort_column_id(column
, COL_LINE
);
175 gtk_tree_view_append_column(GTK_TREE_VIEW(query_view
->query_tree_widget
), column
);
177 renderer
= gtk_cell_renderer_text_new();
178 column
= gtk_tree_view_column_new_with_attributes("Text",
179 renderer
, "text", COL_FUNC
, NULL
);
180 gtk_tree_view_column_set_resizable(column
, TRUE
);
181 gtk_tree_view_column_set_sort_column_id(column
, COL_FUNC
);
182 gtk_tree_view_append_column(GTK_TREE_VIEW(query_view
->query_tree_widget
), column
);
184 query_view
->query_store
= gtk_list_store_new(NUM_COLS
,
185 G_TYPE_STRING
, G_TYPE_UINT
,
186 G_TYPE_STRING
, G_TYPE_ULONG
);
188 list_for_each(t
, query_result
->head
) {
189 int err
= query_result
->proto
->backend_proto_get(t
, &item
);
191 error("%s: backend_proto_get returned %d",
192 query_result
->proto
->protocol_name
, err
);
195 gtk_list_store_append(query_view
->query_store
, &iter
);
196 gtk_list_store_set(query_view
->query_store
, &iter
,
204 model
= GTK_TREE_MODEL(query_view
->query_store
);
205 gtk_tree_view_set_model(GTK_TREE_VIEW(query_view
->query_tree_widget
), model
);
207 /* there is own reference anyway */
208 g_object_unref(model
);
210 gtk_paned_pack1(GTK_PANED(query_view
->me
), scroll_tree
, TRUE
, FALSE
);
213 g_signal_connect(G_OBJECT(query_view
->query_tree_widget
), "button_press_event",
214 G_CALLBACK(on_query_tree_widget_button_press_event
),
215 (gpointer
)query_view
);
220 /* we don't use 'me' at moment */
221 void query_view_destroy(GtkWidget
*me
, void *private)
223 struct query_view
*query_view
= private;
225 //gtk_widget_destroy(query_view->query_store);
226 gtk_widget_destroy(query_view
->query_tree_widget
);
227 gtk_widget_destroy(query_view
->me
);
229 query_view
->query
.proto
->backend_proto_destory(query_view
->query
.head
);