1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3  * anjuta
4  * Copyright (C) James Liggett 2010 <jrliggett@cox.net>
5  *
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.
10  *
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.
15  *
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/>.
18  */
19 
20 #include "git-merge-pane.h"
21 
22 struct _GitMergePanePriv
23 {
24 	GtkBuilder *builder;
25 };
26 
27 G_DEFINE_TYPE (GitMergePane, git_merge_pane, GIT_TYPE_PANE);
28 
29 static void
on_ok_action_activated(GtkAction * action,GitMergePane * self)30 on_ok_action_activated (GtkAction *action, GitMergePane *self)
31 {
32 	Git *plugin;
33 	GtkEditable *merge_revision_entry;
34 	GtkToggleAction *no_commit_action;
35 	GtkToggleAction *squash_action;
36 	GtkToggleButton *use_custom_log_check;
37 	gchar *revision;
38 	gchar *log;
39 	AnjutaColumnTextView *merge_log_view;
40 	GitMergeCommand *merge_command;
41 
42 	plugin = ANJUTA_PLUGIN_GIT (anjuta_dock_pane_get_plugin (ANJUTA_DOCK_PANE (self)));
43 	merge_revision_entry = GTK_EDITABLE (gtk_builder_get_object (self->priv->builder,
44 	                                                   			 "merge_revision_entry"));
45 	no_commit_action = GTK_TOGGLE_ACTION (gtk_builder_get_object (self->priv->builder,
46 	                                                              "no_commit_action"));
47 	squash_action = GTK_TOGGLE_ACTION (gtk_builder_get_object (self->priv->builder,
48 	                                                           "squash_action"));
49 	use_custom_log_check = GTK_TOGGLE_BUTTON (gtk_builder_get_object (self->priv->builder,
50 	                                                                  "use_custom_log_check"));
51 	revision = gtk_editable_get_chars (merge_revision_entry, 0, -1);
52 	log = NULL;
53 
54 	if (!git_pane_check_input (GTK_WIDGET (ANJUTA_PLUGIN (plugin)->shell),
55 	                           GTK_WIDGET (merge_revision_entry), revision,
56 	                           _("Please enter a revision.")))
57 	{
58 		g_free (revision);
59 		return;
60 	}
61 
62 	if (gtk_toggle_button_get_active (use_custom_log_check))
63 	{
64 		merge_log_view = ANJUTA_COLUMN_TEXT_VIEW (gtk_builder_get_object (self->priv->builder,
65 		                                                        		  "merge_log_view"));
66 		log = anjuta_column_text_view_get_text (merge_log_view);
67 
68 		if (!git_pane_check_input (GTK_WIDGET (ANJUTA_PLUGIN (plugin)->shell),
69 		                           GTK_WIDGET (merge_log_view), log,
70 		                           _("Please enter a log message.")))
71 		{
72 			g_free (revision);
73 			g_free (log);
74 			return;
75 		}
76 	}
77 
78 	merge_command = git_merge_command_new (plugin->project_root_directory,
79 	                                       revision, log,
80 	                                       gtk_toggle_action_get_active (no_commit_action),
81 	                                       gtk_toggle_action_get_active (squash_action));
82 
83 	g_free (revision);
84 	g_free (log);
85 
86 	git_pane_create_message_view (plugin);
87 
88 	g_signal_connect (G_OBJECT (merge_command), "data-arrived",
89 	                  G_CALLBACK (git_pane_on_command_info_arrived),
90 	                  plugin);
91 
92 	g_signal_connect (G_OBJECT (merge_command), "command-finished",
93 	                  G_CALLBACK (git_pane_report_errors),
94 	                  plugin);
95 
96 	g_signal_connect (G_OBJECT (merge_command), "command-finished",
97 	                  G_CALLBACK (g_object_unref),
98 	                  NULL);
99 
100 	anjuta_command_start (ANJUTA_COMMAND (merge_command));
101 
102 
103 	git_pane_remove_from_dock (GIT_PANE (self));
104 }
105 
106 static void
on_use_custom_log_check_toggled(GtkToggleButton * button,GitMergePane * self)107 on_use_custom_log_check_toggled (GtkToggleButton *button, GitMergePane *self)
108 {
109 	GtkWidget *merge_log_view;
110 	gboolean active;
111 
112 	merge_log_view = GTK_WIDGET (gtk_builder_get_object (self->priv->builder,
113 	                                               "merge_log_view"));
114 	active = gtk_toggle_button_get_active (button);
115 
116 	gtk_widget_set_sensitive (merge_log_view, active);
117 }
118 
119 static void
git_merge_pane_init(GitMergePane * self)120 git_merge_pane_init (GitMergePane *self)
121 {
122 	gchar *objects[] = {"merge_pane",
123 						"ok_action",
124 						"cancel_action",
125 						"no_commit_action",
126 						"squash_action",
127 						NULL};
128 	GError *error = NULL;
129 	GtkAction *ok_action;
130 	GtkAction *cancel_action;
131 	GtkWidget *use_custom_log_check;
132 
133 	self->priv = g_new0 (GitMergePanePriv, 1);
134 	self->priv->builder = gtk_builder_new ();
135 
136 	if (!gtk_builder_add_objects_from_file (self->priv->builder, BUILDER_FILE,
137 	                                        objects,
138 	                                        &error))
139 	{
140 		g_warning ("Couldn't load builder file: %s", error->message);
141 		g_error_free (error);
142 	}
143 
144 	ok_action = GTK_ACTION (gtk_builder_get_object (self->priv->builder,
145 	                                                "ok_action"));
146 	cancel_action = GTK_ACTION (gtk_builder_get_object (self->priv->builder,
147 	                                                    "cancel_action"));
148 	use_custom_log_check = GTK_WIDGET (gtk_builder_get_object (self->priv->builder,
149 	                                                       	   "use_custom_log_check"));
150 
151 	g_signal_connect (G_OBJECT (ok_action), "activate",
152 	                  G_CALLBACK (on_ok_action_activated),
153 	                  self);
154 
155 	g_signal_connect_swapped (G_OBJECT (cancel_action), "activate",
156 	                          G_CALLBACK (git_pane_remove_from_dock),
157 	                          self);
158 
159 	g_signal_connect (G_OBJECT (use_custom_log_check), "toggled",
160 	                  G_CALLBACK (on_use_custom_log_check_toggled),
161 	                  self);
162 }
163 
164 static void
git_merge_pane_finalize(GObject * object)165 git_merge_pane_finalize (GObject *object)
166 {
167 	GitMergePane *self;
168 
169 	self = GIT_MERGE_PANE (object);
170 
171 	g_object_unref (self->priv->builder);
172 	g_free (self->priv);
173 
174 	G_OBJECT_CLASS (git_merge_pane_parent_class)->finalize (object);
175 }
176 
177 static GtkWidget *
git_merge_pane_get_widget(AnjutaDockPane * pane)178 git_merge_pane_get_widget (AnjutaDockPane *pane)
179 {
180 	GitMergePane *self;
181 
182 	self = GIT_MERGE_PANE (pane);
183 
184 	return GTK_WIDGET (gtk_builder_get_object (self->priv->builder,
185 	                                           "merge_pane"));
186 }
187 
188 static void
git_merge_pane_class_init(GitMergePaneClass * klass)189 git_merge_pane_class_init (GitMergePaneClass *klass)
190 {
191 	GObjectClass* object_class = G_OBJECT_CLASS (klass);
192 	AnjutaDockPaneClass *pane_class = ANJUTA_DOCK_PANE_CLASS (klass);
193 
194 	object_class->finalize = git_merge_pane_finalize;
195 	pane_class->get_widget = git_merge_pane_get_widget;
196 	pane_class->refresh = NULL;
197 }
198 
199 
200 AnjutaDockPane *
git_merge_pane_new(Git * plugin)201 git_merge_pane_new (Git *plugin)
202 {
203 	return g_object_new (GIT_TYPE_MERGE_PANE, "plugin", plugin, NULL);
204 }
205 
206 AnjutaDockPane *
git_merge_pane_new_with_revision(Git * plugin,const gchar * revision)207 git_merge_pane_new_with_revision (Git *plugin, const gchar *revision)
208 {
209 	GitMergePane *self;
210 	AnjutaEntry *merge_revision_entry;
211 
212 	self = g_object_new (GIT_TYPE_MERGE_PANE, "plugin", plugin, NULL);;
213 	merge_revision_entry = ANJUTA_ENTRY (gtk_builder_get_object (self->priv->builder,
214 	                                           					 "merge_revision_entry"));
215 
216 	anjuta_entry_set_text (merge_revision_entry, revision);
217 
218 	return ANJUTA_DOCK_PANE (self);
219 }
220 
221 static void
add_pane(AnjutaDockPane * pane,Git * plugin)222 add_pane (AnjutaDockPane *pane, Git *plugin)
223 {
224 	anjuta_dock_replace_command_pane (ANJUTA_DOCK (plugin->dock), "Merge",
225 	                                  _("Merge"), NULL, pane, GDL_DOCK_BOTTOM, NULL, 0,
226 	                                  NULL);
227 }
228 
229 void
on_merge_button_clicked(GtkAction * action,Git * plugin)230 on_merge_button_clicked (GtkAction *action, Git *plugin)
231 {
232 	AnjutaDockPane *pane;
233 
234 	pane = git_merge_pane_new (plugin);
235 
236 	add_pane (pane, plugin);
237 }
238 
239 void
on_git_branch_merge_activated(GtkAction * action,Git * plugin)240 on_git_branch_merge_activated (GtkAction *action, Git *plugin)
241 {
242 	gchar *selected_branch;
243 	AnjutaDockPane *pane;
244 
245 	selected_branch = git_branches_pane_get_selected_branch (GIT_BRANCHES_PANE (plugin->branches_pane));
246 	pane = git_merge_pane_new_with_revision (plugin, selected_branch);
247 
248 	g_free (selected_branch);
249 	add_pane (pane, plugin);
250 }
251