source: filezilla/trunk/fuentes/src/interface/aui_notebook_ex.cpp @ 130

Last change on this file since 130 was 130, checked in by jrpelegrina, 3 years ago

First release to xenial

File size: 3.9 KB
Line 
1#include <filezilla.h>
2#include <wx/aui/aui.h>
3#include "aui_notebook_ex.h"
4#include <wx/dcmirror.h>
5
6#include <memory>
7
8#ifdef __WXMSW__
9#define TABCOLOUR wxSYS_COLOUR_3DFACE
10#else
11#define TABCOLOUR wxSYS_COLOUR_WINDOWFRAME
12#endif
13
14struct wxAuiTabArtExData
15{
16        std::map<wxString, int> maxSizes;
17};
18
19class wxAuiTabArtEx : public wxAuiDefaultTabArt
20{
21public:
22        wxAuiTabArtEx(wxAuiNotebookEx* pNotebook, std::shared_ptr<wxAuiTabArtExData> const& data)
23                : m_pNotebook(pNotebook)
24                , m_data(data)
25        {
26        }
27
28        virtual wxAuiTabArt* Clone()
29        {
30                wxAuiTabArtEx *art = new wxAuiTabArtEx(m_pNotebook, m_data);
31                art->SetNormalFont(m_normalFont);
32                art->SetSelectedFont(m_selectedFont);
33                art->SetMeasuringFont(m_measuringFont);
34                return art;
35        }
36
37        virtual wxSize GetTabSize(wxDC& dc, wxWindow* wnd, const wxString& caption, const wxBitmap& bitmap, bool active, int close_button_state, int* x_extent)
38        {
39                wxSize size = wxAuiDefaultTabArt::GetTabSize(dc, wnd, caption, bitmap, active, close_button_state, x_extent);
40
41                wxString text = caption;
42                int pos;
43                if ((pos = caption.Find(_T(" ("))) != -1)
44                        text = text.Left(pos);
45                auto iter = m_data->maxSizes.find(text);
46                if (iter == m_data->maxSizes.end())
47                        m_data->maxSizes[text] = size.x;
48                else
49                {
50                        if (iter->second > size.x)
51                        {
52                                size.x = iter->second;
53                                *x_extent = size.x;
54                        }
55                        else
56                                iter->second = size.x;
57                }
58
59                return size;
60        }
61
62protected:
63        wxAuiNotebookEx* m_pNotebook;
64
65        std::shared_ptr<wxAuiTabArtExData> m_data;
66};
67
68BEGIN_EVENT_TABLE(wxAuiNotebookEx, wxAuiNotebook)
69EVT_AUINOTEBOOK_PAGE_CHANGED(wxID_ANY, wxAuiNotebookEx::OnPageChanged)
70END_EVENT_TABLE()
71
72wxAuiNotebookEx::wxAuiNotebookEx()
73{
74}
75
76wxAuiNotebookEx::~wxAuiNotebookEx()
77{
78}
79
80void wxAuiNotebookEx::RemoveExtraBorders()
81{
82        wxAuiPaneInfoArray& panes = m_mgr.GetAllPanes();
83        for (size_t i = 0; i < panes.Count(); i++)
84        {
85                panes[i].PaneBorder(false);
86        }
87        m_mgr.Update();
88}
89
90void wxAuiNotebookEx::SetExArtProvider()
91{
92        SetArtProvider(new wxAuiTabArtEx(this, std::make_shared<wxAuiTabArtExData>()));
93}
94
95bool wxAuiNotebookEx::SetPageText(size_t page_idx, const wxString& text)
96{
97        // Basically identical to the AUI one, but not calling Update
98        if (page_idx >= m_tabs.GetPageCount())
99                return false;
100
101        // update our own tab catalog
102        wxAuiNotebookPage& page_info = m_tabs.GetPage(page_idx);
103        page_info.caption = text;
104
105        // update what's on screen
106        wxAuiTabCtrl* ctrl;
107        int ctrl_idx;
108        if (FindTab(page_info.window, &ctrl, &ctrl_idx)) {
109                wxAuiNotebookPage& info = ctrl->GetPage(ctrl_idx);
110                info.caption = text;
111                ctrl->Refresh();
112        }
113
114        return true;
115}
116
117void wxAuiNotebookEx::Highlight(size_t page, bool highlight /*=true*/)
118{
119        if (GetSelection() == (int)page)
120                return;
121
122        wxASSERT(page < m_tabs.GetPageCount());
123        if (page >= m_tabs.GetPageCount())
124                return;
125
126        if (page >= m_highlighted.size())
127                m_highlighted.resize(page + 1, false);
128
129        if (highlight == m_highlighted[page])
130                return;
131
132        m_highlighted[page] = highlight;
133
134        GetActiveTabCtrl()->Refresh();
135}
136
137bool wxAuiNotebookEx::Highlighted(size_t page) const
138{
139        wxASSERT(page < m_tabs.GetPageCount());
140        if (page >= m_highlighted.size())
141                return false;
142
143        return m_highlighted[page];
144}
145
146void wxAuiNotebookEx::OnPageChanged(wxAuiNotebookEvent&)
147{
148        size_t page = (size_t)GetSelection();
149        if (page >= m_highlighted.size())
150                return;
151
152        m_highlighted[page] = false;
153}
154
155void wxAuiNotebookEx::AdvanceTab(bool forward)
156{
157        int page = GetSelection();
158        if (forward)
159                ++page;
160        else
161                --page;
162        if (page >= (int)GetPageCount())
163                page = 0;
164        else if (page < 0)
165                page = GetPageCount() - 1;
166
167        SetSelection(page);
168}
169
170bool wxAuiNotebookEx::AddPage(wxWindow *page, const wxString &text, bool select, int imageId)
171{
172        bool const res = wxAuiNotebook::AddPage(page, text, select, imageId);
173        size_t const count = GetPageCount();
174
175        if (count > 1) {
176                GetPage(count - 1)->MoveAfterInTabOrder(GetPage(count - 2));
177        }
178
179        if (GetWindowStyle() & wxAUI_NB_BOTTOM) {
180                GetActiveTabCtrl()->MoveAfterInTabOrder(GetPage(count - 1));
181        }
182        else {
183                GetActiveTabCtrl()->MoveBeforeInTabOrder(GetPage(0));
184        }
185
186        return res;
187}
Note: See TracBrowser for help on using the repository browser.