1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
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.
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
{
37 GtkWidget
*revision_list
;
38 GtkWidget
*revision_view
;
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))
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
));
70 giggle_view_file_init (GiggleViewFile
*view
)
72 GiggleViewFilePriv
*priv
;
73 GtkWidget
*hpaned
, *vpaned
, *vbox
;
74 GtkWidget
*scrolled_window
;
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
);
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
);
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
);
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);
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 ();
158 view_file_finalize (GObject
*object
)
160 GiggleViewFilePriv
*priv
;
162 priv
= GET_PRIV (object
);
166 view_file_select_file_job_callback (GiggleGit
*git
,
171 GiggleViewFile
*view
;
172 GiggleViewFilePriv
*priv
;
177 view
= GIGGLE_VIEW_FILE (data
);
178 priv
= GET_PRIV (view
);
183 dialog
= gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view
))),
184 GTK_DIALOG_MODAL
| GTK_DIALOG_DESTROY_WITH_PARENT
,
187 _("An error ocurred when getting the revisions list:\n%s"),
190 gtk_dialog_run (GTK_DIALOG (dialog
));
191 gtk_widget_destroy (dialog
);
193 store
= gtk_list_store_new (1, GIGGLE_TYPE_REVISION
);
194 revisions
= giggle_git_revisions_get_revisions (GIGGLE_GIT_REVISIONS (job
));
197 gtk_list_store_append (store
, &iter
);
198 gtk_list_store_set (store
, &iter
,
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
);
212 view_file_selection_changed_cb (GtkTreeSelection
*selection
,
213 GiggleViewFile
*view
)
215 GiggleViewFilePriv
*priv
;
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
,
225 view_file_select_file_job_callback
,
230 view_file_revision_list_selection_changed_cb (GiggleRevisionList
*list
,
231 GiggleRevision
*revision1
,
232 GiggleRevision
*revision2
,
233 GiggleViewFile
*view
)
235 GiggleViewFilePriv
*priv
;
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
);
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 */
261 giggle_view_file_set_model (GiggleViewFile
*view_history
,
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
);