1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3  * anjuta
4  * Copyright (C) James Liggett 2007 <jrliggett@cox.net>
5  *
6  * anjuta is free software.
7  *
8  * You may redistribute it and/or modify it under the terms of the
9  * GNU General Public License, as published by the Free Software
10  * Foundation; either version 2 of the License, or (at your option)
11  * any later version.
12  *
13  * anjuta is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16  * See the GNU General Public License for more details.
17  *
18  * You should have received a switch of the GNU General Public License
19  * along with anjuta.  If not, write to:
20  * 	The Free Software Foundation, Inc.,
21  * 	51 Franklin Street, Fifth Floor
22  * 	Boston, MA  02110-1301, USA.
23  */
24 
25 #include "subversion-switch-dialog.h"
26 
27 #define BROWSE_BUTTON_SWITCH_DIALOG "browse_button_switch_dialog"
28 
29 static void
on_switch_other_revision_radio_toggled(GtkToggleButton * toggle_button,SubversionData * data)30 on_switch_other_revision_radio_toggled (GtkToggleButton *toggle_button,
31 									    SubversionData *data)
32 {
33 	GtkWidget *switch_revision_entry;
34 	GtkWidget *subversion_switch;
35 	gboolean active;
36 
37 	switch_revision_entry = GTK_WIDGET (gtk_builder_get_object (data->bxml,
38 												  "switch_revision_entry"));
39 	subversion_switch = GTK_WIDGET (gtk_builder_get_object (data->bxml,
40 											  "subversion_switch"));
41 	active = gtk_toggle_button_get_active (toggle_button);
42 	gtk_widget_set_sensitive (switch_revision_entry, active);
43 
44 	if (active)
45 	{
46 		gtk_window_set_focus (GTK_WINDOW (subversion_switch),
47 							  switch_revision_entry);
48 	}
49 }
50 
51 static void
on_switch_command_finished(AnjutaCommand * command,guint return_code,Subversion * plugin)52 on_switch_command_finished (AnjutaCommand *command, guint return_code,
53 						    Subversion *plugin)
54 {
55 	AnjutaStatus *status;
56 
57 	status = anjuta_shell_get_status (ANJUTA_PLUGIN (plugin)->shell,
58 									  NULL);
59 
60 	anjuta_status (status, _("Subversion: Switch complete."), 5);
61 
62 	report_errors (command, return_code);
63 
64 	svn_switch_command_destroy (SVN_SWITCH_COMMAND (command));
65 }
66 
67 static void
on_subversion_switch_response(GtkDialog * dialog,gint response,SubversionData * data)68 on_subversion_switch_response (GtkDialog *dialog, gint response,
69 							 SubversionData *data)
70 {
71 	GtkWidget *switch_working_copy_entry;
72 	GtkWidget *switch_url_entry;
73 	GtkWidget *switch_head_revision_radio;
74 	GtkWidget *switch_other_revision_radio;
75 	GtkWidget *switch_revision_entry;
76 	GtkWidget *switch_no_recursive_check;
77 	gchar *working_copy_path;
78 	gchar *branch_url;
79 	gchar *revision_text;
80 	glong revision;
81 	SvnSwitchCommand *switch_command;
82 
83 	if (response == GTK_RESPONSE_OK)
84 	{
85 		switch_working_copy_entry = GTK_WIDGET (gtk_builder_get_object (data->bxml,
86 												  		  "switch_working_copy_entry"));
87 		switch_url_entry = GTK_WIDGET (gtk_builder_get_object (data->bxml,
88 												 "switch_url_entry"));
89 		switch_head_revision_radio = GTK_WIDGET (gtk_builder_get_object (data->bxml,
90 														   "switch_head_revision_radio"));
91 		switch_other_revision_radio = GTK_WIDGET (gtk_builder_get_object (data->bxml,
92 														    "switch_other_revision_radio"));
93 		switch_no_recursive_check = GTK_WIDGET (gtk_builder_get_object (data->bxml,
94 														  "switch_no_recursive_check"));
95 
96 		working_copy_path = gtk_editable_get_chars (GTK_EDITABLE (switch_working_copy_entry),
97 											  		0, -1);
98 		branch_url = gtk_editable_get_chars (GTK_EDITABLE (switch_url_entry),
99 											 0, -1);
100 
101 		if (!check_input (GTK_WIDGET (dialog), switch_working_copy_entry,
102 						  _("Please enter a working copy path.")))
103 		{
104 			return;
105 		}
106 
107 		if (!check_input (GTK_WIDGET (dialog), switch_url_entry,
108 						  _("Please enter a branch/tag URL.")))
109 		{
110 			return;
111 		}
112 
113 		if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (switch_head_revision_radio)))
114 			revision = SVN_SWITCH_REVISION_HEAD;
115 
116 		if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (switch_other_revision_radio)))
117 		{
118 			switch_revision_entry = GTK_WIDGET (gtk_builder_get_object (data->bxml,
119 														  "switch_revision_entry"));
120 
121 			if (!check_input (GTK_WIDGET (dialog), switch_revision_entry,
122 						  	  _("Please enter a revision.")))
123 			{
124 				return;
125 			}
126 
127 			revision_text = gtk_editable_get_chars (GTK_EDITABLE (switch_revision_entry),
128 													0, -1);
129 			revision = atol (revision_text);
130 
131 			g_free (revision_text);
132 		}
133 
134 		create_message_view (data->plugin);
135 
136 		switch_command = svn_switch_command_new (working_copy_path, branch_url,
137 												 revision,
138 												 !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (switch_no_recursive_check)));
139 
140 		g_signal_connect (G_OBJECT (switch_command), "command-finished",
141 						  G_CALLBACK (on_switch_command_finished),
142 						  data->plugin);
143 
144 		g_signal_connect (G_OBJECT (switch_command), "data-arrived",
145 						  G_CALLBACK (on_command_info_arrived),
146 						  data->plugin);
147 
148 		anjuta_command_start (ANJUTA_COMMAND (switch_command));
149 	}
150 
151 	gtk_widget_destroy (GTK_WIDGET (dialog));
152 	subversion_data_free (data);
153 }
154 
155 static void
subversion_switch_dialog(GtkAction * action,Subversion * plugin)156 subversion_switch_dialog (GtkAction *action, Subversion *plugin)
157 {
158 	GtkBuilder *bxml = gtk_builder_new ();
159 	GtkWidget *subversion_switch;
160 	GtkWidget *switch_working_copy_entry;
161 	GtkWidget *switch_other_revision_radio;
162 	GtkWidget *button;
163 	SubversionData *data;
164 	GError* error = NULL;
165 
166 	if (!gtk_builder_add_from_file (bxml, GLADE_FILE, &error))
167 	{
168 		g_warning ("Couldn't load builder file: %s", error->message);
169 		g_error_free (error);
170 	}
171 
172 	subversion_switch = GTK_WIDGET (gtk_builder_get_object (bxml, "subversion_switch"));
173 	switch_working_copy_entry = GTK_WIDGET (gtk_builder_get_object (bxml,
174 													  "switch_working_copy_entry"));
175 	switch_other_revision_radio = GTK_WIDGET (gtk_builder_get_object (bxml,
176 													    "switch_other_revision_radio"));
177 
178 	data = subversion_data_new (plugin, bxml);
179 
180 	button = GTK_WIDGET (gtk_builder_get_object (bxml, BROWSE_BUTTON_SWITCH_DIALOG));
181 	g_signal_connect(G_OBJECT(button), "clicked",
182 		G_CALLBACK(on_subversion_browse_button_clicked), switch_working_copy_entry);
183 
184 	g_signal_connect (G_OBJECT (subversion_switch), "response",
185 					  G_CALLBACK (on_subversion_switch_response),
186 					  data);
187 
188 	g_signal_connect (G_OBJECT (switch_other_revision_radio), "toggled",
189 					  G_CALLBACK (on_switch_other_revision_radio_toggled),
190 					  data);
191 
192 	if (plugin->project_root_dir)
193 	{
194 		gtk_entry_set_text (GTK_ENTRY (switch_working_copy_entry),
195 							plugin->project_root_dir);
196 	}
197 
198 	gtk_widget_show (subversion_switch);
199 }
200 
201 void
on_menu_subversion_switch(GtkAction * action,Subversion * plugin)202 on_menu_subversion_switch (GtkAction *action, Subversion *plugin)
203 {
204 	subversion_switch_dialog (action, plugin);
205 }
206