Remove silly tag dereferences suffix
[giggle.git] / src / giggle-view-file.c
blob420a331865635099ad01920bd98ea2a6ec1b8929
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3 * Copyright (C) 2007 Imendio AB
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public
16 * License along with this program; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
21 #include <config.h>
22 #include <gtk/gtk.h>
23 #include <glib/gi18n.h>
25 #include "giggle-git.h"
26 #include "giggle-git-revisions.h"
27 #include "giggle-view-file.h"
28 #include "giggle-file-list.h"
29 #include "giggle-revision-list.h"
30 #include "giggle-revision-view.h"
31 #include "giggle-diff-view.h"
33 typedef struct GiggleViewFilePriv GiggleViewFilePriv;
35 struct GiggleViewFilePriv {
36 GtkWidget *file_list;
37 GtkWidget *revision_list;
38 GtkWidget *revision_view;
39 GtkWidget *diff_view;
41 GiggleGit *git;
42 GiggleJob *job;
45 static void view_file_finalize (GObject *object);
47 static void view_file_selection_changed_cb (GtkTreeSelection *selection,
48 GiggleViewFile *view);
49 static void view_file_revision_list_selection_changed_cb (GiggleRevisionList *list,
50 GiggleRevision *revision1,
51 GiggleRevision *revision2,
52 GiggleViewFile *view);
55 G_DEFINE_TYPE (GiggleViewFile, giggle_view_file, GIGGLE_TYPE_VIEW)
57 #define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GIGGLE_TYPE_VIEW_FILE, GiggleViewFilePriv))
59 static void
60 giggle_view_file_class_init (GiggleViewFileClass *class)
62 GObjectClass *object_class = G_OBJECT_CLASS (class);
64 object_class->finalize = view_file_finalize;
66 g_type_class_add_private (object_class, sizeof (GiggleViewFilePriv));
69 static void
70 giggle_view_file_init (GiggleViewFile *view)
72 GiggleViewFilePriv *priv;
73 GtkWidget *hpaned, *vpaned, *vbox;
74 GtkWidget *scrolled_window;
75 GtkWidget *expander;
76 GtkTreeSelection *selection;
78 priv = GET_PRIV (view);
80 priv->git = giggle_git_get ();
82 gtk_widget_push_composite_child ();
84 hpaned = gtk_hpaned_new ();
85 gtk_widget_show (hpaned);
86 gtk_container_add (GTK_CONTAINER (view), hpaned);
88 vpaned = gtk_vpaned_new ();
89 gtk_widget_show (vpaned);
90 gtk_paned_pack2 (GTK_PANED (hpaned), vpaned, TRUE, FALSE);
92 /* FIXME: hardcoded sizes are evil */
93 gtk_paned_set_position (GTK_PANED (hpaned), 150);
95 vbox = gtk_vbox_new (FALSE, 0);
96 gtk_widget_show (vbox);
97 gtk_paned_pack2 (GTK_PANED (vpaned), vbox, FALSE, FALSE);
99 /* file view */
100 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
101 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
102 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
103 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN);
105 priv->file_list = giggle_file_list_new ();
106 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->file_list));
107 g_signal_connect (G_OBJECT (selection), "changed",
108 G_CALLBACK (view_file_selection_changed_cb), view);
110 gtk_container_add (GTK_CONTAINER (scrolled_window), priv->file_list);
111 gtk_widget_show_all (scrolled_window);
113 gtk_paned_pack1 (GTK_PANED (hpaned), scrolled_window, FALSE, FALSE);
115 /* revisions list */
116 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
117 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
118 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
119 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN);
121 priv->revision_list = giggle_revision_list_new ();
122 g_signal_connect (G_OBJECT (priv->revision_list), "selection-changed",
123 G_CALLBACK (view_file_revision_list_selection_changed_cb), view);
125 gtk_container_add (GTK_CONTAINER (scrolled_window), priv->revision_list);
126 gtk_widget_show_all (scrolled_window);
128 gtk_paned_pack1 (GTK_PANED (vpaned), scrolled_window, TRUE, FALSE);
130 /* revision view */
131 expander = gtk_expander_new_with_mnemonic (_("Revision _information"));
132 priv->revision_view = giggle_revision_view_new ();
133 gtk_container_add (GTK_CONTAINER (expander), priv->revision_view);
134 gtk_widget_show_all (expander);
136 gtk_box_pack_start (GTK_BOX (vbox), expander, FALSE, TRUE, 0);
138 /* diff view */
139 expander = gtk_expander_new_with_mnemonic (_("_Differences"));
141 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
142 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
143 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
144 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN);
146 priv->diff_view = giggle_diff_view_new ();
148 gtk_container_add (GTK_CONTAINER (scrolled_window), priv->diff_view);
149 gtk_container_add (GTK_CONTAINER (expander), scrolled_window);
150 gtk_widget_show_all (expander);
152 gtk_box_pack_start (GTK_BOX (vbox), expander, TRUE, TRUE, 0);
154 gtk_widget_pop_composite_child ();
157 static void
158 view_file_finalize (GObject *object)
160 GiggleViewFilePriv *priv;
162 priv = GET_PRIV (object);
165 static void
166 view_file_select_file_job_callback (GiggleGit *git,
167 GiggleJob *job,
168 GError *error,
169 gpointer data)
171 GiggleViewFile *view;
172 GiggleViewFilePriv *priv;
173 GtkListStore *store;
174 GtkTreeIter iter;
175 GList *revisions;
177 view = GIGGLE_VIEW_FILE (data);
178 priv = GET_PRIV (view);
180 if (error) {
181 GtkWidget *dialog;
183 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))),
184 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
185 GTK_MESSAGE_ERROR,
186 GTK_BUTTONS_OK,
187 _("An error ocurred when getting the revisions list:\n%s"),
188 error->message);
190 gtk_dialog_run (GTK_DIALOG (dialog));
191 gtk_widget_destroy (dialog);
192 } else {
193 store = gtk_list_store_new (1, GIGGLE_TYPE_REVISION);
194 revisions = giggle_git_revisions_get_revisions (GIGGLE_GIT_REVISIONS (job));
196 while (revisions) {
197 gtk_list_store_append (store, &iter);
198 gtk_list_store_set (store, &iter,
199 0, revisions->data,
200 -1);
201 revisions = revisions->next;
204 giggle_revision_list_set_model (GIGGLE_REVISION_LIST (priv->revision_list), GTK_TREE_MODEL (store));
205 g_object_unref (store);
208 g_object_unref (job);
211 static void
212 view_file_selection_changed_cb (GtkTreeSelection *selection,
213 GiggleViewFile *view)
215 GiggleViewFilePriv *priv;
216 GList *files;
218 priv = GET_PRIV (view);
219 files = giggle_file_list_get_selection (GIGGLE_FILE_LIST (priv->file_list));
221 priv->job = giggle_git_revisions_new_for_files (files);
223 giggle_git_run_job (priv->git,
224 priv->job,
225 view_file_select_file_job_callback,
226 view);
229 static void
230 view_file_revision_list_selection_changed_cb (GiggleRevisionList *list,
231 GiggleRevision *revision1,
232 GiggleRevision *revision2,
233 GiggleViewFile *view)
235 GiggleViewFilePriv *priv;
236 GList *files;
238 priv = GET_PRIV (view);
240 giggle_revision_view_set_revision (
241 GIGGLE_REVISION_VIEW (priv->revision_view), revision1);
243 if (revision1 && revision2) {
244 files = giggle_file_list_get_selection (GIGGLE_FILE_LIST (priv->file_list));
246 giggle_diff_view_set_revisions (GIGGLE_DIFF_VIEW (priv->diff_view),
247 revision1, revision2, files);
252 GtkWidget *
253 giggle_view_file_new (void)
255 return g_object_new (GIGGLE_TYPE_VIEW_FILE, NULL);
258 /* FIXME: this function is ugly, but we somehow want
259 * the revisions list to be global to all the application */
260 void
261 giggle_view_file_set_model (GiggleViewFile *view_history,
262 GtkTreeModel *model)
264 GiggleViewFilePriv *priv;
266 g_return_if_fail (GIGGLE_IS_VIEW_FILE (view_history));
267 g_return_if_fail (GTK_IS_TREE_MODEL (model));
269 priv = GET_PRIV (view_history);
271 giggle_revision_list_set_model (GIGGLE_REVISION_LIST (priv->revision_list), model);