1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 * Copyright (C) Johannes Schmid 2007 <jhs@gnome.org>
6 * plugin.c is free software.
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)
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.
26 #include <glade/glade-xml.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>
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
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
)
79 file_manager_set_default_uri (AnjutaFileManager
* file_manager
)
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
;
88 g_object_unref (file
);
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
);
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
;
108 file_manager_set_default_uri (file_manager
);
109 file_view_refresh (file_manager
->fv
);
114 project_root_removed (AnjutaPlugin
*plugin
, const gchar
*name
,
117 AnjutaFileManager
* file_manager
= (AnjutaFileManager
*) plugin
;
118 file_manager_set_default_uri (file_manager
);
119 file_view_refresh (file_manager
->fv
);
123 on_file_view_current_file_changed (AnjutaFileView
* view
, GFile
* file
,
124 AnjutaFileManager
* file_manager
)
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
);
137 anjuta_shell_remove_value (ANJUTA_PLUGIN(file_manager
)->shell
,
138 IANJUTA_FILE_MANAGER_SELECTED_FILE
, NULL
);
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
);
156 on_file_view_show_popup_menu (AnjutaFileView
* view
, GFile
* file
,
157 gboolean is_dir
, guint button
,
158 guint32 time
, AnjutaFileManager
* file_manager
)
162 AnjutaUI
* ui
= anjuta_shell_get_ui (ANJUTA_PLUGIN(file_manager
)->shell
,
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");
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
);
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
);
195 file_view_refresh (file_manager
->fv
);
201 file_manager_activate (AnjutaPlugin
*plugin
)
204 AnjutaFileManager
*file_manager
;
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"),
220 GETTEXT_PACKAGE
, FALSE
,
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
),
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
),
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
,
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
,
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
);
270 file_manager_deactivate (AnjutaPlugin
*plugin
)
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
);
289 file_manager_finalize (GObject
*obj
)
291 AnjutaFileManager
*plugin
= (AnjutaFileManager
*)obj
;
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
);
304 file_manager_dispose (GObject
*obj
)
306 /* Disposition codes */
307 G_OBJECT_CLASS (parent_class
)->dispose (obj
);
311 file_manager_instance_init (GObject
*obj
)
313 AnjutaFileManager
*plugin
= (AnjutaFileManager
*)obj
;
315 plugin
->gconf_notify_ids
= NULL
;
316 plugin
->have_project
= FALSE
;
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
;
336 ifile_manager_set_root (IAnjutaFileManager
*ifile_manager
, const gchar
*root
,
339 AnjutaFileManager
* file_manager
= (AnjutaFileManager
*) ifile_manager
;
340 g_object_set (G_OBJECT(file_manager
->fv
), "base_uri", root
, NULL
);
344 ifile_manager_set_selected (IAnjutaFileManager
*file_manager
,
345 GFile
* selected
, GError
**err
)
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
);
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
;
366 ipreferences_merge (IAnjutaPreferences
* ipref
,
367 AnjutaPreferences
* prefs
,
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"),
379 ipreferences_unmerge (IAnjutaPreferences
* ipref
,
380 AnjutaPreferences
* prefs
,
383 anjuta_preferences_remove_page (prefs
, _("File Manager"));
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
);
398 ANJUTA_SIMPLE_PLUGIN (AnjutaFileManager
, file_manager
);