1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4; coding: utf-8 -*- */
2 /* am-project.h
3  *
4  * Copyright (C) 2009  Sébastien Granjoux
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; either version 2 of the
9  * License, or (at your option) any later version.
10  *
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 GNU
14  * General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public
17  * License along with this program; if not, write to the
18  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21 
22 #ifndef _AM_PROJECT_H_
23 #define _AM_PROJECT_H_
24 
25 #include <glib-object.h>
26 
27 #include "amp-root.h"
28 
29 #include <libanjuta/anjuta-project.h>
30 #include <libanjuta/anjuta-token.h>
31 #include <libanjuta/anjuta-token-file.h>
32 #include <libanjuta/anjuta-token-list.h>
33 #include <libanjuta/interfaces/ianjuta-language.h>
34 
35 G_BEGIN_DECLS
36 
37 #define AMP_TYPE_PROJECT		(amp_project_get_type ())
38 #define AMP_PROJECT(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), AMP_TYPE_PROJECT, AmpProject))
39 #define AMP_PROJECT_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST ((klass), AMP_TYPE_PROJECT, AmpProjectClass))
40 #define AMP_IS_PROJECT(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), AMP_TYPE_PROJECT))
41 #define AMP_IS_PROJECT_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((obj), AMP_TYPE_PROJECT))
42 
43 
44 typedef struct _AmpProjectClass   AmpProjectClass;
45 
46 typedef struct _AmpModuleNode AmpModuleNode;
47 typedef struct _AmpPackageNode AmpPackageNode;
48 typedef struct _AmpTargetNode AmpTargetNode;
49 typedef struct _AmpObjectNode AmpObjectNode;
50 typedef struct _AmpSourceNode AmpSourceNode;
51 
52 struct _AmpProjectClass {
53 	AmpRootNodeClass parent_class;
54 };
55 
56 typedef struct _AmpProperty AmpProperty;
57 typedef struct _AmpPropertyInfo AmpPropertyInfo;
58 
59 GType         amp_project_get_type (void);
60 AmpProject   *amp_project_new      (GFile *file, IAnjutaLanguage *language, GError **error);
61 
62 void amp_project_register (GTypeModule *module);
63 
64 
65 gint amp_project_probe (GFile *directory, GError     **error);
66 void amp_project_unload (AmpProject *project);
67 gboolean amp_project_is_loaded (AmpProject *project);
68 
69 
70 void amp_project_load_config (AmpProject *project, AnjutaToken *arg_list);
71 void amp_project_load_properties (AmpProject *project, AnjutaToken *macro, AnjutaToken *list);
72 void amp_project_load_module (AmpProject *project, AnjutaToken *module);
73 
74 AnjutaToken *amp_project_get_config_token (AmpProject *project, GFile *file);
75 
76 AnjutaTokenFile* amp_project_set_configure (AmpProject *project, GFile *configure);
77 gboolean amp_project_update_configure (AmpProject *project, AnjutaToken *token);
78 AnjutaToken* amp_project_get_configure_token (AmpProject *project);
79 void amp_project_update_root (AmpProject *project, AmpProject *new_project);
80 
81 AmpProject *amp_project_get_root (AmpProject *project);
82 AmpGroupNode *amp_project_get_group (AmpProject *project, const gchar *id);
83 AmpTargetNode *amp_project_get_target (AmpProject *project, const gchar *id);
84 AmpSourceNode *amp_project_get_source (AmpProject *project, const gchar *id);
85 gboolean amp_project_get_token_location (AmpProject *project, AnjutaTokenFileLocation *location, AnjutaToken *token);
86 
87 gboolean amp_project_move (AmpProject *project, const gchar *path);
88 
89 typedef enum _AmpFileType{
90 	DUMP_MAKEFILE,
91 	DUMP_CONFIGURE
92 } AmpFileType;
93 
94 gboolean amp_project_dump (AmpProject *project, AnjutaProjectNode *node, AmpFileType type);
95 
96 gchar * amp_project_get_uri (AmpProject *project);
97 GFile* amp_project_get_file (AmpProject *project);
98 
99 gboolean amp_project_is_busy (AmpProject *project);
100 
101 void amp_project_add_file (AmpProject *project, GFile *file, AnjutaTokenFile* token);
102 void amp_project_add_subst_variable (AmpProject *project, const gchar *name, AnjutaToken *value);
103 AnjutaToken *amp_project_get_subst_variable_token (AmpProject *project, const gchar *name);
104 
105 
106 AmpGroupNode* amp_project_add_group (AmpProject  *project, AmpGroupNode *parent, const gchar *name, GError **error);
107 AmpGroupNode* amp_project_add_sibling_group (AmpProject  *project, AmpGroupNode *parent, const gchar *name, gboolean after, AmpGroupNode *sibling, GError **error);
108 void amp_project_remove_group (AmpProject  *project, AmpGroupNode *group, GError **error);
109 
110 AmpTargetNode* amp_project_add_target (AmpProject  *project, AmpGroupNode *parent, const gchar *name, AnjutaProjectNodeType type, GError **error);
111 AmpTargetNode* amp_project_add_sibling_target (AmpProject  *project, AmpGroupNode *parent, const gchar *name, AnjutaProjectNodeType type, gboolean after, AmpTargetNode *sibling, GError **error);
112 void amp_project_remove_target (AmpProject  *project, AmpTargetNode *target, GError **error);
113 
114 AmpSourceNode* amp_project_add_source (AmpProject  *project, AmpTargetNode *parent, GFile *file, GError **error);
115 AmpSourceNode* amp_project_add_sibling_source (AmpProject  *project, AmpTargetNode *parent, GFile *file, gboolean after, AmpSourceNode *sibling, GError **error);
116 void amp_project_remove_source (AmpProject  *project, AmpSourceNode *source, GError **error);
117 
118 AnjutaProjectNodeInfo *amp_project_get_type_info (AmpProject *project, AnjutaProjectNodeType type);
119 const GList *amp_project_get_node_info (AmpProject *project, GError **error);
120 
121 GList *amp_project_get_config_modules (AmpProject *project, GError **error);
122 GList *amp_project_get_config_packages  (AmpProject *project, const gchar* module, GError **error);
123 
124 GList *amp_project_get_target_types (AmpProject *project, GError **error);
125 
126 AnjutaProjectNode *amp_node_parent (AnjutaProjectNode *node);
127 AnjutaProjectNode *amp_node_first_child (AnjutaProjectNode *node);
128 AnjutaProjectNode *amp_node_last_child (AnjutaProjectNode *node);
129 AnjutaProjectNode *amp_node_next_sibling (AnjutaProjectNode *node);
130 AnjutaProjectNode *amp_node_prev_sibling (AnjutaProjectNode *node);
131 //void amp_node_all_foreach (AnjutaProjectNode *node, AnjutaProjectNodeFunc func, gpointer data);
132 
133 GFile *amp_group_node_get_directory (AmpGroupNode *group);
134 gchar *amp_group_node_get_id (AmpGroupNode *group);
135 void amp_group_node_update_variable (AmpGroupNode *group, AnjutaToken *variable);
136 
137 const gchar *amp_target_node_get_name (AmpTargetNode *target);
138 gchar *amp_target_node_get_id (AmpTargetNode *target);
139 
140 void amp_source_node_free (AmpSourceNode *node);
141 gchar *amp_source_node_get_id (AmpSourceNode *source);
142 GFile *amp_source_node_get_file (AmpSourceNode *source);
143 
144 gchar* canonicalize_automake_variable (const gchar *name);
145 gboolean split_automake_variable (gchar *name, gint *flags, gchar **module, gchar **primary);
146 gchar* get_relative_path (GFile *parent, GFile *file);
147 GFileType file_type (GFile *file, const gchar *filename);
148 
149 
150 
151 
152 G_END_DECLS
153 
154 #endif /* _AM_PROJECT_H_ */
155