Set up current working directory on File->Open
[gscope.git] / queries.c
blobe3578f6d2a9e81d97bd281c33eb448e84a52f1a6
1 /*
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...)
21 #include <unistd.h>
22 #include <stdio.h>
23 #include <stddef.h>
24 #include <stdlib.h>
25 #include <stdarg.h>
26 #include <string.h>
27 #include <errno.h>
28 #include <limits.h>
29 #include <sys/param.h>
30 #include <sys/types.h>
32 #include <gtk/gtk.h>
34 #include "queries.h"
35 #include "notebook.h"
36 #include "tags.h"
37 #include "backend-proto.h"
38 #include "sourceview.h"
39 #include "view.h"
41 #include "util.h"
42 #include "list.h"
44 #include "mark.h"
46 enum {
47 COL_FILE,
48 COL_LINE,
49 COL_FUNC,
50 COL_INDEX,
51 NUM_COLS
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;
58 int attempt = 2;
60 while (attempt--) {
62 * search thru all sourceview pages
63 * and highlight the name found
65 //debug("---");
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)) {
70 mark_push(item);
71 source_view_scroll_to_line(sv, item->line);
72 notebook_activate_page(info->notebook_source, page);
73 return 0;
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);
80 return -1;
83 static int item_from_row(GtkTreeView *view, GtkTreePath *path, struct query_result *query,
84 struct backend_proto_item *item)
86 GtkTreeModel *model;
87 GtkTreeIter iter;
89 model = gtk_tree_view_get_model(view);
90 if (gtk_tree_model_get_iter(model, &iter, path)) {
91 unsigned long key;
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);
96 return -1;
98 /* FIXME: free or unreference */
101 return 0;
104 static gboolean
105 on_query_tree_widget_button_press_event(GtkWidget *widget,
106 GdkEventButton *event,
107 gpointer data)
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)
114 return FALSE;
116 gtk_tree_view_get_cursor(GTK_TREE_VIEW(query_view->query_tree_widget), &path, &focus_column);
117 if (path) {
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");
123 goto out;
125 query_switch_or_read_source_into_notebook(&gscope_info, &item);
126 out:
127 gtk_tree_path_free(path);
130 return FALSE;
133 struct query_view *query_view_create(struct query_result *query_result)
135 GtkWidget *scroll_tree;
136 GtkCellRenderer *renderer;
137 GtkTreeViewColumn *column;
138 GtkTreeModel *model;
139 GtkTreeIter iter;
141 struct query_view *query_view;
142 struct backend_proto_item item;
143 struct list_head *t;
145 if (!(is_valid_query_result(query_result)))
146 return NULL;
148 query_view = xzalloc(sizeof(*query_view));
149 memcpy(&query_view->query, query_result, sizeof(query_view->query));
152 * GUI things
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);
190 if (err) {
191 error("%s: backend_proto_get returned %d",
192 query_result->proto->protocol_name, err);
193 break;
195 gtk_list_store_append(query_view->query_store, &iter);
196 gtk_list_store_set(query_view->query_store, &iter,
197 COL_FILE, item.file,
198 COL_LINE, item.line,
199 COL_FUNC, item.text,
200 COL_INDEX,item.key,
201 -1);
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);
212 /* bind events */
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);
217 return 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);
230 free(query_view);