/////////////////////////////////////////////////////////////////////////////
// Name:        wx/bmpcbox.h
// Purpose:     wxBitmapComboBox base header
// Author:      Jaakko Salli
// Created:     Aug-31-2006
// Copyright:   (c) Jaakko Salli
// Licence:     wxWindows licence
/////////////////////////////////////////////////////////////////////////////

#ifndef _WX_BMPCBOX_H_BASE_
#define _WX_BMPCBOX_H_BASE_


#include "wx/defs.h"

#if wxUSE_BITMAPCOMBOBOX

#include "wx/bmpbndl.h"
#include "wx/dynarray.h"

class WXDLLIMPEXP_FWD_CORE wxWindow;
class WXDLLIMPEXP_FWD_CORE wxItemContainer;

// Define wxBITMAPCOMBOBOX_OWNERDRAWN_BASED for platforms which
// wxBitmapComboBox implementation utilizes ownerdrawn combobox
// (either native or generic).
#if !defined(__WXGTK__) || defined(__WXUNIVERSAL__)
    #define wxBITMAPCOMBOBOX_OWNERDRAWN_BASED

class WXDLLIMPEXP_FWD_CORE wxDC;
#endif

extern WXDLLIMPEXP_DATA_CORE(const char) wxBitmapComboBoxNameStr[];


class WXDLLIMPEXP_CORE wxBitmapComboBoxBase
{
public:
    // ctors and such
    wxBitmapComboBoxBase() { Init(); }

    virtual ~wxBitmapComboBoxBase() = default;

    // Sets the image for the given item.
    virtual void SetItemBitmap(unsigned int n, const wxBitmapBundle& bitmap) = 0;

#if !defined(wxBITMAPCOMBOBOX_OWNERDRAWN_BASED)

    // Returns the image of the item with the given index.
    virtual wxBitmap GetItemBitmap(unsigned int n) const = 0;

    // Returns size of the image used in list
    virtual wxSize GetBitmapSize() const = 0;

private:
    void Init() {}

#else // wxBITMAPCOMBOBOX_OWNERDRAWN_BASED

    // Returns the image of the item with the given index.
    virtual wxBitmap GetItemBitmap(unsigned int n) const;

    // Returns size of the image used in list
    virtual wxSize GetBitmapSize() const
    {
        return m_usedImgSize;
    }

protected:

    // Returns pointer to the combobox item container
    virtual wxItemContainer* GetItemContainer() = 0;

    // Return pointer to the owner-drawn combobox control
    virtual wxWindow* GetControl() = 0;

    // wxItemContainer functions
    void BCBDoClear();
    void BCBDoDeleteOneItem(unsigned int n);

    void DoSetItemBitmap(unsigned int n, const wxBitmapBundle& bitmap);

    void DrawBackground(wxDC& dc, const wxRect& rect, int item, int flags) const;
    void DrawItem(wxDC& dc, const wxRect& rect, int item, const wxString& text,
                  int flags) const;
    wxCoord MeasureItem(size_t item) const;

    // Returns true if image size was affected
    virtual bool OnAddBitmap(const wxBitmapBundle& bitmap);

    // Recalculates amount of empty space needed in front of text
    // in control itself. Returns number that can be passed to
    // wxOwnerDrawnComboBox::SetCustomPaintWidth() and similar
    // functions.
    virtual int DetermineIndent();

    void UpdateInternals();

    wxVector<wxBitmapBundle> m_bitmapbundles;// Images associated with items
    wxSize                   m_usedImgSize;  // Size of bitmaps

    int                 m_imgAreaWidth;  // Width and height of area next to text field
    int                 m_fontHeight;
    int                 m_indent;

private:
    void Init();
#endif // !wxBITMAPCOMBOBOX_OWNERDRAWN_BASED/wxBITMAPCOMBOBOX_OWNERDRAWN_BASED
};


#if defined(__WXUNIVERSAL__)
    #include "wx/generic/bmpcbox.h"
#elif defined(__WXMSW__)
    #include "wx/msw/bmpcbox.h"
#elif defined(__WXGTK__)
    #include "wx/gtk/bmpcbox.h"
#else
    #include "wx/generic/bmpcbox.h"
#endif

#endif // wxUSE_BITMAPCOMBOBOX

#endif // _WX_BMPCBOX_H_BASE_
