/* -*- Mode: C; indent-tabs-mode:nil; c-basic-offset: 8-*- */

/* libcroco - Library for parsing and applying CSS
 * Copyright (C) 2006-2019 Free Software Foundation, Inc.
 *
 * This file is not part of the GNU gettext program, but is used with
 * GNU gettext.
 *
 * The original copyright notice is as follows:
 */

/*
 * This file is part of The Croco Library
 *
 * Copyright (C) 2003-2004 Dodji Seketeli.  All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of version 2.1 of the GNU Lesser General Public
 * License as published by the Free Software Foundation.
 *
 * This program 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 Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 * USA
 *
 * Author: Dodji Seketeli
 */

#ifndef __CR_SEL_ENG_H__
#define __CR_SEL_ENG_H__

#include "cr-utils.h"
#include "cr-stylesheet.h"
#include "cr-cascade.h"
#include "cr-style.h"
#include "cr-prop-list.h"

#include <libxml/tree.h>

/**
 *@file:
 *The declaration of the  #CRSelEng class.
 *The #CRSelEng is actually the "Selection Engine"
 *class.
 */

G_BEGIN_DECLS

typedef struct _CRSelEng CRSelEng ;
typedef struct _CRSelEngPriv CRSelEngPriv ;

/**
 *The Selection engine class.
 *The main service provided by this class, is
 *the ability to interpret a libcroco implementation
 *of css2 selectors, and given an xml node, say if
 *the selector matches the node or not.
 */
struct _CRSelEng
{
	CRSelEngPriv *priv ;
} ;


typedef gboolean (*CRPseudoClassSelectorHandler) (CRSelEng* a_this,
                                                  CRAdditionalSel *a_add_sel,
                                                  xmlNode *a_node) ;
CRSelEng * cr_sel_eng_new (void) ;

enum CRStatus cr_sel_eng_register_pseudo_class_sel_handler (CRSelEng *a_this,
                                                            guchar *a_pseudo_class_sel_name,
                                                            enum CRPseudoType a_pseudo_class_type,
                                                            CRPseudoClassSelectorHandler a_handler) ;

enum CRStatus cr_sel_eng_unregister_pseudo_class_sel_handler (CRSelEng *a_this,
                                                              guchar *a_pseudo_class_sel_name,
                                                              enum CRPseudoType a_pseudo_class_type) ;

enum CRStatus cr_sel_eng_unregister_all_pseudo_class_sel_handlers (CRSelEng *a_this) ;

enum CRStatus cr_sel_eng_get_pseudo_class_selector_handler (CRSelEng *a_this,
                                                            guchar *a_pseudo_class_sel_name,
                                                            enum CRPseudoType a_pseudo_class_type,
                                                            CRPseudoClassSelectorHandler *a_handler) ;

enum CRStatus cr_sel_eng_matches_node (CRSelEng *a_this, 
                                       CRSimpleSel *a_sel,
                                       xmlNode *a_node, 
                                       gboolean *a_result) ;

enum CRStatus cr_sel_eng_get_matched_rulesets (CRSelEng *a_this,
                                               CRStyleSheet *a_sheet,
                                               xmlNode *a_node,
                                               CRStatement ***a_rulesets,
                                               gulong *a_len) ;

enum CRStatus
cr_sel_eng_get_matched_properties_from_cascade  (CRSelEng *a_this,
                                                 CRCascade *a_cascade,
                                                 xmlNode *a_node,
                                                 CRPropList **a_props) ;

enum CRStatus cr_sel_eng_get_matched_style (CRSelEng *a_this,
                                            CRCascade *a_cascade,
                                            xmlNode *a_node,
                                            CRStyle *a_parent_style,
                                            CRStyle **a_style,
                                            gboolean a_set_props_to_initial_values) ;

void cr_sel_eng_destroy (CRSelEng *a_this) ;

G_END_DECLS


#endif/*__CR_SEL_ENG_H__*/
