gnome-packagekit r513 - in trunk: data src
- From: rhughes svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-packagekit r513 - in trunk: data src
- Date: Thu, 19 Mar 2009 12:08:23 +0000 (UTC)
Author: rhughes
Date: Thu Mar 19 12:08:23 2009
New Revision: 513
URL: http://svn.gnome.org/viewvc/gnome-packagekit?rev=513&view=rev
Log:
from git
Modified:
trunk/data/gpk-update-viewer2.glade
trunk/src/gpk-cell-renderer-info.c
trunk/src/gpk-common.c
trunk/src/gpk-enum.c
trunk/src/gpk-update-viewer2.c
trunk/src/gpk-watch.c
Modified: trunk/data/gpk-update-viewer2.glade
==============================================================================
--- trunk/data/gpk-update-viewer2.glade (original)
+++ trunk/data/gpk-update-viewer2.glade Thu Mar 19 12:08:23 2009
@@ -22,9 +22,10 @@
<property name="spacing">6</property>
<child>
<widget class="GtkHBox" id="hbox_header">
+ <property name="visible">True</property>
<property name="spacing">9</property>
<child>
- <widget class="GtkImage" id="image_info">
+ <widget class="GtkImage" id="image_header">
<property name="visible">True</property>
<property name="pixel_size">48</property>
<property name="icon_name">system-software-update</property>
@@ -132,6 +133,7 @@
</child>
<child>
<widget class="GtkVPaned" id="vpaned_updates">
+ <property name="visible">True</property>
<property name="can_focus">True</property>
<property name="orientation">vertical</property>
<child>
@@ -179,100 +181,134 @@
</packing>
</child>
<child>
- <widget class="GtkHBox" id="hbox_info">
+ <widget class="GtkVBox" id="vbox4">
<property name="visible">True</property>
- <property name="spacing">9</property>
- <child>
- <widget class="GtkLabel" id="label_placeholder">
- <property name="height_request">32</property>
- <property name="visible">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <widget class="GtkImage" id="image_progress">
- <property name="visible">True</property>
- <property name="stock">gtk-about</property>
- <property name="icon-size">5</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
+ <property name="orientation">vertical</property>
<child>
- <widget class="GtkVBox" id="vbox3">
+ <widget class="GtkHBox" id="hbox_status">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
+ <property name="spacing">9</property>
+ <child>
+ <widget class="GtkImage" id="image_progress">
+ <property name="visible">True</property>
+ <property name="stock">gtk-save</property>
+ <property name="icon-size">5</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
<child>
- <widget class="GtkHBox" id="hbox1">
+ <widget class="GtkVBox" id="vbox5">
<property name="visible">True</property>
+ <property name="orientation">vertical</property>
<child>
- <widget class="GtkProgressBar" id="progressbar_progress">
+ <widget class="GtkHBox" id="hbox2">
<property name="visible">True</property>
- <property name="fraction">0.5</property>
+ <child>
+ <widget class="GtkProgressBar" id="progressbar_progress">
+ <property name="visible">True</property>
+ <property name="fraction">0.5</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
</widget>
<packing>
- <property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
</widget>
<packing>
+ <property name="expand">False</property>
<property name="fill">False</property>
- <property name="position">0</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label_status">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"><b>Downloading:</b></property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label_package">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">data</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label_summary">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">7 updates selected (45Mb)</property>
+ <property name="use_markup">True</property>
+ <property name="justify">right</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">4</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label_status">
- <property name="visible">True</property>
- <property name="label" translatable="yes"><b>Downloading:</b></property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label_package">
- <property name="visible">True</property>
- <property name="label" translatable="yes">data</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">4</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label_summary">
+ <widget class="GtkHBox" id="hbox_info">
<property name="visible">True</property>
- <property name="label" translatable="yes">7 updates selected (45Mb)</property>
- <property name="use_markup">True</property>
- <property name="justify">right</property>
+ <property name="spacing">9</property>
+ <child>
+ <widget class="GtkImage" id="image_info">
+ <property name="visible">True</property>
+ <property name="stock">gtk-remove</property>
+ <property name="icon-size">5</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label_info">
+ <property name="visible">True</property>
+ <property name="label">data that doesn't need the progressbar</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</widget>
<packing>
<property name="expand">False</property>
- <property name="pack_type">end</property>
- <property name="position">5</property>
+ <property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
+ <property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
@@ -301,6 +337,30 @@
</packing>
</child>
<child>
+ <widget class="GtkButton" id="button_logout">
+ <property name="label" translatable="yes">Log out</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button_shutdown">
+ <property name="label" translatable="yes">Shut down</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
<widget class="GtkButton" id="button_close">
<property name="label" translatable="yes">gtk-close</property>
<property name="visible">True</property>
@@ -312,7 +372,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
- <property name="position">1</property>
+ <property name="position">3</property>
</packing>
</child>
<child>
@@ -326,12 +386,12 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
- <property name="position">2</property>
+ <property name="position">4</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="button_install">
- <property name="label" translatable="yes">_Install updates</property>
+ <property name="label">_Install update(s)</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="has_focus">True</property>
@@ -341,7 +401,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
- <property name="position">3</property>
+ <property name="position">5</property>
</packing>
</child>
</widget>
Modified: trunk/src/gpk-cell-renderer-info.c
==============================================================================
--- trunk/src/gpk-cell-renderer-info.c (original)
+++ trunk/src/gpk-cell-renderer-info.c Thu Mar 19 12:08:23 2009
@@ -73,9 +73,10 @@
switch (param_id) {
case PROP_VALUE:
cru->priv->value = g_value_get_uint (value);
- if (cru->priv->value == PK_INFO_ENUM_UNKNOWN ||
- cru->priv->value == PK_INFO_ENUM_FINISHED) {
+ if (cru->priv->value == PK_INFO_ENUM_UNKNOWN) {
g_object_set (cru, "visible", FALSE, NULL);
+ } else if (cru->priv->value == PK_INFO_ENUM_FINISHED) {
+ /* ignore */
} else {
cru->priv->icon_name = gpk_info_enum_to_icon_name (cru->priv->value);
g_object_set (cru, "visible", TRUE, NULL);
Modified: trunk/src/gpk-common.c
==============================================================================
--- trunk/src/gpk-common.c (original)
+++ trunk/src/gpk-common.c Thu Mar 19 12:08:23 2009
@@ -87,6 +87,7 @@
do {
PangoAttribute *attr;
GtkTextTag *tag;
+ GtkTextTag *tag_para;
gint start, end;
pango_attr_iterator_range (paiter, &start, &end);
@@ -153,7 +154,9 @@
g_object_set (tag, "scale", ( (PangoAttrFloat*)attr)->value, NULL);
gtk_text_tag_table_add (gtk_text_buffer_get_tag_table (buffer), tag);
- gtk_text_buffer_insert_with_tags (buffer, iter, text+start, end - start, tag, NULL);
+
+ tag_para = gtk_text_tag_table_lookup (gtk_text_buffer_get_tag_table (buffer), "para");
+ gtk_text_buffer_insert_with_tags (buffer, iter, text+start, end - start, tag, tag_para, NULL);
/* mark had right gravity, so it should be
* at the end of the inserted text now */
Modified: trunk/src/gpk-enum.c
==============================================================================
--- trunk/src/gpk-enum.c (original)
+++ trunk/src/gpk-enum.c Thu Mar 19 12:08:23 2009
@@ -205,7 +205,7 @@
{PK_RESTART_ENUM_UNKNOWN, "help-browser"}, /* fall though value */
{PK_RESTART_ENUM_NONE, ""},
{PK_RESTART_ENUM_SYSTEM, "system-shutdown"},
- {PK_RESTART_ENUM_SESSION, "preferences-system-session"},
+ {PK_RESTART_ENUM_SESSION, "system-log-out"},
{PK_RESTART_ENUM_APPLICATION, "emblem-symbolic-link"},
{0, NULL}
};
@@ -375,16 +375,16 @@
text = _("Could not remove a protected system package");
break;
case PK_ERROR_ENUM_TRANSACTION_CANCELLED:
- text = _("The task was canceled");
+ text = _("The action was canceled");
break;
case PK_ERROR_ENUM_PROCESS_KILL:
- text = _("The task was forcibly canceled");
+ text = _("The action was forcibly canceled");
break;
case PK_ERROR_ENUM_FAILED_CONFIG_PARSING:
- text = _("Reading the config file failed");
+ text = _("Reading the configuration file failed");
break;
case PK_ERROR_ENUM_CANNOT_CANCEL:
- text = _("The task cannot be canceled");
+ text = _("The action cannot be canceled");
break;
case PK_ERROR_ENUM_CANNOT_INSTALL_SOURCE_PACKAGE:
text = _("Source packages cannot be installed");
@@ -519,7 +519,7 @@
"source error.");
break;
case PK_ERROR_ENUM_DEP_RESOLUTION_FAILED:
- text = _("A package could not be found that allows the task to complete.\n"
+ text = _("A package could not be found that allows the action to complete.\n"
"More information is available in the detailed report.");
break;
case PK_ERROR_ENUM_FILTER_INVALID:
@@ -530,7 +530,7 @@
"This normally indicates an internal error and should be reported.");
break;
case PK_ERROR_ENUM_TRANSACTION_ERROR:
- text = _("An unspecified task error has occurred.\n"
+ text = _("An unspecified transaction error has occurred.\n"
"More information is available in the detailed report.");
break;
case PK_ERROR_ENUM_REPO_NOT_FOUND:
@@ -541,10 +541,10 @@
text = _("Removing a protected system package is not allowed.");
break;
case PK_ERROR_ENUM_TRANSACTION_CANCELLED:
- text = _("The task was canceled successfully and no packages were changed.");
+ text = _("The action was canceled successfully and no packages were changed.");
break;
case PK_ERROR_ENUM_PROCESS_KILL:
- text = _("The task was canceled successfully and no packages were changed.\n"
+ text = _("The action was canceled successfully and no packages were changed.\n"
"The backend did not exit cleanly.");
break;
case PK_ERROR_ENUM_FAILED_CONFIG_PARSING:
@@ -552,7 +552,7 @@
"Please make sure configuration is valid.");
break;
case PK_ERROR_ENUM_CANNOT_CANCEL:
- text = _("The task is not safe to be canceled at this time.");
+ text = _("The action cannot be canceled at this time.");
break;
case PK_ERROR_ENUM_CANNOT_INSTALL_SOURCE_PACKAGE:
text = _("Source packages are not normally installed this way.\n"
@@ -788,15 +788,15 @@
break;
case PK_STATUS_ENUM_SETUP:
/* TRANSLATORS: The transaction state */
- text = _("Waiting for transaction to start");
+ text = _("Starting");
break;
case PK_STATUS_ENUM_WAIT:
/* TRANSLATORS: The transaction state */
- text = _("Waiting for other tasks");
+ text = _("Waiting in queue");
break;
case PK_STATUS_ENUM_RUNNING:
/* TRANSLATORS: The transaction state */
- text = _("Running task");
+ text = _("Running");
break;
case PK_STATUS_ENUM_QUERY:
/* TRANSLATORS: The transaction state */
Modified: trunk/src/gpk-update-viewer2.c
==============================================================================
--- trunk/src/gpk-update-viewer2.c (original)
+++ trunk/src/gpk-update-viewer2.c Thu Mar 19 12:08:23 2009
@@ -37,6 +37,7 @@
#include "egg-string.h"
#include "egg-unique.h"
#include "egg-markdown.h"
+#include "egg-console-kit.h"
#include "gpk-common.h"
#include "gpk-gnome.h"
@@ -51,6 +52,12 @@
#include "gpk-repo-signature-helper.h"
#include "gpk-eula-helper.h"
+#define GPK_UPDATE_VIEWER_AUTO_SHUTDOWN_TIMEOUT 10 /* seconds */
+#define GNOME_SESSION_MANAGER_SERVICE "org.gnome.SessionManager"
+#define GNOME_SESSION_MANAGER_PATH "/org/gnome/SessionManager"
+#define GNOME_SESSION_MANAGER_INTERFACE "org.gnome.SessionManager"
+
+static guint auto_shutdown_id = 0;
static GMainLoop *loop = NULL;
static GladeXML *glade_xml = NULL;
static GtkListStore *list_store_updates = NULL;
@@ -63,6 +70,7 @@
static GpkEulaHelper *eula_helper = NULL;
static EggMarkdown *markdown = NULL;
static PkPackageId *package_id_last = NULL;
+static PkRestartEnum restart_update = PK_RESTART_ENUM_NONE;
enum {
GPK_UPDATES_COLUMN_TEXT,
@@ -83,6 +91,59 @@
static gboolean gpk_update_viewer_get_new_update_list (void);
/**
+ * gpk_update_viewer_button_logout_cb:
+ **/
+static void
+gpk_update_viewer_button_logout_cb (GtkWidget *widget, gpointer data)
+{
+ DBusGConnection *connection;
+ DBusGProxy *proxy;
+ GError *error = NULL;
+ gboolean ret;
+
+ /* get org.gnome.Session interface */
+ connection = dbus_g_bus_get (DBUS_BUS_SESSION, NULL);
+ proxy = dbus_g_proxy_new_for_name_owner (connection, GNOME_SESSION_MANAGER_SERVICE,
+ GNOME_SESSION_MANAGER_PATH,
+ GNOME_SESSION_MANAGER_INTERFACE, &error);
+ if (proxy == NULL) {
+ egg_warning ("cannot connect to proxy %s: %s", GNOME_SESSION_MANAGER_SERVICE, error->message);
+ g_error_free (error);
+ goto out;
+ }
+
+ /* log out of the session */
+ ret = dbus_g_proxy_call (proxy, "Shutdown", &error, G_TYPE_INVALID);
+ if (!ret) {
+ egg_warning ("cannot shutdown session: %s", error->message);
+ g_error_free (error);
+ goto out;
+ }
+out:
+ g_object_unref (proxy);
+}
+
+/**
+ * gpk_update_viewer_button_shutdown_cb:
+ **/
+static void
+gpk_update_viewer_button_shutdown_cb (GtkWidget *widget, gpointer data)
+{
+ EggConsoleKit *console;
+ GError *error = NULL;
+ gboolean ret;
+
+ /* use consolekit to restart */
+ console = egg_console_kit_new ();
+ ret = egg_console_kit_restart (console, &error);
+ if (!ret) {
+ egg_warning ("cannot restart: %s", error->message);
+ g_error_free (error);
+ }
+ g_object_unref (console);
+}
+
+/**
* gpk_update_viewer_button_help_cb:
**/
static void
@@ -119,7 +180,9 @@
valid = gtk_tree_model_get_iter_first (model, &iter);
while (valid) {
gtk_list_store_set (list_store_updates, &iter,
- GPK_UPDATES_COLUMN_SENSITIVE, TRUE, -1);
+ GPK_UPDATES_COLUMN_SENSITIVE, TRUE,
+ GPK_UPDATES_COLUMN_CLICKABLE, TRUE,
+ -1);
valid = gtk_tree_model_iter_next (model, &iter);
}
}
@@ -158,6 +221,7 @@
/* set all the checkboxes insensitive */
gtk_list_store_set (list_store_updates, &iter,
+ GPK_UPDATES_COLUMN_CLICKABLE, FALSE,
GPK_UPDATES_COLUMN_SENSITIVE, FALSE, -1);
/* ay selected? */
@@ -384,6 +448,11 @@
gtk_list_store_set (list_store_updates, &iter,
GPK_UPDATES_COLUMN_STATUS, obj->info, -1);
gtk_tree_path_free (path);
+
+ /* set package description */
+ widget = glade_xml_get_widget (glade_xml, "label_package");
+ //gtk_label_set_label (GTK_LABEL (widget), obj->summary);
+
goto out;
}
@@ -461,6 +530,16 @@
}
/**
+ * gpk_update_viewer_auto_shutdown:
+ **/
+static gboolean
+gpk_update_viewer_auto_shutdown (void)
+{
+ g_main_loop_quit (loop);
+ return FALSE;
+}
+
+/**
* gpk_update_viewer_reconsider_info:
**/
static void
@@ -478,6 +557,7 @@
guint number_total = 0;
PkRestartEnum restart;
PkRestartEnum restart_worst = PK_RESTART_ENUM_NONE;
+ const gchar *title;
gchar *text;
gchar *text_size;
@@ -504,7 +584,19 @@
gtk_widget_set_sensitive (widget, any_selected);
main_window = glade_xml_get_widget (glade_xml, "dialog_updates");
- /* have we got any updates */
+ /* sensitive */
+ widget = glade_xml_get_widget (glade_xml, "scrolledwindow_updates");
+ gtk_widget_set_sensitive (widget, TRUE);
+ widget = glade_xml_get_widget (glade_xml, "scrolledwindow_details");
+ gtk_widget_set_sensitive (widget, TRUE);
+
+ /* set the pluralisation of the button */
+ widget = glade_xml_get_widget (glade_xml, "button_install");
+ /* TRANSLATORS: this is the button text when we have updates */
+ title = ngettext ("_Install update", "_Install updates", number_total);
+ gtk_button_set_label (GTK_BUTTON (widget), title);
+
+ /* no updates */
len = PK_OBJ_LIST(update_list)->len;
if (len == 0) {
widget = glade_xml_get_widget (glade_xml, "vpaned_updates");
@@ -512,12 +604,18 @@
widget = glade_xml_get_widget (glade_xml, "dialog_updates");
gtk_window_set_resizable (GTK_WINDOW(widget), FALSE);
+ /* use correct status pane */
+ widget = glade_xml_get_widget (glade_xml, "hbox_status");
+ gtk_widget_hide (widget);
+ widget = glade_xml_get_widget (glade_xml, "hbox_info");
+ gtk_widget_show (widget);
+
/* set state */
- widget = glade_xml_get_widget (glade_xml, "image_progress");
+ widget = glade_xml_get_widget (glade_xml, "image_info");
gtk_image_set_from_icon_name (GTK_IMAGE (widget), "dialog-information", GTK_ICON_SIZE_DIALOG);
gtk_widget_show (widget);
- widget = glade_xml_get_widget (glade_xml, "label_summary");
+ widget = glade_xml_get_widget (glade_xml, "label_info");
/* TRANSLATORS: there are no updates */
text = g_strdup_printf ("<b>%s</b>", _("There are no updates available for your computer"));
gtk_label_set_label (GTK_LABEL (widget), text);
@@ -526,7 +624,6 @@
/* close button */
widget = glade_xml_get_widget (glade_xml, "button_close");
- gtk_widget_show (widget);
gtk_window_set_focus (GTK_WINDOW(main_window), widget);
/* header */
@@ -541,6 +638,18 @@
gtk_widget_hide (widget);
widget = glade_xml_get_widget (glade_xml, "label_package");
gtk_widget_hide (widget);
+
+ /* do we have to show any widgets? */
+ if (restart_update == PK_RESTART_ENUM_SYSTEM) {
+ widget = glade_xml_get_widget (glade_xml, "button_shutdown");
+ gtk_widget_show (widget);
+ } else if (restart_update == PK_RESTART_ENUM_SESSION) {
+ widget = glade_xml_get_widget (glade_xml, "button_logout");
+ gtk_widget_show (widget);
+ } else {
+ /* setup a callback so we autoclose */
+ auto_shutdown_id = g_timeout_add_seconds (GPK_UPDATE_VIEWER_AUTO_SHUTDOWN_TIMEOUT, (GSourceFunc) gpk_update_viewer_auto_shutdown, NULL);
+ }
goto out;
}
@@ -551,24 +660,26 @@
gtk_window_set_resizable (GTK_WINDOW(widget), TRUE);
widget = glade_xml_get_widget (glade_xml, "button_install");
gtk_widget_show (widget);
+ gtk_window_set_focus (GTK_WINDOW(main_window), widget);
widget = glade_xml_get_widget (glade_xml, "button_help");
gtk_widget_show (widget);
- gtk_window_set_focus (GTK_WINDOW(main_window), widget);
- widget = glade_xml_get_widget (glade_xml, "button_close");
+
+ /* use correct status pane */
+ widget = glade_xml_get_widget (glade_xml, "hbox_status");
gtk_widget_hide (widget);
+ widget = glade_xml_get_widget (glade_xml, "hbox_info");
+ gtk_widget_show (widget);
/* restart */
- widget = glade_xml_get_widget (glade_xml, "label_package");
+ widget = glade_xml_get_widget (glade_xml, "label_info");
if (restart_worst == PK_RESTART_ENUM_NONE) {
gtk_widget_hide (widget);
- widget = glade_xml_get_widget (glade_xml, "image_progress");
+ widget = glade_xml_get_widget (glade_xml, "image_info");
gtk_widget_hide (widget);
- widget = glade_xml_get_widget (glade_xml, "label_summary");
- gtk_label_set_label (GTK_LABEL (widget), "");
} else {
gtk_label_set_label (GTK_LABEL (widget), gpk_restart_enum_to_localised_text_future (restart_worst));
gtk_widget_show (widget);
- widget = glade_xml_get_widget (glade_xml, "image_progress");
+ widget = glade_xml_get_widget (glade_xml, "image_info");
gtk_image_set_from_icon_name (GTK_IMAGE (widget), gpk_restart_enum_to_icon_name (restart_worst), GTK_ICON_SIZE_BUTTON);
gtk_widget_show (widget);
}
@@ -616,6 +727,12 @@
egg_debug ("status %s", pk_status_enum_to_text (status));
+ /* use correct status pane */
+ widget = glade_xml_get_widget (glade_xml, "hbox_status");
+ gtk_widget_show (widget);
+ widget = glade_xml_get_widget (glade_xml, "hbox_info");
+ gtk_widget_hide (widget);
+
/* clear package */
if (status == PK_STATUS_ENUM_WAIT) {
widget = glade_xml_get_widget (glade_xml, "label_package");
@@ -630,7 +747,7 @@
gtk_widget_hide (widget);
goto out;
}
- if (status == PK_STATUS_ENUM_QUERY) {
+ if (status == PK_STATUS_ENUM_QUERY || status == PK_STATUS_ENUM_SETUP) {
/* TRANSLATORS: querying update list */
text = _("Getting the list of updates");
} else {
@@ -746,8 +863,10 @@
/* column for text */
renderer = gtk_cell_renderer_text_new ();
- g_object_set (renderer, "yalign", 0.0, NULL);
- g_object_set (renderer, "wrap-mode", PANGO_WRAP_WORD, NULL);
+ g_object_set (renderer,
+ "wrap-mode", PANGO_WRAP_WORD,
+ "ellipsize", PANGO_ELLIPSIZE_END,
+ NULL);
/* TRANSLATORS: a column that has name of the package that will be updated */
column = gtk_tree_view_column_new_with_attributes (_("Software"), renderer,
"markup", GPK_UPDATES_COLUMN_TEXT, NULL);
@@ -758,6 +877,10 @@
/* column for size */
renderer = gpk_cell_renderer_size_new ();
+ g_object_set (renderer,
+ "alignment", PANGO_ALIGN_RIGHT,
+ "xalign", 1.0f,
+ NULL);
/* TRANSLATORS: a column that has size of the package */
column = gtk_tree_view_column_new_with_attributes (_("Size"), renderer,
"value", GPK_UPDATES_COLUMN_SIZE, NULL);
@@ -788,60 +911,45 @@
}
/**
- * gpk_update_viewer_add_description_item:
+ * gpk_update_viewer_add_description_link_item:
**/
static void
-gpk_update_viewer_add_description_item (const gchar *text)
+gpk_update_viewer_add_description_link_item (GtkTextBuffer *buffer, GtkTextIter *iter, const gchar *title, const GPtrArray *array)
{
- GtkTextIter start;
- GtkTextIter iter;
-
- gtk_text_buffer_get_bounds (text_buffer, &start, &iter);
- gtk_text_buffer_insert_with_tags_by_name (text_buffer, &iter, text, -1, "para", NULL);
- gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
-}
+ GtkTextTag *tag;
+ const gchar *uri;
+ gint i;
-/**
- * gpk_update_viewer_add_markup_item:
- **/
-static void
-gpk_update_viewer_add_markup_item (const gchar *text)
-{
- GtkTextIter start;
- GtkTextIter iter;
- gtk_text_buffer_get_bounds (text_buffer, &start, &iter);
- gtk_text_buffer_insert_markup (text_buffer, &iter, text);
- gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
-}
+ /* insert at end */
+ gtk_text_buffer_insert_with_tags_by_name (buffer, iter, title, -1, "para", NULL);
-/**
- * gpk_text_buffer_insert_link:
- **/
-static void
-gpk_text_buffer_insert_link (GtkTextBuffer *buffer, GtkTextIter *iter, const gchar *text, const gchar *href)
-{
- GtkTextTag *tag;
- tag = gtk_text_buffer_create_tag (buffer, NULL,
- "foreground", "blue",
- "underline", PANGO_UNDERLINE_SINGLE,
- NULL);
- g_object_set_data (G_OBJECT (tag), "href", g_strdup (href));
- gtk_text_buffer_insert_with_tags (buffer, iter, text, -1, tag, NULL);
+ for (i=0; i<array->len; i++) {
+ uri = g_ptr_array_index (array, i);
+ gtk_text_buffer_insert (buffer, iter, "\n", -1);
+ gtk_text_buffer_insert (buffer, iter, "â ", -1);
+ tag = gtk_text_buffer_create_tag (buffer, NULL,
+ "foreground", "blue",
+ "underline", PANGO_UNDERLINE_SINGLE,
+ NULL);
+ g_object_set_data (G_OBJECT (tag), "href", g_strdup (uri));
+ gtk_text_buffer_insert_with_tags (buffer, iter, uri, -1, tag, NULL);
+ gtk_text_buffer_insert (buffer, iter, ".", -1);
+ }
+ gtk_text_buffer_insert (buffer, iter, "\n", -1);
}
/**
* gpk_update_viewer_add_description_link_item:
**/
-static void
-gpk_update_viewer_add_description_link_item (const gchar *title, const gchar *url_string)
+static GPtrArray *
+gpk_update_viewer_get_uris (const gchar *url_string)
{
- const gchar *text;
- const gchar *uri;
+ GPtrArray *array;
gchar **urls;
guint length;
gint i;
- GtkTextIter start;
- GtkTextIter iter;
+
+ array = g_ptr_array_new ();
urls = g_strsplit (url_string, ";", 0);
length = g_strv_length (urls);
@@ -852,68 +960,13 @@
length--;
}
- /* insert at end */
- gtk_text_buffer_get_bounds (text_buffer, &start, &iter);
- gtk_text_buffer_insert_with_tags_by_name (text_buffer, &iter, title, -1, "para", NULL);
-
- for (i=0; i<length; i+=2) {
- uri = urls[i];
- text = urls[i+1];
- if (egg_strzero (text))
- text = uri;
+ /* copy into array */
+ for (i=0; i<length; i+=2)
+ g_ptr_array_add (array, g_strdup (urls[i]));
- if (length == 2) {
- gpk_text_buffer_insert_link (text_buffer, &iter, text, uri);
- } else {
- gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
- gtk_text_buffer_insert (text_buffer, &iter, "â ", -1);
- gpk_text_buffer_insert_link (text_buffer, &iter, text, uri);
-// gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
- }
- }
- gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
- g_strfreev (urls);
+ return array;
}
-#if 0
-/**
- * gpk_update_viewer_get_pretty_from_composite:
- **/
-static gchar *
-gpk_update_viewer_get_pretty_from_composite (const gchar *package_ids_delimit)
-{
- guint i;
- guint length;
- gchar **package_ids;
- gchar *pretty = NULL;
- GString *string;
- PkPackageId *id;
-
- /* do we have any data? */
- if (egg_strzero (package_ids_delimit))
- goto out;
-
- string = g_string_new ("");
- package_ids = pk_package_ids_from_text (package_ids_delimit);
- length = g_strv_length (package_ids);
- for (i=0; i<length; i++) {
- id = pk_package_id_new_from_string (package_ids[i]);
- pretty = gpk_package_id_name_version (id);
- pk_package_id_free (id);
- g_string_append (string, pretty);
- g_string_append_c (string, ',');
- g_free (pretty);
- }
-
- /* remove trailing comma */
- g_string_set_size (string, string->len - 1);
- pretty = g_string_free (string, FALSE);
- g_strfreev (package_ids);
-out:
- return pretty;
-}
-#endif
-
/**
* gpk_update_viewer_populate_details:
**/
@@ -924,11 +977,14 @@
GtkTreeSelection *selection;
GtkTreeModel *model;
GtkTreeIter treeiter;
-// gchar *package_pretty;
+ GPtrArray *array;
PkInfoEnum info;
gchar *line;
+ gchar *line2;
+ const gchar *title;
gchar *issued;
gchar *updated;
+ GtkTextIter iter;
/* get info */
widget = glade_xml_get_widget (glade_xml, "treeview_updates");
@@ -941,26 +997,28 @@
/* blank */
gtk_text_buffer_set_text (text_buffer, "", -1);
+ gtk_text_buffer_get_start_iter (text_buffer, &iter);
if (info == PK_INFO_ENUM_ENHANCEMENT) {
/* TRANSLATORS: this is the update type, e.g. security */
- gpk_update_viewer_add_description_item (_("This update will add new features and expand functionality."));
+ gtk_text_buffer_insert_with_tags_by_name (text_buffer, &iter, ("This update will add new features and expand functionality."), -1, "para", NULL);
+ gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
} else if (info == PK_INFO_ENUM_BUGFIX) {
/* TRANSLATORS: this is the update type, e.g. security */
- gpk_update_viewer_add_description_item (_("This update will fix bugs and other non-critical problems."));
+ gtk_text_buffer_insert_with_tags_by_name (text_buffer, &iter, _("This update will fix bugs and other non-critical problems."), -1, "para", NULL);
+ gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
} else if (info == PK_INFO_ENUM_IMPORTANT) {
/* TRANSLATORS: this is the update type, e.g. security */
- line = g_strdup_printf ("<b>%s</b>", _("This update is important as it may solve critical problems."));
- gpk_update_viewer_add_markup_item (line);
- g_free (line);
+ gtk_text_buffer_insert_with_tags_by_name (text_buffer, &iter, _("This update is important as it may solve critical problems."), -1, "para", "important", NULL);
+ gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
} else if (info == PK_INFO_ENUM_SECURITY) {
/* TRANSLATORS: this is the update type, e.g. security */
- line = g_strdup_printf ("<b>%s</b>", _("This update is needed to fix a security vulnerability with this package."));
- gpk_update_viewer_add_markup_item (line);
- g_free (line);
+ gtk_text_buffer_insert_with_tags_by_name (text_buffer, &iter, _("This update is needed to fix a security vulnerability with this package."), -1, "para", "important", NULL);
+ gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
} else if (info == PK_INFO_ENUM_BLOCKED) {
/* TRANSLATORS: this is the update type, e.g. security */
- gpk_update_viewer_add_description_item (_("This update is blocked."));
+ gtk_text_buffer_insert_with_tags_by_name (text_buffer, &iter, _("This update is blocked."), -1, "para", NULL);
+ gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
}
/* issued and updated */
@@ -969,7 +1027,8 @@
updated = pk_iso8601_from_date (obj->updated);
/* TRANSLATORS: this is when the notification was issued and then updated*/
line = g_strdup_printf (_("This notification was issued on %s and last updated on %s."), issued, updated);
- gpk_update_viewer_add_description_item (line);
+ gtk_text_buffer_insert_with_tags_by_name (text_buffer, &iter, line, -1, "para", NULL);
+ gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
g_free (issued);
g_free (updated);
g_free (line);
@@ -977,7 +1036,8 @@
issued = pk_iso8601_from_date (obj->issued);
/* TRANSLATORS: this is when the update was issued */
line = g_strdup_printf (_("This notification was issued on %s."), issued);
- gpk_update_viewer_add_description_item (line);
+ gtk_text_buffer_insert_with_tags_by_name (text_buffer, &iter, line, -1, "para", NULL);
+ gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
g_free (issued);
g_free (line);
}
@@ -986,70 +1046,73 @@
if (!egg_strzero (obj->update_text)) {
/* convert the bullets */
line = egg_markdown_parse (markdown, obj->update_text);
- if (!egg_strzero (line))
- gpk_update_viewer_add_markup_item (line);
+ if (!egg_strzero (line)) {
+ gtk_text_buffer_insert_markup (text_buffer, &iter, line);
+ gtk_text_buffer_insert (text_buffer, &iter, "\n\n", -1);
+ }
g_free (line);
}
/* add all the links */
if (!egg_strzero (obj->vendor_url)) {
+ array = gpk_update_viewer_get_uris (obj->vendor_url);
/* TRANSLATORS: this is a list of vendor URLs */
- gpk_update_viewer_add_description_link_item (_("For more information about this update please visit:"), obj->vendor_url);
+ title = ngettext ("For more information about this update please visit this website:",
+ "For more information about this update please visit these websites:", array->len);
+ gpk_update_viewer_add_description_link_item (text_buffer, &iter, title, array);
+ g_ptr_array_foreach (array, (GFunc) g_free, NULL);
+ g_ptr_array_free (array, TRUE);
}
if (!egg_strzero (obj->bugzilla_url)) {
+ array = gpk_update_viewer_get_uris (obj->bugzilla_url);
/* TRANSLATORS: this is a list of bugzilla URLs */
- gpk_update_viewer_add_description_link_item (_("For more information about bugs fixed by this this update please visit:"), obj->bugzilla_url);
+ title = ngettext ("For more information about bugs fixed by this update please visit this website:",
+ "For more information about bugs fixed by this update please visit these websites:", array->len);
+ gpk_update_viewer_add_description_link_item (text_buffer, &iter, title, array);
+ g_ptr_array_foreach (array, (GFunc) g_free, NULL);
+ g_ptr_array_free (array, TRUE);
}
if (!egg_strzero (obj->cve_url)) {
+ array = gpk_update_viewer_get_uris (obj->cve_url);
/* TRANSLATORS: this is a list of CVE (security) URLs */
- gpk_update_viewer_add_description_link_item (_("For more information about this security update please visit:"), obj->cve_url);
+ title = ngettext ("For more information about this security update please visit this website:",
+ "For more information about this security update please visit these websites:", array->len);
+ gpk_update_viewer_add_description_link_item (text_buffer, &iter, title, array);
+ g_ptr_array_foreach (array, (GFunc) g_free, NULL);
+ g_ptr_array_free (array, TRUE);
}
/* reboot */
if (obj->restart == PK_RESTART_ENUM_SYSTEM) {
/* TRANSLATORS: reboot required */
- gpk_update_viewer_add_description_item (_("The computer will have to be restarted for the changes to take effect."));
+ gtk_text_buffer_insert_with_tags_by_name (text_buffer, &iter, _("The computer will have to be restarted after the update for the changes to take effect."), -1, "para", NULL);
+ gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
} else if (obj->restart == PK_RESTART_ENUM_SESSION) {
/* TRANSLATORS: log out required */
- gpk_update_viewer_add_description_item (_("You will need to log off and back on before the changes will take effect"));
+ gtk_text_buffer_insert_with_tags_by_name (text_buffer, &iter, _("You will need to log off and back on after the update for the changes to take effect."), -1, "para", NULL);
+ gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
}
/* state */
if (obj->state == PK_UPDATE_STATE_ENUM_UNSTABLE) {
/* TRANSLATORS: this is the stability status of the update */
- gpk_update_viewer_add_description_item (_("This update is unstable, and should not be used on production systems."));
+ gtk_text_buffer_insert_with_tags_by_name (text_buffer, &iter, _("The classifaction of this update is unstable which means it is not designed for production use."), -1, "para", NULL);
+ gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
} else if (obj->state == PK_UPDATE_STATE_ENUM_TESTING) {
/* TRANSLATORS: this is the stability status of the update */
- gpk_update_viewer_add_description_item (_("This is a test update, and should not be used on production systems."));
- }
-
-#if 0
- /* split and add */
- package_pretty = gpk_update_viewer_get_pretty_from_composite (obj->updates);
- if (!egg_strzero (package_pretty)) {
- /* TRANSLATORS: this is a list of packages that are updated */
- line = g_strdup_printf (_("This update replaces %s."), package_pretty);
- gpk_update_viewer_add_description_item (line);
- g_free (line);
+ gtk_text_buffer_insert_with_tags_by_name (text_buffer, &iter, _("This is a test update, and is not designed for normal use. Please report any problems or regressions you encounter."), -1, "para", NULL);
+ gtk_text_buffer_insert (text_buffer, &iter, "\n", -1);
}
- g_free (package_pretty);
-
- /* split and add */
- package_pretty = gpk_update_viewer_get_pretty_from_composite (obj->obsoletes);
- if (!egg_strzero (package_pretty)) {
- /* TRANSLATORS: this is a list of packages that are obsoleted */
- line = g_strdup_printf (_("This update obsoletes %s."), package_pretty);
- gpk_update_viewer_add_description_item (line);
- g_free (line);
- }
- g_free (package_pretty);
-#endif
/* changelog */
if (!egg_strzero (obj->changelog)) {
- /* TRANSLATORS: this is a ChangeLog */
- line = g_strdup_printf ("%s\n%s", _("List of changes:"), obj->changelog);
- gpk_update_viewer_add_description_item (line);
+ line = egg_markdown_parse (markdown, obj->changelog);
+ if (!egg_strzero (line)) {
+ /* TRANSLATORS: this is a ChangeLog */
+ line2 = g_strdup_printf ("\n%s\n%s\n", _("List of changes:"), line);
+ gtk_text_buffer_insert_markup (text_buffer, &iter, line2);
+ g_free (line2);
+ }
g_free (line);
}
}
@@ -1242,6 +1305,7 @@
GtkTreeSelection *selection;
PkRoleEnum role;
PkPackageList *list;
+ PkRestartEnum restart;
pk_client_get_role (client, &role, NULL, NULL);
egg_debug ("role: %s, exit: %s", pk_role_enum_to_text (role), pk_exit_enum_to_text (exit));
@@ -1314,6 +1378,11 @@
gpk_update_viewer_reconsider_info (model);
}
+ if (role == PK_ROLE_ENUM_GET_DISTRO_UPGRADES) {
+ /* set info */
+ gpk_update_viewer_reconsider_info (model);
+ }
+
/* we've just agreed to auth or a EULA */
if (role == PK_ROLE_ENUM_INSTALL_SIGNATURE ||
role == PK_ROLE_ENUM_ACCEPT_EULA) {
@@ -1328,6 +1397,11 @@
(role == PK_ROLE_ENUM_UPDATE_SYSTEM ||
role == PK_ROLE_ENUM_UPDATE_PACKAGES)) {
+ /* get the worst restart case */
+ restart = pk_client_get_require_restart (client_primary);
+ if (restart > restart_update)
+ restart_update = restart;
+
/* check blocked */
list = pk_client_get_package_list (client_primary);
gpk_update_viewer_check_blocked_packages (list);
@@ -1788,7 +1862,8 @@
for (tagp = tags; tagp != NULL; tagp = tagp->next) {
GtkTextTag *tag = tagp->data;
const gchar *href = (const gchar *) (g_object_get_data (G_OBJECT (tag), "href"));
- gpk_gnome_open (href);
+ if (href != NULL)
+ gpk_gnome_open (href);
}
if (tags != NULL)
@@ -1943,6 +2018,7 @@
GtkWidget *main_window;
GtkWidget *widget;
GtkTreeSelection *selection;
+ GtkRequisition req;
PkBitfield roles;
gboolean ret;
GError *error = NULL;
@@ -2057,26 +2133,23 @@
g_signal_connect (eula_helper, "event", G_CALLBACK (gpk_update_viewer_eula_event_cb), NULL);
gpk_eula_helper_set_parent (eula_helper, GTK_WINDOW (main_window));
- /* make GpkClient windows modal */
- gtk_widget_realize (main_window);
-
/* create list stores */
list_store_updates = gtk_list_store_new (GPK_UPDATES_COLUMN_LAST, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT,
G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_POINTER, G_TYPE_POINTER);
text_buffer = gtk_text_buffer_new (NULL);
gtk_text_buffer_create_tag (text_buffer, "para",
- "pixels_below_lines", 3,
- "pixels_above_lines", 3, NULL);
+ "pixels_above_lines", 5,
+ "wrap-mode", GTK_WRAP_WORD,
+ NULL);
+ gtk_text_buffer_create_tag (text_buffer, "important",
+ "weight", PANGO_WEIGHT_BOLD,
+ NULL);
/* no upgrades yet */
widget = glade_xml_get_widget (glade_xml, "viewport_upgrade");
gtk_widget_hide (widget);
- /* header */
- widget = glade_xml_get_widget (glade_xml, "hbox_header");
- gtk_widget_hide (widget);
-
/* description */
widget = glade_xml_get_widget (glade_xml, "textview_details");
gtk_text_view_set_buffer (GTK_TEXT_VIEW (widget), text_buffer);
@@ -2089,7 +2162,7 @@
/* updates */
widget = glade_xml_get_widget (glade_xml, "treeview_updates");
- gtk_widget_set_size_request (GTK_WIDGET (widget), 800, 200);
+ gtk_widget_set_size_request (GTK_WIDGET (widget), 750, 300);
gtk_tree_view_columns_autosize (GTK_TREE_VIEW (widget));
gtk_tree_view_set_model (GTK_TREE_VIEW (widget),
GTK_TREE_MODEL (list_store_updates));
@@ -2116,17 +2189,32 @@
g_signal_connect (widget, "clicked",
G_CALLBACK (gpk_update_viewer_button_help_cb), (gpointer) "update-viewer");
+ /* shutdown button */
+ widget = glade_xml_get_widget (glade_xml, "button_shutdown");
+ g_signal_connect (widget, "clicked",
+ G_CALLBACK (gpk_update_viewer_button_shutdown_cb), NULL);
+
+ /* logout button */
+ widget = glade_xml_get_widget (glade_xml, "button_logout");
+ g_signal_connect (widget, "clicked",
+ G_CALLBACK (gpk_update_viewer_button_logout_cb), NULL);
+
/* set install button insensitive */
widget = glade_xml_get_widget (glade_xml, "button_install");
gtk_widget_set_sensitive (widget, FALSE);
g_signal_connect (widget, "clicked",
G_CALLBACK (gpk_update_viewer_button_install_cb), NULL);
+ /* sensitive */
+ widget = glade_xml_get_widget (glade_xml, "scrolledwindow_updates");
+ gtk_widget_set_sensitive (widget, FALSE);
+ widget = glade_xml_get_widget (glade_xml, "scrolledwindow_details");
+ gtk_widget_set_sensitive (widget, FALSE);
+
/* close button */
widget = glade_xml_get_widget (glade_xml, "button_close");
g_signal_connect (widget, "clicked",
G_CALLBACK (gpk_update_viewer_button_close_cb), NULL);
- gtk_widget_hide (widget);
gtk_window_set_focus (GTK_WINDOW(main_window), widget);
/* hide cancel button */
@@ -2143,6 +2231,19 @@
/* show window */
gtk_widget_show (main_window);
+ /* set the paned to be in the middle */
+ widget = glade_xml_get_widget (glade_xml, "vpaned_updates");
+ gtk_widget_size_request (widget, &req);
+ egg_debug ("req.height=%i", req.height);
+ if (req.height != 0)
+ gtk_paned_set_position (GTK_PANED (widget), req.height / 2);
+
+ /* use correct status pane */
+ widget = glade_xml_get_widget (glade_xml, "label_status");
+ gtk_widget_set_size_request (widget, -1, 32);
+ widget = glade_xml_get_widget (glade_xml, "label_info");
+ gtk_widget_set_size_request (widget, -1, 32);
+
/* coldplug */
gpk_update_viewer_get_new_update_list ();
Modified: trunk/src/gpk-watch.c
==============================================================================
--- trunk/src/gpk-watch.c (original)
+++ trunk/src/gpk-watch.c Thu Mar 19 12:08:23 2009
@@ -1385,10 +1385,10 @@
/* TRANSLATORS: This button restarts the computer after an update */
_("_Restart computer"), NULL);
g_object_set (restart_action,
- "no-icon-name", "gnome-shutdown",
- "auth-icon-name", "gnome-shutdown",
- "yes-icon-name","gnome-shutdown",
- "self-blocked-icon-name", "gnome-shutdown",
+ "no-icon-name", "system-shutdown",
+ "auth-icon-name", "system-shutdown",
+ "yes-icon-name","system-shutdown",
+ "self-blocked-icon-name", "system-shutdown",
NULL);
polkit_action_unref (pk_action);
g_signal_connect (restart_action, "activate",
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]