1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
#ifndef CLHEADERBAR_H
#define CLHEADERBAR_H
#include "clHeaderItem.h"
#include "codelite_exports.h"
#include <vector>
#include <wx/panel.h>
class clControlWithItems;
class WXDLLIMPEXP_SDK clHeaderBar : public wxPanel
{
clHeaderItem::Vect_t m_columns;
const clColours& m_colours;
int m_flags = 0;
bool m_isDragging = false;
int m_draggedCol = wxNOT_FOUND;
wxCursor m_previousCursor;
wxFont m_headerFont = wxNullFont;
protected:
void DoUpdateSize();
wxSize GetTextSize(const wxString& label) const;
int HitBorder(int x) const;
void OnPaint(wxPaintEvent& event);
void OnSize(wxSizeEvent& event);
void DoCancelDrag();
public:
clHeaderBar(clControlWithItems* parent, const clColours& colours);
virtual ~clHeaderBar();
void SetHeaderFont(const wxFont& headerFont) { this->m_headerFont = headerFont; }
const wxFont& GetHeaderFont() const { return m_headerFont; }
bool Show(bool show = true);
/**
* @brief set drawing native header
*/
void SetNative(bool b)
{
if(b) {
m_flags |= kHeaderNative;
} else {
m_flags &= ~kHeaderNative;
}
Refresh();
}
/**
* @brief update the column width, but only if the new width is greater than the current one, unless 'force' is set
* to 'true'
* @param col
* @param width
* @param force set the new width, no matter what...
*/
void UpdateColWidthIfNeeded(size_t col, int width, bool force = false);
clHeaderItem& Item(int index) { return m_columns[index]; }
const clHeaderItem& Item(int index) const { return m_columns[index]; }
clHeaderItem& operator[](int index) { return Item(index); }
const clHeaderItem& operator[](int index) const { return Item(index); }
size_t size() const { return m_columns.size(); }
size_t GetCount() const { return size(); }
void SetColumnsWidth(const std::vector<size_t>& v_width);
/**
* @brief Return the header bar height, taking into consideration all columns
*/
size_t GetHeight() const;
/**
* @brief do we have any columns?
*/
bool empty() const { return m_columns.empty(); }
/**
* @brief do we have any columns?
*/
bool IsEmpty() const { return empty(); }
/**
* @brief add new column to the header bar
*/
void push_back(const clHeaderItem& item);
/**
* @brief add new column to the header bar
*/
clHeaderItem& Add(const clHeaderItem& item)
{
push_back(item);
return Last();
}
/**
* @brief add new column to the header bar
*/
clHeaderItem& Add(const wxString& label, const wxBitmap& bitmap = wxNullBitmap)
{
push_back(clHeaderItem(m_parent, label, bitmap));
return Last();
}
void Clear();
const clHeaderItem& Last() const;
clHeaderItem& Last();
/**
* @brief draw the header bar using dc and colours
*/
void Render(wxDC& dc, const clColours& colours);
size_t GetWidth() const;
/**
* @brief are we dragging a column?
*/
bool IsDragging() { return m_isDragging; };
/**
* @brief process a left-down event
*/
void OnMouseLeftDown(wxMouseEvent& event);
/**
* @brief process motion events
*/
void OnMotion(wxMouseEvent& event);
/**
* @brief process a left-up event
*/
void OnMouseLeftUp(wxMouseEvent& event);
};
#endif // CLHEADERBAR_H
|