⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listctrl.cpp

📁 电驴的MAC源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    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 + -