X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/943f6ad3d6962d780b5b022a7f97d45d34f14def..757cc9def70e4685054f4a24238e2df111f6c9fd:/src/generic/listctrl.cpp diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 28853c64c4..3c6eb23cf8 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -499,28 +499,23 @@ public: class WXDLLEXPORT wxListTextCtrl: public wxTextCtrl { -private: - bool *m_accept; - wxString *m_res; - wxListMainWindow *m_owner; - wxString m_startValue; - bool m_finished; - 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 = "listctrltextctrl" ); + wxListTextCtrl(wxListMainWindow *owner, size_t itemEdit); + +protected: void OnChar( wxKeyEvent &event ); void OnKeyUp( wxKeyEvent &event ); void OnKillFocus( wxFocusEvent &event ); + bool AcceptChanges(); + void Finish(); + private: - DECLARE_DYNAMIC_CLASS(wxListTextCtrl) + wxListMainWindow *m_owner; + wxString m_startValue; + size_t m_itemEdited; + bool m_finished; + DECLARE_EVENT_TABLE() }; @@ -632,7 +627,7 @@ public: void SetFocus(); void OnRenameTimer(); - void OnRenameAccept(); + bool OnRenameAccept(size_t itemEdit, const wxString& value); void OnMouse( wxMouseEvent &event ); @@ -667,12 +662,29 @@ public: int GetCountPerPage() const; void SetItem( wxListItem &item ); - void GetItem( wxListItem &item ); + void GetItem( wxListItem &item ) const; void SetItemState( long item, long state, long stateMask ); - int GetItemState( long item, long stateMask ); - void GetItemRect( long index, wxRect &rect ); - bool GetItemPosition( long item, wxPoint& pos ); - int GetSelectedItemCount(); + int GetItemState( long item, long stateMask ) const; + void GetItemRect( long index, wxRect &rect ) const; + bool GetItemPosition( long item, wxPoint& pos ) const; + int GetSelectedItemCount() const; + + wxString GetItemText(long item) const + { + wxListItem info; + 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); @@ -680,7 +692,7 @@ public: // refresh the window and the header void RefreshAll(); - long GetNextItem( long item, int geometry, int state ); + long GetNextItem( long item, int geometry, int state ) const; void DeleteItem( long index ); void DeleteAllItems(); void DeleteColumn( int col ); @@ -721,9 +733,9 @@ public: // these are for wxListLineData usage only // get the backpointer to the list ctrl - wxListCtrl *GetListCtrl() const + wxGenericListCtrl *GetListCtrl() const { - return wxStaticCast(GetParent(), wxListCtrl); + return wxStaticCast(GetParent(), wxGenericListCtrl); } // get the height of all lines (assuming they all do have the same height) @@ -739,7 +751,8 @@ public: } //protected: - // the array of all line objects for a non virtual list control + // 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 @@ -748,9 +761,6 @@ public: // currently focused item or -1 size_t m_current; - // the item currently being edited or -1 - size_t m_currentEdit; - // the number of lines per page int m_linesPerPage; @@ -773,8 +783,6 @@ public: bool m_lastOnSame; wxTimer *m_renameTimer; - bool m_renameAccept; - wxString m_renameRes; bool m_isCreated; int m_dragCount; wxPoint m_dragStart; @@ -1449,8 +1457,8 @@ void wxListLineData::SetPosition( int x, int y, if ( item->HasImage() ) { - m_gi->m_rectIcon.x = m_gi->m_rectAll.x + 4 - + (spacing - m_gi->m_rectIcon.width)/2; + m_gi->m_rectIcon.x = m_gi->m_rectAll.x + 4 + + (m_gi->m_rectAll.width - m_gi->m_rectIcon.width) / 2; m_gi->m_rectIcon.y = m_gi->m_rectAll.y + 4; } @@ -1694,18 +1702,17 @@ void wxListLineData::DrawInReportMode( wxDC *dc, dc->DrawRectangle( rectHL ); } - wxListItemDataList::Node *node = m_items.GetFirst(); - wxCHECK_RET( node, _T("no subitems at all??") ); - - size_t col = 0; wxCoord x = rect.x + HEADER_OFFSET_X, y = rect.y + (LINE_SPACING + EXTRA_HEIGHT) / 2; - while ( node ) + size_t col = 0; + for ( wxListItemDataList::Node *node = m_items.GetFirst(); + node; + node = node->GetNext(), col++ ) { wxListItemData *item = node->GetData(); - int width = m_owner->GetColumnWidth(col++); + int width = m_owner->GetColumnWidth(col); int xOld = x; x += width; @@ -1727,8 +1734,6 @@ void wxListLineData::DrawInReportMode( wxDC *dc, { dc->DrawText( item->GetText(), xOld, y ); } - - node = node->GetNext(); } } @@ -2134,69 +2139,82 @@ void wxListRenameTimer::Notify() // wxListTextCtrl (internal) //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxListTextCtrl,wxTextCtrl) - BEGIN_EVENT_TABLE(wxListTextCtrl,wxTextCtrl) EVT_CHAR (wxListTextCtrl::OnChar) EVT_KEY_UP (wxListTextCtrl::OnKeyUp) EVT_KILL_FOCUS (wxListTextCtrl::OnKillFocus) END_EVENT_TABLE() -wxListTextCtrl::wxListTextCtrl( wxWindow *parent, - const wxWindowID id, - bool *accept, - wxString *res, - wxListMainWindow *owner, - const wxString &value, - const wxPoint &pos, - const wxSize &size, - int style, - const wxValidator& validator, - const wxString &name ) - : wxTextCtrl( parent, id, value, pos, size, style, validator, name ) -{ - m_res = res; - m_accept = accept; +wxListTextCtrl::wxListTextCtrl(wxListMainWindow *owner, size_t itemEdit) + : m_startValue(owner->GetItemText(itemEdit)), + m_itemEdited(itemEdit) +{ m_owner = owner; - (*m_accept) = FALSE; - (*m_res) = ""; - m_startValue = value; m_finished = FALSE; + + wxRect rectLabel = owner->GetLineLabelRect(itemEdit); + + m_owner->CalcScrolledPosition(rectLabel.x, rectLabel.y, + &rectLabel.x, &rectLabel.y); + + (void)Create(owner, wxID_ANY, m_startValue, + wxPoint(rectLabel.x-4,rectLabel.y-4), + wxSize(rectLabel.width+11,rectLabel.height+8)); } -void wxListTextCtrl::OnChar( wxKeyEvent &event ) +void wxListTextCtrl::Finish() { - if (event.m_keyCode == WXK_RETURN) + if ( !m_finished ) { - (*m_accept) = TRUE; - (*m_res) = GetValue(); - - if (!wxPendingDelete.Member(this)) - wxPendingDelete.Append(this); - - if ((*m_res) != m_startValue) - m_owner->OnRenameAccept(); + wxPendingDelete.Append(this); m_finished = TRUE; + m_owner->SetFocus(); + } +} - return; +bool wxListTextCtrl::AcceptChanges() +{ + const wxString value = GetValue(); + + if ( value == m_startValue ) + { + // nothing changed, always accept + return TRUE; } - if (event.m_keyCode == WXK_ESCAPE) + + if ( !m_owner->OnRenameAccept(m_itemEdited, value) ) { - (*m_accept) = FALSE; - (*m_res) = ""; + // vetoed by the user + return FALSE; + } - if (!wxPendingDelete.Member(this)) - wxPendingDelete.Append(this); + // accepted, do rename the item + m_owner->SetItemText(m_itemEdited, value); - m_finished = TRUE; - m_owner->SetFocus(); + return TRUE; +} - return; - } +void wxListTextCtrl::OnChar( wxKeyEvent &event ) +{ + switch ( event.m_keyCode ) + { + case WXK_RETURN: + if ( !AcceptChanges() ) + { + // vetoed by the user code + break; + } + //else: fall through - event.Skip(); + case WXK_ESCAPE: + Finish(); + break; + + default: + event.Skip(); + } } void wxListTextCtrl::OnKeyUp( wxKeyEvent &event ) @@ -2224,20 +2242,14 @@ void wxListTextCtrl::OnKeyUp( wxKeyEvent &event ) void wxListTextCtrl::OnKillFocus( wxFocusEvent &event ) { - if (m_finished) + if ( !m_finished ) { - event.Skip(); - return; - } + (void)AcceptChanges(); - if (!wxPendingDelete.Member(this)) - wxPendingDelete.Append(this); - - (*m_accept) = TRUE; - (*m_res) = GetValue(); + Finish(); + } - if ((*m_res) != m_startValue) - m_owner->OnRenameAccept(); + event.Skip(); } //----------------------------------------------------------------------------- @@ -2280,10 +2292,8 @@ void wxListMainWindow::Init() m_lastOnSame = FALSE; m_renameTimer = new wxListRenameTimer( this ); - m_renameAccept = FALSE; m_current = - m_currentEdit = m_lineLastClicked = m_lineBeforeLastClicked = (size_t)-1; @@ -2365,7 +2375,7 @@ wxListMainWindow::~wxListMainWindow() void wxListMainWindow::CacheLineData(size_t line) { - wxListCtrl *listctrl = GetListCtrl(); + wxGenericListCtrl *listctrl = GetListCtrl(); wxListLineData *ld = GetDummyLine(); @@ -2383,15 +2393,27 @@ wxListLineData *wxListMainWindow::GetDummyLine() const { wxASSERT_MSG( !IsEmpty(), _T("invalid line index") ); - if ( m_lines.IsEmpty() ) + wxASSERT_MSG( IsVirtual(), _T("GetDummyLine() shouldn't be called") ); + + wxListMainWindow *self = wxConstCast(this, wxListMainWindow); + + // we need to recreate the dummy line if the number of columns in the + // control changed as it would have the incorrect number of fields + // otherwise + if ( !m_lines.IsEmpty() && + m_lines[0].m_items.GetCount() != (size_t)GetColumnCount() ) { - // normal controls are supposed to have something in m_lines - // already if it's not empty - wxASSERT_MSG( IsVirtual(), _T("logic error") ); + self->m_lines.Clear(); + } - wxListMainWindow *self = wxConstCast(this, wxListMainWindow); + if ( m_lines.IsEmpty() ) + { wxListLineData *line = new wxListLineData(self); self->m_lines.Add(line); + + // don't waste extra memory -- there never going to be anything + // else/more in this array + self->m_lines.Shrink(); } return &m_lines[0]; @@ -2911,41 +2933,29 @@ void wxListMainWindow::ChangeCurrent(size_t current) void wxListMainWindow::EditLabel( long item ) { wxCHECK_RET( (item >= 0) && ((size_t)item < GetItemCount()), - wxT("wrong index in wxListCtrl::EditLabel()") ); + wxT("wrong index in wxGenericListCtrl::EditLabel()") ); - m_currentEdit = (size_t)item; + size_t itemEdit = (size_t)item; wxListEvent le( wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT, GetParent()->GetId() ); le.SetEventObject( GetParent() ); le.m_itemIndex = item; - wxListLineData *data = GetLine(m_currentEdit); + wxListLineData *data = GetLine(itemEdit); wxCHECK_RET( data, _T("invalid index in EditLabel()") ); data->GetItem( 0, le.m_item ); - GetParent()->GetEventHandler()->ProcessEvent( le ); - - if (!le.IsAllowed()) + if ( GetParent()->GetEventHandler()->ProcessEvent( le ) && !le.IsAllowed() ) + { + // vetoed by user code return; + } // We have to call this here because the label in question might just have // been added and no screen update taken place. - if (m_dirty) + if ( m_dirty ) wxSafeYield(); - wxString s = data->GetText(0); - wxRect rectLabel = GetLineLabelRect(m_currentEdit); - - CalcScrolledPosition(rectLabel.x, rectLabel.y, &rectLabel.x, &rectLabel.y); - - wxListTextCtrl *text = new wxListTextCtrl - ( - this, -1, - &m_renameAccept, - &m_renameRes, - this, - s, - wxPoint(rectLabel.x-4,rectLabel.y-4), - wxSize(rectLabel.width+11,rectLabel.height+8) - ); + wxListTextCtrl *text = new wxListTextCtrl(this, itemEdit); + text->SetFocus(); } @@ -2956,27 +2966,19 @@ void wxListMainWindow::OnRenameTimer() EditLabel( m_current ); } -void wxListMainWindow::OnRenameAccept() +bool wxListMainWindow::OnRenameAccept(size_t itemEdit, const wxString& value) { wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() ); le.SetEventObject( GetParent() ); - le.m_itemIndex = m_currentEdit; + le.m_itemIndex = itemEdit; - wxListLineData *data = GetLine(m_currentEdit); - wxCHECK_RET( data, _T("invalid index in OnRenameAccept()") ); + wxListLineData *data = GetLine(itemEdit); + wxCHECK_MSG( data, FALSE, _T("invalid index in OnRenameAccept()") ); data->GetItem( 0, le.m_item ); - le.m_item.m_text = m_renameRes; - GetParent()->GetEventHandler()->ProcessEvent( le ); - - if (!le.IsAllowed()) return; - - wxListItem info; - info.m_mask = wxLIST_MASK_TEXT; - info.m_itemId = le.m_itemIndex; - info.m_text = m_renameRes; - info.SetTextColour(le.m_item.GetTextColour()); - SetItem( info ); + le.m_item.m_text = value; + return !GetParent()->GetEventHandler()->ProcessEvent( le ) || + le.IsAllowed(); } void wxListMainWindow::OnMouse( wxMouseEvent &event ) @@ -3228,7 +3230,7 @@ void wxListMainWindow::OnArrowChar(size_t newCurrent, const wxKeyEvent& event) ChangeCurrent(newCurrent); - HighlightLine( oldCurrent, FALSE ); + // refresh the old focus to remove it RefreshLine( oldCurrent ); if ( !event.ControlDown() ) @@ -3822,7 +3824,7 @@ void wxListMainWindow::SetItemState( long litem, long state, long stateMask ) } } -int wxListMainWindow::GetItemState( long item, long stateMask ) +int wxListMainWindow::GetItemState( long item, long stateMask ) const { wxCHECK_MSG( item >= 0 && (size_t)item < GetItemCount(), 0, _T("invalid list ctrl item index in GetItemState()") ); @@ -3844,7 +3846,7 @@ int wxListMainWindow::GetItemState( long item, long stateMask ) return ret; } -void wxListMainWindow::GetItem( wxListItem &item ) +void wxListMainWindow::GetItem( wxListItem &item ) const { wxCHECK_RET( item.m_itemId >= 0 && (size_t)item.m_itemId < GetItemCount(), _T("invalid item index in GetItem") ); @@ -3873,7 +3875,7 @@ void wxListMainWindow::SetItemCount(long count) m_dirty = TRUE; } -int wxListMainWindow::GetSelectedItemCount() +int wxListMainWindow::GetSelectedItemCount() const { // deal with the quick case first if ( IsSingleSel() ) @@ -3902,7 +3904,7 @@ int wxListMainWindow::GetSelectedItemCount() // item position/size // ---------------------------------------------------------------------------- -void wxListMainWindow::GetItemRect( long index, wxRect &rect ) +void wxListMainWindow::GetItemRect( long index, wxRect &rect ) const { wxCHECK_RET( index >= 0 && (size_t)index < GetItemCount(), _T("invalid index in GetItemRect") ); @@ -3912,7 +3914,7 @@ void wxListMainWindow::GetItemRect( long index, wxRect &rect ) CalcScrolledPosition(rect.x, rect.y, &rect.x, &rect.y); } -bool wxListMainWindow::GetItemPosition(long item, wxPoint& pos) +bool wxListMainWindow::GetItemPosition(long item, wxPoint& pos) const { wxRect rect; GetItemRect(item, rect); @@ -3976,7 +3978,7 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh) ResetVisibleLinesRange(); SetScrollbars( m_xScroll, m_yScroll, - (GetHeaderWidth() + m_xScroll - 1)/m_xScroll, + GetHeaderWidth() / m_xScroll, (entireHeight + m_yScroll - 1)/m_yScroll, GetScrollPos(wxHORIZONTAL), GetScrollPos(wxVERTICAL), @@ -4094,7 +4096,7 @@ void wxListMainWindow::UpdateCurrent() long wxListMainWindow::GetNextItem( long item, int WXUNUSED(geometry), - int state ) + int state ) const { long ret = item, max = GetItemCount(); @@ -4236,9 +4238,9 @@ void wxListMainWindow::DeleteAllItems() void wxListMainWindow::DeleteEverything() { - DeleteAllItems(); - m_columns.Clear(); + + DeleteAllItems(); } // ---------------------------------------------------------------------------- @@ -4437,7 +4439,7 @@ void wxListMainWindow::OnScroll(wxScrollWinEvent& event) if ( event.GetOrientation() == wxHORIZONTAL && HasHeader() ) { - wxListCtrl* lc = GetListCtrl(); + wxGenericListCtrl* lc = GetListCtrl(); wxCHECK_RET( lc, _T("no listctrl window?") ); lc->m_headerWin->Refresh(); @@ -4498,23 +4500,37 @@ void wxListMainWindow::GetVisibleLinesRange(size_t *from, size_t *to) // wxListItem // ------------------------------------------------------------------------------------- +#if !defined(__WIN32__) IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject) +#endif // ------------------------------------------------------------------------------------- -// wxListCtrl +// wxGenericListCtrl // ------------------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxGenericListCtrl, wxControl) + +#if !defined(__WIN32__) IMPLEMENT_DYNAMIC_CLASS(wxListView, wxListCtrl) IMPLEMENT_DYNAMIC_CLASS(wxListEvent, wxNotifyEvent) +#endif -BEGIN_EVENT_TABLE(wxListCtrl,wxControl) - EVT_SIZE(wxListCtrl::OnSize) - EVT_IDLE(wxListCtrl::OnIdle) +BEGIN_EVENT_TABLE(wxGenericListCtrl,wxControl) + EVT_SIZE(wxGenericListCtrl::OnSize) + EVT_IDLE(wxGenericListCtrl::OnIdle) END_EVENT_TABLE() -wxListCtrl::wxListCtrl() +#if !defined(__WXMSW__) || defined(__WIN16__) || defined(__WXUNIVERSAL__) +/* + * wxListCtrl has to be a real class or we have problems with + * the run-time information. + */ + +IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxGenericListCtrl) +#endif + +wxGenericListCtrl::wxGenericListCtrl() { m_imageListNormal = (wxImageList *) NULL; m_imageListSmall = (wxImageList *) NULL; @@ -4528,7 +4544,7 @@ wxListCtrl::wxListCtrl() m_headerWin = (wxListHeaderWindow*) NULL; } -wxListCtrl::~wxListCtrl() +wxGenericListCtrl::~wxGenericListCtrl() { if (m_ownsImageListNormal) delete m_imageListNormal; @@ -4538,7 +4554,7 @@ wxListCtrl::~wxListCtrl() delete m_imageListState; } -void wxListCtrl::CreateHeaderWindow() +void wxGenericListCtrl::CreateHeaderWindow() { m_headerWin = new wxListHeaderWindow ( @@ -4549,7 +4565,7 @@ void wxListCtrl::CreateHeaderWindow() ); } -bool wxListCtrl::Create(wxWindow *parent, +bool wxGenericListCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, @@ -4594,7 +4610,7 @@ bool wxListCtrl::Create(wxWindow *parent, return TRUE; } -void wxListCtrl::SetSingleStyle( long style, bool add ) +void wxGenericListCtrl::SetSingleStyle( long style, bool add ) { wxASSERT_MSG( !(style & wxLC_VIRTUAL), _T("wxLC_VIRTUAL can't be [un]set") ); @@ -4623,7 +4639,7 @@ void wxListCtrl::SetSingleStyle( long style, bool add ) SetWindowStyleFlag( flag ); } -void wxListCtrl::SetWindowStyleFlag( long flag ) +void wxGenericListCtrl::SetWindowStyleFlag( long flag ) { if (m_mainWin) { @@ -4664,47 +4680,47 @@ void wxListCtrl::SetWindowStyleFlag( long flag ) wxWindow::SetWindowStyleFlag( flag ); } -bool wxListCtrl::GetColumn(int col, wxListItem &item) const +bool wxGenericListCtrl::GetColumn(int col, wxListItem &item) const { m_mainWin->GetColumn( col, item ); return TRUE; } -bool wxListCtrl::SetColumn( int col, wxListItem& item ) +bool wxGenericListCtrl::SetColumn( int col, wxListItem& item ) { m_mainWin->SetColumn( col, item ); return TRUE; } -int wxListCtrl::GetColumnWidth( int col ) const +int wxGenericListCtrl::GetColumnWidth( int col ) const { return m_mainWin->GetColumnWidth( col ); } -bool wxListCtrl::SetColumnWidth( int col, int width ) +bool wxGenericListCtrl::SetColumnWidth( int col, int width ) { m_mainWin->SetColumnWidth( col, width ); return TRUE; } -int wxListCtrl::GetCountPerPage() const +int wxGenericListCtrl::GetCountPerPage() const { return m_mainWin->GetCountPerPage(); // different from Windows ? } -bool wxListCtrl::GetItem( wxListItem &info ) const +bool wxGenericListCtrl::GetItem( wxListItem &info ) const { m_mainWin->GetItem( info ); return TRUE; } -bool wxListCtrl::SetItem( wxListItem &info ) +bool wxGenericListCtrl::SetItem( wxListItem &info ) { m_mainWin->SetItem( info ); return TRUE; } -long wxListCtrl::SetItem( long index, int col, const wxString& label, int imageId ) +long wxGenericListCtrl::SetItem( long index, int col, const wxString& label, int imageId ) { wxListItem info; info.m_text = label; @@ -4720,18 +4736,18 @@ long wxListCtrl::SetItem( long index, int col, const wxString& label, int imageI return TRUE; } -int wxListCtrl::GetItemState( long item, long stateMask ) const +int wxGenericListCtrl::GetItemState( long item, long stateMask ) const { return m_mainWin->GetItemState( item, stateMask ); } -bool wxListCtrl::SetItemState( long item, long state, long stateMask ) +bool wxGenericListCtrl::SetItemState( long item, long state, long stateMask ) { m_mainWin->SetItemState( item, state, stateMask ); return TRUE; } -bool wxListCtrl::SetItemImage( long item, int image, int WXUNUSED(selImage) ) +bool wxGenericListCtrl::SetItemImage( long item, int image, int WXUNUSED(selImage) ) { wxListItem info; info.m_image = image; @@ -4741,24 +4757,17 @@ bool wxListCtrl::SetItemImage( long item, int image, int WXUNUSED(selImage) ) return TRUE; } -wxString wxListCtrl::GetItemText( long item ) const +wxString wxGenericListCtrl::GetItemText( long item ) const { - wxListItem info; - info.m_itemId = item; - m_mainWin->GetItem( info ); - return info.m_text; + return m_mainWin->GetItemText(item); } -void wxListCtrl::SetItemText( long item, const wxString &str ) +void wxGenericListCtrl::SetItemText( long item, const wxString& str ) { - wxListItem info; - info.m_mask = wxLIST_MASK_TEXT; - info.m_itemId = item; - info.m_text = str; - m_mainWin->SetItem( info ); + m_mainWin->SetItemText(item, str); } -long wxListCtrl::GetItemData( long item ) const +long wxGenericListCtrl::GetItemData( long item ) const { wxListItem info; info.m_itemId = item; @@ -4766,7 +4775,7 @@ long wxListCtrl::GetItemData( long item ) const return info.m_data; } -bool wxListCtrl::SetItemData( long item, long data ) +bool wxGenericListCtrl::SetItemData( long item, long data ) { wxListItem info; info.m_mask = wxLIST_MASK_DATA; @@ -4776,44 +4785,44 @@ bool wxListCtrl::SetItemData( long item, long data ) return TRUE; } -bool wxListCtrl::GetItemRect( long item, wxRect &rect, int WXUNUSED(code) ) const +bool wxGenericListCtrl::GetItemRect( long item, wxRect &rect, int WXUNUSED(code) ) const { m_mainWin->GetItemRect( item, rect ); return TRUE; } -bool wxListCtrl::GetItemPosition( long item, wxPoint& pos ) const +bool wxGenericListCtrl::GetItemPosition( long item, wxPoint& pos ) const { m_mainWin->GetItemPosition( item, pos ); return TRUE; } -bool wxListCtrl::SetItemPosition( long WXUNUSED(item), const wxPoint& WXUNUSED(pos) ) +bool wxGenericListCtrl::SetItemPosition( long WXUNUSED(item), const wxPoint& WXUNUSED(pos) ) { return 0; } -int wxListCtrl::GetItemCount() const +int wxGenericListCtrl::GetItemCount() const { return m_mainWin->GetItemCount(); } -int wxListCtrl::GetColumnCount() const +int wxGenericListCtrl::GetColumnCount() const { return m_mainWin->GetColumnCount(); } -void wxListCtrl::SetItemSpacing( int spacing, bool isSmall ) +void wxGenericListCtrl::SetItemSpacing( int spacing, bool isSmall ) { m_mainWin->SetItemSpacing( spacing, isSmall ); } -int wxListCtrl::GetItemSpacing( bool isSmall ) const +int wxGenericListCtrl::GetItemSpacing( bool isSmall ) const { return m_mainWin->GetItemSpacing( isSmall ); } -void wxListCtrl::SetItemTextColour( long item, const wxColour &col ) +void wxGenericListCtrl::SetItemTextColour( long item, const wxColour &col ) { wxListItem info; info.m_itemId = item; @@ -4821,7 +4830,7 @@ void wxListCtrl::SetItemTextColour( long item, const wxColour &col ) m_mainWin->SetItem( info ); } -wxColour wxListCtrl::GetItemTextColour( long item ) const +wxColour wxGenericListCtrl::GetItemTextColour( long item ) const { wxListItem info; info.m_itemId = item; @@ -4829,7 +4838,7 @@ wxColour wxListCtrl::GetItemTextColour( long item ) const return info.GetTextColour(); } -void wxListCtrl::SetItemBackgroundColour( long item, const wxColour &col ) +void wxGenericListCtrl::SetItemBackgroundColour( long item, const wxColour &col ) { wxListItem info; info.m_itemId = item; @@ -4837,7 +4846,7 @@ void wxListCtrl::SetItemBackgroundColour( long item, const wxColour &col ) m_mainWin->SetItem( info ); } -wxColour wxListCtrl::GetItemBackgroundColour( long item ) const +wxColour wxGenericListCtrl::GetItemBackgroundColour( long item ) const { wxListItem info; info.m_itemId = item; @@ -4845,32 +4854,32 @@ wxColour wxListCtrl::GetItemBackgroundColour( long item ) const return info.GetBackgroundColour(); } -int wxListCtrl::GetSelectedItemCount() const +int wxGenericListCtrl::GetSelectedItemCount() const { return m_mainWin->GetSelectedItemCount(); } -wxColour wxListCtrl::GetTextColour() const +wxColour wxGenericListCtrl::GetTextColour() const { return GetForegroundColour(); } -void wxListCtrl::SetTextColour(const wxColour& col) +void wxGenericListCtrl::SetTextColour(const wxColour& col) { SetForegroundColour(col); } -long wxListCtrl::GetTopItem() const +long wxGenericListCtrl::GetTopItem() const { return 0; } -long wxListCtrl::GetNextItem( long item, int geom, int state ) const +long wxGenericListCtrl::GetNextItem( long item, int geom, int state ) const { return m_mainWin->GetNextItem( item, geom, state ); } -wxImageList *wxListCtrl::GetImageList(int which) const +wxImageList *wxGenericListCtrl::GetImageList(int which) const { if (which == wxIMAGE_LIST_NORMAL) { @@ -4887,7 +4896,7 @@ wxImageList *wxListCtrl::GetImageList(int which) const return (wxImageList *) NULL; } -void wxListCtrl::SetImageList( wxImageList *imageList, int which ) +void wxGenericListCtrl::SetImageList( wxImageList *imageList, int which ) { if ( which == wxIMAGE_LIST_NORMAL ) { @@ -4911,7 +4920,7 @@ void wxListCtrl::SetImageList( wxImageList *imageList, int which ) m_mainWin->SetImageList( imageList, which ); } -void wxListCtrl::AssignImageList(wxImageList *imageList, int which) +void wxGenericListCtrl::AssignImageList(wxImageList *imageList, int which) { SetImageList(imageList, which); if ( which == wxIMAGE_LIST_NORMAL ) @@ -4922,24 +4931,24 @@ void wxListCtrl::AssignImageList(wxImageList *imageList, int which) m_ownsImageListState = TRUE; } -bool wxListCtrl::Arrange( int WXUNUSED(flag) ) +bool wxGenericListCtrl::Arrange( int WXUNUSED(flag) ) { return 0; } -bool wxListCtrl::DeleteItem( long item ) +bool wxGenericListCtrl::DeleteItem( long item ) { m_mainWin->DeleteItem( item ); return TRUE; } -bool wxListCtrl::DeleteAllItems() +bool wxGenericListCtrl::DeleteAllItems() { m_mainWin->DeleteAllItems(); return TRUE; } -bool wxListCtrl::DeleteAllColumns() +bool wxGenericListCtrl::DeleteAllColumns() { size_t count = m_mainWin->m_columns.GetCount(); for ( size_t n = 0; n < count; n++ ) @@ -4948,56 +4957,63 @@ bool wxListCtrl::DeleteAllColumns() return TRUE; } -void wxListCtrl::ClearAll() +void wxGenericListCtrl::ClearAll() { m_mainWin->DeleteEverything(); } -bool wxListCtrl::DeleteColumn( int col ) +bool wxGenericListCtrl::DeleteColumn( int col ) { m_mainWin->DeleteColumn( col ); + + // if we don't have the header any longer, we need to relayout the window + if ( !GetColumnCount() ) + { + ResizeReportView(FALSE /* no header */); + } + return TRUE; } -void wxListCtrl::Edit( long item ) +void wxGenericListCtrl::Edit( long item ) { m_mainWin->EditLabel( item ); } -bool wxListCtrl::EnsureVisible( long item ) +bool wxGenericListCtrl::EnsureVisible( long item ) { m_mainWin->EnsureVisible( item ); return TRUE; } -long wxListCtrl::FindItem( long start, const wxString& str, bool partial ) +long wxGenericListCtrl::FindItem( long start, const wxString& str, bool partial ) { return m_mainWin->FindItem( start, str, partial ); } -long wxListCtrl::FindItem( long start, long data ) +long wxGenericListCtrl::FindItem( long start, long data ) { return m_mainWin->FindItem( start, data ); } -long wxListCtrl::FindItem( long WXUNUSED(start), const wxPoint& WXUNUSED(pt), +long wxGenericListCtrl::FindItem( long WXUNUSED(start), const wxPoint& WXUNUSED(pt), int WXUNUSED(direction)) { return 0; } -long wxListCtrl::HitTest( const wxPoint &point, int &flags ) +long wxGenericListCtrl::HitTest( const wxPoint &point, int &flags ) { return m_mainWin->HitTest( (int)point.x, (int)point.y, flags ); } -long wxListCtrl::InsertItem( wxListItem& info ) +long wxGenericListCtrl::InsertItem( wxListItem& info ) { m_mainWin->InsertItem( info ); return info.m_itemId; } -long wxListCtrl::InsertItem( long index, const wxString &label ) +long wxGenericListCtrl::InsertItem( long index, const wxString &label ) { wxListItem info; info.m_text = label; @@ -5006,7 +5022,7 @@ long wxListCtrl::InsertItem( long index, const wxString &label ) return InsertItem( info ); } -long wxListCtrl::InsertItem( long index, int imageIndex ) +long wxGenericListCtrl::InsertItem( long index, int imageIndex ) { wxListItem info; info.m_mask = wxLIST_MASK_IMAGE; @@ -5015,7 +5031,7 @@ long wxListCtrl::InsertItem( long index, int imageIndex ) return InsertItem( info ); } -long wxListCtrl::InsertItem( long index, const wxString &label, int imageIndex ) +long wxGenericListCtrl::InsertItem( long index, const wxString &label, int imageIndex ) { wxListItem info; info.m_text = label; @@ -5025,16 +5041,25 @@ long wxListCtrl::InsertItem( long index, const wxString &label, int imageIndex ) return InsertItem( info ); } -long wxListCtrl::InsertColumn( long col, wxListItem &item ) +long wxGenericListCtrl::InsertColumn( long col, wxListItem &item ) { - wxASSERT( m_headerWin ); + wxCHECK_MSG( m_headerWin, -1, _T("can't add column in non report mode") ); + m_mainWin->InsertColumn( col, item ); + + // if we hadn't had header before and have it now we need to relayout the + // window + if ( GetColumnCount() == 1 ) + { + ResizeReportView(TRUE /* have header */); + } + m_headerWin->Refresh(); return 0; } -long wxListCtrl::InsertColumn( long col, const wxString &heading, +long wxGenericListCtrl::InsertColumn( long col, const wxString &heading, int format, int width ) { wxListItem item; @@ -5050,7 +5075,7 @@ long wxListCtrl::InsertColumn( long col, const wxString &heading, return InsertColumn( col, item ); } -bool wxListCtrl::ScrollList( int WXUNUSED(dx), int WXUNUSED(dy) ) +bool wxGenericListCtrl::ScrollList( int WXUNUSED(dx), int WXUNUSED(dy) ) { return 0; } @@ -5065,7 +5090,7 @@ bool wxListCtrl::ScrollList( int WXUNUSED(dx), int WXUNUSED(dy) ) // or zero if the two items are equivalent. // data is arbitrary data to be passed to the sort function. -bool wxListCtrl::SortItems( wxListCtrlCompare fn, long data ) +bool wxGenericListCtrl::SortItems( wxListCtrlCompare fn, long data ) { m_mainWin->SortItems( fn, data ); return TRUE; @@ -5075,7 +5100,7 @@ bool wxListCtrl::SortItems( wxListCtrlCompare fn, long data ) // event handlers // ---------------------------------------------------------------------------- -void wxListCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) +void wxGenericListCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) { if ( !m_mainWin ) return; @@ -5085,7 +5110,7 @@ void wxListCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) m_mainWin->RecalculatePositions(); } -void wxListCtrl::ResizeReportView(bool showHeader) +void wxGenericListCtrl::ResizeReportView(bool showHeader) { int cw, ch; GetClientSize( &cw, &ch ); @@ -5101,7 +5126,7 @@ void wxListCtrl::ResizeReportView(bool showHeader) } } -void wxListCtrl::OnIdle( wxIdleEvent & event ) +void wxGenericListCtrl::OnIdle( wxIdleEvent & event ) { event.Skip(); @@ -5116,7 +5141,7 @@ void wxListCtrl::OnIdle( wxIdleEvent & event ) // font/colours // ---------------------------------------------------------------------------- -bool wxListCtrl::SetBackgroundColour( const wxColour &colour ) +bool wxGenericListCtrl::SetBackgroundColour( const wxColour &colour ) { if (m_mainWin) { @@ -5127,7 +5152,7 @@ bool wxListCtrl::SetBackgroundColour( const wxColour &colour ) return TRUE; } -bool wxListCtrl::SetForegroundColour( const wxColour &colour ) +bool wxGenericListCtrl::SetForegroundColour( const wxColour &colour ) { if ( !wxWindow::SetForegroundColour( colour ) ) return FALSE; @@ -5146,7 +5171,7 @@ bool wxListCtrl::SetForegroundColour( const wxColour &colour ) return TRUE; } -bool wxListCtrl::SetFont( const wxFont &font ) +bool wxGenericListCtrl::SetFont( const wxFont &font ) { if ( !wxWindow::SetFont( font ) ) return FALSE; @@ -5171,34 +5196,34 @@ bool wxListCtrl::SetFont( const wxFont &font ) #if wxUSE_DRAG_AND_DROP -void wxListCtrl::SetDropTarget( wxDropTarget *dropTarget ) +void wxGenericListCtrl::SetDropTarget( wxDropTarget *dropTarget ) { m_mainWin->SetDropTarget( dropTarget ); } -wxDropTarget *wxListCtrl::GetDropTarget() const +wxDropTarget *wxGenericListCtrl::GetDropTarget() const { return m_mainWin->GetDropTarget(); } #endif // wxUSE_DRAG_AND_DROP -bool wxListCtrl::SetCursor( const wxCursor &cursor ) +bool wxGenericListCtrl::SetCursor( const wxCursor &cursor ) { return m_mainWin ? m_mainWin->wxWindow::SetCursor(cursor) : FALSE; } -wxColour wxListCtrl::GetBackgroundColour() const +wxColour wxGenericListCtrl::GetBackgroundColour() const { return m_mainWin ? m_mainWin->GetBackgroundColour() : wxColour(); } -wxColour wxListCtrl::GetForegroundColour() const +wxColour wxGenericListCtrl::GetForegroundColour() const { return m_mainWin ? m_mainWin->GetForegroundColour() : wxColour(); } -bool wxListCtrl::DoPopupMenu( wxMenu *menu, int x, int y ) +bool wxGenericListCtrl::DoPopupMenu( wxMenu *menu, int x, int y ) { #if wxUSE_MENUS return m_mainWin->PopupMenu( menu, x, y ); @@ -5207,7 +5232,7 @@ bool wxListCtrl::DoPopupMenu( wxMenu *menu, int x, int y ) #endif // wxUSE_MENUS } -void wxListCtrl::SetFocus() +void wxGenericListCtrl::SetFocus() { /* The test in window.cpp fails as we are a composite window, so it checks against "this", but not m_mainWin. */ @@ -5219,24 +5244,24 @@ void wxListCtrl::SetFocus() // virtual list control support // ---------------------------------------------------------------------------- -wxString wxListCtrl::OnGetItemText(long WXUNUSED(item), long WXUNUSED(col)) const +wxString wxGenericListCtrl::OnGetItemText(long WXUNUSED(item), long WXUNUSED(col)) const { // this is a pure virtual function, in fact - which is not really pure // because the controls which are not virtual don't need to implement it - wxFAIL_MSG( _T("wxListCtrl::OnGetItemText not supposed to be called") ); + wxFAIL_MSG( _T("wxGenericListCtrl::OnGetItemText not supposed to be called") ); return wxEmptyString; } -int wxListCtrl::OnGetItemImage(long WXUNUSED(item)) const +int wxGenericListCtrl::OnGetItemImage(long WXUNUSED(item)) const { // same as above - wxFAIL_MSG( _T("wxListCtrl::OnGetItemImage not supposed to be called") ); + wxFAIL_MSG( _T("wxGenericListCtrl::OnGetItemImage not supposed to be called") ); return -1; } -wxListItemAttr *wxListCtrl::OnGetItemAttr(long item) const +wxListItemAttr *wxGenericListCtrl::OnGetItemAttr(long item) const { wxASSERT_MSG( item >= 0 && item < GetItemCount(), _T("invalid item index in OnGetItemAttr()") ); @@ -5245,33 +5270,32 @@ wxListItemAttr *wxListCtrl::OnGetItemAttr(long item) const return NULL; } -void wxListCtrl::SetItemCount(long count) +void wxGenericListCtrl::SetItemCount(long count) { wxASSERT_MSG( IsVirtual(), _T("this is for virtual controls only") ); m_mainWin->SetItemCount(count); } -void wxListCtrl::RefreshItem(long item) +void wxGenericListCtrl::RefreshItem(long item) { m_mainWin->RefreshLine(item); } -void wxListCtrl::RefreshItems(long itemFrom, long itemTo) +void wxGenericListCtrl::RefreshItems(long itemFrom, long itemTo) { m_mainWin->RefreshLines(itemFrom, itemTo); } -void wxListCtrl::Freeze() +void wxGenericListCtrl::Freeze() { m_mainWin->Freeze(); } -void wxListCtrl::Thaw() +void wxGenericListCtrl::Thaw() { m_mainWin->Thaw(); } #endif // wxUSE_LISTCTRL -// vi:sts=4:sw=4:et