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