/*
* Tab page
*
* Copyright (C) 2017 Patrick McDermott
*
* This file is part of Marquee.
*
* Marquee is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Marquee is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Marquee. If not, see .
*/
#include "tab-page.h"
#include
#include
#include
#include
#include
#include "application.h"
#include "i18n.h"
#include "notebook.h"
#include "tab-label.h"
#include "toolbars/find-toolbar.h"
#include "toolbars/navigation-toolbar.h"
#include "web-view.h"
#include "window.h"
struct _MqTabPage {
GtkBox parent_instance;
MqWindow *window;
gchar *uri;
guint position;
MqApplication *application;
guint64 id;
GtkWidget *label;
gboolean title_init;
const gchar *title;
WebKitWebView *web_view;
gulong title_handler_id;
GtkWidget *navigation_toolbar;
};
enum {
PROP_WINDOW = 1,
PROP_URI,
N_PROPERTIES
};
static GParamSpec *obj_properties[N_PROPERTIES] = {NULL,};
struct _MqTabPageClass {
GtkBoxClass parent_class;
};
G_DEFINE_TYPE(MqTabPage, mq_tab_page, GTK_TYPE_BOX)
static void
title_cb(WebKitWebView *web_view, GParamSpec G_GNUC_UNUSED *param_spec,
MqTabPage *tab_page)
{
tab_page->title_init = TRUE;
tab_page->title = webkit_web_view_get_title(web_view);
mq_notebook_update_tab_title(
MQ_NOTEBOOK(gtk_widget_get_parent(GTK_WIDGET(tab_page))),
tab_page,
tab_page->title);
}
static void
init_non_root(MqTabPage *tab_page)
{
GtkWidget *find_toolbar;
tab_page->application = mq_window_get_application(tab_page->window);
tab_page->id = mq_application_register_tab(tab_page->application,
tab_page);
tab_page->web_view = WEBKIT_WEB_VIEW(mq_web_view_new(tab_page,
tab_page->uri));
tab_page->title_handler_id = g_signal_connect(tab_page->web_view,
"notify::title", G_CALLBACK(title_cb), tab_page);
tab_page->label = mq_tab_label_new(tab_page,
MQ_WEB_VIEW(tab_page->web_view));
find_toolbar = mq_find_toolbar_new(MQ_WEB_VIEW(tab_page->web_view));
tab_page->navigation_toolbar = mq_navigation_toolbar_new(
mq_application_get_config(
mq_window_get_application(tab_page->window)),
tab_page, MQ_FIND_TOOLBAR(find_toolbar),
MQ_WEB_VIEW(tab_page->web_view), tab_page->uri);
gtk_box_pack_start(GTK_BOX(tab_page),
tab_page->navigation_toolbar, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(tab_page),
find_toolbar, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(tab_page),
GTK_WIDGET(tab_page->web_view), TRUE, TRUE, 0);
}
static void
constructed(GObject *object)
{
MqTabPage *tab_page;
if (G_OBJECT_CLASS(mq_tab_page_parent_class)->constructed) {
G_OBJECT_CLASS(mq_tab_page_parent_class)->constructed(object);
}
tab_page = MQ_TAB_PAGE(object);
init_non_root(tab_page);
}
static void
finalize(GObject *object)
{
MqTabPage *tab_page;
tab_page = MQ_TAB_PAGE(object);
g_free(tab_page->uri);
mq_application_unregister_tab(tab_page->application, tab_page->id);
G_OBJECT_CLASS(mq_tab_page_parent_class)->finalize(object);
}
static void
get_property(GObject *object, guint property_id, GValue *value,
GParamSpec *param_spec)
{
MqTabPage *tab_page;
tab_page = MQ_TAB_PAGE(object);
switch (property_id) {
case PROP_WINDOW:
g_value_set_object(value, tab_page->window);
break;
case PROP_URI:
g_value_set_string(value, tab_page->uri);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id,
param_spec);
break;
}
}
static void
set_property(GObject *object, guint property_id, const GValue *value,
GParamSpec *param_spec)
{
MqTabPage *tab_page;
tab_page = MQ_TAB_PAGE(object);
switch (property_id) {
case PROP_WINDOW:
tab_page->window = g_value_get_object(value);
break;
case PROP_URI:
g_free(tab_page->uri);
tab_page->uri = g_strdup(g_value_get_string(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id,
param_spec);
break;
}
}
static void
mq_tab_page_class_init(MqTabPageClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS(klass);
object_class->constructed = constructed;
object_class->finalize = finalize;
object_class->get_property = get_property;
object_class->set_property = set_property;
obj_properties[PROP_WINDOW] = g_param_spec_object(
"window",
P_("MqWindow"),
P_("The parent MqWindow instance"),
MQ_TYPE_WINDOW,
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB);
obj_properties[PROP_URI] = g_param_spec_string(
"uri",
P_("URI"),
P_("The URI to load"),
"",
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB);
g_object_class_install_properties(object_class, N_PROPERTIES,
obj_properties);
}
static void
mq_tab_page_init(MqTabPage *tab_page)
{
tab_page->title = _("New Tab");
}
MqTabPage *
mq_tab_page_new(MqWindow *window, const gchar *uri)
{
return g_object_new(MQ_TYPE_TAB_PAGE,
"orientation", GTK_ORIENTATION_VERTICAL,
"spacing", 0,
"window", window,
"uri", uri,
NULL);
}
void
mq_tab_page_close(MqTabPage *tab_page)
{
mq_notebook_remove_page(
MQ_NOTEBOOK(gtk_widget_get_parent(GTK_WIDGET(tab_page))),
tab_page);
}
void
mq_tab_page_quit(MqTabPage *tab_page)
{
mq_window_quit(tab_page->window);
}
MqApplication *
mq_tab_page_get_application(MqTabPage *tab_page)
{
return tab_page->application;
}
MqWindow *
mq_tab_page_get_window(MqTabPage *tab_page)
{
return tab_page->window;
}
MqTabLabel *
mq_tab_page_get_label(MqTabPage *tab_page)
{
return MQ_TAB_LABEL(tab_page->label);
}
guint64
mq_tab_page_get_id(MqTabPage *tab_page)
{
return tab_page->id;
}
guint
mq_tab_page_get_position(MqTabPage *tab_page)
{
return tab_page->position;
}
void
mq_tab_page_set_position(MqTabPage *tab_page, guint position)
{
tab_page->position = position;
}
MqWebView *
mq_tab_page_get_web_view(MqTabPage *tab_page)
{
return MQ_WEB_VIEW(tab_page->web_view);
}
const gchar *
mq_tab_page_get_title(MqTabPage *tab_page)
{
return tab_page->title;
}
void
mq_tab_page_set_title(MqTabPage *tab_page, const gchar *title)
{
if (title) {
tab_page->title = title;
g_signal_handler_block(tab_page->web_view,
tab_page->title_handler_id);
} else {
tab_page->title = webkit_web_view_get_title(tab_page->web_view);
if (tab_page->title_init) {
g_signal_handler_unblock(tab_page->web_view,
tab_page->title_handler_id);
} else {
if (tab_page->title) {
tab_page->title_init = TRUE;
} else {
tab_page->title = _("New Tab");
}
}
}
mq_notebook_update_tab_title(
MQ_NOTEBOOK(gtk_widget_get_parent(GTK_WIDGET(tab_page))),
tab_page,
tab_page->title);
}
void
mq_tab_page_focus_uri_entry(MqTabPage *tab_page)
{
mq_navigation_toolbar_focus_uri_entry(
MQ_NAVIGATION_TOOLBAR(tab_page->navigation_toolbar));
}
void
mq_tab_page_focus_web_view(MqTabPage *tab_page)
{
mq_web_view_grab_focus(MQ_WEB_VIEW(tab_page->web_view));
}