[anjuta] project-wizard: Allow to start a new project from the command line
- From: Sebastien Granjoux <sgranjoux src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [anjuta] project-wizard: Allow to start a new project from the command line
- Date: Sun, 25 Nov 2012 11:53:12 +0000 (UTC)
commit 7bc72fbc242fa1b9a59cd24b55b7376f5c81ce42
Author: SÃbastien Granjoux <seb sfo free fr>
Date: Sun Nov 25 12:45:06 2012 +0100
project-wizard: Allow to start a new project from the command line
We can use the name of a project wizard template file or tar.gz archive
containing all needed files.
anjuta.desktop.in.in | 4 +-
mime/anjuta.xml | 5 +
.../project-wizard/anjuta-project-wizard.plugin.in | 2 +-
plugins/project-wizard/druid.c | 118 ++++++++++++--------
plugins/project-wizard/druid.h | 3 +-
plugins/project-wizard/parser.c | 23 +++--
plugins/project-wizard/parser.h | 2 +-
plugins/project-wizard/plugin.c | 26 +++--
plugins/project-wizard/plugin.h | 2 +-
9 files changed, 118 insertions(+), 67 deletions(-)
---
diff --git a/anjuta.desktop.in.in b/anjuta.desktop.in.in
index 3c00ddf..6c99c45 100644
--- a/anjuta.desktop.in.in
+++ b/anjuta.desktop.in.in
@@ -3,14 +3,14 @@ _Name=Anjuta
_GenericName=Integrated Development Environment
_Comment=Develop software in an integrated development environment
_Keywords=IDE;development;programming;
-Exec=anjuta
+Exec=anjuta %U
Icon=anjuta
Terminal=false
X-MultipleArgs=false
Type=Application
Categories=GNOME;GTK;Development;IDE;
StartupNotify=true
-MimeType=application/x-anjuta;
+MimeType=application/x-anjuta;application/x-anjuta-project-template;x-anjuta-compressed-project-template
X-GNOME-DocPath=anjuta/anjuta-manual.xml
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=anjuta
diff --git a/mime/anjuta.xml b/mime/anjuta.xml
index 4762002..1f22c23 100644
--- a/mime/anjuta.xml
+++ b/mime/anjuta.xml
@@ -9,6 +9,11 @@
<glob pattern="*.anjuta"/>
<glob pattern="*.prj"/>
</mime-type>
+ <mime-type type="application/x-anjuta-project-template">
+ <sub-class-of type="application/xml"/>
+ <comment>Anjuta IDE Project Template</comment>
+ <glob pattern="*.wiz"/>
+ </mime-type>
<mime-type type="application/x-anjuta-compressed-project-template">
<sub-class-of type="application/x-compressed-tar"/>
<comment>Anjuta IDE Compressed Project Template</comment>
diff --git a/plugins/project-wizard/anjuta-project-wizard.plugin.in b/plugins/project-wizard/anjuta-project-wizard.plugin.in
index d783790..6011512 100644
--- a/plugins/project-wizard/anjuta-project-wizard.plugin.in
+++ b/plugins/project-wizard/anjuta-project-wizard.plugin.in
@@ -7,7 +7,7 @@ Interfaces=IAnjutaFile,IAnjutaWizard
UserActivatable=no
[File Loader]
-SupportedMimeTypes=application/x-anjuta-compressed-project-template
+SupportedMimeTypes=application/x-anjuta-compressed-project-template,application/x-anjuta-project-template
[Wizard]
_Title=Project
diff --git a/plugins/project-wizard/druid.c b/plugins/project-wizard/druid.c
index 1a5f3ef..e062525 100644
--- a/plugins/project-wizard/druid.c
+++ b/plugins/project-wizard/druid.c
@@ -119,6 +119,7 @@ struct _NPWDruid
NPWPageParser* parser;
GList* header_list;
NPWHeader* header;
+ gboolean no_selection;
AnjutaAutogen* gen;
gboolean busy;
};
@@ -134,6 +135,23 @@ enum {
/* Helper functon
*---------------------------------------------------------------------------*/
+/* Druid GUI functions
+ *---------------------------------------------------------------------------*/
+
+static void
+npw_druid_set_busy (NPWDruid *druid, gboolean busy_state)
+{
+ if (druid->busy == busy_state)
+ return;
+
+ /* Set busy state */
+ if (busy_state)
+ anjuta_status_busy_push (anjuta_shell_get_status (ANJUTA_PLUGIN (druid->plugin)->shell, NULL));
+ else
+ anjuta_status_busy_pop (anjuta_shell_get_status (ANJUTA_PLUGIN (druid->plugin)->shell, NULL));
+ druid->busy = busy_state;
+}
+
/* Create error page
*---------------------------------------------------------------------------*/
@@ -382,7 +400,7 @@ cb_druid_insert_project_page (gpointer value, gpointer user_data)
/* Fill project selection page */
static gboolean
-npw_druid_fill_selection_page (NPWDruid* druid, const gchar *directory)
+npw_druid_fill_selection_page (NPWDruid* druid, GFile *templates)
{
gchar* dir;
const gchar * const * sys_dir;
@@ -395,17 +413,30 @@ npw_druid_fill_selection_page (NPWDruid* druid, const gchar *directory)
/* Create list of projects */
druid->header_list = npw_header_list_new ();
- if (directory != NULL)
+ if (templates != NULL)
{
- /* Read project template only in specified directory,
- * other directories can still be used to get included
- * files */
- npw_header_list_readdir (&druid->header_list, directory);
- anjuta_autogen_set_library_path (druid->gen, directory);
+ if (g_file_query_file_type (templates, 0, NULL) == G_FILE_TYPE_DIRECTORY)
+ {
+ /* Read project template only in specified directory,
+ * other directories can still be used to get included
+ * files */
+ gchar *directory = g_file_get_path (templates);
+
+ npw_header_list_readdir (&druid->header_list, directory);
+ anjuta_autogen_set_library_path (druid->gen, directory);
+ g_free (directory);
+ }
+ else
+ {
+ /* templates is a file, so read only it as a project template */
+ gchar *filename = g_file_get_path (templates);
+ npw_header_list_read (&druid->header_list, filename);
+ g_free (filename);
+ }
}
dir = g_build_filename (g_get_user_data_dir (), "anjuta", "project", NULL);
- if (directory == NULL)
+ if (templates == NULL)
{
/* Read project template in user directory,
* normally ~/.local/share/anjuta/project,
@@ -418,7 +449,7 @@ npw_druid_fill_selection_page (NPWDruid* druid, const gchar *directory)
for (sys_dir = g_get_system_data_dirs (); *sys_dir != NULL; sys_dir++)
{
dir = g_build_filename (*sys_dir, "anjuta", "project", NULL);
- if (directory == NULL)
+ if (templates == NULL)
{
/* Read project template in system directory */
npw_header_list_readdir (&druid->header_list, dir);
@@ -427,24 +458,32 @@ npw_druid_fill_selection_page (NPWDruid* druid, const gchar *directory)
g_free (dir);
}
- if (directory == NULL)
+ if (templates == NULL)
{
/* Read anjuta installation directory */
npw_header_list_readdir (&druid->header_list, PROJECT_WIZARD_DIRECTORY);
}
anjuta_autogen_set_library_path (druid->gen, PROJECT_WIZARD_DIRECTORY);
- if (g_list_length (druid->header_list) == 0)
+ switch (g_list_length (druid->header_list))
{
+ case 0:
anjuta_util_dialog_error (GTK_WINDOW (ANJUTA_PLUGIN (druid->plugin)->shell),_("Unable to find any project template in %s"), PROJECT_WIZARD_DIRECTORY);
return FALSE;
+ case 1:
+ druid->header = (NPWHeader *)((GList *)druid->header_list->data)->data;
+ druid->no_selection = TRUE;
+ gtk_container_remove (GTK_CONTAINER (druid->window), druid->project_page);
+ gtk_assistant_insert_page (GTK_ASSISTANT (druid->window), druid->progress_page, 0);
+ npw_druid_set_busy (druid, FALSE);
+ break;
+ default:
+ /* Add all necessary notebook page */
+ druid->no_selection = FALSE;
+ g_list_foreach (druid->header_list, cb_druid_insert_project_page, druid);
+ gtk_widget_show_all (GTK_WIDGET (druid->project_book));
}
- /* Add all necessary notebook page */
- g_list_foreach (druid->header_list, cb_druid_insert_project_page, druid);
-
- gtk_widget_show_all (GTK_WIDGET (druid->project_book));
-
return TRUE;
}
@@ -569,7 +608,7 @@ npw_druid_add_new_page (NPWDruid* druid)
/* Get page in cache */
current = gtk_assistant_get_current_page (GTK_ASSISTANT (druid->window));
- page = g_queue_peek_nth (druid->page_list, current);
+ page = g_queue_peek_nth (druid->page_list, current - (druid->no_selection ? 0 : 1) + 1);
if (page == NULL)
{
@@ -641,7 +680,7 @@ npw_druid_remove_following_page (NPWDruid* druid)
gtk_container_remove (GTK_CONTAINER (druid->window), widget);
- page = g_queue_pop_nth (druid->page_list, current - 1);
+ page = g_queue_pop_nth (druid->page_list, current - (druid->no_selection ? 0 : 1));
if (page != NULL) npw_page_free (page);
}
}
@@ -752,7 +791,7 @@ npw_druid_save_valid_values (NPWDruid* druid)
NPWSaveValidPropertyData data;
gboolean ok = TRUE;
- current = gtk_assistant_get_current_page (GTK_ASSISTANT (druid->window)) - 2;
+ current = gtk_assistant_get_current_page (GTK_ASSISTANT (druid->window)) - (druid->no_selection ? 0 : 1) - 1;
page = g_queue_peek_nth (druid->page_list, current);
data.modified = FALSE;
data.parent = GTK_WINDOW (druid->window);
@@ -789,23 +828,6 @@ npw_druid_save_valid_values (NPWDruid* druid)
return ok;
}
-/* Druid GUI functions
- *---------------------------------------------------------------------------*/
-
-static void
-npw_druid_set_busy (NPWDruid *druid, gboolean busy_state)
-{
- if (druid->busy == busy_state)
- return;
-
- /* Set busy state */
- if (busy_state)
- anjuta_status_busy_push (anjuta_shell_get_status (ANJUTA_PLUGIN (druid->plugin)->shell, NULL));
- else
- anjuta_status_busy_pop (anjuta_shell_get_status (ANJUTA_PLUGIN (druid->plugin)->shell, NULL));
- druid->busy = busy_state;
-}
-
/* Druid call backs
*---------------------------------------------------------------------------*/
@@ -843,14 +865,14 @@ on_druid_get_new_page (AnjutaAutogen* gen, gpointer data)
NPWPage* page;
current = gtk_assistant_get_current_page (GTK_ASSISTANT (druid->window));
- page = g_queue_peek_nth (druid->page_list, current - 1);
+ page = g_queue_peek_nth (druid->page_list, current - (druid->no_selection ? 0 : 1));
if (npw_page_get_name (page) == NULL)
{
/* no page, display finish page */
npw_druid_fill_summary_page (druid);
- page = g_queue_pop_nth (druid->page_list, current - 1);
+ page = g_queue_pop_nth (druid->page_list, current - (druid->no_selection ? 0 : 1));
if (page != NULL) npw_page_free (page);
gtk_container_remove (GTK_CONTAINER (druid->window), gtk_assistant_get_nth_page (GTK_ASSISTANT (druid->window), current + 1));
gtk_assistant_set_current_page (GTK_ASSISTANT (druid->window), current + 1);
@@ -1021,6 +1043,7 @@ on_druid_real_prepare (GtkAssistant* assistant, GtkWidget *page, NPWDruid* druid
gtk_container_remove (GTK_CONTAINER (assistant), druid->error_page);
previous--;
}
+ if (druid->no_selection) previous++;
/* Generate the next page */
if (previous == PROJECT_PAGE_INDEX)
@@ -1136,7 +1159,7 @@ on_druid_finish (GtkAssistant* assistant, NPWDruid* druid)
}
static GtkWidget*
-npw_druid_create_assistant (NPWDruid* druid, const gchar *directory)
+npw_druid_create_assistant (NPWDruid* druid, GFile *templates)
{
AnjutaShell *shell;
GtkBuilder *builder;
@@ -1172,8 +1195,6 @@ npw_druid_create_assistant (NPWDruid* druid, const gchar *directory)
PROPERTY_PAGE, &property_page,
NULL);
druid->window = GTK_WINDOW (assistant);
- g_object_ref (druid->error_page);
- g_object_ref (druid->progress_page);
gtk_window_set_transient_for (GTK_WINDOW (assistant), GTK_WINDOW (shell));
g_object_unref (builder);
@@ -1186,9 +1207,15 @@ npw_druid_create_assistant (NPWDruid* druid, const gchar *directory)
/* Remove property page, will be created later as needed */
gtk_container_remove (GTK_CONTAINER (assistant), property_page);
+ /* Remove error page, could be needed later so keep a ref */
+ g_object_ref (druid->error_page);
+ gtk_container_remove (GTK_CONTAINER (assistant), druid->error_page);
+ /* Remove progress page, could be needed later so keep a ref */
+ g_object_ref (druid->progress_page);
+ gtk_container_remove (GTK_CONTAINER (assistant), druid->progress_page);
/* Setup project selection page */
- if (!npw_druid_fill_selection_page (druid, directory))
+ if (!npw_druid_fill_selection_page (druid, templates))
{
return NULL;
}
@@ -1248,7 +1275,7 @@ npw_druid_add_default_property (NPWDruid* druid)
*---------------------------------------------------------------------------*/
NPWDruid*
-npw_druid_new (NPWPlugin* plugin, const gchar *directory)
+npw_druid_new (NPWPlugin* plugin, GFile *templates)
{
NPWDruid* druid;
@@ -1263,13 +1290,14 @@ npw_druid_new (NPWPlugin* plugin, const gchar *directory)
druid->plugin = plugin;
druid->project_file = NULL;
druid->busy = FALSE;
+ druid->no_selection = FALSE;
druid->page_list = g_queue_new ();
druid->values = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_free);
druid->gen = anjuta_autogen_new ();
- druid->plugin = plugin;
+ plugin->druid = druid;
druid->error_extra_widget = NULL;
- if (npw_druid_create_assistant (druid, directory) == NULL)
+ if (npw_druid_create_assistant (druid, templates) == NULL)
{
npw_druid_free (druid);
diff --git a/plugins/project-wizard/druid.h b/plugins/project-wizard/druid.h
index f2a47b3..10d9606 100644
--- a/plugins/project-wizard/druid.h
+++ b/plugins/project-wizard/druid.h
@@ -24,11 +24,12 @@
#define ICON_FILE "anjuta-project-wizard-plugin-48.png"
#include <glib.h>
+#include <gio/gio.h>
struct _NPWPlugin;
typedef struct _NPWDruid NPWDruid;
-NPWDruid* npw_druid_new (struct _NPWPlugin* plugin, const gchar *directory);
+NPWDruid* npw_druid_new (struct _NPWPlugin* plugin, GFile *templates);
void npw_druid_free (NPWDruid* druid);
void npw_druid_show (NPWDruid* druid);
diff --git a/plugins/project-wizard/parser.c b/plugins/project-wizard/parser.c
index b5d50e7..b782cf8 100644
--- a/plugins/project-wizard/parser.c
+++ b/plugins/project-wizard/parser.c
@@ -580,24 +580,25 @@ npw_header_parser_end_parse (NPWHeaderParser* parser, GError** error)
return g_markup_parse_context_end_parse (parser->ctx, error);
}*/
-gboolean
+NPWHeader *
npw_header_list_read (GList** list, const gchar* filename)
{
gchar* content;
gsize len;
NPWHeaderParser* parser;
NPWHeader* header;
+ NPWHeader *found;
GError* err = NULL;
- g_return_val_if_fail (list != NULL, FALSE);
- g_return_val_if_fail (filename != NULL, FALSE);
+ g_return_val_if_fail (list != NULL, NULL);
+ g_return_val_if_fail (filename != NULL, NULL);
if (!g_file_get_contents (filename, &content, &len, &err))
{
g_warning ("%s", err->message);
g_error_free (err);
- return FALSE;
+ return NULL;
}
parser = npw_header_parser_new (list, filename);
@@ -616,7 +617,7 @@ npw_header_list_read (GList** list, const gchar* filename)
g_warning ("Missing project wizard block in %s", filename);
npw_header_free (header);
- return FALSE;
+ return NULL;
}
if (g_error_matches (err, parser_error_quark (), NPW_STOP_PARSING) == FALSE)
{
@@ -625,17 +626,23 @@ npw_header_list_read (GList** list, const gchar* filename)
g_error_free (err);
npw_header_free (header);
- return FALSE;
+ return NULL;
}
g_error_free (err);
/* Add header to list if template does not already exist*/
- if (npw_header_list_find_header (*list, header) == NULL)
+ found = npw_header_list_find_header (*list, header);
+ if (found == NULL)
{
*list = npw_header_list_insert_header (*list, header);
}
+ else
+ {
+ npw_header_free (header);
+ header = found;
+ }
- return TRUE;
+ return header;
}
diff --git a/plugins/project-wizard/parser.h b/plugins/project-wizard/parser.h
index fee8fa9..894e29e 100644
--- a/plugins/project-wizard/parser.h
+++ b/plugins/project-wizard/parser.h
@@ -30,7 +30,7 @@
gboolean npw_header_list_readdir (GList** this, const gchar* pathname);
-gboolean npw_header_list_read (GList** this, const gchar* filename);
+NPWHeader *npw_header_list_read (GList** this, const gchar* filename);
typedef struct _NPWPageParser NPWPageParser;
diff --git a/plugins/project-wizard/plugin.c b/plugins/project-wizard/plugin.c
index 37360e7..9b18d0d 100644
--- a/plugins/project-wizard/plugin.c
+++ b/plugins/project-wizard/plugin.c
@@ -52,11 +52,7 @@ npw_open_project_template (GFile *destination, GFile *tarfile, gpointer data, GE
else
{
/* Show the project wizard dialog, loading only the new projects */
- gchar *path;
-
- path = g_file_get_path (destination);
- npw_plugin_show_wizard (plugin, path);
- g_free (path);
+ npw_plugin_show_wizard (plugin, destination);
}
}
@@ -118,7 +114,7 @@ npw_install_project_template_with_callback (NPWPlugin *plugin, GFile *file, NPWT
/* Display the project wizard selection dialog using only templates in the
* specified directory if non NULL */
gboolean
-npw_plugin_show_wizard (NPWPlugin *plugin, const gchar *directory)
+npw_plugin_show_wizard (NPWPlugin *plugin, GFile *project)
{
if (plugin->install != NULL)
{
@@ -127,7 +123,7 @@ npw_plugin_show_wizard (NPWPlugin *plugin, const gchar *directory)
else if (plugin->druid == NULL)
{
/* Create a new project wizard druid */
- npw_druid_new (plugin, directory);
+ npw_druid_new (plugin, project);
}
if (plugin->druid != NULL)
@@ -136,6 +132,7 @@ npw_plugin_show_wizard (NPWPlugin *plugin, const gchar *directory)
npw_druid_show (plugin->druid);
}
+
return TRUE;
}
@@ -229,8 +226,21 @@ static void
ifile_open (IAnjutaFile *ifile, GFile* file, GError **error)
{
NPWPlugin *plugin = ANJUTA_PLUGIN_NPW (ifile);
+ GFileInfo *info;
- npw_install_project_template_with_callback (plugin, file, npw_open_project_template, error);
+ info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, 0, NULL, NULL);
+ if (info != NULL)
+ {
+ if (strcmp(g_file_info_get_content_type (info), "application/x-anjuta-project-template") == 0)
+ {
+ npw_plugin_show_wizard (plugin, file);
+ }
+ else
+ {
+ npw_install_project_template_with_callback (plugin, file, npw_open_project_template, error);
+ }
+ g_object_unref (info);
+ }
}
static GFile*
diff --git a/plugins/project-wizard/plugin.h b/plugins/project-wizard/plugin.h
index 2dc32e4..9d9427a 100644
--- a/plugins/project-wizard/plugin.h
+++ b/plugins/project-wizard/plugin.h
@@ -52,6 +52,6 @@ IAnjutaMessageView* npw_plugin_create_view (NPWPlugin* plugin);
void npw_plugin_append_view (NPWPlugin* plugin, const gchar* text);
void npw_plugin_print_view (NPWPlugin* plugin, IAnjutaMessageViewType type, const gchar* summary, const gchar* details);
-gboolean npw_plugin_show_wizard (NPWPlugin *plugin, const gchar *template_dir);
+gboolean npw_plugin_show_wizard (NPWPlugin *plugin, GFile *project_template);
#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]