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-remove-files-pane.h"
21 
22 struct _GitRemoveFilesPanePriv
23 {
24 	GtkBuilder *builder;
25 };
26 
27 G_DEFINE_TYPE (GitRemoveFilesPane, git_remove_files_pane, GIT_TYPE_PANE);
28 
29 static void
on_ok_action_activated(GtkAction * action,GitRemoveFilesPane * self)30 on_ok_action_activated (GtkAction *action, GitRemoveFilesPane *self)
31 {
32 	Git *plugin;
33 	AnjutaFileList *remove_file_list;
34 	GtkToggleAction *force_action;
35 	GList *paths;
36 	GitRemoveCommand *remove_command;
37 
38 	plugin = ANJUTA_PLUGIN_GIT (anjuta_dock_pane_get_plugin (ANJUTA_DOCK_PANE (self)));
39 	remove_file_list = ANJUTA_FILE_LIST (gtk_builder_get_object (self->priv->builder,
40 	                                                  			 "remove_file_list"));
41 	force_action = GTK_TOGGLE_ACTION (gtk_builder_get_object (self->priv->builder,
42 	                                                          "force_action"));
43 	paths = anjuta_file_list_get_paths (remove_file_list);
44 	remove_command = git_remove_command_new_list (plugin->project_root_directory,
45 	                                              paths,
46 	                                              gtk_toggle_action_get_active (force_action));
47 
48 	anjuta_util_glist_strings_free (paths);
49 
50 	g_signal_connect (G_OBJECT (remove_command), "command-finished",
51 	                  G_CALLBACK (git_pane_report_errors),
52 	                  plugin);
53 
54 
55 	g_signal_connect (G_OBJECT (remove_command), "command-finished",
56 	                  G_CALLBACK (g_object_unref),
57 	                  NULL);
58 
59 	anjuta_command_start (ANJUTA_COMMAND (remove_command));
60 
61 	git_pane_remove_from_dock (GIT_PANE (self));
62 }
63 
64 static void
git_remove_files_pane_init(GitRemoveFilesPane * self)65 git_remove_files_pane_init (GitRemoveFilesPane *self)
66 {
67 	gchar *objects[] = {"remove_pane",
68 						"ok_action",
69 						"cancel_action",
70 						"force_action",
71 						NULL};
72 	GError *error = NULL;
73 	GtkAction *ok_action;
74 	GtkAction *cancel_action;
75 
76 	self->priv = g_new0 (GitRemoveFilesPanePriv, 1);
77 	self->priv->builder = gtk_builder_new ();
78 
79 	if (!gtk_builder_add_objects_from_file (self->priv->builder, BUILDER_FILE,
80 	                                        objects,
81 	                                        &error))
82 	{
83 		g_warning ("Couldn't load builder file: %s", error->message);
84 		g_error_free (error);
85 	}
86 
87 	ok_action = GTK_ACTION (gtk_builder_get_object (self->priv->builder,
88 	                                                "ok_action"));
89 	cancel_action = GTK_ACTION (gtk_builder_get_object (self->priv->builder,
90 	                                                    "cancel_action"));
91 
92 	g_signal_connect (G_OBJECT (ok_action), "activate",
93 	                  G_CALLBACK (on_ok_action_activated),
94 	                  self);
95 
96 	g_signal_connect_swapped (G_OBJECT (cancel_action), "activate",
97 	                          G_CALLBACK (git_pane_remove_from_dock),
98 	                          self);
99 }
100 
101 static void
git_remove_files_pane_finalize(GObject * object)102 git_remove_files_pane_finalize (GObject *object)
103 {
104 	GitRemoveFilesPane *self;
105 
106 	self = GIT_REMOVE_FILES_PANE (object);
107 
108 	g_object_unref (self->priv->builder);
109 	g_free (self->priv);
110 
111 	G_OBJECT_CLASS (git_remove_files_pane_parent_class)->finalize (object);
112 }
113 
114 static GtkWidget *
git_remove_files_pane_get_widget(AnjutaDockPane * pane)115 git_remove_files_pane_get_widget (AnjutaDockPane *pane)
116 {
117 	GitRemoveFilesPane *self;
118 
119 	self = GIT_REMOVE_FILES_PANE (pane);
120 
121 	return GTK_WIDGET (gtk_builder_get_object (self->priv->builder,
122 	                                           "remove_pane"));
123 }
124 
125 static void
git_remove_files_pane_class_init(GitRemoveFilesPaneClass * klass)126 git_remove_files_pane_class_init (GitRemoveFilesPaneClass *klass)
127 {
128 	GObjectClass* object_class = G_OBJECT_CLASS (klass);
129 	AnjutaDockPaneClass* pane_class = ANJUTA_DOCK_PANE_CLASS (klass);
130 
131 	object_class->finalize = git_remove_files_pane_finalize;
132 	pane_class->get_widget = git_remove_files_pane_get_widget;
133 	pane_class->refresh = NULL;
134 }
135 
136 AnjutaDockPane *
git_remove_files_pane_new(Git * plugin)137 git_remove_files_pane_new (Git *plugin)
138 {
139 	GitRemoveFilesPane *self;
140 	AnjutaFileList *file_list;
141 
142 	self = g_object_new (GIT_TYPE_REMOVE_FILES_PANE, "plugin", plugin, NULL);
143 	file_list = ANJUTA_FILE_LIST (gtk_builder_get_object (self->priv->builder,
144 	                                                      "remove_file_list"));
145 
146 	anjuta_file_list_set_relative_path (file_list,
147 	                                    plugin->project_root_directory);
148 
149 	return ANJUTA_DOCK_PANE (self);
150 }
151 
152 void
on_remove_button_clicked(GtkAction * action,Git * plugin)153 on_remove_button_clicked (GtkAction *action, Git* plugin)
154 {
155 	AnjutaDockPane *pane;
156 
157 	pane = git_remove_files_pane_new (plugin);
158 
159 	anjuta_dock_replace_command_pane (ANJUTA_DOCK (plugin->dock), "RemoveFiles",
160 	                                  _("Remove Files"), NULL, pane, GDL_DOCK_BOTTOM,
161 	                                  NULL, 0, NULL);
162 }
163