📄 listctrl.cpp
字号:
void OnChar( wxKeyEvent &event ); void OnKeyUp( wxKeyEvent &event ); void OnKillFocus( wxFocusEvent &event ); bool AcceptChanges(); void Finish();private: wxListMainWindow *m_owner; wxTextCtrl *m_text; wxString m_startValue; size_t m_itemEdited; bool m_finished; bool m_aboutToFinish; DECLARE_EVENT_TABLE()};//-----------------------------------------------------------------------------// wxListMainWindow (internal)//-----------------------------------------------------------------------------WX_DECLARE_LIST(wxListHeaderData, wxListHeaderDataList);#include <wx/listimpl.cpp>WX_DEFINE_LIST(wxListHeaderDataList)class wxListMainWindow : public wxScrolledWindow{public: wxListMainWindow(); wxListMainWindow( wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, const wxString &name = _T("listctrlmainwindow") ); virtual ~wxListMainWindow(); bool HasFlag(int flag) const { return m_parent->HasFlag(flag); } // return true if this is a virtual list control bool IsVirtual() const { return HasFlag(wxLC_VIRTUAL); } // return true if the control is in report mode bool InReportView() const { return HasFlag(wxLC_REPORT); } // return true if we are in single selection mode, false if multi sel bool IsSingleSel() const { return HasFlag(wxLC_SINGLE_SEL); } // do we have a header window? bool HasHeader() const { return InReportView() && !HasFlag(wxLC_NO_HEADER); } void HighlightAll( bool on ); // all these functions only do something if the line is currently visible // change the line "selected" state, return true if it really changed bool HighlightLine( size_t line, bool highlight = true); // as HighlightLine() but do it for the range of lines: this is incredibly // more efficient for virtual list controls! // // NB: unlike HighlightLine() this one does refresh the lines on screen void HighlightLines( size_t lineFrom, size_t lineTo, bool on = true ); // toggle the line state and refresh it void ReverseHighlight( size_t line ) { HighlightLine(line, !IsHighlighted(line)); RefreshLine(line); } // return true if the line is highlighted bool IsHighlighted(size_t line) const; // refresh one or several lines at once void RefreshLine( size_t line ); void RefreshLines( size_t lineFrom, size_t lineTo ); // refresh all selected items void RefreshSelected(); // refresh all lines below the given one: the difference with // RefreshLines() is that the index here might not be a valid one (happens // when the last line is deleted) void RefreshAfter( size_t lineFrom ); // the methods which are forwarded to wxListLineData itself in list/icon // modes but are here because the lines don't store their positions in the // report mode // get the bound rect for the entire line wxRect GetLineRect(size_t line) const; // get the bound rect of the label wxRect GetLineLabelRect(size_t line) const; // get the bound rect of the items icon (only may be called if we do have // an icon!) wxRect GetLineIconRect(size_t line) const; // get the rect to be highlighted when the item has focus wxRect GetLineHighlightRect(size_t line) const; // get the size of the total line rect wxSize GetLineSize(size_t line) const { return GetLineRect(line).GetSize(); } // return the hit code for the corresponding position (in this line) long HitTestLine(size_t line, int x, int y) const; // bring the selected item into view, scrolling to it if necessary void MoveToItem(size_t item); // bring the current item into view void MoveToFocus() { MoveToItem(m_current); } // start editing the label of the given item wxTextCtrl *EditLabel(long item, wxClassInfo* textControlClass = CLASSINFO(wxTextCtrl)); wxTextCtrl *GetEditControl() const { return m_textctrlWrapper ? m_textctrlWrapper->GetText() : NULL; } void FinishEditing(wxTextCtrl *text) { delete text; m_textctrlWrapper = NULL; SetFocusIgnoringChildren(); } // suspend/resume redrawing the control void Freeze(); void Thaw(); void OnRenameTimer(); bool OnRenameAccept(size_t itemEdit, const wxString& value); void OnRenameCancelled(size_t itemEdit); void OnMouse( wxMouseEvent &event ); // called to switch the selection from the current item to newCurrent, void OnArrowChar( size_t newCurrent, const wxKeyEvent& event ); void OnChar( wxKeyEvent &event ); void OnKeyDown( wxKeyEvent &event ); void OnKeyUp( wxKeyEvent &event ); void OnSetFocus( wxFocusEvent &event ); void OnKillFocus( wxFocusEvent &event ); void OnScroll( wxScrollWinEvent& event ); void OnPaint( wxPaintEvent &event ); void OnErase( wxEraseEvent& event ) { // This is needed to avoid garbage on empty lists. if ( IsEmpty() ) { event.Skip(); } } void DrawImage( int index, wxDC *dc, int x, int y ); void GetImageSize( int index, int &width, int &height ) const; int GetTextLength( const wxString &s ) const; void SetImageList( wxImageList *imageList, int which ); void SetItemSpacing( int spacing, bool isSmall = false ); int GetItemSpacing( bool isSmall = false ); void SetColumn( int col, wxListItem &item ); void SetColumnWidth( int col, int width ); void GetColumn( int col, wxListItem &item ) const; int GetColumnWidth( int col ) const; int GetColumnCount() const { return m_columns.GetCount(); } // returns the sum of the heights of all columns int GetHeaderWidth() const; int GetCountPerPage() const; void SetItem( wxListItem &item ); void GetItem( wxListItem &item ) const; void SetItemState( long item, long state, long stateMask ); void SetItemStateAll( long state, long stateMask ); int GetItemState( long item, long stateMask ) const; void GetItemRect( long index, wxRect &rect ) const; wxRect GetViewRect() const; bool GetItemPosition( long item, wxPoint& pos ) const; int GetSelectedItemCount() const; wxString GetItemText(long item) const { wxListItem info; info.m_mask = wxLIST_MASK_TEXT; info.m_itemId = item; GetItem( info ); return info.m_text; } void SetItemText(long item, const wxString& value) { wxListItem info; info.m_mask = wxLIST_MASK_TEXT; info.m_itemId = item; info.m_text = value; SetItem( info ); } // set the scrollbars and update the positions of the items void RecalculatePositions(bool noRefresh = false); // refresh the window and the header void RefreshAll(); long GetNextItem( long item, int geometry, int state ) const; void DeleteItem( long index ); void DeleteAllItems(); void DeleteColumn( int col ); void DeleteEverything(); void EnsureVisible( long index ); long FindItem( long start, const wxString& str, bool partial = false ); long FindItem( long start, wxUIntPtr data); long FindItem( const wxPoint& pt ); long HitTest( int x, int y, int &flags ) const; void InsertItem( wxListItem &item ); void InsertColumn( long col, wxListItem &item ); int GetItemWidthWithImage(wxListItem * item); void SortItems( MuleListCtrlCompare fn, long data ); size_t GetItemCount() const; bool IsEmpty() const { return GetItemCount() == 0; } void SetItemCount(long count); // change the current (== focused) item, send a notification event void ChangeCurrent(size_t current); void ResetCurrent() { ChangeCurrent((size_t)-1); } bool HasCurrent() const { return m_current != (size_t)-1; } // send out a wxListEvent void SendNotify( size_t line, wxEventType command, const wxPoint& point = wxDefaultPosition ); // override base class virtual to reset m_lineHeight when the font changes virtual bool SetFont(const wxFont& font) { if ( !wxScrolledWindow::SetFont(font) ) return false; m_lineHeight = 0; return true; } // these are for wxListLineData usage only // get the backpointer to the list ctrl wxGenericListCtrl *GetListCtrl() const { return wxStaticCast(GetParent(), wxGenericListCtrl); } // get the height of all lines (assuming they all do have the same height) wxCoord GetLineHeight() const; // get the y position of the given line (only for report view) wxCoord GetLineY(size_t line) const; // get the brush to use for the item highlighting wxBrush *GetHighlightBrush() const { return m_hasFocus ? m_highlightBrush : m_highlightUnfocusedBrush; } bool HasFocus() const { return m_hasFocus; }//protected: // the array of all line objects for a non virtual list control (for the // virtual list control we only ever use m_lines[0]) wxListLineDataArray m_lines; // the list of column objects wxListHeaderDataList m_columns; // currently focused item or -1 size_t m_current; // the number of lines per page int m_linesPerPage; // this flag is set when something which should result in the window // redrawing happens (i.e. an item was added or deleted, or its appearance // changed) and OnPaint() doesn't redraw the window while it is set which // allows to minimize the number of repaintings when a lot of items are // being added. The real repainting occurs only after the next OnIdle() // call bool m_dirty; wxColour *m_highlightColour; wxImageList *m_small_image_list; wxImageList *m_normal_image_list; int m_small_spacing; int m_normal_spacing; bool m_hasFocus; bool m_lastOnSame; wxTimer *m_renameTimer; bool m_isCreated; int m_dragCount; wxPoint m_dragStart; ColWidthArray m_aColWidths; // for double click logic size_t m_lineLastClicked, m_lineBeforeLastClicked, m_lineSelectSingleOnUp;protected: wxWindow *GetMainWindowOfCompositeControl() { return GetParent(); } // the total count of items in a virtual list control size_t m_countVirt; // the object maintaining the items selection state, only used in virtual // controls wxSelectionStore m_selStore; // common part of all ctors void Init(); // get the line data for the given index wxListLineData *GetLine(size_t n) const { wxASSERT_MSG( n != (size_t)-1, _T("invalid line index") ); if ( IsVirtual() ) { wxConstCast(this, wxListMainWindow)->CacheLineData(n); n = 0; } return &m_lines[n]; } // get a dummy line which can be used for geometry calculations and such: // you must use GetLine() if you want to really draw the line wxListLineData *GetDummyLine() const; // cache the line data of the n-th line in m_lines[0] void CacheLineData(size_t line); // get the range of visible lines void GetVisibleLinesRange(size_t *from, size_t *to); // force us to recalculate the range of visible lines void ResetVisibleLinesRange() { m_lineFrom = (size_t)-1; } // get the colour to be used for drawing the rules wxColour GetRuleColour() const { return wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT); }private: // initialize the current item if needed void UpdateCurrent(); // delete all items but don't refresh: called from dtor void DoDeleteAllItems(); // the height of one line using the current font wxCoord m_lineHeight; // the total header width or 0 if not calculated yet wxCoord m_headerWidth; // the first and last lines being shown on screen right now (inclusive), // both may be -1 if they must be calculated so never access them directly: // use GetVisibleLinesRange() above instead size_t m_lineFrom, m_lineTo; // the brushes to use for item highlighting when we do/don't have focus wxBrush *m_highlightBrush, *m_highlightUnfocusedBrush; // if this is > 0, the control is frozen and doesn't redraw itself size_t m_freezeCount; // wrapper around the text control currently used for in place editing or // NULL if no item is being edited wxListTextCtrlWrapper *m_textctrlWrapper; DECLARE_EVENT_TABLE() friend class wxGenericListCtrl;};wxListItemData::~wxListItemData(){ // in the virtual list control the attributes are managed by the main // program, so don't delete them if ( !m_owner->IsVirtual() ) delete m_attr; delete m_rect;}void wxListItemData::Init(){ m_image = -1; m_data = 0; m_attr = NULL;}wxListItemData::wxListItemData(wxListMainWindow *owner){ Init(); m_owner = owner; if ( owner->InReportView() ) m_rect = NULL; else m_rect = new wxRect;}void wxListItemData::SetItem( const wxListItem &info ){ if ( info.m_mask & wxLIST_MASK_TEXT ) SetText(info.m_text); if ( info.m_mask & wxLIST_MASK_IMAGE ) m_image = info.m_image; if ( info.m_mask & wxLIST_MASK_DATA ) m_data = info.m_data; if ( info.HasAttributes() ) { if ( m_attr ) m_attr->AssignFrom(*info.GetAttributes()); else m_attr = new wxListItemAttr(*info.GetAttributes()); } if ( m_rect ) { m_rect->x = m_rect->y = m_rect->height = 0; m_rect->width = info.m_width; }}void wxListItemData::SetPosition( int x, int y ){ wxCHECK_RET( m_rect, _T("unexpected SetPosition() call") ); m_rect->x = x;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -