use crate::ffi;
use glib::{
    prelude::*,
    signal::{connect_raw, SignalHandlerId},
    translate::*,
};
use std::boxed::Box as Box_;
glib::wrapper! {
    #[doc(alias = "GtkSourceSnippetContext")]
    pub struct SnippetContext(Object<ffi::GtkSourceSnippetContext, ffi::GtkSourceSnippetContextClass>);
    match fn {
        type_ => || ffi::gtk_source_snippet_context_get_type(),
    }
}
impl SnippetContext {
    #[doc(alias = "gtk_source_snippet_context_new")]
    pub fn new() -> SnippetContext {
        assert_initialized_main_thread!();
        unsafe { from_glib_full(ffi::gtk_source_snippet_context_new()) }
    }
    #[doc(alias = "gtk_source_snippet_context_clear_variables")]
    pub fn clear_variables(&self) {
        unsafe {
            ffi::gtk_source_snippet_context_clear_variables(self.to_glib_none().0);
        }
    }
    #[doc(alias = "gtk_source_snippet_context_expand")]
    pub fn expand(&self, input: &str) -> glib::GString {
        unsafe {
            from_glib_full(ffi::gtk_source_snippet_context_expand(
                self.to_glib_none().0,
                input.to_glib_none().0,
            ))
        }
    }
    #[doc(alias = "gtk_source_snippet_context_get_variable")]
    #[doc(alias = "get_variable")]
    pub fn variable(&self, key: &str) -> Option<glib::GString> {
        unsafe {
            from_glib_none(ffi::gtk_source_snippet_context_get_variable(
                self.to_glib_none().0,
                key.to_glib_none().0,
            ))
        }
    }
    #[doc(alias = "gtk_source_snippet_context_set_constant")]
    pub fn set_constant(&self, key: &str, value: &str) {
        unsafe {
            ffi::gtk_source_snippet_context_set_constant(
                self.to_glib_none().0,
                key.to_glib_none().0,
                value.to_glib_none().0,
            );
        }
    }
    #[doc(alias = "gtk_source_snippet_context_set_line_prefix")]
    pub fn set_line_prefix(&self, line_prefix: &str) {
        unsafe {
            ffi::gtk_source_snippet_context_set_line_prefix(
                self.to_glib_none().0,
                line_prefix.to_glib_none().0,
            );
        }
    }
    #[doc(alias = "gtk_source_snippet_context_set_tab_width")]
    pub fn set_tab_width(&self, tab_width: i32) {
        unsafe {
            ffi::gtk_source_snippet_context_set_tab_width(self.to_glib_none().0, tab_width);
        }
    }
    #[doc(alias = "gtk_source_snippet_context_set_use_spaces")]
    pub fn set_use_spaces(&self, use_spaces: bool) {
        unsafe {
            ffi::gtk_source_snippet_context_set_use_spaces(
                self.to_glib_none().0,
                use_spaces.into_glib(),
            );
        }
    }
    #[doc(alias = "gtk_source_snippet_context_set_variable")]
    pub fn set_variable(&self, key: &str, value: &str) {
        unsafe {
            ffi::gtk_source_snippet_context_set_variable(
                self.to_glib_none().0,
                key.to_glib_none().0,
                value.to_glib_none().0,
            );
        }
    }
    #[doc(alias = "changed")]
    pub fn connect_changed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
        unsafe extern "C" fn changed_trampoline<F: Fn(&SnippetContext) + 'static>(
            this: *mut ffi::GtkSourceSnippetContext,
            f: glib::ffi::gpointer,
        ) {
            let f: &F = &*(f as *const F);
            f(&from_glib_borrow(this))
        }
        unsafe {
            let f: Box_<F> = Box_::new(f);
            connect_raw(
                self.as_ptr() as *mut _,
                b"changed\0".as_ptr() as *const _,
                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
                    changed_trampoline::<F> as *const (),
                )),
                Box_::into_raw(f),
            )
        }
    }
}
impl Default for SnippetContext {
    fn default() -> Self {
        Self::new()
    }
}