Updated Spanish translation
[anjuta-git-plugin.git] / plugins / file-manager / plugin.c
blobe5239c671dbf72aa2de457659cb9d8aeb3d68f2a
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * plugin.c
4 * Copyright (C) Johannes Schmid 2007 <jhs@gnome.org>
5 *
6 * plugin.c 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.
13 * plugin.c 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.
18 * You should have received a copy of the GNU General Public License
19 * along with plugin.c. If not, write to:
20 * The Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor
22 * Boston, MA 02110-1301, USA.
25 #include <config.h>
26 #include <glade/glade-xml.h>
27 #include <gio/gio.h>
28 #include <libanjuta/anjuta-shell.h>
29 #include <libanjuta/anjuta-debug.h>
30 #include <libanjuta/anjuta-preferences.h>
31 #include <libanjuta/interfaces/ianjuta-file-loader.h>
32 #include <libanjuta/interfaces/ianjuta-file-manager.h>
33 #include <libanjuta/interfaces/ianjuta-project-manager.h>
34 #include <libanjuta/interfaces/ianjuta-preferences.h>
35 #include "plugin.h"
37 #define UI_FILE PACKAGE_DATA_DIR"/ui/file-manager.ui"
38 #define ICON_FILE "anjuta-file-manager-plugin-48.png"
39 #define FILE_MANAGER_GLADE PACKAGE_DATA_DIR"/glade/file-manager.glade"
40 #define FILE_MANAGER_GLADE_ROOT "filemanager_prefs"
42 #define PREF_ROOT "filemanager.root"
43 #define PREF_FILTER_BINARY "filemanager.filter.binary"
44 #define PREF_FILTER_HIDDEN "filemanager.filter.hidden"
45 #define PREF_FILTER_BACKUP "filemanager.filter.backup"
47 #define REGISTER_NOTIFY(key, func) \
48 notify_id = anjuta_preferences_notify_add (file_manager->prefs, \
49 key, func, file_manager, NULL); \
50 file_manager->gconf_notify_ids = g_list_prepend (file_manager->gconf_notify_ids, \
51 GUINT_TO_POINTER(notify_id));
53 static gpointer parent_class;
55 typedef struct _ScrollPosition ScrollPosition;
56 struct _ScrollPosition
58 GtkWidget* window;
59 gdouble hvalue;
60 gdouble vvalue;
63 static void
64 on_file_manager_rename (GtkAction* action, AnjutaFileManager* file_manager)
66 file_view_rename (file_manager->fv);
69 static GtkActionEntry popup_actions[] =
72 "ActionPopupFileManagerRename", NULL,
73 N_("_Rename"), NULL, N_("Rename file or directory"),
74 G_CALLBACK (on_file_manager_rename)
78 static void
79 file_manager_set_default_uri (AnjutaFileManager* file_manager)
81 GFile *file;
83 file = g_file_new_for_path (anjuta_preferences_get (file_manager->prefs, PREF_ROOT));
84 char *uri = g_file_get_uri (file);
85 g_object_set (G_OBJECT (file_manager->fv), "base_uri", uri, NULL);
86 file_manager->have_project = FALSE;
87 g_free (uri);
88 g_object_unref (file);
91 static void
92 project_root_added (AnjutaPlugin *plugin, const gchar *name,
93 const GValue *value, gpointer user_data)
95 AnjutaFileManager* file_manager;
96 const gchar *root_uri;
98 file_manager = (AnjutaFileManager*) plugin;
99 root_uri = g_value_get_string (value);
100 if (root_uri)
102 g_object_set (G_OBJECT(file_manager->fv), "base_uri", root_uri, NULL);
103 file_view_refresh (file_manager->fv);
104 file_manager->have_project = TRUE;
106 else
108 file_manager_set_default_uri (file_manager);
109 file_view_refresh (file_manager->fv);
113 static void
114 project_root_removed (AnjutaPlugin *plugin, const gchar *name,
115 gpointer user_data)
117 AnjutaFileManager* file_manager = (AnjutaFileManager*) plugin;
118 file_manager_set_default_uri (file_manager);
119 file_view_refresh (file_manager->fv);
122 static void
123 on_file_view_current_file_changed (AnjutaFileView* view, GFile* file,
124 AnjutaFileManager* file_manager)
126 if (file)
128 GValue* value;
129 value = g_new0 (GValue, 1);
130 g_value_init (value, G_TYPE_FILE);
131 g_value_set_object (value, file);
132 anjuta_shell_add_value (ANJUTA_PLUGIN (file_manager)->shell,
133 IANJUTA_FILE_MANAGER_SELECTED_FILE, value, NULL);
135 else
137 anjuta_shell_remove_value (ANJUTA_PLUGIN(file_manager)->shell,
138 IANJUTA_FILE_MANAGER_SELECTED_FILE, NULL);
142 static void
143 on_file_view_open_file (AnjutaFileView* view, GFile* file,
144 AnjutaFileManager* file_manager)
146 IAnjutaFileLoader *loader;
147 g_return_if_fail (file != NULL);
148 loader = anjuta_shell_get_interface (ANJUTA_PLUGIN (file_manager)->shell,
149 IAnjutaFileLoader, NULL);
150 g_return_if_fail (loader != NULL);
152 ianjuta_file_loader_load (loader, file, FALSE, NULL);
155 static void
156 on_file_view_show_popup_menu (AnjutaFileView* view, GFile* file,
157 gboolean is_dir, guint button,
158 guint32 time, AnjutaFileManager* file_manager)
160 GtkWidget *popup;
161 GtkWidget *rename;
162 AnjutaUI* ui = anjuta_shell_get_ui (ANJUTA_PLUGIN(file_manager)->shell,
163 NULL);
164 popup = gtk_ui_manager_get_widget (GTK_UI_MANAGER (ui),
165 "/PopupFileManager");
166 rename = gtk_ui_manager_get_widget (GTK_UI_MANAGER (ui),
167 "/PopupFileManager/PopupFileManagerRename");
168 /* TODO */
169 gtk_widget_hide (rename);
171 g_return_if_fail (GTK_IS_WIDGET (popup));
172 gtk_menu_popup (GTK_MENU (popup), NULL, NULL, NULL, NULL, button, time);
175 static void
176 on_gconf_notify(GConfClient *gclient, guint cnxn_id,
177 GConfEntry *entry, gpointer user_data)
179 AnjutaFileManager* file_manager = (AnjutaFileManager*) user_data;
180 GtkTreeModel* sort_model = gtk_tree_view_get_model (GTK_TREE_VIEW (file_manager->fv));
181 GtkTreeModel* file_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT(sort_model));
183 g_object_set (G_OBJECT (file_model),
184 "filter_binary", anjuta_preferences_get_int (file_manager->prefs, PREF_FILTER_BINARY),
185 "filter_hidden", anjuta_preferences_get_int (file_manager->prefs, PREF_FILTER_HIDDEN),
186 "filter_backup", anjuta_preferences_get_int (file_manager->prefs, PREF_FILTER_BACKUP), NULL);
188 if (!file_manager->have_project)
190 file_manager_set_default_uri (file_manager);
191 file_view_refresh (file_manager->fv);
193 else
195 file_view_refresh (file_manager->fv);
200 static gboolean
201 file_manager_activate (AnjutaPlugin *plugin)
203 AnjutaUI *ui;
204 AnjutaFileManager *file_manager;
205 gint notify_id;
207 DEBUG_PRINT ("AnjutaFileManager: Activating AnjutaFileManager plugin ...");
208 file_manager = (AnjutaFileManager*) plugin;
210 file_manager->prefs = anjuta_shell_get_preferences (plugin->shell, NULL);
212 /* Add all UI actions and merge UI */
213 ui = anjuta_shell_get_ui (plugin->shell, NULL);
215 /* Add action group */
216 file_manager->action_group =
217 anjuta_ui_add_action_group_entries (ui, "ActionGroupFileManager",
218 _("File manager popup actions"),
219 popup_actions, 1,
220 GETTEXT_PACKAGE, FALSE,
221 plugin);
223 file_manager->uiid = anjuta_ui_merge (ui, UI_FILE);
225 file_manager->sw = gtk_scrolled_window_new (NULL, NULL);
226 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (file_manager->sw),
227 GTK_POLICY_AUTOMATIC,
228 GTK_POLICY_AUTOMATIC);
229 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (file_manager->sw),
230 GTK_SHADOW_IN);
232 file_manager->fv = ANJUTA_FILE_VIEW (file_view_new ());
234 g_signal_connect (G_OBJECT (file_manager->fv), "file-open",
235 G_CALLBACK (on_file_view_open_file), file_manager);
236 g_signal_connect (G_OBJECT(file_manager->fv), "show-popup-menu",
237 G_CALLBACK (on_file_view_show_popup_menu), file_manager);
238 g_signal_connect (G_OBJECT(file_manager->fv), "current-file-changed",
239 G_CALLBACK (on_file_view_current_file_changed),
240 file_manager);
241 file_manager_set_default_uri (file_manager);
242 file_view_refresh (file_manager->fv);
244 gtk_container_add (GTK_CONTAINER (file_manager->sw),
245 GTK_WIDGET (file_manager->fv));
247 gtk_widget_show_all (file_manager->sw);
249 anjuta_shell_add_widget (plugin->shell, file_manager->sw,
250 "AnjutaFileManager",
251 _("Files"), GTK_STOCK_OPEN,
252 ANJUTA_SHELL_PLACEMENT_LEFT, NULL);
254 file_manager->root_watch_id =
255 anjuta_plugin_add_watch (plugin, IANJUTA_PROJECT_MANAGER_PROJECT_ROOT_URI,
256 project_root_added,
257 project_root_removed, NULL);
260 REGISTER_NOTIFY (PREF_ROOT, on_gconf_notify);
261 REGISTER_NOTIFY (PREF_FILTER_BINARY, on_gconf_notify);
262 REGISTER_NOTIFY (PREF_FILTER_BACKUP, on_gconf_notify);
263 REGISTER_NOTIFY (PREF_FILTER_HIDDEN, on_gconf_notify);
264 on_gconf_notify (NULL, 0, NULL, file_manager);
266 return TRUE;
269 static gboolean
270 file_manager_deactivate (AnjutaPlugin *plugin)
272 AnjutaUI *ui;
273 AnjutaFileManager *file_manager;
275 DEBUG_PRINT ("AnjutaFileManager: Dectivating AnjutaFileManager plugin ...");
277 file_manager = (AnjutaFileManager*) plugin;
278 ui = anjuta_shell_get_ui (plugin->shell, NULL);
280 anjuta_plugin_remove_watch (plugin, file_manager->root_watch_id, TRUE);
281 anjuta_ui_remove_action_group (ui, ((AnjutaFileManager*)plugin)->action_group);
282 anjuta_ui_unmerge (ui, ((AnjutaFileManager*)plugin)->uiid);
284 anjuta_shell_remove_widget (plugin->shell, file_manager->sw, NULL);
285 return TRUE;
288 static void
289 file_manager_finalize (GObject *obj)
291 AnjutaFileManager *plugin = (AnjutaFileManager*)obj;
292 GList* id;
293 for (id = plugin->gconf_notify_ids; id != NULL; id = id->next)
295 anjuta_preferences_notify_remove(plugin->prefs,GPOINTER_TO_UINT(id->data));
297 g_list_free(plugin->gconf_notify_ids);
299 /* Finalization codes here */
300 G_OBJECT_CLASS (parent_class)->finalize (obj);
303 static void
304 file_manager_dispose (GObject *obj)
306 /* Disposition codes */
307 G_OBJECT_CLASS (parent_class)->dispose (obj);
310 static void
311 file_manager_instance_init (GObject *obj)
313 AnjutaFileManager *plugin = (AnjutaFileManager*)obj;
315 plugin->gconf_notify_ids = NULL;
316 plugin->have_project = FALSE;
318 plugin->uiid = 0;
321 static void
322 file_manager_class_init (GObjectClass *klass)
324 AnjutaPluginClass *plugin_class = ANJUTA_PLUGIN_CLASS (klass);
326 parent_class = g_type_class_peek_parent (klass);
328 plugin_class->activate = file_manager_activate;
329 plugin_class->deactivate = file_manager_deactivate;
331 klass->finalize = file_manager_finalize;
332 klass->dispose = file_manager_dispose;
335 static void
336 ifile_manager_set_root (IAnjutaFileManager *ifile_manager, const gchar *root,
337 GError **err)
339 AnjutaFileManager* file_manager = (AnjutaFileManager*) ifile_manager;
340 g_object_set (G_OBJECT(file_manager->fv), "base_uri", root, NULL);
343 static void
344 ifile_manager_set_selected (IAnjutaFileManager *file_manager,
345 GFile* selected, GError **err)
347 /* TODO */
350 static GFile*
351 ifile_manager_get_selected (IAnjutaFileManager *ifile_manager, GError **err)
353 AnjutaFileManager* file_manager = (AnjutaFileManager*) ifile_manager;
354 return file_view_get_selected (file_manager->fv);
357 static void
358 ifile_manager_iface_init (IAnjutaFileManagerIface *iface)
360 iface->set_root = ifile_manager_set_root;
361 iface->get_selected = ifile_manager_get_selected;
362 iface->set_selected = ifile_manager_set_selected;
365 static void
366 ipreferences_merge (IAnjutaPreferences* ipref,
367 AnjutaPreferences* prefs,
368 GError** e)
370 GladeXML* gxml;
372 gxml = glade_xml_new (FILE_MANAGER_GLADE, FILE_MANAGER_GLADE_ROOT, NULL);
374 anjuta_preferences_add_page (prefs, gxml, FILE_MANAGER_GLADE_ROOT, _("File Manager"),
375 ICON_FILE);
378 static void
379 ipreferences_unmerge (IAnjutaPreferences* ipref,
380 AnjutaPreferences* prefs,
381 GError** e)
383 anjuta_preferences_remove_page (prefs, _("File Manager"));
386 static void
387 ipreferences_iface_init (IAnjutaPreferencesIface* iface)
389 iface->merge = ipreferences_merge;
390 iface->unmerge = ipreferences_unmerge;
393 ANJUTA_PLUGIN_BEGIN (AnjutaFileManager, file_manager);
394 ANJUTA_PLUGIN_ADD_INTERFACE (ifile_manager, IANJUTA_TYPE_FILE_MANAGER);
395 ANJUTA_PLUGIN_ADD_INTERFACE (ipreferences, IANJUTA_TYPE_PREFERENCES);
396 ANJUTA_PLUGIN_END
398 ANJUTA_SIMPLE_PLUGIN (AnjutaFileManager, file_manager);