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