[pan2] - improved status icon behavior, change only happens on click, simplified - beautified tabs in prefe



commit 206afbf285fddb7c709f04a71ae4f4ef10160e91
Author: Heinrich MÃller <henmull src gnome org>
Date:   Mon Jan 23 16:03:37 2012 +0100

    - improved status icon behavior, change only happens on click, simplified
    - beautified tabs in preferences, auto-set tab number to 0 on entry
    - fixed article-cache behavior with new filename extensions, but user still has to recache articles with different extension than the current because pan can't guess vice-versa

 pan/data/article-cache.cc |    6 +--
 pan/gui/pan.cc            |  107 +++++++++++++++-----------------
 pan/gui/prefs-ui.cc       |  150 +++++++++++++++++++++++++--------------------
 pan/icons/Makefile.am     |   13 +++-
 4 files changed, 145 insertions(+), 131 deletions(-)
---
diff --git a/pan/data/article-cache.cc b/pan/data/article-cache.cc
index 6a431c2..b1918a4 100644
--- a/pan/data/article-cache.cc
+++ b/pan/data/article-cache.cc
@@ -124,11 +124,7 @@ ArticleCache :: message_id_to_filename (char * buf, int len, const StringView& m
   }
 
   // add the filename extension
-  char* tmp = new char[msg_extension.length()+1];
-  g_snprintf (tmp, sizeof(tmp), ".%s", msg_extension.c_str());
-  g_snprintf (out, len-(out-buf), tmp);
-
-  delete tmp;
+  g_snprintf (out, len-(out-buf), ".%s", msg_extension.c_str());
 
   return buf;
 }
diff --git a/pan/gui/pan.cc b/pan/gui/pan.cc
index 4c97679..204b640 100644
--- a/pan/gui/pan.cc
+++ b/pan/gui/pan.cc
@@ -74,7 +74,7 @@ extern "C" {
 #endif
 
 
-/* NOTE : Dbus is disabled for now, it's buggy */
+/* NOTE : Dbus is disabled for now, my implementation is buggy */
 //#define DEBUG_LOCALE 1
 #define DEBUG_PARALLEL 1
 
@@ -114,14 +114,7 @@ namespace
 
   gboolean delete_event_cb (GtkWidget * w, GdkEvent *, gpointer user_data)
   {
-    Prefs* prefs (static_cast<Prefs*>(user_data));
-    if(prefs->get_flag ("status-icon", true))
-    {
-      gtk_widget_hide(w);
-      gtk_window_iconify (GTK_WINDOW(w));
-    }
-    else
-      mainloop_quit ();
+    mainloop_quit ();
     return true; // don't invoke the default handler that destroys the widget
   }
 
@@ -429,26 +422,26 @@ namespace
 
 /* ****** End Status Icon and Notification ****************************************/
 
-  static gboolean window_state_event (GtkWidget *widget, GdkEventWindowState *event, gpointer trayIcon)
-  {
-
-    StatusIconListener* l(static_cast<StatusIconListener*>(trayIcon));
-
-    if(event->changed_mask == GDK_WINDOW_STATE_ICONIFIED
-       && (event->new_window_state == GDK_WINDOW_STATE_ICONIFIED
-       || event->new_window_state == (GDK_WINDOW_STATE_ICONIFIED | GDK_WINDOW_STATE_MAXIMIZED)))
-    {
-        gtk_status_icon_set_visible(GTK_STATUS_ICON(l->icon), TRUE);
-        gtk_widget_hide (GTK_WIDGET(widget));
-    }
-//    else if(event->changed_mask == GDK_WINDOW_STATE_WITHDRAWN
-//            && (event->new_window_state == GDK_WINDOW_STATE_ICONIFIED
-//            || event->new_window_state == (GDK_WINDOW_STATE_ICONIFIED | GDK_WINDOW_STATE_MAXIMIZED)))
+//  static gboolean window_state_event (GtkWidget *widget, GdkEventWindowState *event, gpointer trayIcon)
+//  {
+//
+//    StatusIconListener* l(static_cast<StatusIconListener*>(trayIcon));
+//
+//    if(event->changed_mask == GDK_WINDOW_STATE_ICONIFIED
+//       && (event->new_window_state == GDK_WINDOW_STATE_ICONIFIED
+//       || event->new_window_state == (GDK_WINDOW_STATE_ICONIFIED | GDK_WINDOW_STATE_MAXIMIZED)))
 //    {
-//        gtk_status_icon_set_visible(GTK_STATUS_ICON(l->icon), FALSE);
+//        gtk_status_icon_set_visible(GTK_STATUS_ICON(l->icon), TRUE);
+//        gtk_widget_hide (GTK_WIDGET(widget));
 //    }
-    return TRUE;
-  }
+////    else if(event->changed_mask == GDK_WINDOW_STATE_WITHDRAWN
+////            && (event->new_window_state == GDK_WINDOW_STATE_ICONIFIED
+////            || event->new_window_state == (GDK_WINDOW_STATE_ICONIFIED | GDK_WINDOW_STATE_MAXIMIZED)))
+////    {
+////        gtk_status_icon_set_visible(GTK_STATUS_ICON(l->icon), FALSE);
+////    }
+//    return TRUE;
+//  }
 
   struct QueueAndGui
   {
@@ -507,7 +500,7 @@ namespace
     gtk_widget_show_all(menu);
     g_signal_connect(icon, "activate", G_CALLBACK(status_icon_activate), window);
     g_signal_connect(icon, "popup-menu", G_CALLBACK(status_icon_popup_menu), menu);
-    g_signal_connect (G_OBJECT (window), "window-state-event", G_CALLBACK (window_state_event), pl);
+//    g_signal_connect (G_OBJECT (window), "window-state-event", G_CALLBACK (window_state_event), pl);
   }
 
 
@@ -518,41 +511,39 @@ namespace
                           GroupPrefs    & group_prefs,
                           GtkWindow     * window)
   {
-//    {
 
-      GUI& gui (*_gui);
+    GUI& gui (*_gui);
 
-      const gulong delete_cb_id =  g_signal_connect (window, "delete-event", G_CALLBACK(delete_event_cb), &prefs);
+    const gulong delete_cb_id =  g_signal_connect (window, "delete-event", G_CALLBACK(delete_event_cb), NULL);
 
-      gtk_container_add (GTK_CONTAINER(window), gui.root());
-      const bool minimized(prefs.get_flag("start-minimized", false));
-      if (minimized) gtk_window_iconify (window);
-      gtk_widget_show (GTK_WIDGET(window));
+    gtk_container_add (GTK_CONTAINER(window), gui.root());
+    const bool minimized(prefs.get_flag("start-minimized", false));
+    if (minimized) gtk_window_iconify (window);
+    gtk_widget_show (GTK_WIDGET(window));
 
-      const quarks_t servers (data.get_servers ());
-      if (servers.empty())
-      {
-        const Quark empty_server;
-        GtkWidget * w = server_edit_dialog_new (data, queue, window, empty_server);
-        gtk_widget_show_all (w);
-        GtkWidget * msg = gtk_message_dialog_new (GTK_WINDOW(w),
-                                                  GTK_DIALOG_DESTROY_WITH_PARENT,
-                                                  GTK_MESSAGE_INFO,
-                                                  GTK_BUTTONS_CLOSE,
-                                                _("Thank you for trying Pan!\n \nTo start newsreading, first Add a Server."));
-        g_signal_connect_swapped (msg, "response", G_CALLBACK (gtk_widget_destroy), msg);
-        gtk_widget_show_all (msg);
-
-        DataAndQueue * foo = g_new0 (DataAndQueue, 1);
-        foo->data = &data;
-        foo->queue = &queue;
-        g_signal_connect (w, "destroy", G_CALLBACK(add_grouplist_task), foo);
-      }
+    const quarks_t servers (data.get_servers ());
+    if (servers.empty())
+    {
+      const Quark empty_server;
+      GtkWidget * w = server_edit_dialog_new (data, queue, window, empty_server);
+      gtk_widget_show_all (w);
+      GtkWidget * msg = gtk_message_dialog_new (GTK_WINDOW(w),
+                                                GTK_DIALOG_DESTROY_WITH_PARENT,
+                                                GTK_MESSAGE_INFO,
+                                                GTK_BUTTONS_CLOSE,
+                                              _("Thank you for trying Pan!\n \nTo start newsreading, first Add a Server."));
+      g_signal_connect_swapped (msg, "response", G_CALLBACK (gtk_widget_destroy), msg);
+      gtk_widget_show_all (msg);
+
+      DataAndQueue * foo = g_new0 (DataAndQueue, 1);
+      foo->data = &data;
+      foo->queue = &queue;
+      g_signal_connect (w, "destroy", G_CALLBACK(add_grouplist_task), foo);
+    }
 
-      register_shutdown_signals ();
-      mainloop ();
-      g_signal_handler_disconnect (window, delete_cb_id);
-//    }
+    register_shutdown_signals ();
+    mainloop ();
+    g_signal_handler_disconnect (window, delete_cb_id);
 
     delete _gui;
 
diff --git a/pan/gui/prefs-ui.cc b/pan/gui/prefs-ui.cc
index f816fee..5320cf1 100644
--- a/pan/gui/prefs-ui.cc
+++ b/pan/gui/prefs-ui.cc
@@ -296,6 +296,21 @@ namespace
     return r;
   }
 
+  GtkWidget* new_label_with_icon(const char* mnemonic, const char* label, const guint8* line, Prefs& prefs)
+  {
+    const bool show_text =!prefs.get_flag("show-only-icons-in-preftabs", "false");
+
+    GtkWidget* hbox = gtk_hbox_new(false, 2);
+    GdkPixbuf * pixbuf = gdk_pixbuf_new_from_inline (-1, line, false, 0);
+    GtkWidget * image = gtk_image_new_from_pixbuf (pixbuf);
+    g_object_unref (pixbuf);
+    if (line) gtk_box_pack_start (GTK_BOX(hbox), image, true, true, 0);
+    if (show_text) gtk_box_pack_start (GTK_BOX(hbox), gtk_label_new_with_mnemonic(mnemonic), true, true, 0);
+    gtk_widget_set_tooltip_text (hbox, label);
+    gtk_widget_show_all(hbox);
+    return hbox;
+  }
+
   void fill_pref_hotkeys(GtkWidget* t, int& row, Prefs& prefs)
   {
 
@@ -785,76 +800,56 @@ PrefsDialog :: PrefsDialog (Prefs& prefs, GtkWindow* parent):
     gtk_misc_set_alignment (GTK_MISC(l), 0.0, 0.5);
     HIG :: workarea_add_row (t, &row, w, l);
 
-  HIG :: workarea_finish (t, &row);
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, gtk_label_new_with_mnemonic(_("_Behavior")));
-
-  // Hotkeys
-  row = 0;
-  t = HIG :: workarea_create ();
-  fill_pref_hotkeys(t, row, _prefs);
+    HIG::workarea_add_section_divider (t, &row);
+    HIG :: workarea_add_section_title (t, &row, _("Tabs"));
+    w = new_check_button (_("Show only icons in Preferences tabs"), "show-only-icons-in-preftabs", false, prefs);
+    HIG :: workarea_add_wide_control (t, &row, w);
 
   HIG :: workarea_finish (t, &row);
-
-  GtkWidget* scroll = gtk_scrolled_window_new (NULL, NULL);
-  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scroll), GTK_SHADOW_IN);
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
-                                  GTK_POLICY_AUTOMATIC,
-                                  GTK_POLICY_AUTOMATIC);
-  gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW(scroll), t);
-
-  gtk_widget_show_all (scroll);
-
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), scroll, gtk_label_new_with_mnemonic(_("_Hotkeys")));
+  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, new_label_with_icon(_("_Behavior"), _("Behavior"), icon_prefs_behavior, prefs));
 
   //charset
   row = 0;
   t = HIG :: workarea_create ();
-  HIG :: workarea_add_section_spacer (t, row, 1);
-  HIG :: workarea_add_section_title (t, &row, _("Language Settings"));
-  w = gtk_button_new_from_stock (GTK_STOCK_SELECT_FONT);
-  l = charset_label = gtk_label_new (NULL);
-  gtk_misc_set_alignment (GTK_MISC(l), 0.0, 0.0);
-  update_default_charset_label(_prefs.get_string("default-charset","UTF-8"));
-  g_signal_connect (w, "clicked", G_CALLBACK(select_prefs_charset_cb), this);
-  HIG::workarea_add_row (t, &row, w, l);
-  HIG :: workarea_finish (t, &row);
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, gtk_label_new_with_mnemonic(_("_Charset")));
+    HIG :: workarea_add_section_spacer (t, row, 1);
+    HIG :: workarea_add_section_title (t, &row, _("Language Settings"));
+    w = gtk_button_new_from_stock (GTK_STOCK_SELECT_FONT);
+    l = charset_label = gtk_label_new (NULL);
+    gtk_misc_set_alignment (GTK_MISC(l), 0.0, 0.0);
+    update_default_charset_label(_prefs.get_string("default-charset","UTF-8"));
+    g_signal_connect (w, "clicked", G_CALLBACK(select_prefs_charset_cb), this);
+    HIG::workarea_add_row (t, &row, w, l);
 
-  // systray and notify popup
-  row = 0;
-  t = HIG :: workarea_create ();
-  HIG :: workarea_add_section_title (t, &row, _("System Tray Behavior"));
-  HIG :: workarea_add_section_spacer (t, row, 3);
-  w = new_check_button (_("Hide to system tray"), "status-icon", false, prefs);
-  HIG :: workarea_add_wide_control (t, &row, w);
-  w = new_check_button (_("Start Pan minimized"), "start-minimized", false, prefs);
-  HIG :: workarea_add_wide_control (t, &row, w);
+    // systray and notify popup
+    HIG :: workarea_add_section_title (t, &row, _("System Tray Behavior"));
+    HIG :: workarea_add_section_spacer (t, row, 3);
+    w = new_check_button (_("Hide to system tray"), "status-icon", false, prefs);
+    HIG :: workarea_add_wide_control (t, &row, w);
+    w = new_check_button (_("Start Pan minimized"), "start-minimized", false, prefs);
+    HIG :: workarea_add_wide_control (t, &row, w);
 #ifdef HAVE_LIBNOTIFY
-  w = new_check_button (_("Show notifications"), "use-notify", false, prefs);
-  HIG :: workarea_add_wide_control (t, &row, w);
+    w = new_check_button (_("Show notifications"), "use-notify", false, prefs);
+    HIG :: workarea_add_wide_control (t, &row, w);
 #endif
-  HIG :: workarea_finish (t, &row);
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, gtk_label_new_with_mnemonic(_("_Status and Notifications")));
 
-  // Autosave Features
-  row = 0;
-  t = HIG :: workarea_create ();
-  HIG :: workarea_add_section_spacer (t, row, 2);
-  HIG :: workarea_add_section_title (t, &row, _("Autosave Article Draft"));
-  w = new_spin_button ("draft-autosave-timeout-min", 0, 60, prefs);
-  l = gtk_label_new(_("Minutes to autosave the current Article Draft."));
-  gtk_misc_set_alignment (GTK_MISC(l), 0.0, 0.5);
-  gtk_label_set_mnemonic_widget(GTK_LABEL(l), w);
-  HIG::workarea_add_row (t, &row, w, l);
-  HIG::workarea_add_section_divider (t, &row);
-  HIG :: workarea_add_section_title (t, &row, _("Autosave Articles"));
-  w = new_spin_button ("newsrc-autosave-timeout-min", 0, 60, prefs);
-  l = gtk_label_new(_("Minutes to autosave newsrc files"));
-  gtk_misc_set_alignment (GTK_MISC(l), 0.0, 0.5);
-  gtk_label_set_mnemonic_widget(GTK_LABEL(l), w);
-  HIG::workarea_add_row (t, &row, w, l);
+    // Autosave Features
+    HIG :: workarea_add_section_spacer (t, row, 2);
+    HIG :: workarea_add_section_title (t, &row, _("Autosave Article Draft"));
+    w = new_spin_button ("draft-autosave-timeout-min", 0, 60, prefs);
+    l = gtk_label_new(_("Minutes to autosave the current Article Draft."));
+    gtk_misc_set_alignment (GTK_MISC(l), 0.0, 0.5);
+    gtk_label_set_mnemonic_widget(GTK_LABEL(l), w);
+    HIG::workarea_add_row (t, &row, w, l);
+    HIG::workarea_add_section_divider (t, &row);
+    HIG :: workarea_add_section_title (t, &row, _("Autosave Articles"));
+    w = new_spin_button ("newsrc-autosave-timeout-min", 0, 60, prefs);
+    l = gtk_label_new(_("Minutes to autosave newsrc files"));
+    gtk_misc_set_alignment (GTK_MISC(l), 0.0, 0.5);
+    gtk_label_set_mnemonic_widget(GTK_LABEL(l), w);
+    HIG::workarea_add_row (t, &row, w, l);
+
   HIG :: workarea_finish (t, &row);
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, gtk_label_new_with_mnemonic(_("_Autosave")));
+  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, new_label_with_icon(_("_Miscellaneous"), _("Miscellaneous"), icon_prefs_extras, prefs));
 
   // Layout
   row = 0;
@@ -890,8 +885,9 @@ PrefsDialog :: PrefsDialog (Prefs& prefs, GtkWindow* parent):
     HIG :: workarea_add_wide_control (t, &row, w);
     w = new_orient_radio (w, _("1=Body, 2=Headers, 3=Groups"), "body,headers,groups", cur, prefs);
     HIG :: workarea_add_wide_control (t, &row, w);
+
   HIG :: workarea_finish (t, &row);
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, gtk_label_new_with_mnemonic(_("_Layout")));
+  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, new_label_with_icon(_("_Layout"), _("Layout"), icon_prefs_layout, prefs));
 
   // Headers
   row = 0;
@@ -900,8 +896,9 @@ PrefsDialog :: PrefsDialog (Prefs& prefs, GtkWindow* parent):
     HIG :: workarea_add_section_spacer(t, row, 1);
     HIG :: workarea_add_wide_control (t, &row, header_columns_layout_new (prefs));
   HIG :: workarea_finish (t, &row);
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, gtk_label_new_with_mnemonic(_("_Headers")));
+  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, new_label_with_icon(_("_Headers"), _("Headers"), icon_prefs_headers, prefs));
 
+  // customizable actionss
   row = 0;
   t = HIG :: workarea_create ();
 
@@ -917,7 +914,7 @@ PrefsDialog :: PrefsDialog (Prefs& prefs, GtkWindow* parent):
     HIG :: workarea_add_row (t, &row, _("Download _attachments of posts scoring at: "), w);
 
   HIG :: workarea_finish (t, &row);
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, gtk_label_new_with_mnemonic(_("_Actions")));
+  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, new_label_with_icon(_("_Actions"), _("Actions"), icon_prefs_actions, prefs));
 
   // Fonts
   row = 0;
@@ -943,7 +940,7 @@ PrefsDialog :: PrefsDialog (Prefs& prefs, GtkWindow* parent):
     b = new_font_button ("monospace-font", "Monospace 10", prefs);
     HIG :: workarea_add_row (t, &row, l, b);
   HIG :: workarea_finish (t, &row);
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, gtk_label_new_with_mnemonic(_("_Fonts")));
+  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, new_label_with_icon(_("_Fonts"), _("Fonts"), icon_prefs_fonts, prefs));
 
   // Colors
   row = 0;
@@ -997,7 +994,7 @@ PrefsDialog :: PrefsDialog (Prefs& prefs, GtkWindow* parent):
     HIG :: workarea_add_row (t, &row, _("URL:"), new_color_button ("body-pane-color-url", TANGO_SKY_BLUE_DARK, prefs));
     HIG :: workarea_add_row (t, &row, _("Signature:"), new_color_button ("body-pane-color-signature", TANGO_SKY_BLUE_LIGHT, prefs));
   HIG :: workarea_finish (t, &row);
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, gtk_label_new_with_mnemonic(_("_Colors")));
+  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, new_label_with_icon(_("_Colors"), _("Colors"), icon_prefs_colors, prefs));
 
   // Applications
   row = 0;
@@ -1013,7 +1010,7 @@ PrefsDialog :: PrefsDialog (Prefs& prefs, GtkWindow* parent):
     w = editor_new (prefs);
     HIG :: workarea_add_row (t, &row, _("_Text editor:"), w);
   HIG :: workarea_finish (t, &row);
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, gtk_label_new_with_mnemonic(_("A_pplications")));
+  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, new_label_with_icon(_("_Applications"), _("Applications"), icon_prefs_applications, prefs));
 
   // Upload Options
   row = 0;
@@ -1027,9 +1024,30 @@ PrefsDialog :: PrefsDialog (Prefs& prefs, GtkWindow* parent):
   HIG::workarea_add_row (t, &row, w, l);
 
   HIG :: workarea_finish (t, &row);
-  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, gtk_label_new_with_mnemonic(_("_Upload")));
+  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), t, new_label_with_icon(_("_Upload"), _("Upload"), icon_prefs_upload, prefs));
+
+  // Hotkeys
+  row = 0;
+  t = HIG :: workarea_create ();
+  fill_pref_hotkeys(t, row, _prefs);
+
+  HIG :: workarea_finish (t, &row);
+
+  GtkWidget* scroll = gtk_scrolled_window_new (NULL, NULL);
+  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scroll), GTK_SHADOW_IN);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
+                                  GTK_POLICY_AUTOMATIC,
+                                  GTK_POLICY_AUTOMATIC);
+  gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW(scroll), t);
+
+  gtk_widget_show_all (scroll);
+
+  gtk_notebook_append_page (GTK_NOTEBOOK(notebook), scroll, new_label_with_icon(_("_Hotkeys"), _("Hotkeys"), icon_prefs_hotkeys, prefs));
 
   gtk_widget_show_all (notebook);
   gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area( GTK_DIALOG(dialog))), notebook, true, true, 0);
+
+  gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 0);
+
   _root = dialog;
 }
diff --git a/pan/icons/Makefile.am b/pan/icons/Makefile.am
index 3107fb3..4677c27 100644
--- a/pan/icons/Makefile.am
+++ b/pan/icons/Makefile.am
@@ -55,8 +55,17 @@ stock_images = \
   icon_status_idle.png \
   icon_status_new_articles.png \
   icon_sig_ok.png \
-  icon_sig_fail.png
-
+  icon_sig_fail.png \
+  icon_prefs_applications.png \
+  icon_prefs_extras.png \
+  icon_prefs_hotkeys.png \
+  icon_prefs_behavior.png \
+  icon_prefs_fonts.png \
+  icon_prefs_upload.png \
+  icon_prefs_colors.png \
+  icon_prefs_headers.png \
+  icon_prefs_layout.png \
+  icon_prefs_actions.png
 
 EXTRA_DIST = \
 	pan-template.xcf \



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