source: filezilla/trunk/fuentes/src/interface/listctrlex.h @ 3185

Last change on this file since 3185 was 3185, checked in by jrpelegrina, 2 years ago

Update new version: 3.15.02

File size: 4.4 KB
Line 
1#ifndef __LISTCTRLEX_H__
2#define __LISTCTRLEX_H__
3
4#include "systemimagelist.h"
5#include <wx/dnd.h>
6
7#ifdef __WXMSW__
8typedef wxNavigationEnabled<wxListCtrl> wxListCtrlExBase;
9#else
10typedef wxListCtrl wxListCtrlExBase;
11#endif
12class wxListCtrlEx : public wxListCtrlExBase, public CSystemImageList
13{
14public:
15        typedef int Item;
16
17        wxListCtrlEx(wxWindow *parent,
18                wxWindowID id = wxID_ANY,
19                const wxPoint& pos = wxDefaultPosition,
20                const wxSize& size = wxDefaultSize,
21                long style = wxLC_ICON,
22                const wxValidator& validator = wxDefaultValidator,
23                const wxString& name = wxListCtrlNameStr);
24        ~wxListCtrlEx();
25
26        // Ensure that the given item is the first in the list
27        void ScrollTopItem(int item);
28
29        void EnablePrefixSearch(bool enable) { m_prefixSearch_enabled = enable; }
30
31        // Reducing item count does not reset the focused item
32        // if using the generic list control. Work around it.
33        void SaveSetItemCount(long count);
34
35        void ShowColumnEditor();
36
37        void ShowColumn(unsigned int col, bool show);
38
39        // Moves column. Target position includes both hidden
40        // as well as shown columns
41        void MoveColumn(unsigned int col, unsigned int before);
42
43        // Do not call after calling LoadColumnSettings
44        void AddColumn(const wxString& name, int align, int initialWidth, bool fixed = false);
45
46        // LoadColumnSettings needs to be called exactly once after adding
47        // all columns
48        void LoadColumnSettings(int widthsOptionId, int visibilityOptionId, int sortOptionId);
49        void SaveColumnSettings(int widthsOptionId, int visibilityOptionId, int sortOptionId);
50
51        int GetColumnVisibleIndex(int col);
52
53        // Refresh list but not header
54        void RefreshListOnly(bool eraseBackground = true);
55
56        void CancelLabelEdit();
57        void SetLabelEditBlock(bool block);
58
59        wxWindow* GetMainWindow();
60        wxWindow const* GetMainWindow() const;
61
62        bool HasSelection() const;
63
64        // Returns the true rect of the area containing the actual list items
65        wxRect GetActualClientRect() const;
66
67        bool Valid(int i) const { return i >= 0 && i < GetItemCount(); }
68        int GetFirstItem() const { return GetItemCount() ? 0 : -1; }
69        int GetLastItem() const { return GetItemCount() - 1; }
70        int GetBottomItem() const {
71                if (GetItemCount()) {
72                        return wxMin(GetLastItem(), GetTopItem() + GetCountPerPage() - 1);
73                }
74                return -1;
75        }
76
77        int GetNextItemSimple(int i) const {
78                if (!Valid(++i)) {
79                        i = -1;
80                }
81                return i;
82        }
83
84        int GetPrevItemSimple(int i) const {
85                if (!Valid(--i)) {
86                        i = -1;
87                }
88                return i;
89        }
90
91protected:
92        virtual void OnPostScroll();
93        virtual void OnPreEmitPostScrollEvent();
94        void EmitPostScrollEvent();
95
96        virtual wxString GetItemText(int, unsigned int) { return _T(""); }
97
98        virtual wxString OnGetItemText(long item, long column) const;
99        void ResetSearchPrefix();
100
101        // Argument is visible column index
102        int GetHeaderSortIconIndex(int col);
103        void SetHeaderSortIconIndex(int col, int icon);
104
105        // Has to be called after setting the image list for the items
106        void InitHeaderSortImageList();
107#ifdef __WXMSW__
108        wxImageListEx *m_pHeaderImageList{};
109#endif
110        struct _header_icon_index
111        {
112                int up{-1};
113                int down{-1};
114        } m_header_icon_index;
115
116private:
117        // Keyboard prefix search
118        void HandlePrefixSearch(wxChar character);
119        int FindItemWithPrefix(const wxString& searchPrefix, int start);
120
121        DECLARE_EVENT_TABLE()
122        void OnPostScrollEvent(wxCommandEvent& event);
123        void OnScrollEvent(wxScrollWinEvent& event);
124        void OnMouseWheel(wxMouseEvent& event);
125        void OnSelectionChanged(wxListEvent& event);
126        void OnKeyDown(wxKeyEvent& event);
127        void OnBeginLabelEdit(wxListEvent& event);
128        void OnEndLabelEdit(wxListEvent& event);
129        void OnColumnDragging(wxListEvent& event);
130
131        bool m_prefixSearch_enabled{};
132        fz::datetime m_prefixSearch_lastKeyPress;
133        wxString m_prefixSearch_prefix;
134
135        bool ReadColumnWidths(unsigned int optionId);
136        void SaveColumnWidths(unsigned int optionId);
137
138        void CreateVisibleColumnMapping();
139
140        virtual bool OnBeginRename(const wxListEvent& event);
141        virtual bool OnAcceptRename(const wxListEvent& event);
142
143        struct t_columnInfo
144        {
145                wxString name;
146                int align;
147                int width;
148                bool shown;
149                unsigned int order;
150                bool fixed;
151        };
152        std::vector<t_columnInfo> m_columnInfo;
153        unsigned int *m_pVisibleColumnMapping{};
154
155#ifdef __WXMSW__
156        virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
157        bool m_columnDragging{};
158#endif
159
160#ifndef __WXMSW__
161        bool m_editing;
162#endif
163        int m_blockedLabelEditing;
164};
165
166class CLabelEditBlocker
167{
168public:
169        CLabelEditBlocker(wxListCtrlEx& listCtrl);
170        virtual ~CLabelEditBlocker();
171private:
172        wxListCtrlEx& m_listCtrl;
173};
174
175#endif //__LISTCTRLEX_H__
Note: See TracBrowser for help on using the repository browser.