[nautilus/wip/antoniof/new_open_with: 24/31] properties-window: Use GtkStack for navigation




commit 1d3e7ec914faf9007325483ceb0991c6e99d8a73
Author: Peter Eisenmann <p3732 getgoogleoff me>
Date:   Fri Dec 31 08:12:29 2021 +0100

    properties-window: Use GtkStack for navigation
    
    Replace the tabbed GtkNotebook view with inlined navigation rows that
    link to subpages and a back button that allows navigating back.
    
    Add additional needed getters to NautilusPropertyPage.
    
    Also, replace the now-inadequate .view style class with .background.
    
    Part of #1326

 libnautilus-extension/nautilus-property-page.c |  18 +++
 libnautilus-extension/nautilus-property-page.h |  25 ++++
 src/nautilus-properties-window.c               | 192 +++++++++++++++----------
 src/resources/ui/nautilus-properties-window.ui | 175 +++++++++++++++-------
 4 files changed, 289 insertions(+), 121 deletions(-)
---
diff --git a/libnautilus-extension/nautilus-property-page.c b/libnautilus-extension/nautilus-property-page.c
index dad8e5315..bd37a3602 100644
--- a/libnautilus-extension/nautilus-property-page.c
+++ b/libnautilus-extension/nautilus-property-page.c
@@ -222,3 +222,21 @@ nautilus_property_page_class_init (NautilusPropertyPageClass *class)
                                                           GTK_TYPE_WIDGET,
                                                           G_PARAM_READWRITE));
 }
+
+GtkWidget *
+nautilus_property_page_get_label (NautilusPropertyPage *page)
+{
+    return page->label;
+}
+
+const char *
+nautilus_property_page_get_name (NautilusPropertyPage *page)
+{
+    return page->name;
+}
+
+GtkWidget *
+nautilus_property_page_get_widget (NautilusPropertyPage *page)
+{
+    return page->page;
+}
diff --git a/libnautilus-extension/nautilus-property-page.h b/libnautilus-extension/nautilus-property-page.h
index 35181fe10..d9b51bf4f 100644
--- a/libnautilus-extension/nautilus-property-page.h
+++ b/libnautilus-extension/nautilus-property-page.h
@@ -68,4 +68,29 @@ NautilusPropertyPage *nautilus_property_page_new (const char *name,
  *   page (widget)        - the property page to display
  */
 
+/**
+ * nautilus_property_page_get_label:
+ * @page: the property page
+ *
+ * Returns: (transfer none): the label of this #NautilusPropertyPage
+ */
+GtkWidget * nautilus_property_page_get_label (NautilusPropertyPage *page);
+
+/**
+ * nautilus_property_page_get_name:
+ * @page: the property page
+ *
+ * Returns: (transfer none): the name of this #NautilusPropertyPage
+ */
+const char *nautilus_property_page_get_name (NautilusPropertyPage *page);
+
+/**
+ * nautilus_property_page_get_widget:
+ * @page: the property page
+ *
+ * Returns: (transfer none): the widget associated wtih this #NautilusPropertyPage
+ */
+GtkWidget * nautilus_property_page_get_widget (NautilusPropertyPage *page);
+
+
 G_END_DECLS
diff --git a/src/nautilus-properties-window.c b/src/nautilus-properties-window.c
index e6056581d..02ae39c82 100644
--- a/src/nautilus-properties-window.c
+++ b/src/nautilus-properties-window.c
@@ -46,6 +46,7 @@
 #include "nautilus-metadata.h"
 #include "nautilus-mime-actions.h"
 #include "nautilus-module.h"
+#include "nautilus-property-page.h"
 #include "nautilus-signaller.h"
 #include "nautilus-ui-utilities.h"
 
@@ -77,9 +78,11 @@ struct _NautilusPropertiesWindow
     GList *original_files;
     GList *target_files;
 
-    GtkNotebook *notebook;
+    AdwWindowTitle *window_title;
 
-    /* Basic tab widgets */
+    GtkStack *page_stack;
+
+    /* Basic page */
 
     GtkStack *icon_stack;
     GtkWidget *icon_image;
@@ -97,6 +100,8 @@ struct _NautilusPropertiesWindow
     GtkWidget *disk_space_free_value;
     GtkWidget *disk_space_capacity_value;
 
+    GtkWidget *open_with_navigation_row;
+
     GtkWidget *link_target_row;
     GtkWidget *link_target_value_label;
     GtkWidget *size_row;
@@ -121,11 +126,14 @@ struct _NautilusPropertiesWindow
     GtkWidget *accessed_row;
     GtkWidget *accessed_value_label;
 
+    GtkWidget *permissions_navigation_row;
+
+    GtkListBox *extension_list_box;
+
     GtkWidget *free_space_list_box;
     GtkWidget *free_space_value_label;
 
-
-    /* Permissions tab Widgets */
+    /* Permissions page */
 
     GtkWidget *permissions_stack;
 
@@ -159,7 +167,7 @@ struct _NautilusPropertiesWindow
     GtkWidget *change_permissions_button_box;
     GtkWidget *change_permissions_button;
 
-    /* Open With tab Widgets */
+    /* Open With page */
 
     GtkWidget *open_with_box;
     GtkWidget *open_with_label;
@@ -472,7 +480,7 @@ static void set_icon (const char               *icon_path,
 static void remove_pending (StartupData *data,
                             gboolean     cancel_call_when_ready,
                             gboolean     cancel_timed_wait);
-static void append_extension_pages (NautilusPropertiesWindow *self);
+static void refresh_extension_pages (NautilusPropertiesWindow *self);
 
 G_DEFINE_TYPE (NautilusPropertiesWindow, nautilus_properties_window, ADW_TYPE_WINDOW);
 
@@ -532,6 +540,39 @@ get_target_file (NautilusPropertiesWindow *self)
     return NAUTILUS_FILE (self->target_files->data);
 }
 
+static void
+navigate_main_page (NautilusPropertiesWindow *self,
+                    GParamSpec               *params,
+                    GtkWidget                *widget)
+{
+    gtk_stack_set_visible_child_name (self->page_stack, "main");
+}
+
+static void
+navigate_open_with_page (NautilusPropertiesWindow *self,
+                         GParamSpec               *params,
+                         GtkWidget                *widget)
+{
+    gtk_stack_set_visible_child_name (self->page_stack, "open-with");
+}
+
+static void
+navigate_permissions_page (NautilusPropertiesWindow *self,
+                           GParamSpec               *params,
+                           GtkWidget                *widget)
+{
+    gtk_stack_set_visible_child_name (self->page_stack, "permissions");
+}
+
+static void
+navigate_extension_page (NautilusPropertiesWindow *self,
+                         GParamSpec               *params,
+                         AdwPreferencesRow        *row)
+{
+    gtk_stack_set_visible_child_name (self->page_stack,
+                                      adw_preferences_row_get_title (row));
+}
+
 static void
 get_image_for_properties_window (NautilusPropertiesWindow  *self,
                                  char                     **icon_name,
@@ -541,7 +582,7 @@ get_image_for_properties_window (NautilusPropertiesWindow  *self,
     GList *l;
     gint icon_scale;
 
-    icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (self->notebook));
+    icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (self));
     /* FIXME: Temporary regression: HiDPI icons not supported, ignore scale. */
     icon_scale = 1;
 
@@ -877,36 +918,53 @@ update_properties_window_title (NautilusPropertiesWindow *self)
     gtk_window_set_title (GTK_WINDOW (self), title);
 }
 
-static void
-clear_extension_pages (NautilusPropertiesWindow *self)
+static GtkWidget *
+add_extension_page (NautilusPropertyPage     *property_page,
+                    NautilusPropertiesWindow *self)
 {
-    int i;
-    int num_pages;
-    GtkWidget *page;
+    GtkWidget *row;
+    GtkWidget *image;
+    GtkWidget *page_widget;
+    GtkWidget *header_bar;
+    GtkWidget *up_button;
+    GtkWidget *box;
+    const char *extension_type;
+    g_autofree char *navigation_label;
+
+    row = adw_action_row_new ();
+    image = gtk_image_new_from_icon_name ("go-next-symbolic");
+    extension_type = gtk_label_get_text (GTK_LABEL (nautilus_property_page_get_label (property_page)));
+    navigation_label = g_strdup_printf (_("%s Properties"), extension_type);
+    page_widget = nautilus_property_page_get_widget (property_page);
+
+    adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), navigation_label);
+    adw_action_row_add_suffix (ADW_ACTION_ROW (row), image);
+
+    gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE);
+    gtk_list_box_row_set_selectable (GTK_LIST_BOX_ROW (row), FALSE);
+
+    g_signal_connect_swapped (row, "activated",
+                              G_CALLBACK (navigate_extension_page),
+                              self);
 
-    num_pages = gtk_notebook_get_n_pages
-                    (GTK_NOTEBOOK (self->notebook));
+    header_bar = gtk_header_bar_new ();
+    gtk_header_bar_set_title_widget (GTK_HEADER_BAR (header_bar),
+                                     adw_window_title_new (navigation_label, NULL));
 
-    for (i = 0; i < num_pages; i++)
-    {
-        page = gtk_notebook_get_nth_page
-                   (GTK_NOTEBOOK (self->notebook), i);
+    up_button = gtk_button_new_from_icon_name ("go-previous-symbolic");
+    g_signal_connect_swapped (up_button, "clicked", G_CALLBACK (navigate_main_page), self);
+    gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), up_button);
 
-        if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (page), "is-extension-page")))
-        {
-            gtk_notebook_remove_page
-                (GTK_NOTEBOOK (self->notebook), i);
-            num_pages--;
-            i--;
-        }
-    }
-}
+    box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+    gtk_box_append (GTK_BOX (box), header_bar);
+    gtk_box_append (GTK_BOX (box), page_widget);
+    gtk_widget_add_css_class (page_widget, "background");
 
-static void
-refresh_extension_pages (NautilusPropertiesWindow *self)
-{
-    clear_extension_pages (self);
-    append_extension_pages (self);
+    gtk_stack_add_named (self->page_stack,
+                         box,
+                         navigation_label);
+
+    return row;
 }
 
 static void
@@ -3458,48 +3516,32 @@ setup_permissions_page (NautilusPropertiesWindow *self)
 }
 
 static void
-append_extension_pages (NautilusPropertiesWindow *self)
+refresh_extension_pages (NautilusPropertiesWindow *self)
 {
-    g_autolist (GObject) providers = NULL;
-    GList *p;
+    GListStore *extension_providers = g_list_store_new (NAUTILUS_TYPE_PROPERTY_PAGE);
+    g_autolist (GObject) providers =
+        nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER);
 
-    providers = nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER);
-
-    for (p = providers; p != NULL; p = p->next)
+    for (GList *p = providers; p != NULL; p = p->next)
     {
-        NautilusPropertyPageProvider *provider;
-        g_autolist (NautilusPropertyPage) pages = NULL;
-        GList *l;
+        NautilusPropertyPageProvider *provider = NAUTILUS_PROPERTY_PAGE_PROVIDER (p->data);
+        g_autolist (NautilusPropertyPage) pages =
+            nautilus_property_page_provider_get_pages (provider, self->original_files);
 
-        provider = NAUTILUS_PROPERTY_PAGE_PROVIDER (p->data);
-
-        pages = nautilus_property_page_provider_get_pages
-                    (provider, self->original_files);
-
-        for (l = pages; l != NULL; l = l->next)
+        for (GList *l = pages; l != NULL; l = l->next)
         {
-            NautilusPropertyPage *page;
-            g_autoptr (GtkWidget) page_widget = NULL;
-            g_autoptr (GtkWidget) label = NULL;
-
-            page = NAUTILUS_PROPERTY_PAGE (l->data);
-
-            g_object_get (G_OBJECT (page),
-                          "page", &page_widget, "label", &label,
-                          NULL);
-
-            gtk_notebook_append_page (self->notebook,
-                                      page_widget, label);
-            g_object_set (gtk_notebook_get_page (GTK_NOTEBOOK (self->notebook),
-                                                 GTK_WIDGET (page_widget)),
-                          "tab-expand", TRUE,
-                          NULL);
-
-            g_object_set_data (G_OBJECT (page_widget),
-                               "is-extension-page",
-                               GINT_TO_POINTER (TRUE));
+            g_list_store_append (extension_providers, NAUTILUS_PROPERTY_PAGE (l->data));
         }
     }
+
+    gtk_widget_set_visible (GTK_WIDGET (self->extension_list_box),
+                            g_list_model_get_n_items (G_LIST_MODEL (extension_providers)) > 0);
+
+    gtk_list_box_bind_model (self->extension_list_box,
+                             G_LIST_MODEL (extension_providers),
+                             (GtkListBoxCreateWidgetFunc) add_extension_page,
+                             self,
+                             NULL);
 }
 
 static gboolean
@@ -4037,17 +4079,17 @@ create_properties_window (StartupData *startup_data)
     if (should_show_permissions (window))
     {
         setup_permissions_page (window);
-        gtk_widget_show (window->permissions_stack);
+        gtk_widget_show (window->permissions_navigation_row);
     }
 
     if (should_show_open_with (window))
     {
         setup_open_with_page (window);
-        gtk_widget_show (window->open_with_box);
+        gtk_widget_show (window->open_with_navigation_row);
     }
 
-    /* append pages from available views */
-    append_extension_pages (window);
+    /* Add available extension pages */
+    refresh_extension_pages (window);
 
     /* Update from initial state */
     properties_window_update (window, NULL);
@@ -4571,7 +4613,7 @@ nautilus_properties_window_class_init (NautilusPropertiesWindowClass *klass)
 
     gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/nautilus/ui/nautilus-properties-window.ui");
 
-    gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, notebook);
+    gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, page_stack);
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, icon_stack);
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, icon_image);
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, icon_button);
@@ -4584,6 +4626,7 @@ nautilus_properties_window_class_init (NautilusPropertiesWindowClass *klass)
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, disk_space_used_value);
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, disk_space_free_value);
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, disk_space_capacity_value);
+    gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, open_with_navigation_row);
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, link_target_row);
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, link_target_value_label);
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, size_row);
@@ -4603,6 +4646,8 @@ nautilus_properties_window_class_init (NautilusPropertiesWindowClass *klass)
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, created_value_label);
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, accessed_row);
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, accessed_value_label);
+    gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, 
permissions_navigation_row);
+    gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, extension_list_box);
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, free_space_list_box);
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, free_space_value_label);
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, permissions_stack);
@@ -4637,6 +4682,9 @@ nautilus_properties_window_class_init (NautilusPropertiesWindowClass *klass)
     gtk_widget_class_bind_template_child (widget_class, NautilusPropertiesWindow, set_as_default_button);
 
     gtk_widget_class_bind_template_callback (widget_class, open_in_disks);
+    gtk_widget_class_bind_template_callback (widget_class, navigate_main_page);
+    gtk_widget_class_bind_template_callback (widget_class, navigate_permissions_page);
+    gtk_widget_class_bind_template_callback (widget_class, navigate_open_with_page);
 }
 
 static void
diff --git a/src/resources/ui/nautilus-properties-window.ui b/src/resources/ui/nautilus-properties-window.ui
index 1644dd196..19b5add7a 100644
--- a/src/resources/ui/nautilus-properties-window.ui
+++ b/src/resources/ui/nautilus-properties-window.ui
@@ -5,27 +5,29 @@
     <property name="focusable">False</property>
     <property name="modal">True</property>
     <child>
-      <object class="GtkBox" id="content_box">
-        <property name="orientation">vertical</property>
+      <object class="GtkStack" id="page_stack">
+        <property name="hexpand">True</property>
+        <property name="transition-type">over-left-right</property>
         <child>
-          <object class="AdwHeaderBar"/>
-        </child>
-        <child>
-          <object class="GtkNotebook" id="notebook">
-            <property name="hexpand">True</property>
-            <property name="focusable">True</property>
-            <property name="show_border">False</property>
-            <child>
-              <object class="GtkNotebookPage">
-                <property name="tab_expand">True</property>
-                <property name="child">
+          <object class="GtkStackPage">
+            <property name="name">main</property>
+            <property name="child">
+              <object class="GtkBox">
+                <property name="orientation">vertical</property>
+                <child>
+                  <object class="GtkHeaderBar"/>
+                </child>
+                <child>
                   <object class="GtkBox" id="basic_box">
+                    <property name="orientation">vertical</property>
+                    <property name="spacing">12</property>
                     <property name="margin-top">18</property>
                     <property name="margin-bottom">18</property>
                     <property name="margin-start">18</property>
                     <property name="margin-end">18</property>
-                    <property name="orientation">vertical</property>
-                    <property name="spacing">12</property>
+                    <style>
+                      <class name="background"/>
+                    </style>
                     <child>
                       <object class="GtkStack" id="icon_stack">
                         <property name="halign">center</property>
@@ -243,6 +245,21 @@
                     <child>
                       <object class="GtkListBox" id="file_data_list_box">
                         <property name="selection-mode">none</property>
+                        <child>
+                          <object class="AdwActionRow" id="open_with_navigation_row">
+                            <property name="visible">False</property>
+                            <property name="activatable">True</property>
+                            <property name="selectable">False</property>
+                            <property name="title" translatable="yes">_Open With</property>
+                            <property name="use-underline">True</property>
+                            <signal name="activated" handler="navigate_open_with_page" 
object="NautilusPropertiesWindow" swapped="yes"/>
+                            <child>
+                              <object class="GtkImage">
+                                <property name="icon-name">go-next-symbolic</property>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
                         <child>
                           <object class="AdwActionRow" id="link_target_row">
                             <property name="visible">False</property>
@@ -506,6 +523,40 @@
                         </style>
                       </object>
                     </child>
+                    <child>
+                      <object class="GtkListBox" id="permissions_list_box">
+                        <property name="selection-mode">none</property>
+                        <child>
+                          <object class="AdwActionRow" id="permissions_navigation_row">
+                            <property name="activatable">True</property>
+                            <property name="selectable">False</property>
+                            <property name="title" translatable="yes">Set Custom _Permissions</property>
+                            <property name="use-underline">True</property>
+                            <signal name="activated" handler="navigate_permissions_page" 
object="NautilusPropertiesWindow" swapped="yes"/>
+                            <child>
+                              <object class="GtkBox" id="permissions_navigation_action_box">
+                                <child>
+                                  <object class="GtkImage">
+                                    <property name="icon-name">go-next-symbolic</property>
+                                  </object>
+                                </child>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+                        <style>
+                          <class name="boxed-list"/>
+                        </style>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkListBox" id="extension_list_box">
+                        <property name="selection-mode">none</property>
+                        <style>
+                          <class name="boxed-list"/>
+                        </style>
+                      </object>
+                    </child>
                     <child>
                       <object class="GtkListBox" id="free_space_list_box">
                         <property name="visible">False</property>
@@ -702,24 +753,41 @@
                       </object>
                     </child>
                   </object>
-                </property>
-                <property name="tab">
-                  <object class="GtkLabel" id="basic_label">
-                    <property name="label" translatable="yes">Basic</property>
-                  </object>
-                </property>
+                </child>
               </object>
-            </child>
-            <child>
-              <object class="GtkNotebookPage">
-                <property name="tab_expand">True</property>
-                <property name="child">
+            </property>
+          </object>
+        </child>
+        <child>
+          <object class="GtkStackPage">
+            <property name="name">permissions</property>
+            <property name="child">
+              <object class="GtkBox">
+                <property name="orientation">vertical</property>
+                <child>
+                  <object class="GtkHeaderBar">
+                    <property name="title-widget">
+                      <object class="AdwWindowTitle">
+                        <property name="title" translatable="yes">Set Custom Permissions</property>
+                      </object>
+                    </property>
+                    <child type="start">
+                      <object class="GtkButton">
+                        <property name="icon-name">go-previous-symbolic</property>
+                        <signal name="clicked" handler="navigate_main_page" 
object="NautilusPropertiesWindow" swapped="yes"/>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child>
                   <object class="GtkStack" id="permissions_stack">
-                    <property name="visible">True</property>
                     <property name="margin-top">18</property>
                     <property name="margin-bottom">18</property>
                     <property name="margin-start">18</property>
                     <property name="margin-end">18</property>
+                    <style>
+                      <class name="background"/>
+                    </style>
                     <child>
                       <object class="GtkStackPage">
                         <property name="name">permission-indeterminable</property>
@@ -953,24 +1021,41 @@
                       </object>
                     </child>
                   </object>
-                </property>
-                <property name="tab">
-                  <object class="GtkLabel" id="permissions_label">
-                    <property name="label" translatable="yes">Permissions</property>
-                  </object>
-                </property>
+                </child>
               </object>
-            </child>
-            <child>
-              <object class="GtkNotebookPage">
-                <property name="tab_expand">True</property>
-                <property name="child">
+            </property>
+          </object>
+        </child>
+        <child>
+          <object class="GtkStackPage">
+            <property name="name">open-with</property>
+            <property name="child">
+              <object class="GtkBox">
+                <property name="orientation">vertical</property>
+                <child>
+                  <object class="GtkHeaderBar">
+                    <property name="title-widget">
+                      <object class="AdwWindowTitle">
+                        <property name="title" translatable="yes">Open With</property>
+                      </object>
+                    </property>
+                    <child type="start">
+                      <object class="GtkButton">
+                        <property name="icon-name">go-previous-symbolic</property>
+                        <signal name="clicked" handler="navigate_main_page" 
object="NautilusPropertiesWindow" swapped="yes"/>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child>
                   <object class="GtkBox" id="open_with_box">
-                    <property name="visible">False</property>
                     <property name="margin-top">18</property>
                     <property name="margin-bottom">18</property>
                     <property name="margin-start">18</property>
                     <property name="margin-end">18</property>
+                    <style>
+                      <class name="background"/>
+                    </style>
                     <property name="orientation">vertical</property>
                     <property name="spacing">6</property>
                     <child>
@@ -1025,19 +1110,11 @@
                       </object>
                     </child>
                   </object>
-                </property>
-                <property name="tab">
-                  <object class="GtkLabel">
-                    <property name="label" translatable="yes">Open With</property>
-                  </object>
-                </property>
+                </child>
               </object>
-            </child>
+            </property>
           </object>
         </child>
-        <style>
-          <class name="view"/>
-        </style>
       </object>
     </child>
   </template>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]