netsurf/gtk/gtk_history.c

150 lines
3.5 KiB
C

/*
* This file is part of NetSurf, http://netsurf.sourceforge.net/
* Licensed under the GNU General Public License,
* http://www.opensource.org/licenses/gpl-license
* Copyright 2006 Rob Kendrick <rjek@rjek.com>
*/
#include <gtk/gtk.h>
#include <glade/glade.h>
#include "netsurf/utils/log.h"
#include "netsurf/content/urldb.h"
#include "netsurf/gtk/gtk_history.h"
#include "netsurf/gtk/gtk_gui.h"
enum
{
COL_TITLE = 0,
COL_ADDRESS,
COL_LASTVISIT,
COL_TOTALVISITS,
COL_THUMBNAIL,
COL_NCOLS
};
GtkWindow *wndHistory;
static GtkTreeView *treeview;
static GtkTreeStore *history_tree;
static GtkTreeSelection *selection;
static bool nsgtk_history_add_internal(const char *, const struct url_data *);
static void nsgtk_history_selection_changed(GtkTreeSelection *, gpointer);
void nsgtk_history_init(void)
{
GtkCellRenderer *renderer;
wndHistory = GTK_WINDOW(glade_xml_get_widget(gladeWindows,
"wndHistory"));
treeview = GTK_TREE_VIEW(glade_xml_get_widget(gladeWindows,
"treeHistory"));
history_tree = gtk_tree_store_new(COL_NCOLS,
G_TYPE_STRING, /* title */
G_TYPE_STRING, /* address */
G_TYPE_STRING, /* last visit */
G_TYPE_INT, /* nr. visits */
GDK_TYPE_PIXBUF); /* thumbnail */
selection = gtk_tree_view_get_selection(treeview);
gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
g_signal_connect(G_OBJECT(selection), "changed",
G_CALLBACK(nsgtk_history_selection_changed), NULL);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes(treeview, -1, "Title",
renderer,
"text",
COL_TITLE,
NULL);
gtk_tree_view_set_model(treeview, GTK_TREE_MODEL(history_tree));
nsgtk_history_update();
}
void nsgtk_history_update(void)
{
gtk_tree_store_clear(history_tree);
urldb_iterate_entries(nsgtk_history_add_internal);
}
bool nsgtk_history_add_internal(const char *url, const struct url_data *data)
{
GtkTreeIter iter;
if (data->visits > 0)
{
gtk_tree_store_append(history_tree, &iter, NULL);
gtk_tree_store_set(history_tree, &iter,
COL_TITLE, data->title,
COL_ADDRESS, url,
COL_LASTVISIT, "Unknown",
COL_TOTALVISITS, data->visits,
-1);
}
return true;
}
void nsgtk_history_selection_changed(GtkTreeSelection *treesel, gpointer g)
{
GtkTreeIter iter;
if (gtk_tree_selection_get_selected(treesel, &history_tree, &iter))
{
gchar *b;
gint i;
char buf[20];
gtk_tree_model_get(history_tree, &iter, COL_ADDRESS, &b, -1);
gtk_label_set_text(GTK_LABEL(glade_xml_get_widget(gladeWindows,
"labelHistoryAddress")), b);
gtk_tree_model_get(history_tree, &iter, COL_LASTVISIT, &b, -1);
gtk_label_set_text(GTK_LABEL(glade_xml_get_widget(gladeWindows,
"labelHistoryLastVisit")), b);
gtk_tree_model_get(history_tree, &iter, COL_TOTALVISITS,
&i, -1);
snprintf(buf, 20, "%d", i);
gtk_label_set_text(GTK_LABEL(glade_xml_get_widget(gladeWindows,
"labelHistoryVisits")), buf);
}
else
{
}
}
void nsgtk_history_row_activated(GtkTreeView *tv, GtkTreePath *path,
GtkTreeViewColumn *column, gpointer g)
{
GtkTreeModel *model;
GtkTreeIter iter;
model = gtk_tree_view_get_model(tv);
if (gtk_tree_model_get_iter(model, &iter, path))
{
gchar *b;
gtk_tree_model_get(model, &iter, COL_ADDRESS, &b, -1);
browser_window_create((const char *)b, NULL, NULL, true);
}
}
void global_history_add(const char *url)
{
const struct url_data *data;
data = urldb_get_url_data(url);
if (!data)
return;
nsgtk_history_add_internal(url, data);
}