Updated Spanish translation
[anjuta.git] / libanjuta / anjuta-cell-renderer-diff.c
blob019ff7dbf0a15bd787f5b727bb8d830d1af47e00
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * anjuta-cell-renderer-diff.c
4 * Copyright (C) 2013 James Liggett <jrliggett@cox.net>
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 "anjuta-cell-renderer-diff.h"
22 struct _AnjutaCellRendererDiffPrivate
24 GtkCellRenderer *text_cell;
28 enum
30 PROP_0,
32 PROP_DIFF
36 /* Line types */
37 typedef enum
39 LINE_TYPE_HEADER,
40 LINE_TYPE_HUNK_HEADER,
41 LINE_TYPE_ADD,
42 LINE_TYPE_DELETE,
43 LINE_TYPE_CONTEXT
44 } LineType;
46 G_DEFINE_TYPE (AnjutaCellRendererDiff, anjuta_cell_renderer_diff, GTK_TYPE_CELL_RENDERER);
48 static void
49 anjuta_cell_renderer_diff_init (AnjutaCellRendererDiff *self)
51 self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, ANJUTA_TYPE_CELL_RENDERER_DIFF,
52 AnjutaCellRendererDiffPrivate);
54 self->priv->text_cell = gtk_cell_renderer_text_new ();
57 static void
58 anjuta_cell_renderer_diff_finalize (GObject *object)
60 AnjutaCellRendererDiff *self;
62 self = ANJUTA_CELL_RENDERER_DIFF (object);
64 g_object_unref (self->priv->text_cell);
66 G_OBJECT_CLASS (anjuta_cell_renderer_diff_parent_class)->finalize (object);
69 static void
70 anjuta_cell_renderer_diff_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
72 g_return_if_fail (ANJUTA_IS_CELL_RENDERER_DIFF (object));
74 switch (prop_id)
76 case PROP_DIFF:
77 anjuta_cell_renderer_diff_set_diff (ANJUTA_CELL_RENDERER_DIFF (object),
78 g_value_get_string (value));
79 break;
80 default:
81 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
82 break;
86 static void
87 anjuta_cell_renderer_diff_render (GtkCellRenderer *cell,
88 cairo_t *cr,
89 GtkWidget *widget,
90 const GdkRectangle *background_area,
91 const GdkRectangle *cell_area,
92 GtkCellRendererState flags)
94 AnjutaCellRendererDiff *self;
96 self = ANJUTA_CELL_RENDERER_DIFF (cell);
98 gtk_cell_renderer_render (self->priv->text_cell, cr, widget,
99 background_area, cell_area, flags);
102 static void
103 anjuta_cell_renderer_diff_get_preferred_width (GtkCellRenderer *cell,
104 GtkWidget *widget,
105 gint *minimum,
106 gint *natural)
108 AnjutaCellRendererDiff *self;
110 self = ANJUTA_CELL_RENDERER_DIFF (cell);
112 gtk_cell_renderer_get_preferred_width (self->priv->text_cell, widget,
113 minimum, natural);
116 static void
117 anjuta_cell_renderer_diff_get_preferred_height (GtkCellRenderer *cell,
118 GtkWidget *widget,
119 gint *minimum,
120 gint *natural)
122 AnjutaCellRendererDiff *self;
124 self = ANJUTA_CELL_RENDERER_DIFF (cell);
126 gtk_cell_renderer_get_preferred_height (self->priv->text_cell, widget,
127 minimum, natural);
130 static void
131 anjuta_cell_renderer_diff_class_init (AnjutaCellRendererDiffClass *klass)
133 GObjectClass *object_class = G_OBJECT_CLASS (klass);
134 GtkCellRendererClass *parent_class = GTK_CELL_RENDERER_CLASS (klass);
136 g_type_class_add_private (klass, sizeof (AnjutaCellRendererDiffPrivate));
138 object_class->finalize = anjuta_cell_renderer_diff_finalize;
139 object_class->set_property = anjuta_cell_renderer_diff_set_property;
140 parent_class->render = anjuta_cell_renderer_diff_render;
141 parent_class->get_preferred_width = anjuta_cell_renderer_diff_get_preferred_width;;
142 parent_class->get_preferred_height = anjuta_cell_renderer_diff_get_preferred_height;
144 g_object_class_install_property (object_class,
145 PROP_DIFF,
146 g_param_spec_string ("diff",
147 "diff",
148 "Diff to render",
150 G_PARAM_WRITABLE));
154 static PangoAttrList *
155 create_attribute_list (const gchar *diff)
157 PangoAttrList *list;
158 LineType type;
160 list = pango_attr_list_new ();
162 /* Make all of the text monospace */
163 pango_attr_list_insert (list, pango_attr_family_new ("Monospace"));
165 /* Assume that diff points to one line of a unified diff */
166 type = LINE_TYPE_CONTEXT;
168 if (diff && diff[0])
170 if (*diff != ' ')
172 if (diff[0] == '@' && diff[1] == '@')
173 type = LINE_TYPE_HUNK_HEADER;
174 else if (diff[0] == '+')
176 if (g_str_has_prefix (diff, "+++ "))
177 type = LINE_TYPE_HEADER;
178 else
179 type = LINE_TYPE_ADD;
181 else if (diff[0] == '-')
183 if (g_str_has_prefix (diff, "--- "))
184 type = LINE_TYPE_HEADER;
185 else
186 type = LINE_TYPE_DELETE;
188 else
189 type = LINE_TYPE_HEADER;
193 switch (type)
195 case LINE_TYPE_HEADER:
196 /* Make file headers easier to see by making them bold */
197 pango_attr_list_insert (list,
198 pango_attr_weight_new (PANGO_WEIGHT_BOLD));
199 break;
200 case LINE_TYPE_HUNK_HEADER:
201 /* Dark blue */
202 pango_attr_list_insert (list,
203 pango_attr_foreground_new (0, 0, 0x8000));
204 break;
205 case LINE_TYPE_ADD:
206 /* Dark green */
207 pango_attr_list_insert (list,
208 pango_attr_foreground_new (0, 0x8000, 0));
209 break;
210 case LINE_TYPE_DELETE:
211 /* Red */
212 pango_attr_list_insert (list,
213 pango_attr_foreground_new (0xffff, 0, 0));
214 break;
215 default:
216 break;
219 return list;
222 void
223 anjuta_cell_renderer_diff_set_diff (AnjutaCellRendererDiff *self,
224 const gchar *diff)
226 PangoAttrList *attributes = NULL;
227 gchar *newline;
228 gchar *diff_without_newline = NULL;
230 if (diff)
232 newline = strchr (diff, '\n');
234 if (newline)
236 diff_without_newline = g_strndup (diff, newline - diff);
237 g_object_set (G_OBJECT (self->priv->text_cell),
238 "text", diff_without_newline,
239 NULL);
240 g_free (diff_without_newline);
242 else
244 g_object_set (G_OBJECT (self->priv->text_cell),
245 "text", diff,
246 NULL);
249 attributes = create_attribute_list (diff);
251 g_object_set (G_OBJECT (self->priv->text_cell),
252 "attributes", attributes,
253 NULL);
255 pango_attr_list_unref (attributes);
257 else
259 g_object_set (G_OBJECT (self->priv->text_cell),
260 "text", "", NULL);
264 GtkCellRenderer *
265 anjuta_cell_renderer_diff_new (void)
267 return g_object_new (ANJUTA_TYPE_CELL_RENDERER_DIFF, NULL);