[anjuta] Updated starter plugin
- From: Sebastien Granjoux <sgranjoux src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [anjuta] Updated starter plugin
- Date: Sat, 14 Jun 2014 06:45:32 +0000 (UTC)
commit 912ffd03c794b568dfd7f58264048887579d83ce
Author: Tristian Celestin <tristian celestin outlook com>
Date: Sat Apr 26 16:02:56 2014 -0400
Updated starter plugin
Use a GtkStack and GtkStackSwitcher to present the same information
as before. Updated minimum required GTK+ to 3.10
configure.ac | 2 +-
plugins/starter/Makefile.am | 11 +-
.../org.gnome.anjuta.starter.gschema.xml.in | 7 +
plugins/starter/plugin.c | 521 ++++++++++++--------
plugins/starter/plugin.h | 31 +-
plugins/starter/starter.ui | 449 +++++++++--------
6 files changed, 606 insertions(+), 415 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index f646cc5..0998b11 100644
--- a/configure.ac
+++ b/configure.ac
@@ -32,7 +32,7 @@ AC_SUBST(BUGZILLA_VERSION)
dnl Anjuta core
GLIB_REQUIRED=2.34.0
-GTK_REQUIRED=3.6.0
+GTK_REQUIRED=3.10.0
GTHREAD_REQUIRED=2.22.0
GDK_PIXBUF_REQUIRED=2.0.0
GDA4_REQUIRED=4.2.0
diff --git a/plugins/starter/Makefile.am b/plugins/starter/Makefile.am
index 6c81a7e..8cd6295 100644
--- a/plugins/starter/Makefile.am
+++ b/plugins/starter/Makefile.am
@@ -1,3 +1,8 @@
+# Schema file
+gsettings_in_file = org.gnome.anjuta.starter.gschema.xml.in
+ INTLTOOL_XML_NOMERGE_RULE@
+ GSETTINGS_RULES@
+
# Plugin file
plugin_in_files = anjuta-starter.plugin.in
%.plugin: %.plugin.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*po) ; $(INTLTOOL_MERGE)
$(top_srcdir)/po $< $@ -d -u -c $(top_builddir)/po/.intltool-merge-cache
@@ -34,11 +39,15 @@ libanjuta_starter_la_SOURCES= \
nodist_libanjuta_starter_la_SOURCES= = \
$(BUILT_SOURCES)
+gsettings_SCHEMAS = $(gsettings_in_file:.xml.in=.xml)
+
CLEANFILES = \
- $(BUILT_SOURCES)
+ $(BUILT_SOURCES) \
+ $(gsettings_SCHEMAS)
EXTRA_DIST = \
$(plugin_in_files) \
+ $(gsettings_in_file) \
starter.gresource.xml \
starter.ui
diff --git a/plugins/starter/org.gnome.anjuta.starter.gschema.xml.in
b/plugins/starter/org.gnome.anjuta.starter.gschema.xml.in
new file mode 100644
index 0000000..17dd012
--- /dev/null
+++ b/plugins/starter/org.gnome.anjuta.starter.gschema.xml.in
@@ -0,0 +1,7 @@
+<schemalist>
+ <schema path="/org/gnome/anjuta/" id="org.gnome.anjuta.starter">
+ <key type="i" name="recent-limit">
+ <default>10</default>
+ </key>
+ </schema>
+</schemalist>
diff --git a/plugins/starter/plugin.c b/plugins/starter/plugin.c
index 3117580..23a133d 100644
--- a/plugins/starter/plugin.c
+++ b/plugins/starter/plugin.c
@@ -2,6 +2,7 @@
/*
plugin.c
Copyright (C) 2008 Ignacio Casal Quinteiro
+ Copyright (C) 2014 Tristian Celestin
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -26,61 +27,66 @@
#include <libanjuta/interfaces/ianjuta-project-manager.h>
#include <libanjuta/interfaces/ianjuta-file-loader.h>
#include <libanjuta/interfaces/ianjuta-wizard.h>
-
#include <gtk/gtk.h>
-
#include "plugin.h"
-static gpointer parent_class;
-
-#define STARTER_VBOX "starter_vbox"
-#define RECENT_VBOX "recent_vbox"
-#define IMPORT_IMAGE "import_image"
-#define NEW_IMAGE "new_image"
-
-#define NEW_PROJECT_PIXMAP "anjuta-project-wizard-plugin-48.png"
-#define IMPORT_PROJECT_PIXMAP "anjuta-project-import-plugin-48.png"
-
+#define PREF_SCHEMA "org.gnome.anjuta.starter"
+#define RECENT_LIMIT "recent-limit"
+#define STARTER_BOX "starter_box"
+#define SWITCHER_BOX "switcher_box"
+#define ACTIONS_LISTBOX "actions_listbox"
+#define ACTIONS_FRAME "actions_frame"
+#define RECENT_PROJECTS_BOX "recent_projects_box"
+#define RECENT_LISTBOX "recent_listbox"
+#define IMPORT_ROW "import_row"
+#define ANJUTA_DOC_ROW "anjuta_doc_row"
+#define ANJUTA_FAQ_ROW "anjuta_faq_row"
+#define ONLINE_DOC_ROW "gtk_doc_row"
+#define RECENT_ROW "recent_row"
+#define CREATE_ROW "create_row"
+#define CODE_ROW "code_row"
+#define PROJECT_LABEL "project_label"
+#define PATH_LABEL "path_label"
+#define TRANSITION_TIME 90
+#define URI_KEY "uri"
+#define REMOVE_PROJECT_BUTTON "remove_project_button"
+#define ACTIONS_ID "actions"
+#define RECENT_PROJECTS_ID "recent_projects"
#define PROJECT_WIZARD_ID "anjuta-project-wizard:NPWPlugin"
#define PROJECT_IMPORT_ID "anjuta-project-import:AnjutaProjectImportPlugin"
-#define RECENT_LIMIT 3
+struct _StarterPluginPrivate {
+ GtkWidget *starter;
+ gint editor_watch_id;
+ gint project_watch_id;
+};
void
-on_new_project_clicked (GtkButton *button, gpointer user_data);
-void
-on_import_project_clicked (GtkButton *button, gpointer user_data);
-
-static void
-on_recent_project_clicked (GtkButton *button, StarterPlugin *plugin)
+on_recent_project_activated (GtkListBox *box, GtkListBoxRow *row, gpointer user_data)
{
GFile *file;
- IAnjutaFileLoader *loader =
- anjuta_shell_get_interface (anjuta_plugin_get_shell (ANJUTA_PLUGIN (plugin)),
- IAnjutaFileLoader,
- NULL);
-
- file = g_object_get_data (G_OBJECT (button), "file");
+ IAnjutaFileLoader *loader;
- ianjuta_file_loader_load (IANJUTA_FILE_LOADER (loader),
- file, FALSE, NULL);
+ loader = anjuta_shell_get_interface (anjuta_plugin_get_shell (ANJUTA_PLUGIN (user_data)),
IAnjutaFileLoader, NULL);
+ file = g_file_new_for_uri ((const char*) g_object_get_data (G_OBJECT (row), URI_KEY));
+ ianjuta_file_loader_load (IANJUTA_FILE_LOADER (loader), file, FALSE, NULL);
}
-void
-on_new_project_clicked (GtkButton *button, gpointer user_data)
+static void
+on_new_project_activated (GtkListBoxRow *row, gpointer user_data)
{
- AnjutaPlugin* plugin = ANJUTA_PLUGIN (user_data);
- AnjutaPluginManager* plugin_manager =
+ AnjutaPlugin *plugin = ANJUTA_PLUGIN (user_data);
+ AnjutaPluginManager *plugin_manager =
anjuta_shell_get_plugin_manager (anjuta_plugin_get_shell (plugin),
- NULL);
+ NULL);
GList *plugin_handles = NULL;
- plugin_handles = anjuta_plugin_manager_query (plugin_manager,
- "Anjuta Plugin",
- "Location",
- PROJECT_WIZARD_ID,
- NULL);
+ plugin_handles = anjuta_plugin_manager_query (plugin_manager,
+ "Anjuta
Plugin",
+ "Location",
+
PROJECT_WIZARD_ID,
+ NULL);
if (plugin_handles != NULL)
{
GObject* wizard =
@@ -91,20 +97,44 @@ on_new_project_clicked (GtkButton *button, gpointer user_data)
g_list_free (plugin_handles);
}
-void
-on_import_project_clicked (GtkButton *button, gpointer user_data)
+static void
+on_local_doc_activated (GtkListBoxRow *row, gpointer user_data)
+{
+ gtk_show_uri (NULL, "help:anjuta-manual", GDK_CURRENT_TIME, NULL);
+}
+
+static void
+on_local_faq_activated (GtkListBoxRow *row, gpointer user_data)
+{
+ gtk_show_uri (NULL, "help:anjuta-faqs", GDK_CURRENT_TIME, NULL);
+}
+
+static void
+on_online_doc_activated (GtkListBoxRow *row, gpointer user_data)
+{
+ gtk_show_uri (NULL, "https://developer.gnome.org/references", GDK_CURRENT_TIME, NULL);
+}
+
+static void
+on_search_example_code_activated (GtkListBoxRow *row, gpointer user_data)
+{
+ gtk_show_uri (NULL, "http://www.koders.com", GDK_CURRENT_TIME, NULL);
+}
+
+static void
+on_import_project_activated (GtkListBoxRow *row, gpointer user_data)
{
AnjutaPlugin* plugin = ANJUTA_PLUGIN (user_data);
AnjutaPluginManager* plugin_manager =
anjuta_shell_get_plugin_manager (anjuta_plugin_get_shell (plugin),
- NULL);
+ NULL);
GList *plugin_handles = NULL;
plugin_handles = anjuta_plugin_manager_query (plugin_manager,
- "Anjuta Plugin",
- "Location",
- PROJECT_IMPORT_ID,
- NULL);
+ "Anjuta
Plugin",
+ "Location",
+
PROJECT_IMPORT_ID,
+ NULL);
if (plugin_handles != NULL)
{
@@ -116,128 +146,212 @@ on_import_project_clicked (GtkButton *button, gpointer user_data)
g_list_free (plugin_handles);
}
+void
+on_row_activated (GtkListBox *box, GtkListBoxRow *row, gpointer user_data)
+{
+ gchar *name;
+
+ if (row != NULL)
+ {
+ name = gtk_widget_get_name (row);
+ if (name != NULL) {
+ if (g_strcmp0 (name, CREATE_ROW) == 0)
+ on_new_project_activated (row, user_data);
+ else if (g_strcmp0 (name, IMPORT_ROW) == 0)
+ on_import_project_activated (row, user_data);
+ else if (g_strcmp0 (name, ANJUTA_DOC_ROW) == 0)
+ on_local_doc_activated (row, user_data);
+ else if (g_strcmp0 (name, ANJUTA_FAQ_ROW) == 0)
+ on_local_faq_activated (row, user_data);
+ else if (g_strcmp0 (name, ONLINE_DOC_ROW) == 0)
+ on_online_doc_activated (row, user_data);
+ else if (g_strcmp0 (name, CODE_ROW) == 0)
+ on_search_example_code_activated (row, user_data);
+ }
+ }
+}
+
static void
-build_recent_projects (GtkWidget *box, StarterPlugin* plugin)
+add_recent_project_row (GtkListBox *recent_project_box, GtkRecentData *recent_project)
{
+ GtkBuilder *builder;
+ GFile *file;
+ GtkWidget *recent_row;
+ GtkLabel *project_label, *path_label;
+ GError *error;
+
+ error = NULL;
+ builder = gtk_builder_new ();
+ if (!gtk_builder_add_from_resource (builder, "/org/gnome/anjuta/ui/starter.ui", &error))
+ {
+ DEBUG_PRINT ("Could not load starter.ui! %s", error->message);
+ g_error_free (error);
+ }
+ else
+ {
+ file = g_file_new_for_uri (gtk_recent_info_get_uri (recent_project));
+ if (g_file_query_exists (file, NULL))
+ {
+ recent_row = GTK_WIDGET (gtk_builder_get_object (builder, RECENT_ROW));
+ project_label = GTK_WIDGET (gtk_builder_get_object (builder, PROJECT_LABEL));
+ path_label = GTK_WIDGET (gtk_builder_get_object (builder, PATH_LABEL));
+ gtk_label_set_text (project_label, gtk_recent_info_get_display_name(recent_project));
+ gtk_label_set_text (path_label, g_file_get_path(file));
+ g_object_set_data_full (G_OBJECT (recent_row), URI_KEY, g_file_get_uri(file), g_free);
+ gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (recent_row)), recent_row);
+ gtk_list_box_insert (recent_project_box, recent_row, -1);
+ }
+ g_object_unref (file);
+
+ }
+ g_object_unref (builder);
+}
+
+static void
+refresh_recent_project_view (GtkListBox *box)
+{
+ GSettings *settings;
GtkRecentManager *manager;
+ GtkRecentData *recent_project;
GList *items, *list;
- gint i = 0;
-
- manager = gtk_recent_manager_get_default ();
+ gint i;
+ guint recent_limit;
+ manager = gtk_recent_manager_get_default ();
items = gtk_recent_manager_get_items (manager);
items = g_list_reverse (items);
-
list = items;
- while (i < RECENT_LIMIT && list != NULL)
+ settings = g_settings_new (PREF_SCHEMA);
+ i = 0;
+ g_settings_get (settings, RECENT_LIMIT, "i", &recent_limit);
+ while (i < recent_limit && list != NULL)
{
if (strcmp (gtk_recent_info_get_mime_type (list->data), "application/x-anjuta") == 0)
{
- GtkWidget *button;
- GtkWidget *label;
- GtkWidget *button_box;
- GFile *file;
- GFileInfo* info;
- gchar *uri;
- GIcon* icon;
-
- button_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
- button = gtk_button_new ();
- gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
- gtk_widget_set_halign (button, GTK_ALIGN_START);
-
- label = gtk_label_new (gtk_recent_info_get_display_name (list->data));
- gtk_box_pack_end (GTK_BOX (button_box), label, FALSE, FALSE, 0);
-
- file = g_file_new_for_uri (gtk_recent_info_get_uri (list->data));
-
- if (!g_file_query_exists (file, NULL))
- {
- list = g_list_next (list);
- continue;
- }
-
- info = g_file_query_info (file,
- G_FILE_ATTRIBUTE_STANDARD_ICON,
- G_FILE_QUERY_INFO_NONE,
- NULL, NULL);
- if (info)
- {
- icon = g_file_info_get_icon (info);
- if (icon)
- {
- GtkWidget* image = gtk_image_new_from_gicon (icon,
-
GTK_ICON_SIZE_BUTTON);
- gtk_box_pack_start (GTK_BOX (button_box), image, FALSE, FALSE, 0);
- }
- g_object_unref (info);
- }
- gtk_container_add (GTK_CONTAINER (button), button_box);
- gtk_widget_show_all (button);
-
- gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
-
- g_object_set_data_full (G_OBJECT (button), "file", file,
- (GDestroyNotify)g_object_unref);
- uri = gtk_recent_info_get_uri_display (list->data);
- if (uri)
- {
- gchar *tip;
-
- tip = g_strdup_printf (_("Open '%s'"), uri);
- gtk_widget_set_tooltip_text (button, tip);
-
- g_free (tip);
- g_free (uri);
- }
-
- g_signal_connect (button, "clicked",
- G_CALLBACK (on_recent_project_clicked),
- plugin);
+ recent_project = list->data;
+ add_recent_project_row (box, recent_project);
i++;
}
- list = g_list_next (list);
+ list = list->next;
}
-
g_list_free_full(items, (GDestroyNotify)gtk_recent_info_unref);
+ g_object_unref (settings);
}
-static GtkWidget*
-create_starter_widget (StarterPlugin* plugin)
+static void
+on_remove_project_clicked (GtkButton *button, gpointer user_data)
{
- GError* error = NULL;
- GtkWidget* starter_vbox;
- GtkWidget* recent_vbox;
- GtkBuilder* builder = gtk_builder_new ();
- GtkWidget* image;
-
- if (!gtk_builder_add_from_resource (builder,
- "/org/gnome/anjuta/ui/starter.ui",
- &error))
+ GtkRecentManager *manager;
+ GtkListBox *recent_list_box;
+ GtkListBoxRow *row;
+ GError *error;
+
+ manager = gtk_recent_manager_get_default ();
+ recent_list_box = GTK_LIST_BOX (user_data);
+ row = gtk_list_box_get_selected_row (recent_list_box);
+ error = NULL;
+ if (row != NULL)
{
- DEBUG_PRINT ("Could load starter ui! %s", error->message);
- g_error_free (error);
- return NULL;
+ if (gtk_recent_manager_remove_item (manager, g_object_get_data (row, URI_KEY), &error))
+ {
+ gtk_container_remove (GTK_CONTAINER (recent_list_box), row);
+ }
+ else
+ {
+ DEBUG_PRINT ("Could not remove recent item. %s", error->message);
+ g_error_free (error);
+ }
+
}
- starter_vbox = GTK_WIDGET (gtk_builder_get_object (builder, STARTER_VBOX));
- recent_vbox = GTK_WIDGET (gtk_builder_get_object (builder, RECENT_VBOX));
+}
+
+static void
+add_action_separators (GtkListBoxRow *row, GtkListBoxRow *before, gpointer user_data)
+{
+ GtkWidget *current;
+
+ if (before == NULL)
+ return;
- build_recent_projects (recent_vbox, plugin);
+ current = gtk_list_box_row_get_header (row);
+ if (current == NULL)
+ {
+ current = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
+ gtk_widget_show (current);
+ gtk_list_box_row_set_header (row, current);
+ }
+}
- g_object_ref (starter_vbox);
- gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (starter_vbox)),
- starter_vbox);
+static void
+show_starter_page ()
+{
+ return;
+}
- image = GTK_WIDGET (gtk_builder_get_object (builder, NEW_IMAGE));
- gtk_image_set_from_file (GTK_IMAGE (image),
- PACKAGE_PIXMAPS_DIR"/"NEW_PROJECT_PIXMAP);
- image = GTK_WIDGET (gtk_builder_get_object (builder, IMPORT_IMAGE));
- gtk_image_set_from_file (GTK_IMAGE (image),
- PACKAGE_PIXMAPS_DIR"/"IMPORT_PROJECT_PIXMAP);
+static GtkWidget*
+create_starter_widget (StarterPlugin* plugin)
+{
+ GError *error;
+ GtkWidget *stack;
+ GtkWidget *switcher;
+ GtkWidget *starter_box;
+ GtkWidget *switcher_box;
+ GtkWidget *actions_frame;
+ GtkWidget *actions_listbox;
+ GtkWidget *recent_projects_box;
+ GtkWidget *recent_listbox;
+ GtkBuilder *builder;
+ GtkWidget *button;
- gtk_builder_connect_signals (builder, plugin);
+ error = NULL;
+ builder = gtk_builder_new ();
- return starter_vbox;
+ if (!gtk_builder_add_from_resource (builder, "/org/gnome/anjuta/ui/starter.ui", &error))
+ {
+ DEBUG_PRINT ("Could not load starter.ui! %s", error->message);
+ g_error_free (error);
+ }
+ else
+ {
+ /* Manually assembling stack and switcher because they are not available in glade yet */
+ switcher = gtk_stack_switcher_new ();
+ stack = gtk_stack_new ();
+ gtk_stack_switcher_set_stack (switcher, stack);
+ gtk_stack_set_transition_type (stack, GTK_STACK_TRANSITION_TYPE_CROSSFADE);
+ gtk_stack_set_transition_duration (stack, TRANSITION_TIME);
+
+ starter_box = GTK_WIDGET (gtk_builder_get_object (builder, STARTER_BOX));
+ switcher_box = GTK_WIDGET (gtk_builder_get_object (builder, SWITCHER_BOX));
+ gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (starter_box)), starter_box);
+ g_object_ref (starter_box);
+ gtk_box_pack_start (switcher_box, switcher, FALSE, FALSE, 0);
+ gtk_box_pack_start (starter_box, stack, FALSE, FALSE, 0);
+ gtk_widget_show_all (starter_box);
+
+ actions_listbox = GTK_WIDGET (gtk_builder_get_object (builder, ACTIONS_LISTBOX));
+ gtk_list_box_set_header_func (GTK_LIST_BOX (actions_listbox), add_action_separators, NULL,
NULL);
+ actions_frame = GTK_WIDGET (gtk_builder_get_object (builder, ACTIONS_FRAME));
+ gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (actions_frame)), actions_frame);
+ g_object_ref (actions_frame);
+ gtk_stack_add_titled (stack, actions_frame, ACTIONS_ID, "Actions");
+
+ recent_projects_box = GTK_WIDGET (gtk_builder_get_object (builder, RECENT_PROJECTS_BOX));
+ gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (recent_projects_box)),
recent_projects_box);
+ g_object_ref (recent_projects_box);
+
+ recent_listbox = GTK_WIDGET (gtk_builder_get_object (builder, RECENT_LISTBOX));
+ refresh_recent_project_view (GTK_LIST_BOX (recent_listbox));
+
+ gtk_stack_add_titled (stack, recent_projects_box, RECENT_PROJECTS_ID, "Recent Projects");
+
+ button = GTK_WIDGET (gtk_builder_get_object (builder, REMOVE_PROJECT_BUTTON));
+ g_signal_connect_object (G_OBJECT (button), "clicked",
+ G_CALLBACK (on_remove_project_clicked), recent_listbox, G_CONNECT_AFTER);
+
+ gtk_builder_connect_signals (builder, plugin);
+ }
+ g_object_unref (builder);
+ return starter_box;
}
/* Remove the starter plugin once a document was opened */
@@ -245,18 +359,21 @@ static void
on_value_added_current_project (AnjutaPlugin *plugin, const gchar *name,
const GValue *value, gpointer data)
{
- GObject* project = g_value_get_object (value);
- AnjutaShell* shell = ANJUTA_PLUGIN(plugin)->shell;
- StarterPlugin* splugin = ANJUTA_PLUGIN_STARTER (plugin);
+ GObject *project;
+ AnjutaShell *shell;
+ StarterPlugin *splugin;
+ project = g_value_get_object (value);
+ shell = ANJUTA_PLUGIN(plugin)->shell;
+ splugin = ANJUTA_PLUGIN_STARTER (plugin);
if (project)
{
- if (splugin->starter)
+ if (splugin->priv->starter)
{
DEBUG_PRINT ("Hiding starter");
- anjuta_shell_remove_widget (shell, splugin->starter, NULL);
+ anjuta_shell_remove_widget (shell, splugin->priv->starter, NULL);
}
- splugin->starter = NULL;
+ splugin->priv->starter = NULL;
}
}
@@ -266,65 +383,69 @@ static void
on_value_added_current_editor (AnjutaPlugin *plugin, const gchar *name,
const GValue *value, gpointer data)
{
- GObject* doc = g_value_get_object (value);
- AnjutaShell* shell = ANJUTA_PLUGIN(plugin)->shell;
- StarterPlugin* splugin = ANJUTA_PLUGIN_STARTER (plugin);
-
+ GObject *doc;
+ AnjutaShell *shell;
+ StarterPlugin *splugin;
+
+ doc = g_value_get_object (value);
+ shell = ANJUTA_PLUGIN(plugin)->shell;
+ splugin = ANJUTA_PLUGIN_STARTER (plugin);
if (doc)
{
- if (splugin->starter)
+ if (splugin->priv->starter)
{
DEBUG_PRINT ("Hiding starter");
- anjuta_shell_remove_widget (shell, splugin->starter, NULL);
+ anjuta_shell_remove_widget (shell, splugin->priv->starter, NULL);
}
- splugin->starter = NULL;
+ splugin->priv->starter = NULL;
}
}
static void
-on_value_removed (AnjutaPlugin *plugin, const gchar *name,
- gpointer data)
+on_value_removed (AnjutaPlugin *plugin,
+ const gchar *name,
+ gpointer data)
{
AnjutaShell* shell = anjuta_plugin_get_shell (plugin);
StarterPlugin* splugin = ANJUTA_PLUGIN_STARTER (plugin);
IAnjutaDocumentManager* docman = anjuta_shell_get_interface (shell,
- IAnjutaDocumentManager,
- NULL);
+
IAnjutaDocumentManager,
+
NULL);
IAnjutaProjectManager* pm = anjuta_shell_get_interface (shell,
- IAnjutaProjectManager,
- NULL);
+
IAnjutaProjectManager,
+
NULL);
if (!(docman && ianjuta_document_manager_get_doc_widgets (docman, NULL)) &&
- !(pm && ianjuta_project_manager_get_current_project (pm, NULL)))
+ !(pm && ianjuta_project_manager_get_current_project (pm, NULL)))
{
DEBUG_PRINT ("Showing starter");
- splugin->starter = create_starter_widget (splugin);
- anjuta_shell_add_widget (shell, splugin->starter,
- "AnjutaStarter",
- _("Start"),
- GTK_STOCK_ABOUT,
- ANJUTA_SHELL_PLACEMENT_CENTER,
- NULL);
- anjuta_shell_present_widget (shell, splugin->starter, NULL);
- g_object_unref (splugin->starter);
+ splugin->priv->starter = create_starter_widget (splugin);
+ anjuta_shell_add_widget (shell, splugin->priv->starter,
+ "AnjutaStarter",
+ _("Start"),
+ GTK_STOCK_ABOUT,
+ ANJUTA_SHELL_PLACEMENT_CENTER,
+ NULL);
+ anjuta_shell_present_widget (shell, splugin->priv->starter, NULL);
+ g_object_unref (splugin->priv->starter);
}
}
static void
-on_session_load (AnjutaShell* shell,
- AnjutaSessionPhase phase,
- AnjutaSession* session,
- StarterPlugin* plugin)
+on_session_load (AnjutaShell *shell,
+ AnjutaSessionPhase phase,
+ AnjutaSession *session,
+ StarterPlugin *plugin)
{
if (phase == ANJUTA_SESSION_PHASE_END)
{
- if (!plugin->starter)
+ if (!plugin->priv->starter)
on_value_removed (ANJUTA_PLUGIN (plugin), NULL, plugin);
- if (plugin->starter)
+ if (plugin->priv->starter)
{
anjuta_shell_maximize_widget (shell,
- "AnjutaStarter",
- NULL);
+ "AnjutaStarter",
+ NULL);
}
}
}
@@ -332,28 +453,28 @@ on_session_load (AnjutaShell* shell,
static gboolean
activate_plugin (AnjutaPlugin *plugin)
{
- StarterPlugin* splugin = ANJUTA_PLUGIN_STARTER (plugin);
+ StarterPlugin *splugin = ANJUTA_PLUGIN_STARTER (plugin);
DEBUG_PRINT ("StarterPlugin: Activating document manager plugin...");
- splugin->editor_watch_id =
+ splugin->priv->editor_watch_id =
anjuta_plugin_add_watch (plugin,
- IANJUTA_DOCUMENT_MANAGER_CURRENT_DOCUMENT,
+ IANJUTA_DOCUMENT_MANAGER_CURRENT_DOCUMENT,
on_value_added_current_editor,
on_value_removed,
NULL);
- splugin->project_watch_id =
+ splugin->priv->project_watch_id =
anjuta_plugin_add_watch (plugin,
- IANJUTA_PROJECT_MANAGER_CURRENT_PROJECT,
+ IANJUTA_PROJECT_MANAGER_CURRENT_PROJECT,
on_value_added_current_project,
on_value_removed,
NULL);
on_value_removed (plugin, NULL, splugin);
g_signal_connect (anjuta_plugin_get_shell (plugin),
- "load-session",
- G_CALLBACK (on_session_load),
- plugin);
+ "load-session",
+ G_CALLBACK (on_session_load),
+ plugin);
return TRUE;
}
@@ -363,12 +484,12 @@ deactivate_plugin (AnjutaPlugin *plugin)
{
StarterPlugin* splugin = ANJUTA_PLUGIN_STARTER (plugin);
DEBUG_PRINT ("StarterPlugin: Deactivating starter plugin...");
- if (splugin->starter)
+ if (splugin->priv->starter)
anjuta_shell_remove_widget (anjuta_plugin_get_shell (plugin),
- splugin->starter, NULL);
+ splugin->priv->starter, NULL);
- anjuta_plugin_remove_watch (plugin, splugin->editor_watch_id, FALSE);
- anjuta_plugin_remove_watch (plugin, splugin->project_watch_id, FALSE);
+ anjuta_plugin_remove_watch (plugin, splugin->priv->editor_watch_id, FALSE);
+ anjuta_plugin_remove_watch (plugin, splugin->priv->project_watch_id, FALSE);
return TRUE;
}
@@ -376,28 +497,42 @@ deactivate_plugin (AnjutaPlugin *plugin)
static void
dispose (GObject *obj)
{
+ AnjutaPluginClass *klass;
+ gpointer parent_class;
+
+ klass = ANJUTA_PLUGIN_GET_CLASS(obj);
+ parent_class = g_type_class_peek_parent (klass);
G_OBJECT_CLASS (parent_class)->dispose (obj);
}
static void
finalize (GObject *obj)
{
+ AnjutaPluginClass *klass;
+ gpointer parent_class;
+
/* Finalization codes here */
+ klass = ANJUTA_PLUGIN_GET_CLASS(obj);
+ parent_class = g_type_class_peek_parent (klass);
G_OBJECT_CLASS (parent_class)->finalize (obj);
}
static void
starter_plugin_instance_init (GObject *obj)
{
+ StarterPlugin *splugin;
+
+ splugin = ANJUTA_PLUGIN_STARTER (obj);
+ splugin->priv = G_TYPE_INSTANCE_GET_PRIVATE (obj, ANJUTA_TYPE_PLUGIN_STARTER, StarterPluginPrivate);
}
static void
starter_plugin_class_init (GObjectClass *klass)
{
- AnjutaPluginClass *plugin_class = ANJUTA_PLUGIN_CLASS (klass);
-
- parent_class = g_type_class_peek_parent (klass);
+ AnjutaPluginClass *plugin_class;
+ g_type_class_add_private (klass, sizeof (StarterPluginPrivate));
+ plugin_class = ANJUTA_PLUGIN_CLASS (klass);
plugin_class->activate = activate_plugin;
plugin_class->deactivate = deactivate_plugin;
klass->dispose = dispose;
diff --git a/plugins/starter/plugin.h b/plugins/starter/plugin.h
index c15c80d..7bfedce 100644
--- a/plugins/starter/plugin.h
+++ b/plugins/starter/plugin.h
@@ -1,9 +1,28 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
+/*
+ plugin.c
+ Copyright (C) 2014 Tristian Celestin
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
#ifndef __PLUGIN_H__
#define __PLUGIN_H__
#include <libanjuta/anjuta-plugin.h>
-extern GType starter_plugin_get_type (GTypeModule *module);
#define ANJUTA_TYPE_PLUGIN_STARTER (starter_plugin_get_type (NULL))
#define ANJUTA_PLUGIN_STARTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), ANJUTA_TYPE_PLUGIN_STARTER,
StarterPlugin))
#define ANJUTA_PLUGIN_STARTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), ANJUTA_TYPE_PLUGIN_STARTER,
StarterPluginClass))
@@ -13,16 +32,20 @@ extern GType starter_plugin_get_type (GTypeModule *module);
typedef struct _StarterPlugin StarterPlugin;
typedef struct _StarterPluginClass StarterPluginClass;
+typedef struct _StarterPluginPrivate StarterPluginPrivate;
struct _StarterPlugin{
AnjutaPlugin parent;
- GtkWidget *starter;
- gint editor_watch_id;
- gint project_watch_id;
+ StarterPluginPrivate *priv;
};
struct _StarterPluginClass{
AnjutaPluginClass parent_class;
};
+extern GType starter_plugin_get_type (GTypeModule *module);
+
+void on_recent_project_activated (GtkListBox *box, GtkListBoxRow *row, gpointer user_data);
+void on_row_activated (GtkListBox *box, GtkListBoxRow *row, gpointer user_data);
+
#endif
diff --git a/plugins/starter/starter.ui b/plugins/starter/starter.ui
index 7da4df1..5baf1ac 100644
--- a/plugins/starter/starter.ui
+++ b/plugins/starter/starter.ui
@@ -1,280 +1,297 @@
<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.16.1 -->
<interface>
- <!-- interface-requires gtk+ 3.0 -->
+ <requires lib="gtk+" version="3.10"/>
<object class="GtkWindow" id="unused">
<property name="can_focus">False</property>
<child>
- <object class="GtkVBox" id="starter_vbox">
+ <object class="GtkFrame" id="actions_frame">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="spacing">10</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="label_xalign">0</property>
+ <property name="label_yalign">0</property>
+ <property name="shadow_type">in</property>
<child>
- <object class="GtkFrame" id="frame3">
+ <object class="GtkListBox" id="actions_listbox">
+ <property name="name">actions_listbox</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="hexpand">True</property>
- <property name="label_xalign">0</property>
+ <property name="selection_mode">none</property>
+ <signal name="row-activated" handler="on_row_activated" swapped="no"/>
<child>
- <object class="GtkAlignment" id="alignment3">
+ <object class="GtkListBoxRow" id="create_row">
+ <property name="name">create_row</property>
+ <property name="width_request">100</property>
+ <property name="height_request">80</property>
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="left_padding">12</property>
+ <property name="can_focus">True</property>
<child>
- <object class="GtkHBox" id="hbox1">
+ <object class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="halign">start</property>
- <property name="valign">start</property>
- <property name="spacing">5</property>
- <child>
- <object class="GtkButton" id="new_button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="halign">start</property>
- <property name="use_action_appearance">False</property>
- <property name="relief">none</property>
- <signal name="clicked" handler="on_new_project_clicked" swapped="no"/>
- <child>
- <object class="GtkBox" id="box1">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <child>
- <object class="GtkImage" id="new_image">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="icon-size">6</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="label" translatable="yes">Create a new project</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="import_button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="halign">start</property>
- <property name="use_action_appearance">False</property>
- <property name="relief">none</property>
- <signal name="clicked" handler="on_import_project_clicked" swapped="no"/>
- <child>
- <object class="GtkBox" id="box2">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <child>
- <object class="GtkImage" id="import_image">
- <property name="can_focus">False</property>
- <property name="icon-size">6</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="label" translatable="yes">Import an existing
project</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
+ <property name="xpad">150</property>
+ <property name="label" translatable="yes">Create a new project</property>
</object>
</child>
</object>
</child>
- <child type="label_item">
- <placeholder/>
+ <child>
+ <object class="GtkListBoxRow" id="import_row">
+ <property name="name">import_row</property>
+ <property name="width_request">100</property>
+ <property name="height_request">80</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Import a project</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBoxRow" id="code_row">
+ <property name="name">code_row</property>
+ <property name="width_request">100</property>
+ <property name="height_request">80</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Search for example code</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBoxRow" id="anjuta_doc_row">
+ <property name="name">anjuta_doc_row</property>
+ <property name="width_request">100</property>
+ <property name="height_request">80</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">View local Anjuta documentation</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBoxRow" id="anjuta_faq_row">
+ <property name="name">anjuta_faq_row</property>
+ <property name="width_request">100</property>
+ <property name="height_request">80</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">View local Anjuta FAQ</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBoxRow" id="gtk_doc_row">
+ <property name="name">gtk_doc_row</property>
+ <property name="width_request">100</property>
+ <property name="height_request">80</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">View online library documentation</property>
+ </object>
+ </child>
+ </object>
</child>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
</child>
+ <child type="label_item">
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkWindow" id="unused_1">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkListBox" id="unused_2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="selection_mode">none</property>
<child>
- <object class="GtkFrame" id="frame1">
+ <object class="GtkListBoxRow" id="recent_row">
+ <property name="width_request">100</property>
+ <property name="height_request">80</property>
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="hexpand">True</property>
- <property name="label_xalign">0</property>
+ <property name="can_focus">True</property>
+ <property name="margin_bottom">2</property>
<child>
- <object class="GtkAlignment" id="alignment1">
+ <object class="GtkBox" id="box2">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="left_padding">12</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="project_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="label" translatable="yes">label</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
<child>
- <object class="GtkVBox" id="recent_vbox">
+ <object class="GtkLabel" id="path_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="halign">start</property>
- <property name="spacing">5</property>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
+ <property name="label" translatable="yes">label</property>
+ <property name="wrap">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
</object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
</child>
- <child type="label">
- <object class="GtkLabel" id="label3">
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkWindow" id="unused_3">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="recent_projects_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">5</property>
+ <property name="margin_right">5</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkViewport" id="viewport">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">Recent projects:</property>
- <property name="use_markup">True</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
+ <child>
+ <object class="GtkListBox" id="recent_listbox">
+ <property name="name">recent_listbox</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="activate_on_single_click">False</property>
+ <signal name="row-activated" handler="on_recent_project_activated" swapped="no"/>
+ </object>
+ </child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
- <property name="padding">10</property>
<property name="position">1</property>
</packing>
</child>
<child>
- <object class="GtkFrame" id="frame2">
+ <object class="GtkToolbar" id="toolbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="hexpand">True</property>
- <property name="label_xalign">0</property>
<child>
- <object class="GtkAlignment" id="alignment2">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="left_padding">12</property>
- <child>
- <object class="GtkVBox" id="vbox4">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="spacing">5</property>
- <child>
- <object class="GtkLinkButton" id="tutorials_link">
- <property name="label" translatable="yes">Tutorials</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="has_tooltip">True</property>
- <property name="halign">start</property>
- <property name="use_action_appearance">False</property>
- <property name="relief">none</property>
- <property name="uri">http://developer.gnome.org</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLinkButton" id="manual_link">
- <property name="label" translatable="yes">Anjuta Manual</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="has_tooltip">True</property>
- <property name="halign">start</property>
- <property name="use_action_appearance">False</property>
- <property name="relief">none</property>
- <property name="uri">help:anjuta-manual</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLinkButton" id="faq_link">
- <property name="label" translatable="yes">FAQ</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="has_tooltip">True</property>
- <property name="halign">start</property>
- <property name="use_action_appearance">False</property>
- <property name="relief">none</property>
- <property name="uri">help:anjuta-faqs</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label4">
+ <object class="GtkToolButton" id="remove_project_button">
+ <property name="use_action_appearance">True</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">Getting started:</property>
- <property name="use_markup">True</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
+ <property name="tooltip_text" translatable="yes">Remove recently used project from
list</property>
+ <property name="label" translatable="yes">Unlist Project</property>
+ <property name="stock_id">gtk-remove</property>
</object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
</child>
+ <style>
+ <class name="inline-toolbar"/>
+ </style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
- <property name="padding">10</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
+ <object class="GtkWindow" id="unused_4">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="starter_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_left">5</property>
+ <property name="margin_right">5</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkBox" id="switcher_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
</interface>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]