1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 Copyright (C) 2000 Naba Kumar
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include <libgnomevfs/gnome-vfs-utils.h>
23 #include <libgnomevfs/gnome-vfs-ops.h>
24 #include <libanjuta/interfaces/ianjuta-file.h>
25 #include <libanjuta/interfaces/ianjuta-file-savable.h>
26 #include <libanjuta/interfaces/ianjuta-file-loader.h>
27 #include <libanjuta/interfaces/ianjuta-project-manager.h>
28 #include <libanjuta/interfaces/ianjuta-document-manager.h>
29 #include <libanjuta/anjuta-profile-manager.h>
30 #include <libanjuta/anjuta-debug.h>
31 #include <libanjuta/anjuta-status.h>
33 #include <gbf/gbf-project-util.h>
34 #include <gbf/gbf-backend.h>
38 #define UI_FILE PACKAGE_DATA_DIR"/ui/anjuta-project-manager.ui"
39 #define PREFS_GLADE PACKAGE_DATA_DIR"/glade/anjuta-project-manager-plugin.glade"
40 #define ICON_FILE "anjuta-project-manager-plugin-48.png"
41 #define DEFAULT_PROFILE "file://"PACKAGE_DATA_DIR"/profiles/default.profile"
42 #define PROJECT_PROFILE_NAME "project"
44 static gpointer parent_class
;
46 static gboolean
uri_is_inside_project (ProjectManagerPlugin
*plugin
,
48 static void project_manager_plugin_close (ProjectManagerPlugin
*plugin
);
51 get_plugin_parent_window (ProjectManagerPlugin
*plugin
)
56 toplevel
= gtk_widget_get_toplevel (plugin
->scrolledwindow
);
57 if (toplevel
&& GTK_IS_WINDOW (toplevel
))
58 win
= GTK_WINDOW (toplevel
);
60 win
= GTK_WINDOW (ANJUTA_PLUGIN (plugin
)->shell
);
65 update_title (ProjectManagerPlugin
* plugin
, const gchar
*project_uri
)
68 status
= anjuta_shell_get_status (ANJUTA_PLUGIN (plugin
)->shell
, NULL
);
72 gchar
* unescape_basename
;
75 uri_basename
= g_path_get_basename (project_uri
);
76 unescape_basename
= gnome_vfs_unescape_string (uri_basename
, "");
77 ext
= strrchr (unescape_basename
, '.');
80 anjuta_status_set_title (status
, unescape_basename
);
81 g_free (unescape_basename
);
82 g_free (uri_basename
);
86 anjuta_status_set_title (status
, NULL
);
91 get_session_dir (ProjectManagerPlugin
*plugin
)
94 gchar
*session_dir
= NULL
;
96 g_return_val_if_fail (plugin
->project_root_uri
, NULL
);
98 vfs_uri
= gnome_vfs_uri_new (plugin
->project_root_uri
);
99 if (vfs_uri
&& gnome_vfs_uri_is_local (vfs_uri
))
103 local_dir
= gnome_vfs_get_local_path_from_uri (plugin
->project_root_uri
);
106 session_dir
= g_build_filename (local_dir
, ".anjuta", "session",
112 gnome_vfs_uri_unref (vfs_uri
);
118 project_manager_save_session (ProjectManagerPlugin
*plugin
)
121 session_dir
= get_session_dir (plugin
);
122 g_return_if_fail (session_dir
!= NULL
);
124 plugin
->session_by_me
= TRUE
;
125 anjuta_shell_session_save (ANJUTA_PLUGIN (plugin
)->shell
,
127 plugin
->session_by_me
= FALSE
;
128 g_free (session_dir
);
132 on_session_save (AnjutaShell
*shell
, AnjutaSessionPhase phase
,
133 AnjutaSession
*session
, ProjectManagerPlugin
*plugin
)
137 if (phase
!= ANJUTA_SESSION_PHASE_NORMAL
)
141 * When a project session is being saved (session_by_me == TRUE),
142 * we should not save the current project uri, because project
143 * sessions are loaded when the project has already been loaded.
145 if (plugin
->project_uri
&& !plugin
->session_by_me
)
147 files
= anjuta_session_get_string_list (session
,
150 files
= g_list_append (files
, g_strdup (plugin
->project_uri
));
151 anjuta_session_set_string_list (session
, "File Loader",
153 g_list_foreach (files
, (GFunc
)g_free
, NULL
);
159 on_shell_exiting (AnjutaShell
*shell
, ProjectManagerPlugin
*plugin
)
161 if (plugin
->project_uri
)
163 /* Also make sure we save the project session also */
164 project_manager_save_session (plugin
);
169 on_close_project_idle (gpointer plugin
)
171 project_manager_plugin_close (ANJUTA_PLUGIN_PROJECT_MANAGER (plugin
));
173 anjuta_plugin_deactivate (ANJUTA_PLUGIN (plugin
));
179 on_close_project (GtkAction
*action
, ProjectManagerPlugin
*plugin
)
181 if (plugin
->project_uri
)
182 g_idle_add (on_close_project_idle
, plugin
);
186 find_missing_uris (GList
*pre
, GList
*post
)
192 hash
= g_hash_table_new (g_str_hash
, g_str_equal
);
196 g_hash_table_insert (hash
, node
->data
, node
->data
);
197 node
= g_list_next (node
);
203 if (g_hash_table_lookup (hash
, node
->data
) == NULL
)
204 ret
= g_list_prepend (ret
, node
->data
);
205 node
= g_list_next (node
);
207 g_hash_table_destroy (hash
);
208 return g_list_reverse (ret
);
212 update_operation_emit_signals (ProjectManagerPlugin
*plugin
, GList
*pre
,
215 GList
*missing_uris
, *node
;
217 missing_uris
= find_missing_uris (pre
, post
);
221 DEBUG_PRINT ("URI added emitting: %s", (char*)node
->data
);
222 g_signal_emit_by_name (G_OBJECT (plugin
), "element_added",
224 node
= g_list_next (node
);
226 g_list_free (missing_uris
);
228 missing_uris
= find_missing_uris (post
, pre
);
232 DEBUG_PRINT ("URI removed emitting: %s", (char*)node
->data
);
233 g_signal_emit_by_name (G_OBJECT (plugin
), "element_removed",
235 node
= g_list_next (node
);
237 g_list_free (missing_uris
);
241 update_operation_end (ProjectManagerPlugin
*plugin
, gboolean emit_signal
)
245 if (plugin
->pre_update_sources
)
247 GList
*post_update_sources
=
248 ianjuta_project_manager_get_elements (IANJUTA_PROJECT_MANAGER (plugin
),
249 IANJUTA_PROJECT_MANAGER_SOURCE
,
251 update_operation_emit_signals (plugin
, plugin
->pre_update_sources
,
252 post_update_sources
);
253 if (post_update_sources
)
255 g_list_foreach (post_update_sources
, (GFunc
)g_free
, NULL
);
256 g_list_free (post_update_sources
);
259 if (plugin
->pre_update_targets
)
261 GList
*post_update_targets
=
262 ianjuta_project_manager_get_elements (IANJUTA_PROJECT_MANAGER (plugin
),
263 IANJUTA_PROJECT_MANAGER_TARGET
,
265 update_operation_emit_signals (plugin
, plugin
->pre_update_targets
,
266 post_update_targets
);
267 if (post_update_targets
)
269 g_list_foreach (post_update_targets
, (GFunc
)g_free
, NULL
);
270 g_list_free (post_update_targets
);
273 if (plugin
->pre_update_groups
)
275 GList
*post_update_groups
=
276 ianjuta_project_manager_get_elements (IANJUTA_PROJECT_MANAGER (plugin
),
277 IANJUTA_PROJECT_MANAGER_GROUP
,
279 update_operation_emit_signals (plugin
, plugin
->pre_update_groups
,
281 if (post_update_groups
)
283 g_list_foreach (post_update_groups
, (GFunc
)g_free
, NULL
);
284 g_list_free (post_update_groups
);
288 if (plugin
->pre_update_sources
)
290 g_list_foreach (plugin
->pre_update_sources
, (GFunc
)g_free
, NULL
);
291 g_list_free (plugin
->pre_update_sources
);
292 plugin
->pre_update_sources
= NULL
;
294 if (plugin
->pre_update_targets
)
296 g_list_foreach (plugin
->pre_update_targets
, (GFunc
)g_free
, NULL
);
297 g_list_free (plugin
->pre_update_targets
);
298 plugin
->pre_update_targets
= NULL
;
300 if (plugin
->pre_update_groups
)
302 g_list_foreach (plugin
->pre_update_groups
, (GFunc
)g_free
, NULL
);
303 g_list_free (plugin
->pre_update_groups
);
304 plugin
->pre_update_groups
= NULL
;
309 update_operation_begin (ProjectManagerPlugin
*plugin
)
311 update_operation_end (plugin
, FALSE
);
312 plugin
->pre_update_sources
=
313 ianjuta_project_manager_get_elements (IANJUTA_PROJECT_MANAGER (plugin
),
314 IANJUTA_PROJECT_MANAGER_SOURCE
,
316 plugin
->pre_update_targets
=
317 ianjuta_project_manager_get_elements (IANJUTA_PROJECT_MANAGER (plugin
),
318 IANJUTA_PROJECT_MANAGER_TARGET
,
320 plugin
->pre_update_groups
=
321 ianjuta_project_manager_get_elements (IANJUTA_PROJECT_MANAGER (plugin
),
322 IANJUTA_PROJECT_MANAGER_GROUP
,
327 on_refresh_idle (gpointer user_data
)
329 ProjectManagerPlugin
*plugin
;
330 AnjutaStatus
*status
;
333 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (user_data
);
335 status
= anjuta_shell_get_status (ANJUTA_PLUGIN (plugin
)->shell
, NULL
);
336 anjuta_status_push (status
, "Refreshing symbol tree...");
337 anjuta_status_busy_push (status
);
339 gbf_project_refresh (GBF_PROJECT (plugin
->project
), &err
);
342 anjuta_util_dialog_error (get_plugin_parent_window (plugin
),
343 _("Failed to refresh project: %s"),
347 anjuta_status_busy_pop (status
);
348 anjuta_status_pop (status
);
353 on_refresh (GtkAction
*action
, ProjectManagerPlugin
*plugin
)
355 g_idle_add (on_refresh_idle
, plugin
);
359 on_properties (GtkAction
*action
, ProjectManagerPlugin
*plugin
)
361 GtkWidget
*win
, *properties
;
363 properties
= gbf_project_configure (plugin
->project
, NULL
);
366 win
= gtk_dialog_new_with_buttons (_("Project properties"),
367 GTK_WINDOW (ANJUTA_PLUGIN(plugin
)->shell
),
368 GTK_DIALOG_DESTROY_WITH_PARENT
,
369 GTK_STOCK_CLOSE
, GTK_RESPONSE_CANCEL
, NULL
);
370 g_signal_connect_swapped (win
, "response",
371 G_CALLBACK (gtk_widget_destroy
), win
);
373 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(win
)->vbox
),
375 gtk_window_set_default_size (GTK_WINDOW (win
), 450, -1);
376 gtk_widget_show (win
);
380 anjuta_util_dialog_info (GTK_WINDOW (ANJUTA_PLUGIN(plugin
)->shell
),
381 _("No properties available for this target"));
386 on_add_group (GtkAction
*action
, ProjectManagerPlugin
*plugin
)
388 gchar
*group_uri
, *default_group_uri
= NULL
;
389 if (plugin
->current_editor_uri
)
390 default_group_uri
= g_path_get_dirname (plugin
->current_editor_uri
);
392 default_group_uri
= g_strdup ("");
394 ianjuta_project_manager_add_group (IANJUTA_PROJECT_MANAGER (plugin
),
395 "", default_group_uri
,
398 g_free (default_group_uri
);
402 on_add_target (GtkAction
*action
, ProjectManagerPlugin
*plugin
)
404 gchar
*target_uri
, *default_group_uri
= NULL
;
405 if (plugin
->current_editor_uri
)
406 default_group_uri
= g_path_get_dirname (plugin
->current_editor_uri
);
408 default_group_uri
= g_strdup ("");
410 ianjuta_project_manager_add_target (IANJUTA_PROJECT_MANAGER (plugin
),
411 "", default_group_uri
,
414 g_free (default_group_uri
);
418 on_add_source (GtkAction
*action
, ProjectManagerPlugin
*plugin
)
420 gchar
*default_group_uri
= NULL
, *default_source_uri
;
423 if (plugin
->current_editor_uri
)
425 default_group_uri
= g_path_get_dirname (plugin
->current_editor_uri
);
426 default_source_uri
= plugin
->current_editor_uri
;
430 default_group_uri
= g_strdup ("");
431 default_source_uri
= "";
434 ianjuta_project_manager_add_source (IANJUTA_PROJECT_MANAGER (plugin
),
436 default_group_uri
, NULL
);
438 g_free (default_group_uri
);
442 on_popup_properties (GtkAction
*action
, ProjectManagerPlugin
*plugin
)
445 const gchar
*selected_target
;
446 GtkWidget
*properties
, *win
;
448 data
= gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin
->view
),
449 GBF_TREE_NODE_TARGET
);
450 selected_target
= NULL
;
453 selected_target
= data
->id
;
454 properties
= gbf_project_configure_target (plugin
->project
,
455 selected_target
, NULL
);
458 win
= gtk_dialog_new_with_buttons (_("Target properties"),
459 GTK_WINDOW (ANJUTA_PLUGIN(plugin
)->shell
),
460 GTK_DIALOG_DESTROY_WITH_PARENT
,
461 GTK_STOCK_CLOSE
, GTK_RESPONSE_CANCEL
, NULL
);
462 g_signal_connect_swapped (win
, "response",
463 G_CALLBACK (gtk_widget_destroy
), win
);
465 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(win
)->vbox
),
467 gtk_window_set_default_size (GTK_WINDOW (win
), 450, -1);
468 gtk_widget_show (win
);
472 anjuta_util_dialog_info (GTK_WINDOW (ANJUTA_PLUGIN(plugin
)->shell
),
473 _("No properties available for this target"));
477 data
= gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin
->view
),
478 GBF_TREE_NODE_GROUP
);
479 selected_target
= NULL
;
482 selected_target
= data
->id
;
483 properties
= gbf_project_configure_group (plugin
->project
,
484 selected_target
, NULL
);
487 win
= gtk_dialog_new_with_buttons (_("Group properties"),
488 GTK_WINDOW (ANJUTA_PLUGIN(plugin
)->shell
),
489 GTK_DIALOG_DESTROY_WITH_PARENT
,
490 _("Close"), GTK_RESPONSE_CANCEL
, NULL
);
491 g_signal_connect_swapped (win
, "response",
492 G_CALLBACK (gtk_widget_destroy
), win
);
494 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(win
)->vbox
),
496 gtk_window_set_default_size (GTK_WINDOW (win
), 450, -1);
497 gtk_widget_show (win
);
501 anjuta_util_dialog_info (GTK_WINDOW (ANJUTA_PLUGIN(plugin
)->shell
),
502 _("No properties available for this group"));
510 on_popup_add_group (GtkAction
*action
, ProjectManagerPlugin
*plugin
)
513 const gchar
*selected_group
;
516 update_operation_begin (plugin
);
517 data
= gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin
->view
),
518 GBF_TREE_NODE_GROUP
);
519 selected_group
= NULL
;
521 selected_group
= data
->id
;
522 group_id
= gbf_project_util_new_group (plugin
->model
,
523 get_plugin_parent_window (plugin
),
524 selected_group
, NULL
);
526 gbf_tree_data_free (data
);
527 update_operation_end (plugin
, TRUE
);
532 on_popup_add_target (GtkAction
*action
, ProjectManagerPlugin
*plugin
)
535 const gchar
*selected_group
;
538 update_operation_begin (plugin
);
539 data
= gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin
->view
),
540 GBF_TREE_NODE_GROUP
);
541 selected_group
= NULL
;
543 selected_group
= data
->id
;
544 target_id
= gbf_project_util_new_target (plugin
->model
,
545 get_plugin_parent_window (plugin
),
546 selected_group
, NULL
);
548 gbf_tree_data_free (data
);
549 update_operation_end (plugin
, TRUE
);
554 on_popup_add_source (GtkAction
*action
, ProjectManagerPlugin
*plugin
)
557 const gchar
*selected_target
;
560 update_operation_begin (plugin
);
561 data
= gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin
->view
),
562 GBF_TREE_NODE_TARGET
);
563 selected_target
= NULL
;
565 selected_target
= data
->id
;
566 source_id
= gbf_project_util_add_source (plugin
->model
,
567 get_plugin_parent_window (plugin
),
568 selected_target
, NULL
, NULL
);
570 gbf_tree_data_free (data
);
571 update_operation_end (plugin
, TRUE
);
576 confirm_removal (ProjectManagerPlugin
*plugin
, GbfTreeData
*data
)
585 case GBF_TREE_NODE_GROUP
:
586 question
= _("Are you sure you want to remove the following group from project?\n\n");
587 mesg
= _("Group: %s\n\nThe group will not be deleted from file system.");
589 case GBF_TREE_NODE_TARGET
:
590 question
= _("Are you sure you want to remove the following target from project?\n\n");
591 mesg
= _("Target: %s");
593 case GBF_TREE_NODE_TARGET_SOURCE
:
594 question
= _("Are you sure you want to remove the following source file from project?\n\n");
595 mesg
= _("Source: %s\n\nThe source file will not be deleted from file system.");
598 g_warning ("Unknown node");
601 full_mesg
= g_strconcat (question
, mesg
, NULL
);
603 anjuta_util_dialog_boolean_question (get_plugin_parent_window (plugin
),
611 on_popup_remove (GtkAction
*action
, ProjectManagerPlugin
*plugin
)
615 data
= gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin
->view
),
616 GBF_TREE_NODE_TARGET_SOURCE
);
619 data
= gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin
->view
),
620 GBF_TREE_NODE_TARGET
);
624 data
= gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin
->view
),
625 GBF_TREE_NODE_GROUP
);
629 if (confirm_removal (plugin
, data
))
632 update_operation_begin (plugin
);
635 case GBF_TREE_NODE_GROUP
:
636 gbf_project_remove_group (plugin
->project
, data
->id
, &err
);
638 case GBF_TREE_NODE_TARGET
:
639 gbf_project_remove_target (plugin
->project
, data
->id
, &err
);
641 case GBF_TREE_NODE_TARGET_SOURCE
:
642 gbf_project_remove_source (plugin
->project
, data
->id
, &err
);
645 g_warning ("Should not reach here!!!");
647 update_operation_end (plugin
, TRUE
);
650 anjuta_util_dialog_error (get_plugin_parent_window (plugin
),
651 _("Failed to remove '%s':\n%s"),
652 data
->name
, err
->message
);
656 gbf_tree_data_free (data
);
661 on_popup_add_to_project (GtkAction
*action
, ProjectManagerPlugin
*plugin
)
664 GnomeVFSFileInfo info
;
666 gchar
*parent_directory
, *filename
;
668 win
= get_plugin_parent_window (plugin
);
669 res
= gnome_vfs_get_file_info (plugin
->fm_current_uri
, &info
,
670 GNOME_VFS_FILE_INFO_DEFAULT
|
671 GNOME_VFS_FILE_INFO_FOLLOW_LINKS
);
672 if (res
== GNOME_VFS_OK
)
674 parent_directory
= g_path_get_dirname (plugin
->fm_current_uri
);
675 if (!parent_directory
)
676 parent_directory
= g_strdup ("");
678 filename
= g_path_get_basename (plugin
->fm_current_uri
);
679 if (info
.type
== GNOME_VFS_FILE_TYPE_DIRECTORY
)
682 ianjuta_project_manager_add_group (IANJUTA_PROJECT_MANAGER (plugin
),
683 filename
, parent_directory
,
690 ianjuta_project_manager_add_source (IANJUTA_PROJECT_MANAGER
692 plugin
->fm_current_uri
,
698 g_free (parent_directory
);
704 if (res
!= GNOME_VFS_OK
)
705 mesg
= gnome_vfs_result_to_string (res
);
707 mesg
= _("The file you selected is a link and can't be added to the project");
708 anjuta_util_dialog_error (win
,
709 _("Failed to retrieve URI info of %s: %s"),
710 plugin
->fm_current_uri
, mesg
);
715 on_uri_activated (GtkWidget
*widget
, const gchar
*uri
,
716 ProjectManagerPlugin
*plugin
)
718 IAnjutaFileLoader
*loader
;
720 loader
= anjuta_shell_get_interface (ANJUTA_PLUGIN (plugin
)->shell
,
721 IAnjutaFileLoader
, NULL
);
723 ianjuta_file_loader_load (loader
, uri
, FALSE
, NULL
);
727 on_target_activated (GtkWidget
*widget
, const gchar
*target_id
,
728 ProjectManagerPlugin
*plugin
)
730 on_popup_properties (NULL
, plugin
);
734 on_group_activated (GtkWidget
*widget
, const gchar
*group_id
,
735 ProjectManagerPlugin
*plugin
)
737 on_popup_properties (NULL
, plugin
);
740 static GtkActionEntry pm_actions
[] =
743 "ActionMenuProject", NULL
,
744 N_("_Project"), NULL
, NULL
, NULL
747 "ActionProjectProperties", GTK_STOCK_PROPERTIES
,
748 N_("_Properties"), NULL
, N_("Project properties"),
749 G_CALLBACK (on_properties
)
752 "ActionProjectRefresh", GTK_STOCK_REFRESH
,
753 N_("_Refresh"), NULL
, N_("Refresh project manager tree"),
754 G_CALLBACK (on_refresh
)
757 "ActionProjectAddGroup", GTK_STOCK_ADD
,
758 N_("Add _Group..."), NULL
, N_("Add a group to project"),
759 G_CALLBACK (on_add_group
)
762 "ActionProjectAddTarget", GTK_STOCK_ADD
,
763 N_("Add _Target..."), NULL
, N_("Add a target to project"),
764 G_CALLBACK (on_add_target
)
767 "ActionProjectAddSource", GTK_STOCK_ADD
,
768 N_("Add _Source File..."), NULL
, N_("Add a source file to project"),
769 G_CALLBACK (on_add_source
)
772 "ActionFileCloseProject", NULL
,
773 N_("Close Pro_ject"), NULL
, N_("Close project"),
774 G_CALLBACK (on_close_project
)
778 static GtkActionEntry popup_actions
[] =
781 "ActionPopupProjectProperties", GTK_STOCK_PROPERTIES
,
782 N_("_Properties"), NULL
, N_("Properties of group/target/source"),
783 G_CALLBACK (on_popup_properties
)
786 "ActionPopupProjectAddToProject", GTK_STOCK_ADD
,
787 N_("_Add To Project"), NULL
, N_("Add a source file to project"),
788 G_CALLBACK (on_popup_add_to_project
)
791 "ActionPopupProjectAddGroup", GTK_STOCK_ADD
,
792 N_("Add _Group"), NULL
, N_("Add a group to project"),
793 G_CALLBACK (on_popup_add_group
)
796 "ActionPopupProjectAddTarget", GTK_STOCK_ADD
,
797 N_("Add _Target"), NULL
, N_("Add a target to project"),
798 G_CALLBACK (on_popup_add_target
)
801 "ActionPopupProjectAddSource", GTK_STOCK_ADD
,
802 N_("Add _Source File"), NULL
, N_("Add a source file to project"),
803 G_CALLBACK (on_popup_add_source
)
806 "ActionPopupProjectRemove", GTK_STOCK_REMOVE
,
807 N_("Re_move"), NULL
, N_("Remove from project"),
808 G_CALLBACK (on_popup_remove
)
813 update_ui (ProjectManagerPlugin
*plugin
)
818 GbfProjectCapabilities caps
= GBF_PROJECT_CAN_ADD_NONE
;
821 caps
= gbf_project_get_capabilities (plugin
->project
, NULL
);
823 ui
= anjuta_shell_get_ui (ANJUTA_PLUGIN (plugin
)->shell
, NULL
);
824 for (j
= 0; j
< G_N_ELEMENTS (pm_actions
); j
++)
826 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManager",
828 if (pm_actions
[j
].callback
&&
829 strcmp (pm_actions
[j
].name
, "ActionFileCloseProject") != 0)
831 /* 'close' menuitem is never disabled */
832 g_object_set (G_OBJECT (action
), "sensitive",
833 (plugin
->project
!= NULL
), NULL
);
838 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManager",
839 "ActionProjectAddGroup");
840 g_object_set (G_OBJECT (action
), "sensitive",
841 ((plugin
->project
!= NULL
) &&
842 (caps
& GBF_PROJECT_CAN_ADD_GROUP
)), NULL
);
844 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManager",
845 "ActionProjectAddTarget");
846 g_object_set (G_OBJECT (action
), "sensitive",
847 ((plugin
->project
!= NULL
) &&
848 (caps
& GBF_PROJECT_CAN_ADD_TARGET
)), NULL
);
850 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManager",
851 "ActionProjectAddSource");
852 g_object_set (G_OBJECT (action
), "sensitive",
853 ((plugin
->project
!= NULL
) &&
854 (caps
& GBF_PROJECT_CAN_ADD_SOURCE
)), NULL
);
857 for (j
= 0; j
< G_N_ELEMENTS (popup_actions
); j
++)
859 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManagerPopup",
860 popup_actions
[j
].name
);
861 if (popup_actions
[j
].callback
)
863 g_object_set (G_OBJECT (action
), "sensitive",
864 (plugin
->project
!= NULL
), NULL
);
870 on_treeview_selection_changed (GtkTreeSelection
*sel
,
871 ProjectManagerPlugin
*plugin
)
877 GbfProjectCapabilities caps
= GBF_PROJECT_CAN_ADD_NONE
;
879 ui
= anjuta_shell_get_ui (ANJUTA_PLUGIN (plugin
)->shell
, NULL
);
881 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManagerPopup",
882 "ActionPopupProjectAddGroup");
883 g_object_set (G_OBJECT (action
), "sensitive", FALSE
, NULL
);
884 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManagerPopup",
885 "ActionPopupProjectAddTarget");
886 g_object_set (G_OBJECT (action
), "sensitive", FALSE
, NULL
);
887 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManagerPopup",
888 "ActionPopupProjectAddSource");
889 g_object_set (G_OBJECT (action
), "sensitive", FALSE
, NULL
);
890 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManagerPopup",
891 "ActionPopupProjectRemove");
892 g_object_set (G_OBJECT (action
), "sensitive", FALSE
, NULL
);
895 caps
= gbf_project_get_capabilities (plugin
->project
, NULL
);
896 data
= gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin
->view
),
897 GBF_TREE_NODE_TARGET_SOURCE
);
898 if (data
&& data
->type
== GBF_TREE_NODE_TARGET_SOURCE
)
900 if (caps
& GBF_PROJECT_CAN_ADD_SOURCE
)
902 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManagerPopup",
903 "ActionPopupProjectAddSource");
904 g_object_set (G_OBJECT (action
), "sensitive", TRUE
, NULL
);
906 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManagerPopup",
907 "ActionPopupProjectRemove");
908 g_object_set (G_OBJECT (action
), "sensitive", TRUE
, NULL
);
909 gbf_tree_data_free (data
);
913 gbf_tree_data_free (data
);
914 data
= gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin
->view
),
915 GBF_TREE_NODE_TARGET
);
916 if (data
&& data
->type
== GBF_TREE_NODE_TARGET
)
918 if (caps
& GBF_PROJECT_CAN_ADD_SOURCE
)
920 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManagerPopup",
921 "ActionPopupProjectAddSource");
922 g_object_set (G_OBJECT (action
), "sensitive", TRUE
, NULL
);
924 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManagerPopup",
925 "ActionPopupProjectRemove");
926 g_object_set (G_OBJECT (action
), "sensitive", TRUE
, NULL
);
927 gbf_tree_data_free (data
);
931 gbf_tree_data_free (data
);
932 data
= gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin
->view
),
933 GBF_TREE_NODE_GROUP
);
934 if (data
&& data
->type
== GBF_TREE_NODE_GROUP
)
936 if (caps
& GBF_PROJECT_CAN_ADD_GROUP
)
938 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManagerPopup",
939 "ActionPopupProjectAddGroup");
940 g_object_set (G_OBJECT (action
), "sensitive", TRUE
, NULL
);
942 if (caps
& GBF_PROJECT_CAN_ADD_TARGET
)
944 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManagerPopup",
945 "ActionPopupProjectAddTarget");
946 g_object_set (G_OBJECT (action
), "sensitive", TRUE
, NULL
);
948 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManagerPopup",
949 "ActionPopupProjectRemove");
950 g_object_set (G_OBJECT (action
), "sensitive", TRUE
, NULL
);
951 gbf_tree_data_free (data
);
956 ianjuta_project_manager_get_selected (IANJUTA_PROJECT_MANAGER (plugin
),
961 value
= g_new0 (GValue
, 1);
962 g_value_init (value
, G_TYPE_STRING
);
963 g_value_set_string (value
, selected_uri
);
964 anjuta_shell_add_value (ANJUTA_PLUGIN(plugin
)->shell
,
965 "project_manager_current_uri",
967 g_signal_emit_by_name (G_OBJECT (plugin
), "element_selected",
969 g_free (selected_uri
);
971 anjuta_shell_remove_value (ANJUTA_PLUGIN(plugin
)->shell
,
972 "project_manager_current_uri", NULL
);
977 on_treeview_event (GtkWidget
*widget
,
979 ProjectManagerPlugin
*plugin
)
983 ui
= anjuta_shell_get_ui (ANJUTA_PLUGIN (plugin
)->shell
, NULL
);
984 if (event
->type
== GDK_BUTTON_PRESS
) {
985 GdkEventButton
*e
= (GdkEventButton
*) event
;
986 if (e
->button
== 3) {
988 popup
= gtk_ui_manager_get_widget (GTK_UI_MANAGER (ui
),
989 "/PopupProjectManager");
990 g_return_val_if_fail (GTK_IS_WIDGET (popup
), FALSE
);
991 gtk_menu_popup (GTK_MENU (popup
),
992 NULL
, NULL
, NULL
, NULL
,
993 ((GdkEventButton
*) event
)->button
,
994 ((GdkEventButton
*) event
)->time
);
1002 register_stock_icons (AnjutaPlugin
*plugin
)
1004 static gboolean registered
= FALSE
;
1010 /* Register stock icons */
1011 BEGIN_REGISTER_ICON(plugin
);
1012 REGISTER_ICON (ICON_FILE
,
1013 "project-manager-plugin-icon");
1018 value_added_fm_current_uri (AnjutaPlugin
*plugin
, const char *name
,
1019 const GValue
*value
, gpointer data
)
1024 ProjectManagerPlugin
*pm_plugin
;
1026 uri
= g_value_get_string (value
);
1028 pm_plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (plugin
);
1029 ui
= anjuta_shell_get_ui (plugin
->shell
, NULL
);
1031 if (pm_plugin
->fm_current_uri
)
1032 g_free (pm_plugin
->fm_current_uri
);
1033 pm_plugin
->fm_current_uri
= g_strdup (uri
);
1035 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManagerPopup",
1036 "ActionPopupProjectAddToProject");
1037 g_object_set (G_OBJECT (action
), "sensitive", TRUE
, NULL
);
1041 value_removed_fm_current_uri (AnjutaPlugin
*plugin
,
1042 const char *name
, gpointer data
)
1046 ProjectManagerPlugin
*pm_plugin
;
1048 pm_plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (plugin
);
1050 if (pm_plugin
->fm_current_uri
)
1051 g_free (pm_plugin
->fm_current_uri
);
1052 pm_plugin
->fm_current_uri
= NULL
;
1054 ui
= anjuta_shell_get_ui (plugin
->shell
, NULL
);
1055 action
= anjuta_ui_get_action (ui
, "ActionGroupProjectManagerPopup",
1056 "ActionPopupProjectAddToProject");
1057 g_object_set (G_OBJECT (action
), "sensitive", FALSE
, NULL
);
1061 value_added_current_editor (AnjutaPlugin
*plugin
, const char *name
,
1062 const GValue
*value
, gpointer data
)
1065 ProjectManagerPlugin
*pm_plugin
;
1067 editor
= g_value_get_object (value
);
1068 if (!IANJUTA_IS_EDITOR(editor
))
1071 pm_plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (plugin
);
1073 if (pm_plugin
->current_editor_uri
)
1074 g_free (pm_plugin
->current_editor_uri
);
1075 pm_plugin
->current_editor_uri
=
1076 ianjuta_file_get_uri (IANJUTA_FILE (editor
), NULL
);
1080 value_removed_current_editor (AnjutaPlugin
*plugin
,
1081 const char *name
, gpointer data
)
1083 ProjectManagerPlugin
*pm_plugin
;
1085 pm_plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (plugin
);
1087 if (pm_plugin
->current_editor_uri
)
1088 g_free (pm_plugin
->current_editor_uri
);
1089 pm_plugin
->current_editor_uri
= NULL
;
1093 project_manager_load_gbf (ProjectManagerPlugin
*pm_plugin
)
1095 AnjutaStatus
*status
;
1097 const gchar
*root_uri
;
1099 GError
*error
= NULL
;
1100 GbfBackend
*backend
= NULL
;
1102 root_uri
= pm_plugin
->project_root_uri
;
1104 dirname
= gnome_vfs_get_local_path_from_uri (root_uri
);
1106 g_return_if_fail (dirname
!= NULL
);
1108 if (pm_plugin
->project
!= NULL
)
1109 g_object_unref (pm_plugin
->project
);
1111 DEBUG_PRINT ("initializing gbf backend...\n");
1112 gbf_backend_init ();
1113 for (l
= gbf_backend_get_backends (); l
; l
= l
->next
) {
1116 pm_plugin
->project
= gbf_backend_new_project (backend
->id
);
1117 if (pm_plugin
->project
)
1119 if (gbf_project_probe (pm_plugin
->project
, dirname
, NULL
))
1124 g_object_unref (pm_plugin
->project
);
1125 pm_plugin
->project
= NULL
;
1128 if (!strcmp (backend->id, "gbf-am:GbfAmProject"))
1136 /* FIXME: Set err */
1137 g_warning ("no backend available for this project\n");
1142 DEBUG_PRINT ("Creating new gbf project\n");
1144 /* pm_plugin->project = gbf_backend_new_project (backend->id); */
1145 if (!pm_plugin
->project
)
1147 /* FIXME: Set err */
1148 g_warning ("project creation failed\n");
1153 status
= anjuta_shell_get_status (ANJUTA_PLUGIN (pm_plugin
)->shell
, NULL
);
1154 anjuta_status_progress_add_ticks (status
, 1);
1155 anjuta_status_push (status
, _("Loading project: %s"), g_basename (dirname
));
1156 anjuta_status_busy_push (status
);
1158 DEBUG_PRINT ("loading project %s\n\n", dirname
);
1159 /* FIXME: use the error parameter to determine if the project
1160 * was loaded successfully */
1161 gbf_project_load (pm_plugin
->project
, dirname
, &error
);
1163 anjuta_status_progress_tick (status
, NULL
, _("Created project view..."));
1167 GtkWidget
*toplevel
;
1170 toplevel
= gtk_widget_get_toplevel (pm_plugin
->scrolledwindow
);
1171 if (toplevel
&& GTK_IS_WINDOW (toplevel
))
1172 win
= GTK_WINDOW (toplevel
);
1174 win
= GTK_WINDOW (ANJUTA_PLUGIN (pm_plugin
)->shell
);
1176 anjuta_util_dialog_error (win
, _("Failed to parse project (the project is opened, but there will be no project view) %s: %s\n"
1178 dirname
, error
->message
);
1179 /* g_propagate_error (err, error); */
1180 g_object_unref (pm_plugin
->project
);
1181 pm_plugin
->project
= NULL
;
1183 /* gtk_widget_destroy (progress_win); */
1184 anjuta_status_pop (status
);
1185 anjuta_status_busy_pop (status
);
1188 g_object_set (G_OBJECT (pm_plugin
->model
), "project",
1189 pm_plugin
->project
, NULL
);
1191 update_ui (pm_plugin
);
1192 anjuta_shell_present_widget (ANJUTA_PLUGIN (pm_plugin
)->shell
,
1193 pm_plugin
->scrolledwindow
,
1196 anjuta_status_set_default (status
, _("Project"), g_basename (dirname
));
1197 anjuta_status_pop (status
);
1198 anjuta_status_busy_pop (status
);
1203 project_manager_unload_gbf (ProjectManagerPlugin
*pm_plugin
)
1205 AnjutaStatus
*status
;
1207 if (pm_plugin
->project
)
1209 IAnjutaDocumentManager
*docman
;
1211 /* Close files that belong to this project (that are saved) */
1212 docman
= anjuta_shell_get_interface (ANJUTA_PLUGIN (pm_plugin
)->shell
,
1213 IAnjutaDocumentManager
, NULL
);
1216 GList
*to_remove
= NULL
;
1221 ianjuta_document_manager_get_doc_widgets (docman
, NULL
);
1225 if (!IANJUTA_IS_EDITOR(node
->data
))
1227 node
= g_list_next(node
);
1231 ianjuta_file_get_uri (IANJUTA_FILE (node
->data
), NULL
);
1233 /* Only remove if it does not have unsaved data */
1234 if (editor_uri
&& (!IANJUTA_IS_FILE_SAVABLE (node
->data
) ||
1235 !ianjuta_file_savable_is_dirty
1236 (IANJUTA_FILE_SAVABLE (node
->data
),
1239 if (strncmp (editor_uri
, pm_plugin
->project_root_uri
,
1240 strlen (pm_plugin
->project_root_uri
)) == 0 &&
1241 editor_uri
[strlen (pm_plugin
->project_root_uri
)] == '/')
1243 to_remove
= g_list_prepend (to_remove
, node
->data
);
1246 g_free (editor_uri
);
1247 node
= g_list_next (node
);
1252 ianjuta_document_manager_remove_document (docman
,
1253 IANJUTA_DOCUMENT (node
->data
),
1256 node
= g_list_next (node
);
1259 g_list_free (editors
);
1261 g_list_free (to_remove
);
1264 /* Release project */
1265 g_object_unref (pm_plugin
->project
);
1266 pm_plugin
->project
= NULL
;
1267 g_object_set (G_OBJECT (pm_plugin
->model
), "project", NULL
, NULL
);
1268 update_ui (pm_plugin
);
1269 status
= anjuta_shell_get_status (ANJUTA_PLUGIN (pm_plugin
)->shell
,
1271 anjuta_status_set_default (status
, _("Project"), NULL
);
1276 on_profile_scoped (AnjutaProfileManager
*profile_manager
,
1277 AnjutaProfile
*profile
, ProjectManagerPlugin
*plugin
)
1281 DEBUG_PRINT ("Profile scoped: %s", anjuta_profile_get_name (profile
));
1282 if (strcmp (anjuta_profile_get_name (profile
), PROJECT_PROFILE_NAME
) != 0)
1285 DEBUG_PRINT ("Project profile loaded; Restoring project session");
1287 /* Load gbf project */
1288 project_manager_load_gbf (plugin
);
1290 /* Export project */
1291 value
= g_new0 (GValue
, 1);
1292 g_value_init (value
, G_TYPE_STRING
);
1293 g_value_set_string (value
, plugin
->project_root_uri
);
1295 update_title (plugin
, plugin
->project_root_uri
);
1296 anjuta_shell_add_value (ANJUTA_PLUGIN(plugin
)->shell
,
1300 /* If profile scoped to "project", restore project session */
1301 session_dir
= get_session_dir (plugin
);
1302 g_return_if_fail (session_dir
!= NULL
);
1305 * If there is a session load already in progress (that is this
1306 * project is being opened in session restoration), our session
1307 * load would be ignored. Good thing.
1309 plugin
->session_by_me
= TRUE
;
1310 anjuta_shell_session_load (ANJUTA_PLUGIN (plugin
)->shell
,
1312 plugin
->session_by_me
= FALSE
;
1313 g_free (session_dir
);
1317 on_profile_descoped (AnjutaProfileManager
*profile_manager
,
1318 AnjutaProfile
*profile
, ProjectManagerPlugin
*plugin
)
1320 DEBUG_PRINT ("Profile descoped: %s", anjuta_profile_get_name (profile
));
1322 if (strcmp (anjuta_profile_get_name (profile
), PROJECT_PROFILE_NAME
) != 0)
1325 DEBUG_PRINT ("Project profile descoped; Saving project session");
1327 /* Save current project session */
1328 g_return_if_fail (plugin
->project_root_uri
!= NULL
);
1330 /* Save project session */
1331 project_manager_save_session (plugin
);
1333 /* Close current project */
1334 project_manager_unload_gbf (plugin
);
1336 g_free (plugin
->project_root_uri
);
1337 g_free (plugin
->project_uri
);
1338 plugin
->project_uri
= NULL
;
1339 plugin
->project_root_uri
= NULL
;
1341 update_title (ANJUTA_PLUGIN_PROJECT_MANAGER (plugin
), NULL
);
1342 anjuta_shell_remove_value (ANJUTA_PLUGIN (plugin
)->shell
,
1343 "project_root_uri", NULL
);
1347 project_manager_plugin_close (ProjectManagerPlugin
*plugin
)
1349 AnjutaProfileManager
*profile_manager
;
1350 GError
*error
= NULL
;
1352 /* Remove project profile */
1354 anjuta_shell_get_profile_manager (ANJUTA_PLUGIN (plugin
)->shell
, NULL
);
1355 anjuta_profile_manager_pop (profile_manager
, PROJECT_PROFILE_NAME
, &error
);
1358 anjuta_util_dialog_error (get_plugin_parent_window (plugin
),
1359 _("Error closing project: %s"),
1361 g_error_free (error
);
1366 project_manager_plugin_activate_plugin (AnjutaPlugin
*plugin
)
1368 AnjutaProfileManager
*profile_manager
;
1369 GtkWidget
*view
, *scrolled_window
;
1370 GbfProjectModel
*model
;
1371 static gboolean initialized
= FALSE
;
1372 GtkTreeSelection
*selection
;
1373 /* GladeXML *gxml; */
1374 ProjectManagerPlugin
*pm_plugin
;
1376 DEBUG_PRINT ("ProjectManagerPlugin: Activating Project Manager plugin...");
1379 register_stock_icons (plugin
);
1381 pm_plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (plugin
);
1382 pm_plugin
->ui
= anjuta_shell_get_ui (plugin
->shell
, NULL
);
1383 pm_plugin
->prefs
= anjuta_shell_get_preferences (plugin
->shell
, NULL
);
1385 /* create model & view and bind them */
1386 model
= gbf_project_model_new (NULL
);
1387 view
= gbf_project_view_new ();
1389 gtk_tree_view_set_model (GTK_TREE_VIEW (view
),
1390 GTK_TREE_MODEL (model
));
1392 selection
= gtk_tree_view_get_selection (GTK_TREE_VIEW (view
));
1393 g_signal_connect (view
, "uri-activated",
1394 G_CALLBACK (on_uri_activated
), plugin
);
1395 g_signal_connect (view
, "target-selected",
1396 G_CALLBACK (on_target_activated
), plugin
);
1397 g_signal_connect (view
, "group-selected",
1398 G_CALLBACK (on_group_activated
), plugin
);
1399 g_signal_connect (selection
, "changed",
1400 G_CALLBACK (on_treeview_selection_changed
), plugin
);
1401 g_signal_connect (view
, "event",
1402 G_CALLBACK (on_treeview_event
), plugin
);
1404 scrolled_window
= gtk_scrolled_window_new (NULL
, NULL
);
1405 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window
),
1406 GTK_POLICY_AUTOMATIC
,
1407 GTK_POLICY_AUTOMATIC
);
1408 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window
),
1410 gtk_container_add (GTK_CONTAINER (scrolled_window
), view
);
1411 gtk_widget_show (view
);
1412 gtk_widget_show (scrolled_window
);
1414 pm_plugin
->scrolledwindow
= scrolled_window
;
1415 pm_plugin
->view
= view
;
1416 pm_plugin
->model
= model
;
1419 pm_plugin
->pm_action_group
=
1420 anjuta_ui_add_action_group_entries (pm_plugin
->ui
,
1421 "ActionGroupProjectManager",
1422 _("Project manager actions"),
1424 G_N_ELEMENTS(pm_actions
),
1425 GETTEXT_PACKAGE
, TRUE
,
1427 pm_plugin
->popup_action_group
=
1428 anjuta_ui_add_action_group_entries (pm_plugin
->ui
,
1429 "ActionGroupProjectManagerPopup",
1430 _("Project manager popup actions"),
1432 G_N_ELEMENTS (popup_actions
),
1433 GETTEXT_PACKAGE
, TRUE
,
1436 pm_plugin
->merge_id
=
1437 anjuta_ui_merge (pm_plugin
->ui
, UI_FILE
);
1439 update_ui (pm_plugin
);
1441 /* Added widget in shell */
1442 anjuta_shell_add_widget (plugin
->shell
, pm_plugin
->scrolledwindow
,
1443 "AnjutaProjectManager", _("Project"),
1444 "project-manager-plugin-icon",
1445 ANJUTA_SHELL_PLACEMENT_LEFT
, NULL
);
1447 /* Add preferences page */
1448 gxml
= glade_xml_new (PREFS_GLADE
, "dialog.project.manager", NULL
);
1450 anjuta_preferences_add_page (pm_plugin
->prefs
,
1451 gxml
, "Project Manager", ICON_FILE
);
1452 preferences_changed(pm_plugin
->prefs
, pm_plugin
);
1453 g_object_unref (G_OBJECT (gxml
));
1457 pm_plugin
->fm_watch_id
=
1458 anjuta_plugin_add_watch (plugin
, "file_manager_current_uri",
1459 value_added_fm_current_uri
,
1460 value_removed_fm_current_uri
, NULL
);
1461 pm_plugin
->editor_watch_id
=
1462 anjuta_plugin_add_watch (plugin
, "document_manager_current_editor",
1463 value_added_current_editor
,
1464 value_removed_current_editor
, NULL
);
1465 /* Connect to save session */
1466 g_signal_connect (G_OBJECT (plugin
->shell
), "save_session",
1467 G_CALLBACK (on_session_save
), plugin
);
1468 g_signal_connect (G_OBJECT (plugin
->shell
), "exiting",
1469 G_CALLBACK (on_shell_exiting
), plugin
);
1470 profile_manager
= anjuta_shell_get_profile_manager (plugin
->shell
, NULL
);
1472 /* Connect to profile scoping */
1473 g_signal_connect (profile_manager
, "profile-scoped",
1474 G_CALLBACK (on_profile_scoped
), plugin
);
1475 g_signal_connect (profile_manager
, "profile-descoped",
1476 G_CALLBACK (on_profile_descoped
), plugin
);
1481 project_manager_plugin_deactivate_plugin (AnjutaPlugin
*plugin
)
1483 AnjutaProfileManager
*profile_manager
;
1484 ProjectManagerPlugin
*pm_plugin
;
1485 pm_plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (plugin
);
1487 /* Close project if it's open */
1488 if (pm_plugin
->project_root_uri
)
1489 project_manager_plugin_close (pm_plugin
);
1491 profile_manager
= anjuta_shell_get_profile_manager (plugin
->shell
, NULL
);
1493 /* Disconnect signals */
1494 g_signal_handlers_disconnect_by_func (G_OBJECT (plugin
->shell
),
1495 G_CALLBACK (on_session_save
),
1497 g_signal_handlers_disconnect_by_func (G_OBJECT (plugin
->shell
),
1498 G_CALLBACK (on_shell_exiting
),
1500 g_signal_handlers_disconnect_by_func (G_OBJECT (profile_manager
),
1501 G_CALLBACK (on_profile_descoped
),
1503 g_signal_handlers_disconnect_by_func (G_OBJECT (profile_manager
),
1504 G_CALLBACK (on_profile_scoped
),
1506 /* Remove watches */
1507 anjuta_plugin_remove_watch (plugin
, pm_plugin
->fm_watch_id
, TRUE
);
1508 anjuta_plugin_remove_watch (plugin
, pm_plugin
->editor_watch_id
, TRUE
);
1510 g_object_unref (G_OBJECT (pm_plugin
->model
));
1512 /* Widget is removed from the shell when destroyed */
1513 gtk_widget_destroy (pm_plugin
->scrolledwindow
);
1515 anjuta_ui_unmerge (pm_plugin
->ui
, pm_plugin
->merge_id
);
1516 anjuta_ui_remove_action_group (pm_plugin
->ui
, pm_plugin
->pm_action_group
);
1517 anjuta_ui_remove_action_group (pm_plugin
->ui
,
1518 pm_plugin
->popup_action_group
);
1524 project_manager_plugin_finalize (GObject
*obj
)
1527 G_OBJECT_CLASS (parent_class
)->finalize (obj
);
1531 project_manager_plugin_dispose (GObject
*obj
)
1534 G_OBJECT_CLASS (parent_class
)->dispose (obj
);
1538 project_manager_plugin_instance_init (GObject
*obj
)
1540 ProjectManagerPlugin
*plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (obj
);
1541 plugin
->scrolledwindow
= NULL
;
1542 plugin
->project
= NULL
;
1543 plugin
->view
= NULL
;
1544 plugin
->model
= NULL
;
1545 plugin
->pre_update_sources
= NULL
;
1546 plugin
->pre_update_targets
= NULL
;
1547 plugin
->pre_update_groups
= NULL
;
1548 plugin
->project_root_uri
= NULL
;
1549 plugin
->project_uri
= NULL
;
1550 plugin
->fm_current_uri
= NULL
;
1551 plugin
->current_editor_uri
= NULL
;
1552 plugin
->session_by_me
= FALSE
;
1556 project_manager_plugin_class_init (GObjectClass
*klass
)
1558 AnjutaPluginClass
*plugin_class
= ANJUTA_PLUGIN_CLASS (klass
);
1560 parent_class
= g_type_class_peek_parent (klass
);
1562 plugin_class
->activate
= project_manager_plugin_activate_plugin
;
1563 plugin_class
->deactivate
= project_manager_plugin_deactivate_plugin
;
1564 klass
->dispose
= project_manager_plugin_finalize
;
1565 klass
->dispose
= project_manager_plugin_dispose
;
1568 /* IAnjutaProjectManager implementation */
1570 static GnomeVFSFileType
1571 get_uri_vfs_type (const gchar
*uri
)
1573 GnomeVFSFileInfo info
;
1574 gnome_vfs_get_file_info (uri
, &info
, 0);
1579 uri_is_inside_project (ProjectManagerPlugin
*plugin
, const gchar
*uri
)
1581 if (strncmp (uri
, plugin
->project_root_uri
,
1582 strlen (plugin
->project_root_uri
)) == 0)
1587 const gchar
*project_root_path
= strchr (plugin
->project_root_uri
, ':');
1588 if (project_root_path
)
1589 project_root_path
+= 3;
1591 project_root_path
= plugin
->project_root_uri
;
1592 return (strncmp (uri
, project_root_path
,
1593 strlen (project_root_path
)) == 0);
1599 get_element_uri_from_id (ProjectManagerPlugin
*plugin
, const gchar
*id
)
1603 const gchar
*project_root
;
1608 path
= g_strdup (id
);
1609 ptr
= strrchr (path
, ':');
1614 /* ID is source ID, extract source uri */
1615 ptr
= strrchr (ptr
, ':');
1616 return g_strdup (ptr
+1);
1621 anjuta_shell_get (ANJUTA_PLUGIN (plugin
)->shell
,
1622 "project_root_uri", G_TYPE_STRING
,
1623 &project_root
, NULL
);
1624 uri
= g_build_filename (project_root
, path
, NULL
);
1625 /* DEBUG_PRINT ("Converting id: %s to %s", id, uri); */
1630 static const gchar
*
1631 get_element_relative_path (ProjectManagerPlugin
*plugin
, const gchar
*uri
)
1633 const gchar
*project_root
= NULL
;
1635 anjuta_shell_get (ANJUTA_PLUGIN (plugin
)->shell
,
1636 "project_root_uri", G_TYPE_STRING
,
1637 &project_root
, NULL
);
1642 return uri
+ strlen (project_root
);
1646 const gchar
*project_root_path
= strchr (project_root
, ':');
1647 if (project_root_path
)
1648 project_root_path
+= 3;
1650 project_root_path
= project_root
;
1651 return uri
+ strlen (project_root_path
);
1657 static GbfProjectTarget
*
1658 get_target_from_uri (ProjectManagerPlugin
*plugin
, const gchar
*uri
)
1660 GbfProjectTarget
*data
;
1661 const gchar
*rel_path
;
1664 rel_path
= get_element_relative_path (plugin
, uri
);
1669 /* FIXME: More target types should be handled */
1670 /* Test for shared lib */
1671 test_id
= g_strconcat (rel_path
, ":shared_lib", NULL
);
1672 data
= gbf_project_get_target (GBF_PROJECT (plugin
->project
),
1678 /* Test for static lib */
1679 test_id
= g_strconcat (rel_path
, ":static_lib", NULL
);
1680 data
= gbf_project_get_target (GBF_PROJECT (plugin
->project
),
1686 /* Test for program */
1687 test_id
= g_strconcat (rel_path
, ":program", NULL
);
1688 data
= gbf_project_get_target (GBF_PROJECT (plugin
->project
),
1696 get_element_id_from_uri (ProjectManagerPlugin
*plugin
, const gchar
*uri
)
1698 GbfProjectTarget
*target
;
1701 if (!uri_is_inside_project (plugin
, uri
))
1704 target
= get_target_from_uri (plugin
, uri
);
1707 id
= g_strdup (target
->id
);
1708 gbf_project_target_free (target
);
1710 else if (get_uri_vfs_type (uri
) | GNOME_VFS_FILE_TYPE_DIRECTORY
)
1712 id
= g_strconcat (get_element_relative_path (plugin
, uri
), "/", NULL
);
1716 id
= strdup (get_element_relative_path (plugin
, uri
));
1721 static IAnjutaProjectManagerElementType
1722 iproject_manager_get_element_type (IAnjutaProjectManager
*project_manager
,
1723 const gchar
*element_uri
,
1726 GnomeVFSFileType ftype
;
1727 ProjectManagerPlugin
*plugin
;
1729 g_return_val_if_fail (ANJUTA_IS_PLUGIN (project_manager
),
1730 IANJUTA_PROJECT_MANAGER_UNKNOWN
);
1732 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager
));
1733 g_return_val_if_fail (GBF_IS_PROJECT (plugin
->project
),
1734 IANJUTA_PROJECT_MANAGER_UNKNOWN
);
1735 g_return_val_if_fail (uri_is_inside_project (plugin
, element_uri
),
1736 IANJUTA_PROJECT_MANAGER_UNKNOWN
);
1738 ftype
= get_uri_vfs_type (element_uri
);
1739 if (ftype
| GNOME_VFS_FILE_TYPE_DIRECTORY
)
1741 return IANJUTA_PROJECT_MANAGER_GROUP
;
1743 else if (ianjuta_project_manager_get_target_type (project_manager
,
1744 element_uri
, NULL
) !=
1745 IANJUTA_PROJECT_MANAGER_TARGET_UNKNOWN
)
1747 return IANJUTA_PROJECT_MANAGER_TARGET
;
1749 else if (ftype
| GNOME_VFS_FILE_TYPE_REGULAR
)
1751 return IANJUTA_PROJECT_MANAGER_SOURCE
;
1753 return IANJUTA_PROJECT_MANAGER_UNKNOWN
;
1757 iproject_manager_get_elements (IAnjutaProjectManager
*project_manager
,
1758 IAnjutaProjectManagerElementType element_type
,
1762 ProjectManagerPlugin
*plugin
;
1764 g_return_val_if_fail (ANJUTA_IS_PLUGIN (project_manager
), NULL
);
1766 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager
));
1767 g_return_val_if_fail (GBF_IS_PROJECT (plugin
->project
), NULL
);
1770 switch (element_type
)
1772 case IANJUTA_PROJECT_MANAGER_SOURCE
:
1774 GList
*sources
, *node
;
1775 GbfProjectTargetSource
*source
;
1776 sources
= gbf_project_get_all_sources (plugin
->project
, NULL
);
1780 source
= gbf_project_get_source (plugin
->project
,
1781 (const gchar
*) node
->data
,
1784 elements
= g_list_prepend (elements
,
1785 g_strdup (source
->source_uri
));
1786 gbf_project_target_source_free (source
);
1787 g_free (node
->data
);
1790 g_list_free (sources
);
1793 case IANJUTA_PROJECT_MANAGER_TARGET
:
1795 GList
*targets
, *node
;
1796 targets
= gbf_project_get_all_targets (plugin
->project
, NULL
);
1800 elements
= g_list_prepend (elements
,
1801 get_element_uri_from_id (plugin
,
1802 (const gchar
*)node
->data
));
1803 g_free (node
->data
);
1806 g_list_free (targets
);
1809 case IANJUTA_PROJECT_MANAGER_GROUP
:
1811 GList
*groups
, *node
;
1812 groups
= gbf_project_get_all_groups (plugin
->project
, NULL
);
1816 elements
= g_list_prepend (elements
,
1817 get_element_uri_from_id (plugin
,
1818 (const gchar
*)node
->data
));
1819 g_free (node
->data
);
1822 g_list_free (groups
);
1828 return g_list_reverse (elements
);
1831 static IAnjutaProjectManagerTargetType
1832 iproject_manager_get_target_type (IAnjutaProjectManager
*project_manager
,
1833 const gchar
*target_uri
,
1836 IAnjutaProjectManagerElementType element_type
;
1837 IAnjutaProjectManagerTargetType target_type
;
1838 ProjectManagerPlugin
*plugin
;
1839 GbfProjectTarget
*data
;
1841 g_return_val_if_fail (ANJUTA_IS_PLUGIN (project_manager
),
1842 IANJUTA_PROJECT_MANAGER_TARGET_UNKNOWN
);
1844 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager
));
1845 g_return_val_if_fail (GBF_IS_PROJECT (plugin
->project
),
1846 IANJUTA_PROJECT_MANAGER_TARGET_UNKNOWN
);
1848 element_type
= ianjuta_project_manager_get_element_type (project_manager
,
1851 g_return_val_if_fail (uri_is_inside_project (plugin
, target_uri
),
1852 IANJUTA_PROJECT_MANAGER_TARGET_UNKNOWN
);
1854 data
= get_target_from_uri (plugin
, target_uri
);
1856 if (data
&& data
->type
&& strcmp (data
->type
, "shared_lib") == 0)
1858 target_type
= IANJUTA_PROJECT_MANAGER_TARGET_SHAREDLIB
;
1860 else if (data
&& data
->type
&& strcmp (data
->type
, "static_lib") == 0)
1862 target_type
= IANJUTA_PROJECT_MANAGER_TARGET_STATICLIB
;
1864 else if (data
&& data
->type
&& strcmp (data
->type
, "program") == 0)
1866 target_type
= IANJUTA_PROJECT_MANAGER_TARGET_STATICLIB
;
1870 target_type
= IANJUTA_PROJECT_MANAGER_TARGET_UNKNOWN
;
1873 gbf_project_target_free (data
);
1878 iproject_manager_get_targets (IAnjutaProjectManager
*project_manager
,
1879 IAnjutaProjectManagerTargetType target_type
,
1882 GList
*targets
, *node
;
1883 const gchar
*target_id
;
1885 ProjectManagerPlugin
*plugin
;
1886 GList
*target_types
= NULL
;
1888 g_return_val_if_fail (ANJUTA_IS_PLUGIN (project_manager
), NULL
);
1890 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager
));
1891 g_return_val_if_fail (GBF_IS_PROJECT (plugin
->project
), NULL
);
1893 switch (target_type
)
1895 case IANJUTA_PROJECT_MANAGER_TARGET_SHAREDLIB
:
1896 target_types
= g_list_append(target_types
, "shared_lib");
1898 case IANJUTA_PROJECT_MANAGER_TARGET_STATICLIB
:
1899 target_types
= g_list_append(target_types
, "static_lib");
1901 case IANJUTA_PROJECT_MANAGER_TARGET_EXECUTABLE
:
1902 target_types
= g_list_append(target_types
, "program");
1903 target_types
= g_list_append(target_types
, "script");
1906 /* FIXME: there are some more target types */
1907 g_warning ("Unsupported target type");
1912 targets
= gbf_project_get_all_targets (plugin
->project
, NULL
);
1916 const gchar
*t_type
;
1918 target_id
= (const gchar
*) node
->data
;
1920 t_type
= strrchr (target_id
, ':');
1921 if (t_type
&& strlen (t_type
) > 2)
1925 for (type_node
= target_types
; type_node
!= NULL
;
1926 type_node
= type_node
->next
)
1928 if (strcmp (t_type
, type_node
->data
) == 0)
1930 gchar
*target_uri
= get_element_uri_from_id (plugin
,
1932 elements
= g_list_prepend (elements
, target_uri
);
1936 g_free (node
->data
);
1939 g_list_free (targets
);
1940 return g_list_reverse (elements
);
1944 iproject_manager_get_parent (IAnjutaProjectManager
*project_manager
,
1945 const gchar
*element_uri
,
1948 IAnjutaProjectManagerElementType type
;
1949 ProjectManagerPlugin
*plugin
;
1951 g_return_val_if_fail (ANJUTA_IS_PLUGIN (project_manager
), NULL
);
1953 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager
));
1954 g_return_val_if_fail (GBF_IS_PROJECT (plugin
->project
), NULL
);
1956 type
= ianjuta_project_manager_get_element_type (project_manager
,
1963 iproject_manager_get_children (IAnjutaProjectManager
*project_manager
,
1964 const gchar
*element_uri
,
1967 ProjectManagerPlugin
*plugin
;
1969 g_return_val_if_fail (ANJUTA_IS_PLUGIN (project_manager
), NULL
);
1971 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager
));
1972 g_return_val_if_fail (GBF_IS_PROJECT (plugin
->project
), NULL
);
1978 iproject_manager_get_selected (IAnjutaProjectManager
*project_manager
,
1983 ProjectManagerPlugin
*plugin
;
1985 g_return_val_if_fail (ANJUTA_IS_PLUGIN (project_manager
), NULL
);
1987 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager
));
1988 g_return_val_if_fail (GBF_IS_PROJECT (plugin
->project
), NULL
);
1990 data
= gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin
->view
),
1991 GBF_TREE_NODE_TARGET_SOURCE
);
1992 if (data
&& data
->type
== GBF_TREE_NODE_TARGET_SOURCE
)
1994 uri
= g_strdup (data
->uri
);
1995 gbf_tree_data_free (data
);
2000 gbf_tree_data_free (data
);
2002 data
= gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin
->view
),
2003 GBF_TREE_NODE_TARGET
);
2004 if (data
&& data
->type
== GBF_TREE_NODE_TARGET
)
2006 uri
= get_element_uri_from_id (plugin
, data
->id
);
2007 gbf_tree_data_free (data
);
2012 gbf_tree_data_free (data
);
2014 data
= gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin
->view
),
2015 GBF_TREE_NODE_GROUP
);
2016 if (data
&& data
->type
== GBF_TREE_NODE_GROUP
)
2018 uri
= g_strdup (data
->uri
);
2019 gbf_tree_data_free (data
);
2024 gbf_tree_data_free (data
);
2029 static IAnjutaProjectManagerCapabilities
2030 iproject_manager_get_capabilities (IAnjutaProjectManager
*project_manager
,
2033 ProjectManagerPlugin
*plugin
;
2035 g_return_val_if_fail (ANJUTA_IS_PLUGIN (project_manager
),
2036 IANJUTA_PROJECT_MANAGER_CAN_ADD_NONE
);
2038 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager
));
2039 return gbf_project_get_capabilities (plugin
->project
, NULL
);
2043 iproject_manager_add_source (IAnjutaProjectManager
*project_manager
,
2044 const gchar
*source_uri_to_add
,
2045 const gchar
*default_location_uri
,
2048 ProjectManagerPlugin
*plugin
;
2049 IAnjutaProjectManagerElementType default_location_type
;
2054 g_return_val_if_fail (ANJUTA_IS_PLUGIN (project_manager
), FALSE
);
2056 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager
));
2057 g_return_val_if_fail (GBF_IS_PROJECT (plugin
->project
), FALSE
);
2059 update_operation_begin (plugin
);
2060 default_location_type
=
2061 ianjuta_project_manager_get_element_type (project_manager
,
2062 default_location_uri
, NULL
);
2063 location_id
= get_element_id_from_uri (plugin
, default_location_uri
);
2064 if (default_location_type
== IANJUTA_PROJECT_MANAGER_GROUP
)
2066 source_id
= gbf_project_util_add_source (plugin
->model
,
2067 get_plugin_parent_window (plugin
),
2071 else if (default_location_type
== IANJUTA_PROJECT_MANAGER_TARGET
)
2073 source_id
= gbf_project_util_add_source (plugin
->model
,
2074 get_plugin_parent_window (plugin
),
2080 source_id
= gbf_project_util_add_source (plugin
->model
,
2081 get_plugin_parent_window (plugin
),
2085 update_operation_end (plugin
, TRUE
);
2087 source_uri
= get_element_uri_from_id(plugin
, source_id
);
2094 iproject_manager_add_source_multi (IAnjutaProjectManager
*project_manager
,
2095 GList
*source_add_uris
,
2096 const gchar
*default_location_uri
,
2099 ProjectManagerPlugin
*plugin
;
2100 IAnjutaProjectManagerElementType default_location_type
;
2103 GList
* source_uris
= NULL
;
2105 g_return_val_if_fail (ANJUTA_IS_PLUGIN (project_manager
), FALSE
);
2107 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager
));
2108 g_return_val_if_fail (GBF_IS_PROJECT (plugin
->project
), FALSE
);
2110 update_operation_begin (plugin
);
2111 default_location_type
=
2112 ianjuta_project_manager_get_element_type (project_manager
,
2113 default_location_uri
, NULL
);
2114 location_id
= get_element_id_from_uri (plugin
, default_location_uri
);
2115 if (default_location_type
== IANJUTA_PROJECT_MANAGER_GROUP
)
2117 source_ids
= gbf_project_util_add_source_multi (plugin
->model
,
2118 get_plugin_parent_window (plugin
),
2122 else if (default_location_type
== IANJUTA_PROJECT_MANAGER_TARGET
)
2125 gbf_project_util_add_source_multi (plugin
->model
,
2126 get_plugin_parent_window (plugin
),
2133 gbf_project_util_add_source_multi (plugin
->model
,
2134 get_plugin_parent_window (plugin
),
2138 update_operation_end (plugin
, TRUE
);
2142 source_uris
= g_list_append (source_uris
,
2143 get_element_uri_from_id (plugin
,
2145 g_free (source_ids
->data
);
2146 source_ids
= g_list_next(source_ids
);
2148 g_list_free (source_ids
);
2153 iproject_manager_add_target (IAnjutaProjectManager
*project_manager
,
2154 const gchar
*target_name_to_add
,
2155 const gchar
*default_group_uri
,
2158 ProjectManagerPlugin
*plugin
;
2159 gchar
*default_group_id
, *target_id
, *target_uri
= NULL
;
2161 g_return_val_if_fail (ANJUTA_IS_PLUGIN (project_manager
), FALSE
);
2163 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager
));
2165 g_return_val_if_fail (GBF_IS_PROJECT (plugin
->project
), FALSE
);
2167 default_group_id
= get_element_id_from_uri (plugin
, default_group_uri
);
2169 update_operation_begin (plugin
);
2170 target_id
= gbf_project_util_new_target (plugin
->model
,
2171 get_plugin_parent_window (plugin
),
2173 target_name_to_add
);
2174 update_operation_end (plugin
, TRUE
);
2175 target_uri
= get_element_uri_from_id (plugin
, target_id
);
2177 g_free (default_group_id
);
2182 iproject_manager_add_group (IAnjutaProjectManager
*project_manager
,
2183 const gchar
*group_name_to_add
,
2184 const gchar
*default_group_uri
,
2187 ProjectManagerPlugin
*plugin
;
2188 gchar
*group_id
, *group_uri
= NULL
;
2189 gchar
*default_group_id
;
2191 g_return_val_if_fail (ANJUTA_IS_PLUGIN (project_manager
), FALSE
);
2193 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager
));
2194 g_return_val_if_fail (GBF_IS_PROJECT (plugin
->project
), FALSE
);
2196 default_group_id
= get_element_id_from_uri (plugin
, default_group_uri
);
2198 update_operation_begin (plugin
);
2199 group_id
= gbf_project_util_new_group (plugin
->model
,
2200 get_plugin_parent_window (plugin
),
2203 update_operation_end (plugin
, TRUE
);
2204 group_uri
= get_element_uri_from_id (plugin
, group_id
);
2206 g_free (default_group_id
);
2211 iproject_manager_is_open (IAnjutaProjectManager
*project_manager
, GError
**err
)
2213 ProjectManagerPlugin
*plugin
;
2215 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager
));
2217 return GBF_IS_PROJECT (plugin
->project
);
2221 iproject_manager_iface_init(IAnjutaProjectManagerIface
*iface
)
2223 iface
->get_element_type
= iproject_manager_get_element_type
;
2224 iface
->get_elements
= iproject_manager_get_elements
;
2225 iface
->get_target_type
= iproject_manager_get_target_type
;
2226 iface
->get_targets
= iproject_manager_get_targets
;
2227 iface
->get_parent
= iproject_manager_get_parent
;
2228 iface
->get_children
= iproject_manager_get_children
;
2229 iface
->get_selected
= iproject_manager_get_selected
;
2230 iface
->get_capabilities
= iproject_manager_get_capabilities
;
2231 iface
->add_source
= iproject_manager_add_source
;
2232 iface
->add_sources
= iproject_manager_add_source_multi
;
2233 iface
->add_target
= iproject_manager_add_target
;
2234 iface
->add_group
= iproject_manager_add_group
;
2235 iface
->is_open
= iproject_manager_is_open
;
2239 ifile_open (IAnjutaFile
*ifile
, const gchar
* uri
, GError
**e
)
2241 AnjutaProfile
*profile
;
2242 AnjutaProfileManager
*profile_manager
;
2243 AnjutaPluginManager
*plugin_manager
;
2244 AnjutaStatus
*status
;
2245 GnomeVFSURI
*vfs_uri
;
2246 gchar
*dirname
, *dirname_tmp
, *vfs_dir
;
2247 gchar
*session_profile
, *profile_name
;
2248 ProjectManagerPlugin
*plugin
;
2249 GError
*error
= NULL
;
2251 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (ifile
);
2253 #if 1 /* Enable it now */
2254 /* If there is already a project loaded, load in separate anjuta window */
2255 if (plugin
->project_root_uri
)
2257 gchar
*quoted_uri
= g_shell_quote (uri
);
2258 gchar
*cmd
= g_strconcat ("anjuta --no-splash --no-client ", quoted_uri
, NULL
);
2259 g_free (quoted_uri
);
2260 anjuta_util_execute_shell (NULL
, cmd
);
2267 anjuta_shell_get_plugin_manager (ANJUTA_PLUGIN (ifile
)->shell
, NULL
);
2269 anjuta_shell_get_profile_manager (ANJUTA_PLUGIN (ifile
)->shell
, NULL
);
2270 status
= anjuta_shell_get_status (ANJUTA_PLUGIN (ifile
)->shell
, NULL
);
2272 anjuta_status_progress_add_ticks (status
, 2);
2275 anjuta_shell_freeze (ANJUTA_PLUGIN (ifile
)->shell
, NULL
);
2277 /* Prepare profile */
2278 profile
= anjuta_profile_new (PROJECT_PROFILE_NAME
, plugin_manager
);
2280 /* System default profile */
2281 anjuta_profile_add_plugins_from_xml (profile
, DEFAULT_PROFILE
,
2285 anjuta_util_dialog_error (GTK_WINDOW (ANJUTA_PLUGIN (ifile
)->shell
),
2286 "%s", error
->message
);
2287 g_error_free (error
);
2291 /* Project default profile */
2292 anjuta_profile_add_plugins_from_xml (profile
, uri
, TRUE
, &error
);
2295 anjuta_util_dialog_error (GTK_WINDOW (ANJUTA_PLUGIN (ifile
)->shell
),
2296 "%s", error
->message
);
2297 g_error_free (error
);
2301 /* Project session profile */
2302 vfs_uri
= gnome_vfs_uri_new (uri
);
2304 dirname_tmp
= gnome_vfs_uri_extract_dirname (vfs_uri
);
2305 dirname
= gnome_vfs_unescape_string (dirname_tmp
, "");
2306 g_free (dirname_tmp
);
2308 profile_name
= g_path_get_basename (DEFAULT_PROFILE
);
2309 gnome_vfs_uri_unref (vfs_uri
);
2311 session_profile
= g_build_filename (dirname
, ".anjuta",
2312 profile_name
, NULL
);
2313 DEBUG_PRINT ("Loading project session profile: %s", session_profile
);
2315 if (g_file_test (session_profile
, G_FILE_TEST_EXISTS
))
2317 anjuta_profile_add_plugins_from_xml (profile
, session_profile
,
2321 anjuta_util_dialog_error (GTK_WINDOW (ANJUTA_PLUGIN (ifile
)->shell
),
2322 "%s", error
->message
);
2323 g_error_free (error
);
2327 anjuta_profile_set_sync_uri (profile
, session_profile
);
2328 g_free (session_profile
);
2329 g_free (profile_name
);
2331 /* Set project uri */
2332 g_free (plugin
->project_root_uri
);
2333 g_free (plugin
->project_uri
);
2335 vfs_dir
= gnome_vfs_get_uri_from_local_path (dirname
);
2336 plugin
->project_uri
= g_strdup (uri
);
2337 plugin
->project_root_uri
= vfs_dir
;
2341 anjuta_profile_manager_push (profile_manager
, profile
, &error
);
2344 anjuta_util_dialog_error (GTK_WINDOW (ANJUTA_PLUGIN (ifile
)->shell
),
2345 "%s", error
->message
);
2346 g_error_free (error
);
2350 anjuta_status_progress_tick (status
, NULL
,
2351 _("Loaded Project... Initializing"));
2355 /* FIXME: The shell can not be thawed after the session is loaded,
2356 * because the layout is loaded in the session. If shell is not thawed
2357 * before that, the widgets on which layout is applied are not present
2358 * side the shell (freezing delays the widgets addition).
2360 anjuta_shell_thaw (ANJUTA_PLUGIN (ifile
)->shell
, NULL
);
2362 anjuta_status_progress_tick (status
, NULL
, _("Loaded Project..."));
2366 ifile_get_uri (IAnjutaFile
*ifile
, GError
**e
)
2368 ProjectManagerPlugin
*plugin
;
2370 plugin
= ANJUTA_PLUGIN_PROJECT_MANAGER (ifile
);
2371 if (plugin
->project_root_uri
)
2372 return g_strdup (plugin
->project_root_uri
);
2378 ifile_iface_init(IAnjutaFileIface
*iface
)
2380 iface
->open
= ifile_open
;
2381 iface
->get_uri
= ifile_get_uri
;
2384 ANJUTA_PLUGIN_BEGIN (ProjectManagerPlugin
, project_manager_plugin
);
2385 ANJUTA_PLUGIN_ADD_INTERFACE (iproject_manager
, IANJUTA_TYPE_PROJECT_MANAGER
);
2386 ANJUTA_PLUGIN_ADD_INTERFACE (ifile
, IANJUTA_TYPE_FILE
);
2389 ANJUTA_SIMPLE_PLUGIN (ProjectManagerPlugin
, project_manager_plugin
);