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

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

First release to xenial

File size: 4.6 KB
Line 
1#include <filezilla.h>
2#include "customheightlistctrl.h"
3
4BEGIN_EVENT_TABLE(wxCustomHeightListCtrl, wxScrolledWindow)
5EVT_MOUSE_EVENTS(wxCustomHeightListCtrl::OnMouseEvent)
6END_EVENT_TABLE()
7
8wxCustomHeightListCtrl::wxCustomHeightListCtrl(wxWindow* parent, wxWindowID id /*=-1*/, const wxPoint& pos /*=wxDefaultPosition*/, const wxSize& size /*=wxDefaultSize*/, long style /*=wxHSCROLL|wxVSCROLL*/, const wxString& name /*=_T("scrolledWindow")*/)
9        : wxScrolledWindow(parent, id, pos, size, style, name)
10{
11        m_lineHeight = 20;
12        m_lineCount = 0;
13        m_focusedLine = -1;
14
15        SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
16
17        m_allow_selection = true;
18}
19
20void wxCustomHeightListCtrl::SetLineHeight(int height)
21{
22        m_lineHeight = height;
23
24        int posx, posy;
25        GetViewStart(&posx, &posy);
26        SetScrollbars(0, m_lineHeight, 0, m_lineCount, 0, posy);
27
28        Refresh();
29}
30
31void wxCustomHeightListCtrl::SetLineCount(int count)
32{
33        if (count < m_lineCount)
34        {
35                std::set<int> selectedLines = m_selectedLines;
36                m_selectedLines.clear();
37                for (std::set<int>::const_iterator iter = selectedLines.begin(); iter != selectedLines.end(); ++iter)
38                        if (*iter < count)
39                                m_selectedLines.insert(*iter);
40        }
41        m_lineCount = count;
42        if (m_focusedLine >= count)
43                m_focusedLine = -1;
44
45        int posx, posy;
46        GetViewStart(&posx, &posy);
47
48#ifdef __WXGTK__
49        // When decreasing scrollbar range, wxGTK does not seem to adjust child position
50        // if viewport gets moved
51        wxPoint old_view;
52        GetViewStart(&old_view.x, &old_view.y);
53#endif
54
55        SetScrollbars(0, m_lineHeight, 0, m_lineCount, 0, posy);
56
57#ifdef __WXGTK__
58        wxPoint new_view;
59        GetViewStart(&new_view.x, &new_view.y);
60        int delta_y = m_lineHeight *(old_view.y - new_view.y);
61
62        if (delta_y)
63        {
64                wxWindowList::compatibility_iterator iter = GetChildren().GetFirst();
65                while (iter)
66                {
67                        wxWindow* child = iter->GetData();
68                        wxPoint pos = child->GetPosition();
69                        pos.y -= delta_y;
70                        child->SetPosition(pos);
71
72                        iter = iter->GetNext();
73                }
74        }
75#endif
76
77        Refresh();
78}
79
80void wxCustomHeightListCtrl::SetFocus()
81{
82        wxWindow::SetFocus();
83}
84
85void wxCustomHeightListCtrl::OnDraw(wxDC& dc)
86{
87        wxSize size = GetClientSize();
88
89        dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT)));
90        dc.SetPen(*wxTRANSPARENT_PEN);
91
92        for (std::set<int>::const_iterator iter = m_selectedLines.begin(); iter != m_selectedLines.end(); ++iter)
93        {
94                if (*iter == m_focusedLine)
95                        dc.SetPen(wxPen(wxColour(0, 0, 0), 1, wxDOT));
96                else
97                        dc.SetPen(*wxTRANSPARENT_PEN);
98                dc.DrawRectangle(0, m_lineHeight * *iter, size.GetWidth(), m_lineHeight);
99        }
100        if (m_focusedLine != -1 && m_selectedLines.find(m_focusedLine) == m_selectedLines.end())
101        {
102                dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)));
103                dc.SetPen(wxPen(wxColour(0, 0, 0), 1, wxDOT));
104                dc.DrawRectangle(0, m_lineHeight * m_focusedLine, size.GetWidth(), m_lineHeight);
105        }
106}
107
108void wxCustomHeightListCtrl::OnMouseEvent(wxMouseEvent& event)
109{
110        bool changed = false;
111        if (event.ButtonDown() && m_allow_selection)
112        {
113                wxPoint pos = event.GetPosition();
114                int x, y;
115                CalcUnscrolledPosition(pos.x, pos.y, &x, &y);
116                if (y > m_lineHeight * m_lineCount)
117                {
118                        m_focusedLine = -1;
119                        m_selectedLines.clear();
120                        changed = true;
121                }
122                else
123                {
124                        int line = y / m_lineHeight;
125                        if (event.ShiftDown())
126                        {
127                                if (line < m_focusedLine)
128                                {
129                                        for (int i = line; i <= m_focusedLine; i++)
130                                        {
131                                                if (m_selectedLines.find(i) == m_selectedLines.end())
132                                                {
133                                                        changed = true;
134                                                        m_selectedLines.insert(i);
135                                                }
136                                        }
137                                }
138                                else
139                                {
140                                        for (int i = line; i >= m_focusedLine; i--)
141                                        {
142                                                if (m_selectedLines.find(i) == m_selectedLines.end())
143                                                {
144                                                        changed = true;
145                                                        m_selectedLines.insert(i);
146                                                }
147                                        }
148                                }
149                        }
150                        else if (event.ControlDown())
151                        {
152                                if (m_selectedLines.find(line) == m_selectedLines.end())
153                                        m_selectedLines.insert(line);
154                                else
155                                        m_selectedLines.erase(line);
156                                changed = true;
157                        }
158                        else
159                        {
160                                m_selectedLines.clear();
161                                m_selectedLines.insert(line);
162                                changed = true;
163                        }
164
165                        m_focusedLine = line;
166
167                }
168                Refresh();
169        }
170
171        event.Skip();
172
173        if (changed)
174        {
175                wxCommandEvent evt(wxEVT_COMMAND_LISTBOX_SELECTED, GetId());
176                ProcessEvent(evt);
177        }
178}
179
180void wxCustomHeightListCtrl::ClearSelection()
181{
182        m_selectedLines.clear();
183        m_focusedLine = -1;
184
185        Refresh();
186}
187
188std::set<int> wxCustomHeightListCtrl::GetSelection() const
189{
190        return m_selectedLines;
191}
192
193void wxCustomHeightListCtrl::SelectLine(int line)
194{
195        m_selectedLines.clear();
196        m_focusedLine = line;
197        if (line != -1)
198                m_selectedLines.insert(line);
199
200        Refresh();
201}
202
203void wxCustomHeightListCtrl::AllowSelection(bool allow_selection)
204{
205        m_allow_selection = allow_selection;
206        if (!allow_selection)
207                ClearSelection();
208}
Note: See TracBrowser for help on using the repository browser.