/**
 * @brief The QgsMapLayerComboBox class is a combo box which displays the list of layers
 * @note added in 2.3
 */
class QgsMapLayerComboBox : QComboBox
{

%TypeHeaderCode
#include "qgsmaplayercombobox.h"
%End

  public:
    /**
     * @brief QgsMapLayerComboBox creates a combo box to dislpay the list of layers (currently in the registry).
     * The layers can be filtered and/or ordered.
     */
    explicit QgsMapLayerComboBox( QWidget *parent /TransferThis/ = 0 );

    //! setFilters allows fitering according to layer type and/or geometry type.
    void setFilters( const QgsMapLayerProxyModel::Filters& filters );

    //! currently used filter on list layers
    QgsMapLayerProxyModel::Filters filters() const;

    //! except a list of layers not to be listed
    void setExceptedLayerList( const QList<QgsMapLayer*>& layerList );

    //! returns the list of excepted layers
    QList<QgsMapLayer*> exceptedLayerList() const;

    /**
     * Sets a list of data providers which should be excluded from the combobox.
     * @note added in QGIS 3.0
     * @see excludedProviders()
     */
    void setExcludedProviders( const QStringList& providers );

    /**
     * Returns the list of data providers which are excluded from the combobox.
     * @see setExcludedProviders()
     * @note added in QGIS 3.0
     */
    QStringList excludedProviders() const;

    /**
     * Sets whether an optional empty layer ("not set") option is shown in the combo box.
     * @see allowEmptyLayer()
     * @note added in QGIS 3.0
     */
    void setAllowEmptyLayer( bool allowEmpty );

    /**
     * Returns true if the combo box allows the empty layer ("not set") choice.
     * @see setAllowEmptyLayer()
     * @note added in QGIS 3.0
     */
    bool allowEmptyLayer() const;

    /**
     * Sets whether the CRS of layers is also included in the combo box text.
     * @see showCrs()
     * @note added in QGIS 3.0
     */
    void setShowCrs( bool showCrs );

    /**
     * Returns true if the combo box shows the layer's CRS.
     * @see setShowCrs()
     * @note added in QGIS 3.0
     */
    bool showCrs() const;

    /**
     * Sets a list of additional (non map layer) items to include at the end of the combobox.
     * These may represent additional layers such as layers which are not included in the map
     * layer registry, or paths to layers which have not yet been loaded into QGIS.
     * @see additionalItems()
     * @note added in QGIS 3.0
     */
    void setAdditionalItems( const QStringList& items );

    /**
     * Return the list of additional (non map layer) items included at the end of the combo box.
     * @see setAdditionalItems()
     * @note added in QGIS 3.0
     */
    QStringList additionalItems() const;

    /** Returns the current layer selected in the combo box.
     * @see layer
     */
    QgsMapLayer* currentLayer() const;

    /** Return the layer currently shown at the specified index within the combo box.
     * @param layerIndex position of layer to return
     * @note added in QGIS 2.10
     * @see currentLayer
     */
    QgsMapLayer* layer( int layerIndex ) const;

  public slots:
    //! setLayer set the current layer selected in the combo
    void setLayer( QgsMapLayer* layer );

  signals:
    //! layerChanged this signal is emitted whenever the currently selected layer changes
    void layerChanged( QgsMapLayer* layer );

  protected slots:
    void indexChanged( int i );
    void rowsChanged();
};