From: Vadim Zeitlin Date: Tue, 22 Feb 2000 15:22:21 +0000 (+0000) Subject: 1. corrected bug with LIST_ITEM_ACTIVATED being sent even if second click in X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/efbb7287e6be8cfa29cb30a9678a3a3e6e99bfb3 1. corrected bug with LIST_ITEM_ACTIVATED being sent even if second click in dbl click was on another item 2. moved private classes from listctrl.h -> listctrl.cpp 3. made sample messages include the item index git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6211 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/generic/listctrl.h b/include/wx/generic/listctrl.h index e6e931b290..09bd6c5b22 100644 --- a/include/wx/generic/listctrl.h +++ b/include/wx/generic/listctrl.h @@ -51,324 +51,6 @@ class WXDLLEXPORT wxListMainWindow; class WXDLLEXPORT wxListRenameTimer; class WXDLLEXPORT wxListTextCtrl; -//----------------------------------------------------------------------------- -// wxListItemData (internal) -//----------------------------------------------------------------------------- - -class WXDLLEXPORT wxListItemData : public wxObject -{ -public: - wxString m_text; - int m_image; - long m_data; - int m_xpos,m_ypos; - int m_width,m_height; - - wxListItemAttr *m_attr; - -public: - wxListItemData(); - ~wxListItemData() { delete m_attr; } - - wxListItemData( const wxListItem &info ); - void SetItem( const wxListItem &info ); - void SetText( const wxString &s ); - void SetImage( int image ); - void SetData( long data ); - void SetPosition( int x, int y ); - void SetSize( int width, int height ); - bool HasImage() const; - bool HasText() const; - bool IsHit( int x, int y ) const; - void GetText( wxString &s ); - const wxString& GetText() { return m_text; } - int GetX( void ) const; - int GetY( void ) const; - int GetWidth() const; - int GetHeight() const; - int GetImage() const; - void GetItem( wxListItem &info ) const; - - wxListItemAttr *GetAttributes() const { return m_attr; } - -private: - DECLARE_DYNAMIC_CLASS(wxListItemData); -}; - -//----------------------------------------------------------------------------- -// wxListHeaderData (internal) -//----------------------------------------------------------------------------- - -class WXDLLEXPORT wxListHeaderData : public wxObject -{ -protected: - long m_mask; - int m_image; - wxString m_text; - int m_format; - int m_width; - int m_xpos,m_ypos; - int m_height; - -public: - wxListHeaderData(); - wxListHeaderData( const wxListItem &info ); - void SetItem( const wxListItem &item ); - void SetPosition( int x, int y ); - void SetWidth( int w ); - void SetFormat( int format ); - void SetHeight( int h ); - bool HasImage() const; - bool HasText() const; - bool IsHit( int x, int y ) const; - void GetItem( wxListItem &item ); - void GetText( wxString &s ); - int GetImage() const; - int GetWidth() const; - int GetFormat() const; - -private: - DECLARE_DYNAMIC_CLASS(wxListHeaderData); -}; - -//----------------------------------------------------------------------------- -// wxListLineData (internal) -//----------------------------------------------------------------------------- - -class WXDLLEXPORT wxListLineData : public wxObject -{ -public: - wxList m_items; - wxRect m_bound_all; - wxRect m_bound_label; - wxRect m_bound_icon; - wxRect m_bound_hilight; - int m_mode; - bool m_hilighted; - wxBrush *m_hilightBrush; - int m_spacing; - wxListMainWindow *m_owner; - - void DoDraw( wxDC *dc, bool hilight, bool paintBG ); - -public: - wxListLineData() {} - wxListLineData( wxListMainWindow *owner, int mode, wxBrush *hilightBrush ); - void CalculateSize( wxDC *dc, int spacing ); - void SetPosition( wxDC *dc, int x, int y, int window_width ); - void SetColumnPosition( int index, int x ); - void GetSize( int &width, int &height ); - void GetExtent( int &x, int &y, int &width, int &height ); - void GetLabelExtent( int &x, int &y, int &width, int &height ); - long IsHit( int x, int y ); - void InitItems( int num ); - void SetItem( int index, const wxListItem &info ); - void GetItem( int index, wxListItem &info ); - void GetText( int index, wxString &s ); - void SetText( int index, const wxString s ); - int GetImage( int index ); - void GetRect( wxRect &rect ); - void Hilight( bool on ); - void ReverseHilight(); - void DrawRubberBand( wxDC *dc, bool on ); - void Draw( wxDC *dc ); - bool IsInRect( int x, int y, const wxRect &rect ); - bool IsHilighted(); - void AssignRect( wxRect &dest, int x, int y, int width, int height ); - void AssignRect( wxRect &dest, const wxRect &source ); - -private: - void SetAttributes(wxDC *dc, - const wxListItemAttr *attr, - const wxColour& colText, const wxFont& font, - bool hilight); - - DECLARE_DYNAMIC_CLASS(wxListLineData); -}; - -//----------------------------------------------------------------------------- -// wxListHeaderWindow (internal) -//----------------------------------------------------------------------------- - -class WXDLLEXPORT wxListHeaderWindow : public wxWindow -{ -protected: - wxListMainWindow *m_owner; - wxCursor *m_currentCursor; - wxCursor *m_resizeCursor; - bool m_isDragging; - int m_column; - int m_minX; - int m_currentX; - -public: - wxListHeaderWindow(); - ~wxListHeaderWindow(); - wxListHeaderWindow( wxWindow *win, wxWindowID id, wxListMainWindow *owner, - const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, - long style = 0, const wxString &name = "columntitles" ); - void DoDrawRect( wxDC *dc, int x, int y, int w, int h ); - void OnPaint( wxPaintEvent &event ); - void DrawCurrent(); - void OnMouse( wxMouseEvent &event ); - void OnSetFocus( wxFocusEvent &event ); - -private: - DECLARE_DYNAMIC_CLASS(wxListHeaderWindow) - DECLARE_EVENT_TABLE() -}; - -//----------------------------------------------------------------------------- -// wxListRenameTimer (internal) -//----------------------------------------------------------------------------- - -class WXDLLEXPORT wxListRenameTimer: public wxTimer -{ -private: - wxListMainWindow *m_owner; - -public: - wxListRenameTimer( wxListMainWindow *owner ); - void Notify(); -}; - -//----------------------------------------------------------------------------- -// wxListTextCtrl (internal) -//----------------------------------------------------------------------------- - -class WXDLLEXPORT wxListTextCtrl: public wxTextCtrl -{ -private: - bool *m_accept; - wxString *m_res; - wxListMainWindow *m_owner; - wxString m_startValue; - -public: - wxListTextCtrl() {} - wxListTextCtrl( wxWindow *parent, const wxWindowID id, - bool *accept, wxString *res, wxListMainWindow *owner, - const wxString &value = "", - const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, - int style = 0, - const wxValidator& validator = wxDefaultValidator, - const wxString &name = "wxListTextCtrlText" ); - void OnChar( wxKeyEvent &event ); - void OnKillFocus( wxFocusEvent &event ); - -private: - DECLARE_DYNAMIC_CLASS(wxListTextCtrl); - DECLARE_EVENT_TABLE() -}; - -//----------------------------------------------------------------------------- -// wxListMainWindow (internal) -//----------------------------------------------------------------------------- - -class WXDLLEXPORT wxListMainWindow: public wxScrolledWindow -{ -public: - long m_mode; - wxList m_lines; - wxList m_columns; - wxListLineData *m_current; - wxListLineData *m_currentEdit; - int m_visibleLines; - wxBrush *m_hilightBrush; - wxColour *m_hilightColour; - int m_xScroll,m_yScroll; - bool m_dirty; - wxImageList *m_small_image_list; - wxImageList *m_normal_image_list; - int m_small_spacing; - int m_normal_spacing; - bool m_hasFocus; - bool m_usedKeys; - bool m_lastOnSame; - wxTimer *m_renameTimer; - bool m_renameAccept; - wxString m_renameRes; - bool m_isCreated; - int m_dragCount; - wxPoint m_dragStart; - -public: - wxListMainWindow(); - wxListMainWindow( wxWindow *parent, wxWindowID id, - const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, - long style = 0, const wxString &name = "listctrl" ); - ~wxListMainWindow(); - void RefreshLine( wxListLineData *line ); - void OnPaint( wxPaintEvent &event ); - void HilightAll( bool on ); - void SendNotify( wxListLineData *line, wxEventType command ); - void FocusLine( wxListLineData *line ); - void UnfocusLine( wxListLineData *line ); - void SelectLine( wxListLineData *line ); - void DeselectLine( wxListLineData *line ); - void DeleteLine( wxListLineData *line ); - - void EditLabel( long item ); - void Edit( long item ) { EditLabel(item); } // deprecated - void OnRenameTimer(); - void OnRenameAccept(); - - void OnMouse( wxMouseEvent &event ); - void MoveToFocus(); - void OnArrowChar( wxListLineData *newCurrent, bool shiftDown ); - void OnChar( wxKeyEvent &event ); - void OnKeyDown( wxKeyEvent &event ); - void OnSetFocus( wxFocusEvent &event ); - void OnKillFocus( wxFocusEvent &event ); - void OnSize( wxSizeEvent &event ); - void OnScroll(wxScrollWinEvent& event) ; - - void DrawImage( int index, wxDC *dc, int x, int y ); - void GetImageSize( int index, int &width, int &height ); - int GetIndexOfLine( const wxListLineData *line ); - int GetTextLength( wxString &s ); // should be 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 ); - int GetColumnWidth( int vol ); - int GetColumnCount(); - int GetCountPerPage(); - void SetItem( wxListItem &item ); - void GetItem( wxListItem &item ); - void SetItemState( long item, long state, long stateMask ); - int GetItemState( long item, long stateMask ); - int GetItemCount(); - void GetItemRect( long index, wxRect &rect ); - bool GetItemPosition( long item, wxPoint& pos ); - int GetSelectedItemCount(); - void SetMode( long mode ); - long GetMode() const; - void CalculatePositions(); - void RealizeChanges(); - long GetNextItem( long item, int geometry, int state ); - 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, long data); - long HitTest( int x, int y, int &flags ); - void InsertItem( wxListItem &item ); -// void AddItem( wxListItem &item ); - void InsertColumn( long col, wxListItem &item ); -// void AddColumn( wxListItem &item ); - void SortItems( wxListCtrlCompare fn, long data ); - -private: - DECLARE_DYNAMIC_CLASS(wxListMainWindow); - DECLARE_EVENT_TABLE() -}; - //----------------------------------------------------------------------------- // wxListCtrl //----------------------------------------------------------------------------- @@ -468,27 +150,15 @@ public: bool SetFont( const wxFont &font ); #if wxUSE_DRAG_AND_DROP - void SetDropTarget( wxDropTarget *dropTarget ) - { m_mainWin->SetDropTarget( dropTarget ); } - wxDropTarget *GetDropTarget() const - { return m_mainWin->GetDropTarget(); } + void SetDropTarget( wxDropTarget *dropTarget ); + wxDropTarget *GetDropTarget() const; #endif - bool SetCursor( const wxCursor &cursor ) - { return m_mainWin ? m_mainWin->wxWindow::SetCursor(cursor) : FALSE; } - wxColour GetBackgroundColour() const - { return m_mainWin ? m_mainWin->GetBackgroundColour() : wxColour(); } - wxColour GetForegroundColour() const - { return m_mainWin ? m_mainWin->GetForegroundColour() : wxColour(); } - bool DoPopupMenu( wxMenu *menu, int x, int y ) - { return m_mainWin->PopupMenu( menu, x, y ); } - void SetFocus() - { - /* The test in window.cpp fails as we are a composite - window, so it checks against "this", but not m_mainWin. */ - if (FindFocus() != this) - m_mainWin->SetFocus(); - } + bool SetCursor( const wxCursor &cursor ); + wxColour GetBackgroundColour() const; + wxColour GetForegroundColour() const; + bool DoPopupMenu( wxMenu *menu, int x, int y ); + void SetFocus(); // implementation // -------------- diff --git a/samples/listctrl/listtest.cpp b/samples/listctrl/listtest.cpp index 6db715830d..6f93325f14 100644 --- a/samples/listctrl/listtest.cpp +++ b/samples/listctrl/listtest.cpp @@ -532,7 +532,7 @@ void MyListCtrl::OnEndLabelEdit(wxListEvent& event) text->WriteText("\n"); } -void MyListCtrl::OnDeleteItem(wxListEvent& WXUNUSED(event)) +void MyListCtrl::OnDeleteItem(wxListEvent& event) { if ( !wxGetApp().GetTopWindow() ) return; @@ -541,7 +541,7 @@ void MyListCtrl::OnDeleteItem(wxListEvent& WXUNUSED(event)) if ( !text ) return; - text->WriteText("OnDeleteItem\n"); + text->WriteText(wxString::Format("%ld OnDeleteItem\n", event.GetIndex())); } void MyListCtrl::OnDeleteAllItems(wxListEvent& WXUNUSED(event)) @@ -553,7 +553,7 @@ void MyListCtrl::OnDeleteAllItems(wxListEvent& WXUNUSED(event)) if ( !text ) return; - text->WriteText("OnDeleteAllItems\n"); + text->WriteText("OnDeleteAllItems\n"); } void MyListCtrl::OnGetInfo(wxListEvent& event) @@ -590,7 +590,7 @@ void MyListCtrl::OnGetInfo(wxListEvent& event) (*text) << "\n"; } -void MyListCtrl::OnSetInfo(wxListEvent& WXUNUSED(event)) +void MyListCtrl::OnSetInfo(wxListEvent& event) { if ( !wxGetApp().GetTopWindow() ) return; @@ -599,7 +599,7 @@ void MyListCtrl::OnSetInfo(wxListEvent& WXUNUSED(event)) if ( !text ) return; - text->WriteText("OnSetInfo\n"); + text->WriteText(wxString::Format("%ld OnSetInfo\n", event.GetIndex())); } void MyListCtrl::OnSelected(wxListEvent& event) @@ -628,10 +628,10 @@ void MyListCtrl::OnSelected(wxListEvent& event) } } - text->WriteText("OnSelected\n"); + text->WriteText(wxString::Format("%ld OnSelected\n", event.GetIndex())); } -void MyListCtrl::OnDeselected(wxListEvent& WXUNUSED(event)) +void MyListCtrl::OnDeselected(wxListEvent& event) { if ( !wxGetApp().GetTopWindow() ) return; @@ -640,10 +640,10 @@ void MyListCtrl::OnDeselected(wxListEvent& WXUNUSED(event)) if ( !text ) return; - text->WriteText("OnDeselected\n"); + text->WriteText(wxString::Format("%ld OnDeselected\n", event.GetIndex())); } -void MyListCtrl::OnActivated(wxListEvent& WXUNUSED(event)) +void MyListCtrl::OnActivated(wxListEvent& event) { if ( !wxGetApp().GetTopWindow() ) return; @@ -652,7 +652,7 @@ void MyListCtrl::OnActivated(wxListEvent& WXUNUSED(event)) if ( !text ) return; - text->WriteText("OnActivated\n"); + text->WriteText(wxString::Format("%ld OnActivated\n", event.GetIndex())); } void MyListCtrl::OnListKeyDown(wxListEvent& event) @@ -664,7 +664,7 @@ void MyListCtrl::OnListKeyDown(wxListEvent& event) if ( !text ) return; - text->WriteText("OnListKeyDown\n"); + text->WriteText(wxString::Format("%ld OnListKeyDown\n", event.GetIndex())); } diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 4c9d73e2ed..9eb3fed218 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -28,6 +28,336 @@ #define wxUSE_GENERIC_LIST_EXTENSIONS 0 #endif +// ============================================================================ +// private classes +// ============================================================================ + +//----------------------------------------------------------------------------- +// wxListItemData (internal) +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxListItemData : public wxObject +{ +public: + wxString m_text; + int m_image; + long m_data; + int m_xpos,m_ypos; + int m_width,m_height; + + wxListItemAttr *m_attr; + +public: + wxListItemData(); + ~wxListItemData() { delete m_attr; } + + wxListItemData( const wxListItem &info ); + void SetItem( const wxListItem &info ); + void SetText( const wxString &s ); + void SetImage( int image ); + void SetData( long data ); + void SetPosition( int x, int y ); + void SetSize( int width, int height ); + bool HasImage() const; + bool HasText() const; + bool IsHit( int x, int y ) const; + void GetText( wxString &s ); + const wxString& GetText() { return m_text; } + int GetX( void ) const; + int GetY( void ) const; + int GetWidth() const; + int GetHeight() const; + int GetImage() const; + void GetItem( wxListItem &info ) const; + + wxListItemAttr *GetAttributes() const { return m_attr; } + +private: + DECLARE_DYNAMIC_CLASS(wxListItemData); +}; + +//----------------------------------------------------------------------------- +// wxListHeaderData (internal) +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxListHeaderData : public wxObject +{ +protected: + long m_mask; + int m_image; + wxString m_text; + int m_format; + int m_width; + int m_xpos,m_ypos; + int m_height; + +public: + wxListHeaderData(); + wxListHeaderData( const wxListItem &info ); + void SetItem( const wxListItem &item ); + void SetPosition( int x, int y ); + void SetWidth( int w ); + void SetFormat( int format ); + void SetHeight( int h ); + bool HasImage() const; + bool HasText() const; + bool IsHit( int x, int y ) const; + void GetItem( wxListItem &item ); + void GetText( wxString &s ); + int GetImage() const; + int GetWidth() const; + int GetFormat() const; + +private: + DECLARE_DYNAMIC_CLASS(wxListHeaderData); +}; + +//----------------------------------------------------------------------------- +// wxListLineData (internal) +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxListLineData : public wxObject +{ +public: + wxList m_items; + wxRect m_bound_all; + wxRect m_bound_label; + wxRect m_bound_icon; + wxRect m_bound_hilight; + int m_mode; + bool m_hilighted; + wxBrush *m_hilightBrush; + int m_spacing; + wxListMainWindow *m_owner; + + void DoDraw( wxDC *dc, bool hilight, bool paintBG ); + +public: + wxListLineData() {} + wxListLineData( wxListMainWindow *owner, int mode, wxBrush *hilightBrush ); + void CalculateSize( wxDC *dc, int spacing ); + void SetPosition( wxDC *dc, int x, int y, int window_width ); + void SetColumnPosition( int index, int x ); + void GetSize( int &width, int &height ); + void GetExtent( int &x, int &y, int &width, int &height ); + void GetLabelExtent( int &x, int &y, int &width, int &height ); + long IsHit( int x, int y ); + void InitItems( int num ); + void SetItem( int index, const wxListItem &info ); + void GetItem( int index, wxListItem &info ); + void GetText( int index, wxString &s ); + void SetText( int index, const wxString s ); + int GetImage( int index ); + void GetRect( wxRect &rect ); + void Hilight( bool on ); + void ReverseHilight(); + void DrawRubberBand( wxDC *dc, bool on ); + void Draw( wxDC *dc ); + bool IsInRect( int x, int y, const wxRect &rect ); + bool IsHilighted(); + void AssignRect( wxRect &dest, int x, int y, int width, int height ); + void AssignRect( wxRect &dest, const wxRect &source ); + +private: + void SetAttributes(wxDC *dc, + const wxListItemAttr *attr, + const wxColour& colText, const wxFont& font, + bool hilight); + + DECLARE_DYNAMIC_CLASS(wxListLineData); +}; + +//----------------------------------------------------------------------------- +// wxListHeaderWindow (internal) +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxListHeaderWindow : public wxWindow +{ +protected: + wxListMainWindow *m_owner; + wxCursor *m_currentCursor; + wxCursor *m_resizeCursor; + bool m_isDragging; + int m_column; + int m_minX; + int m_currentX; + +public: + wxListHeaderWindow(); + ~wxListHeaderWindow(); + wxListHeaderWindow( wxWindow *win, wxWindowID id, wxListMainWindow *owner, + const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, + long style = 0, const wxString &name = "columntitles" ); + void DoDrawRect( wxDC *dc, int x, int y, int w, int h ); + void OnPaint( wxPaintEvent &event ); + void DrawCurrent(); + void OnMouse( wxMouseEvent &event ); + void OnSetFocus( wxFocusEvent &event ); + +private: + DECLARE_DYNAMIC_CLASS(wxListHeaderWindow) + DECLARE_EVENT_TABLE() +}; + +//----------------------------------------------------------------------------- +// wxListRenameTimer (internal) +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxListRenameTimer: public wxTimer +{ +private: + wxListMainWindow *m_owner; + +public: + wxListRenameTimer( wxListMainWindow *owner ); + void Notify(); +}; + +//----------------------------------------------------------------------------- +// wxListTextCtrl (internal) +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxListTextCtrl: public wxTextCtrl +{ +private: + bool *m_accept; + wxString *m_res; + wxListMainWindow *m_owner; + wxString m_startValue; + +public: + wxListTextCtrl() {} + wxListTextCtrl( wxWindow *parent, const wxWindowID id, + bool *accept, wxString *res, wxListMainWindow *owner, + const wxString &value = "", + const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, + int style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString &name = "wxListTextCtrlText" ); + void OnChar( wxKeyEvent &event ); + void OnKillFocus( wxFocusEvent &event ); + +private: + DECLARE_DYNAMIC_CLASS(wxListTextCtrl); + DECLARE_EVENT_TABLE() +}; + +//----------------------------------------------------------------------------- +// wxListMainWindow (internal) +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxListMainWindow: public wxScrolledWindow +{ +public: + long m_mode; + wxList m_lines; + wxList m_columns; + wxListLineData *m_current; + wxListLineData *m_currentEdit; + int m_visibleLines; + wxBrush *m_hilightBrush; + wxColour *m_hilightColour; + int m_xScroll,m_yScroll; + bool m_dirty; + wxImageList *m_small_image_list; + wxImageList *m_normal_image_list; + int m_small_spacing; + int m_normal_spacing; + bool m_hasFocus; + bool m_usedKeys; + bool m_lastOnSame; + wxTimer *m_renameTimer; + bool m_renameAccept; + wxString m_renameRes; + bool m_isCreated; + int m_dragCount; + wxPoint m_dragStart; + + // for double click logic + wxListLineData *m_lineLastClicked, + *m_lineBeforeLastClicked; + +public: + wxListMainWindow(); + wxListMainWindow( wxWindow *parent, wxWindowID id, + const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, + long style = 0, const wxString &name = "listctrl" ); + ~wxListMainWindow(); + void RefreshLine( wxListLineData *line ); + void OnPaint( wxPaintEvent &event ); + void HilightAll( bool on ); + void SendNotify( wxListLineData *line, wxEventType command ); + void FocusLine( wxListLineData *line ); + void UnfocusLine( wxListLineData *line ); + void SelectLine( wxListLineData *line ); + void DeselectLine( wxListLineData *line ); + void DeleteLine( wxListLineData *line ); + + void EditLabel( long item ); + void Edit( long item ) { EditLabel(item); } // deprecated + void OnRenameTimer(); + void OnRenameAccept(); + + void OnMouse( wxMouseEvent &event ); + void MoveToFocus(); + void OnArrowChar( wxListLineData *newCurrent, bool shiftDown ); + void OnChar( wxKeyEvent &event ); + void OnKeyDown( wxKeyEvent &event ); + void OnSetFocus( wxFocusEvent &event ); + void OnKillFocus( wxFocusEvent &event ); + void OnSize( wxSizeEvent &event ); + void OnScroll(wxScrollWinEvent& event) ; + + void DrawImage( int index, wxDC *dc, int x, int y ); + void GetImageSize( int index, int &width, int &height ); + int GetIndexOfLine( const wxListLineData *line ); + int GetTextLength( wxString &s ); // should be 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 ); + int GetColumnWidth( int vol ); + int GetColumnCount(); + int GetCountPerPage(); + void SetItem( wxListItem &item ); + void GetItem( wxListItem &item ); + void SetItemState( long item, long state, long stateMask ); + int GetItemState( long item, long stateMask ); + int GetItemCount(); + void GetItemRect( long index, wxRect &rect ); + bool GetItemPosition( long item, wxPoint& pos ); + int GetSelectedItemCount(); + void SetMode( long mode ); + long GetMode() const; + void CalculatePositions(); + void RealizeChanges(); + long GetNextItem( long item, int geometry, int state ); + 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, long data); + long HitTest( int x, int y, int &flags ); + void InsertItem( wxListItem &item ); +// void AddItem( wxListItem &item ); + void InsertColumn( long col, wxListItem &item ); +// void AddColumn( wxListItem &item ); + void SortItems( wxListCtrlCompare fn, long data ); + +private: + DECLARE_DYNAMIC_CLASS(wxListMainWindow); + DECLARE_EVENT_TABLE() +}; + +// ============================================================================ +// implementation +// ============================================================================ + //----------------------------------------------------------------------------- // wxListItemData //----------------------------------------------------------------------------- @@ -1132,6 +1462,9 @@ wxListMainWindow::wxListMainWindow() m_renameTimer = new wxListRenameTimer( this ); m_isCreated = FALSE; m_dragCount = 0; + + m_lineLastClicked = + m_lineBeforeLastClicked = (wxListLineData *)NULL; } wxListMainWindow::wxListMainWindow( wxWindow *parent, wxWindowID id, @@ -1425,15 +1758,26 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) if (!line) return; + bool forceClick = FALSE; if (event.ButtonDClick()) { - m_usedKeys = FALSE; - m_lastOnSame = FALSE; m_renameTimer->Stop(); + m_lastOnSame = FALSE; + + if ( line == m_lineBeforeLastClicked ) + { + m_usedKeys = FALSE; - SendNotify( line, wxEVT_COMMAND_LIST_ITEM_ACTIVATED ); + SendNotify( line, wxEVT_COMMAND_LIST_ITEM_ACTIVATED ); - return; + return; + } + else + { + // the first click was on another item, so don't interpret this as + // a double click, but as a simple click instead + forceClick = TRUE; + } } if (event.LeftUp() && m_lastOnSame) @@ -1461,8 +1805,11 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) return; } - if (event.LeftDown()) + if ( event.LeftDown() || forceClick ) { + m_lineBeforeLastClicked = m_lineLastClicked; + m_lineLastClicked = line; + m_usedKeys = FALSE; wxListLineData *oldCurrent = m_current; if (m_mode & wxLC_SINGLE_SEL) @@ -1534,7 +1881,10 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) UnfocusLine( oldCurrent ); FocusLine( m_current ); } - m_lastOnSame = (m_current == oldCurrent); + + // forceClick is only set if the previous click was on another item + m_lastOnSame = !forceClick && (m_current == oldCurrent); + return; } } @@ -3258,3 +3608,44 @@ bool wxListCtrl::SetFont( const wxFont &font ) return TRUE; } +#if wxUSE_DRAG_AND_DROP + +void wxListCtrl::SetDropTarget( wxDropTarget *dropTarget ) +{ + m_mainWin->SetDropTarget( dropTarget ); +} + +wxDropTarget *wxListCtrl::GetDropTarget() const +{ + return m_mainWin->GetDropTarget(); +} + +#endif // wxUSE_DRAG_AND_DROP + +bool wxListCtrl::SetCursor( const wxCursor &cursor ) +{ + return m_mainWin ? m_mainWin->wxWindow::SetCursor(cursor) : FALSE; +} + +wxColour wxListCtrl::GetBackgroundColour() const +{ + return m_mainWin ? m_mainWin->GetBackgroundColour() : wxColour(); +} + +wxColour wxListCtrl::GetForegroundColour() const +{ + return m_mainWin ? m_mainWin->GetForegroundColour() : wxColour(); +} + +bool wxListCtrl::DoPopupMenu( wxMenu *menu, int x, int y ) +{ + return m_mainWin->PopupMenu( menu, x, y ); +} + +void wxListCtrl::SetFocus() +{ + /* The test in window.cpp fails as we are a composite + window, so it checks against "this", but not m_mainWin. */ + if ( FindFocus() != this ) + m_mainWin->SetFocus(); +}