|
Packit |
a7d494 |
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; coding: utf-8 -*-
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* This file is part of GtkSourceView
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* Copyright (C) 2014 - Christian Hergert
|
|
Packit |
a7d494 |
* Copyright (C) 2014 - Ignacio Casal Quinteiro
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* GtkSourceView is free software; you can redistribute it and/or
|
|
Packit |
a7d494 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
a7d494 |
* License as published by the Free Software Foundation; either
|
|
Packit |
a7d494 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* GtkSourceView is distributed in the hope that it will be useful,
|
|
Packit |
a7d494 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
a7d494 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
a7d494 |
* Lesser General Public License for more details.
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* You should have received a copy of the GNU Lesser General Public License
|
|
Packit |
a7d494 |
* along with GtkSourceView. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
a7d494 |
*/
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
a7d494 |
#include <config.h>
|
|
Packit |
a7d494 |
#endif
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
#include "gtksourcestyleschemechooserbutton.h"
|
|
Packit |
a7d494 |
#include "gtksourcestyleschemechooser.h"
|
|
Packit |
a7d494 |
#include "gtksourcestyleschemechooserwidget.h"
|
|
Packit |
a7d494 |
#include "gtksourcestylescheme.h"
|
|
Packit |
a7d494 |
#include "gtksourceview-i18n.h"
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/**
|
|
Packit |
a7d494 |
* SECTION:styleschemechooserbutton
|
|
Packit |
a7d494 |
* @Short_description: A button to launch a style scheme selection dialog
|
|
Packit |
a7d494 |
* @Title: GtkSourceStyleSchemeChooserButton
|
|
Packit |
a7d494 |
* @See_also: #GtkSourceStyleSchemeChooserWidget
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* The #GtkSourceStyleSchemeChooserButton is a button which displays
|
|
Packit |
a7d494 |
* the currently selected style scheme and allows to open a style scheme
|
|
Packit |
a7d494 |
* selection dialog to change the style scheme.
|
|
Packit |
a7d494 |
* It is suitable widget for selecting a style scheme in a preference dialog.
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* In #GtkSourceStyleSchemeChooserButton, a #GtkSourceStyleSchemeChooserWidget
|
|
Packit |
a7d494 |
* is used to provide a dialog for selecting style schemes.
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* Since: 3.16
|
|
Packit |
a7d494 |
*/
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
typedef struct
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
GtkSourceStyleScheme *scheme;
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
GtkWidget *dialog;
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserWidget *chooser;
|
|
Packit |
a7d494 |
} GtkSourceStyleSchemeChooserButtonPrivate;
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
static void gtk_source_style_scheme_chooser_button_style_scheme_chooser_interface_init (GtkSourceStyleSchemeChooserInterface *iface);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
G_DEFINE_TYPE_WITH_CODE (GtkSourceStyleSchemeChooserButton,
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_button,
|
|
Packit |
a7d494 |
GTK_TYPE_BUTTON,
|
|
Packit |
a7d494 |
G_ADD_PRIVATE (GtkSourceStyleSchemeChooserButton)
|
|
Packit |
a7d494 |
G_IMPLEMENT_INTERFACE (GTK_SOURCE_TYPE_STYLE_SCHEME_CHOOSER,
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_button_style_scheme_chooser_interface_init))
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
#define GET_PRIV(o) gtk_source_style_scheme_chooser_button_get_instance_private (o)
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
enum
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
PROP_0,
|
|
Packit |
a7d494 |
PROP_STYLE_SCHEME
|
|
Packit |
a7d494 |
};
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
static void
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_button_dispose (GObject *object)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserButton *button = GTK_SOURCE_STYLE_SCHEME_CHOOSER_BUTTON (object);
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (button);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_clear_object (&priv->scheme);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
G_OBJECT_CLASS (gtk_source_style_scheme_chooser_button_parent_class)->dispose (object);
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
static void
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_button_get_property (GObject *object,
|
|
Packit |
a7d494 |
guint prop_id,
|
|
Packit |
a7d494 |
GValue *value,
|
|
Packit |
a7d494 |
GParamSpec *pspec)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
switch (prop_id)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
case PROP_STYLE_SCHEME:
|
|
Packit |
a7d494 |
g_value_set_object (value,
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_get_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (object)));
|
|
Packit |
a7d494 |
break;
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
default:
|
|
Packit |
a7d494 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
static void
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_button_set_property (GObject *object,
|
|
Packit |
a7d494 |
guint prop_id,
|
|
Packit |
a7d494 |
const GValue *value,
|
|
Packit |
a7d494 |
GParamSpec *pspec)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
switch (prop_id)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
case PROP_STYLE_SCHEME:
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_set_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (object),
|
|
Packit |
a7d494 |
g_value_get_object (value));
|
|
Packit |
a7d494 |
break;
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
default:
|
|
Packit |
a7d494 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
static void
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_button_constructed (GObject *object)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserButton *button = GTK_SOURCE_STYLE_SCHEME_CHOOSER_BUTTON (object);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
G_OBJECT_CLASS (gtk_source_style_scheme_chooser_button_parent_class)->constructed (object);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_set_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (button),
|
|
Packit |
a7d494 |
_gtk_source_style_scheme_get_default ());
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
static gboolean
|
|
Packit |
a7d494 |
dialog_destroy (GtkWidget *widget,
|
|
Packit |
a7d494 |
gpointer data)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserButton *button = GTK_SOURCE_STYLE_SCHEME_CHOOSER_BUTTON (data);
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (button);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
priv->dialog = NULL;
|
|
Packit |
a7d494 |
priv->chooser = NULL;
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
return FALSE;
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
static void
|
|
Packit |
a7d494 |
dialog_response (GtkDialog *dialog,
|
|
Packit |
a7d494 |
gint response,
|
|
Packit |
a7d494 |
gpointer data)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
if (response == GTK_RESPONSE_CANCEL)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
gtk_widget_hide (GTK_WIDGET (dialog));
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
else if (response == GTK_RESPONSE_OK)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserButton *button = GTK_SOURCE_STYLE_SCHEME_CHOOSER_BUTTON (data);
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (button);
|
|
Packit |
a7d494 |
GtkSourceStyleScheme *scheme;
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
scheme = gtk_source_style_scheme_chooser_get_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (priv->chooser));
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_widget_hide (GTK_WIDGET (dialog));
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_set_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (button),
|
|
Packit |
a7d494 |
scheme);
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* Create the dialog and connects its buttons */
|
|
Packit |
a7d494 |
static void
|
|
Packit |
a7d494 |
ensure_dialog (GtkSourceStyleSchemeChooserButton *button)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (button);
|
|
Packit |
a7d494 |
GtkWidget *parent, *dialog, *scrolled_window;
|
|
Packit |
a7d494 |
GtkWidget *content_area;
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
if (priv->dialog != NULL)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
return;
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
parent = gtk_widget_get_toplevel (GTK_WIDGET (button));
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/* TODO: have a ChooserDialog? */
|
|
Packit |
a7d494 |
priv->dialog = dialog = gtk_dialog_new_with_buttons (_("Select a Style"),
|
|
Packit |
a7d494 |
GTK_WINDOW (parent),
|
|
Packit |
a7d494 |
GTK_DIALOG_DESTROY_WITH_PARENT |
|
|
Packit |
a7d494 |
GTK_DIALOG_USE_HEADER_BAR,
|
|
Packit |
a7d494 |
_("_Cancel"), GTK_RESPONSE_CANCEL,
|
|
Packit |
a7d494 |
_("_Select"), GTK_RESPONSE_OK,
|
|
Packit |
a7d494 |
NULL);
|
|
Packit |
a7d494 |
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
|
|
Packit |
a7d494 |
gtk_widget_set_size_request (scrolled_window, 325, 350);
|
|
Packit |
a7d494 |
gtk_widget_show (scrolled_window);
|
|
Packit |
a7d494 |
gtk_widget_set_hexpand (scrolled_window, TRUE);
|
|
Packit |
a7d494 |
gtk_widget_set_vexpand (scrolled_window, TRUE);
|
|
Packit |
a7d494 |
content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
|
|
Packit |
a7d494 |
gtk_container_add (GTK_CONTAINER (content_area), scrolled_window);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
priv->chooser = GTK_SOURCE_STYLE_SCHEME_CHOOSER_WIDGET (gtk_source_style_scheme_chooser_widget_new ());
|
|
Packit |
a7d494 |
gtk_widget_show (GTK_WIDGET (priv->chooser));
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_set_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (priv->chooser),
|
|
Packit |
a7d494 |
priv->scheme);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_container_add (GTK_CONTAINER (scrolled_window), GTK_WIDGET (priv->chooser));
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
if (gtk_widget_is_toplevel (parent) && GTK_IS_WINDOW (parent))
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
if (GTK_WINDOW (parent) != gtk_window_get_transient_for (GTK_WINDOW (dialog)))
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent));
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_window_set_modal (GTK_WINDOW (dialog),
|
|
Packit |
a7d494 |
gtk_window_get_modal (GTK_WINDOW (parent)));
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_signal_connect (dialog, "response",
|
|
Packit |
a7d494 |
G_CALLBACK (dialog_response), button);
|
|
Packit |
a7d494 |
g_signal_connect (dialog, "destroy",
|
|
Packit |
a7d494 |
G_CALLBACK (dialog_destroy), button);
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
static void
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_button_clicked (GtkButton *button)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserButton *cbutton = GTK_SOURCE_STYLE_SCHEME_CHOOSER_BUTTON (button);
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (cbutton);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
ensure_dialog (cbutton);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_set_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (priv->chooser),
|
|
Packit |
a7d494 |
priv->scheme);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
gtk_window_present (GTK_WINDOW (priv->dialog));
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
static void
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_button_class_init (GtkSourceStyleSchemeChooserButtonClass *klass)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
Packit |
a7d494 |
GtkButtonClass *button_class = GTK_BUTTON_CLASS (klass);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
object_class->dispose = gtk_source_style_scheme_chooser_button_dispose;
|
|
Packit |
a7d494 |
object_class->get_property = gtk_source_style_scheme_chooser_button_get_property;
|
|
Packit |
a7d494 |
object_class->set_property = gtk_source_style_scheme_chooser_button_set_property;
|
|
Packit |
a7d494 |
object_class->constructed = gtk_source_style_scheme_chooser_button_constructed;
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
button_class->clicked = gtk_source_style_scheme_chooser_button_clicked;
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_object_class_override_property (object_class, PROP_STYLE_SCHEME, "style-scheme");
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
static void
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_button_init (GtkSourceStyleSchemeChooserButton *button)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
static GtkSourceStyleScheme *
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_button_get_style_scheme (GtkSourceStyleSchemeChooser *chooser)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserButton *button = GTK_SOURCE_STYLE_SCHEME_CHOOSER_BUTTON (chooser);
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (button);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
return priv->scheme;
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
static void
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_button_update_label (GtkSourceStyleSchemeChooserButton *button)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (button);
|
|
Packit |
a7d494 |
const gchar *label;
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
label = priv->scheme != NULL ? gtk_source_style_scheme_get_name (priv->scheme) : NULL;
|
|
Packit |
a7d494 |
gtk_button_set_label (GTK_BUTTON (button), label);
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
static void
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_button_set_style_scheme (GtkSourceStyleSchemeChooser *chooser,
|
|
Packit |
a7d494 |
GtkSourceStyleScheme *scheme)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserButton *button = GTK_SOURCE_STYLE_SCHEME_CHOOSER_BUTTON (chooser);
|
|
Packit |
a7d494 |
GtkSourceStyleSchemeChooserButtonPrivate *priv = GET_PRIV (button);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
if (g_set_object (&priv->scheme, scheme))
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_button_update_label (button);
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
g_object_notify (G_OBJECT (button), "style-scheme");
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
static void
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_button_style_scheme_chooser_interface_init (GtkSourceStyleSchemeChooserInterface *iface)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
iface->get_style_scheme = gtk_source_style_scheme_chooser_button_get_style_scheme;
|
|
Packit |
a7d494 |
iface->set_style_scheme = gtk_source_style_scheme_chooser_button_set_style_scheme;
|
|
Packit |
a7d494 |
}
|
|
Packit |
a7d494 |
|
|
Packit |
a7d494 |
/**
|
|
Packit |
a7d494 |
* gtk_source_style_scheme_chooser_button_new:
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* Creates a new #GtkSourceStyleSchemeChooserButton.
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* Returns: a new #GtkSourceStyleSchemeChooserButton.
|
|
Packit |
a7d494 |
*
|
|
Packit |
a7d494 |
* Since: 3.16
|
|
Packit |
a7d494 |
*/
|
|
Packit |
a7d494 |
GtkWidget *
|
|
Packit |
a7d494 |
gtk_source_style_scheme_chooser_button_new (void)
|
|
Packit |
a7d494 |
{
|
|
Packit |
a7d494 |
return g_object_new (GTK_SOURCE_TYPE_STYLE_SCHEME_CHOOSER_BUTTON, NULL);
|
|
Packit |
a7d494 |
}
|