X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/48f7ffbe93ab587c54643e2476b0e3b0c74e1386..70b6d394128782bdc2454dacbc7a72e347485868:/src/generic/listctrl.cpp diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 72bd336298..c6a51c9524 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -23,11 +23,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "listctrl.h" - #pragma implementation "listctrlbase.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -142,9 +137,8 @@ static const int MARGIN_BETWEEN_ROWS = 6; // when autosizing the columns, add some slack static const int AUTOSIZE_COL_MARGIN = 10; -// default and minimal widths for the header columns +// default width for the header columns static const int WIDTH_COL_DEFAULT = 80; -static const int WIDTH_COL_MIN = 10; // the space between the image and the text in the report mode static const int IMAGE_MARGIN_IN_REPORT_MODE = 5; @@ -290,7 +284,7 @@ private: WX_DECLARE_LIST(wxListItemData, wxListItemDataList); #include "wx/listimpl.cpp" -WX_DEFINE_LIST(wxListItemDataList); +WX_DEFINE_LIST(wxListItemDataList) class wxListLineData { @@ -367,7 +361,7 @@ public: void GetItem( int index, wxListItem &info ); wxString GetText(int index) const; - void SetText( int index, const wxString s ); + void SetText( int index, const wxString& s ); wxListItemAttr *GetAttr() const; void SetAttr(wxListItemAttr *attr); @@ -418,7 +412,7 @@ private: WX_DECLARE_EXPORTED_OBJARRAY(wxListLineData, wxListLineDataArray); #include "wx/arrimpl.cpp" -WX_DEFINE_OBJARRAY(wxListLineDataArray); +WX_DEFINE_OBJARRAY(wxListLineDataArray) //----------------------------------------------------------------------------- // wxListHeaderWindow (internal) @@ -471,7 +465,7 @@ private: // generate and process the list event of the given type, return true if // it wasn't vetoed, i.e. if we should proceed - bool SendListEvent(wxEventType type, wxPoint pos); + bool SendListEvent(wxEventType type, const wxPoint& pos); DECLARE_DYNAMIC_CLASS(wxListHeaderWindow) DECLARE_EVENT_TABLE() @@ -500,6 +494,8 @@ class WXDLLEXPORT wxListTextCtrl: public wxTextCtrl public: wxListTextCtrl(wxListMainWindow *owner, size_t itemEdit); + void AcceptChangesAndFinish(); + protected: void OnChar( wxKeyEvent &event ); void OnKeyUp( wxKeyEvent &event ); @@ -524,7 +520,7 @@ private: WX_DECLARE_LIST(wxListHeaderData, wxListHeaderDataList); #include "wx/listimpl.cpp" -WX_DEFINE_LIST(wxListHeaderDataList); +WX_DEFINE_LIST(wxListHeaderDataList) class wxListMainWindow : public wxScrolledWindow { @@ -674,6 +670,7 @@ public: wxString GetItemText(long item) const { wxListItem info; + info.m_mask = wxLIST_MASK_TEXT; info.m_itemId = item; GetItem( info ); return info.m_text; @@ -721,7 +718,7 @@ public: // send out a wxListEvent void SendNotify( size_t line, wxEventType command, - wxPoint point = wxDefaultPosition ); + const wxPoint& point = wxDefaultPosition ); // override base class virtual to reset m_lineHeight when the font changes virtual bool SetFont(const wxFont& font) @@ -795,6 +792,8 @@ public: m_lineBeforeLastClicked, m_lineSelectSingleOnUp; + wxListTextCtrl* m_textctrl; + protected: // the total count of items in a virtual list control size_t m_countVirt; @@ -997,9 +996,19 @@ int wxListItemData::GetHeight() const void wxListItemData::GetItem( wxListItem &info ) const { - info.m_text = m_text; - info.m_image = m_image; - info.m_data = m_data; + long mask = info.m_mask; + if ( !mask ) + { + // by default, get everything for backwards compatibility + mask = -1; + } + + if ( mask & wxLIST_MASK_TEXT ) + info.m_text = m_text; + if ( mask & wxLIST_MASK_IMAGE ) + info.m_image = m_image; + if ( mask & wxLIST_MASK_DATA ) + info.m_data = m_data; if ( m_attr ) { @@ -1069,11 +1078,7 @@ void wxListHeaderData::SetHeight( int h ) void wxListHeaderData::SetWidth( int w ) { - m_width = w; - if (m_width < 0) - m_width = WIDTH_COL_DEFAULT; - else if (m_width < WIDTH_COL_MIN) - m_width = WIDTH_COL_MIN; + m_width = w < 0 ? WIDTH_COL_DEFAULT : w; } void wxListHeaderData::SetFormat( int format ) @@ -1359,7 +1364,7 @@ wxString wxListLineData::GetText(int index) const return s; } -void wxListLineData::SetText( int index, const wxString s ) +void wxListLineData::SetText( int index, const wxString& s ) { wxListItemDataList::compatibility_iterator node = m_items.Item( index ); if (node) @@ -2003,7 +2008,7 @@ void wxListHeaderWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) m_owner->Update(); } -bool wxListHeaderWindow::SendListEvent(wxEventType type, wxPoint pos) +bool wxListHeaderWindow::SendListEvent(wxEventType type, const wxPoint& pos) { wxWindow *parent = GetParent(); wxListEvent le( type, parent->GetId() ); @@ -2067,7 +2072,8 @@ void wxListTextCtrl::Finish() if ( !m_finished ) { wxPendingDelete.Append(this); - + m_owner->m_textctrl = NULL; + m_finished = true; m_owner->SetFocusIgnoringChildren(); @@ -2096,16 +2102,21 @@ bool wxListTextCtrl::AcceptChanges() return true; } +void wxListTextCtrl::AcceptChangesAndFinish() +{ + m_aboutToFinish = true; + // Notify the owner about the changes + AcceptChanges(); + // Even if vetoed, close the control (consistent with MSW) + Finish(); +} + void wxListTextCtrl::OnChar( wxKeyEvent &event ) { switch ( event.m_keyCode ) { case WXK_RETURN: - m_aboutToFinish = true; - // Notify the owner about the changes - AcceptChanges(); - // Even if vetoed, close the control (consistent with MSW) - Finish(); + AcceptChangesAndFinish(); break; case WXK_ESCAPE: @@ -2197,7 +2208,8 @@ void wxListMainWindow::Init() m_lastOnSame = false; m_renameTimer = new wxListRenameTimer( this ); - + m_textctrl = NULL; + m_current = m_lineLastClicked = m_lineSelectSingleOnUp = @@ -2788,7 +2800,7 @@ void wxListMainWindow::HighlightAll( bool on ) void wxListMainWindow::SendNotify( size_t line, wxEventType command, - wxPoint point ) + const wxPoint& point ) { wxListEvent le( command, GetParent()->GetId() ); le.SetEventObject( GetParent() ); @@ -2846,9 +2858,8 @@ void wxListMainWindow::EditLabel( long item ) if ( m_dirty ) wxSafeYield(); - wxListTextCtrl *text = new wxListTextCtrl(this, itemEdit); - - text->SetFocus(); + m_textctrl = new wxListTextCtrl(this, itemEdit); + m_textctrl->SetFocus(); } void wxListMainWindow::OnRenameTimer() @@ -2893,6 +2904,17 @@ void wxListMainWindow::OnRenameCancelled(size_t itemEdit) void wxListMainWindow::OnMouse( wxMouseEvent &event ) { +#ifdef __WXMAC__ + // On wxMac we can't depend on the EVT_KILL_FOCUS event to properly + // shutdown the edit control when the mouse is clicked elsewhere on the + // listctrl because the order of events is different (or something like + // that,) so explicitly end the edit if it is active. + if ( event.LeftDown() && m_textctrl) + { + m_textctrl->AcceptChangesAndFinish(); + } +#endif + event.SetEventObject( GetParent() ); if ( GetParent()->GetEventHandler()->ProcessEvent( event) ) return; @@ -3648,6 +3670,10 @@ void wxListMainWindow::SetItem( wxListItem &item ) wxListLineData *line = GetLine((size_t)id); line->SetItem( item.m_col, item ); + // Set item state if user wants + if ( item.m_mask & wxLIST_MASK_STATE ) + SetItemState( item.m_itemId, item.m_state, item.m_state ); + if (InReportView()) { // update the Max Width Cache if needed @@ -3716,8 +3742,8 @@ void wxListMainWindow::SetItemState( long litem, long state, long stateMask ) return; } - wxCHECK_RET( litem >= 0 && (size_t)litem < GetItemCount(), - _T("invalid list ctrl item index in SetItem") ); + wxCHECK_RET( litem >= 0 && (size_t)litem < GetItemCount(), + _T("invalid list ctrl item index in SetItem") ); size_t oldCurrent = m_current; size_t item = (size_t)litem; // safe because of the check above @@ -3831,6 +3857,11 @@ void wxListMainWindow::GetItem( wxListItem &item ) const wxListLineData *line = GetLine((size_t)item.m_itemId); line->GetItem( item.m_col, item ); + + // Get item state if user wants it + if ( item.m_mask & wxLIST_MASK_STATE ) + item.m_state = GetItemState( item.m_itemId, wxLIST_STATE_SELECTED | + wxLIST_STATE_FOCUSED ); } // ---------------------------------------------------------------------------- @@ -4996,6 +5027,7 @@ void wxGenericListCtrl::SetItemText( long item, const wxString& str ) wxUIntPtr wxGenericListCtrl::GetItemData( long item ) const { wxListItem info; + info.m_mask = wxLIST_MASK_DATA; info.m_itemId = item; m_mainWin->GetItem( info ); return info.m_data; @@ -5094,6 +5126,22 @@ wxColour wxGenericListCtrl::GetItemBackgroundColour( long item ) const return info.GetBackgroundColour(); } +void wxGenericListCtrl::SetItemFont( long item, const wxFont &f ) +{ + wxListItem info; + info.m_itemId = item; + info.SetFont( f ); + m_mainWin->SetItem( info ); +} + +wxFont wxGenericListCtrl::GetItemFont( long item ) const +{ + wxListItem info; + info.m_itemId = item; + m_mainWin->GetItem( info ); + return info.GetFont(); +} + int wxGenericListCtrl::GetSelectedItemCount() const { return m_mainWin->GetSelectedItemCount();