X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/39570cd47981d75ac61a1734eb91628cbcfbfa39..a38b83c353cce75329b2c53c0eaa4ad0f500ccf1:/src/generic/listctrl.cpp?ds=sidebyside diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 84e0770e14..95ede00501 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -2,9 +2,8 @@ // Name: listctrl.cpp // Purpose: // Author: Robert Roebling -// Created: 01/02/97 -// Id: -// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem +// Id: $Id$ +// Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -12,6 +11,8 @@ #pragma implementation "listctrl.h" #endif +#include "wx/dcscreen.h" +#include "wx/app.h" #include "wx/listctrl.h" //----------------------------------------------------------------------------- @@ -29,7 +30,7 @@ wxListItemData::wxListItemData(void) m_width = 0; m_height = 0; m_colour = wxBLACK; -}; +} wxListItemData::wxListItemData( const wxListItem &info ) { @@ -37,7 +38,7 @@ wxListItemData::wxListItemData( const wxListItem &info ) m_data = 0; m_colour = info.m_colour; SetItem( info ); -}; +} void wxListItemData::SetItem( const wxListItem &info ) { @@ -49,96 +50,96 @@ void wxListItemData::SetItem( const wxListItem &info ) m_ypos = 0; m_width = info.m_width; m_height = 0; -}; +} void wxListItemData::SetText( const wxString &s ) { m_text = s; -}; +} void wxListItemData::SetImage( int image ) { m_image = image; -}; +} void wxListItemData::SetData( long data ) { m_data = data; -}; +} void wxListItemData::SetPosition( int x, int y ) { m_xpos = x; m_ypos = y; -}; +} void wxListItemData::SetSize( int const width, int height ) { - m_width = width; - m_height = height; -}; + if (width != -1) m_width = width; + if (height != -1) m_height = height; +} void wxListItemData::SetColour( wxColour *col ) { m_colour = col; -}; +} bool wxListItemData::HasImage(void) const { return (m_image >= 0); -}; +} bool wxListItemData::HasText(void) const { return (!m_text.IsNull()); -}; +} bool wxListItemData::IsHit( int x, int y ) const { return ((x >= m_xpos) && (x <= m_xpos+m_width) && (y >= m_ypos) && (y <= m_ypos+m_height)); -}; +} void wxListItemData::GetText( wxString &s ) { s = m_text; -}; +} int wxListItemData::GetX( void ) const { return m_xpos; -}; +} int wxListItemData::GetY( void ) const { return m_ypos; -}; +} int wxListItemData::GetWidth(void) const { return m_width; -}; +} int wxListItemData::GetHeight(void) const { return m_height; -}; +} int wxListItemData::GetImage(void) const { return m_image; -}; +} void wxListItemData::GetItem( wxListItem &info ) { info.m_text = m_text; info.m_image = m_image; info.m_data = m_data; -}; +} wxColour *wxListItemData::GetColour(void) { return m_colour; -}; +} //----------------------------------------------------------------------------- // wxListHeaderData @@ -155,7 +156,7 @@ wxListHeaderData::wxListHeaderData(void) m_xpos = 0; m_ypos = 0; m_height = 0; -}; +} wxListHeaderData::wxListHeaderData( const wxListItem &item ) { @@ -163,7 +164,7 @@ wxListHeaderData::wxListHeaderData( const wxListItem &item ) m_xpos = 0; m_ypos = 0; m_height = 0; -}; +} void wxListHeaderData::SetItem( const wxListItem &item ) { @@ -174,45 +175,45 @@ void wxListHeaderData::SetItem( const wxListItem &item ) m_width = item.m_width; if (m_width < 0) m_width = 80; if (m_width < 6) m_width = 6; -}; +} void wxListHeaderData::SetPosition( int x, int y ) { m_xpos = x; m_ypos = y; -}; +} void wxListHeaderData::SetHeight( int h ) { m_height = h; -}; +} void wxListHeaderData::SetWidth( int w ) { m_width = w; if (m_width < 0) m_width = 80; if (m_width < 6) m_width = 6; -}; +} void wxListHeaderData::SetFormat( int format ) { m_format = format; -}; +} bool wxListHeaderData::HasImage(void) const { return (m_image != 0); -}; +} bool wxListHeaderData::HasText(void) const { return (m_text.Length() > 0); -}; +} bool wxListHeaderData::IsHit( int x, int y ) const { return ((x >= m_xpos) && (x <= m_xpos+m_width) && (y >= m_ypos) && (y <= m_ypos+m_height)); -}; +} void wxListHeaderData::GetItem( wxListItem &item ) { @@ -221,27 +222,27 @@ void wxListHeaderData::GetItem( wxListItem &item ) item.m_image = m_image; item.m_format = m_format; item.m_width = m_width; -}; +} void wxListHeaderData::GetText( wxString &s ) { s = m_text; -}; +} int wxListHeaderData::GetImage(void) const { return m_image; -}; +} int wxListHeaderData::GetWidth(void) const { return m_width; -}; +} int wxListHeaderData::GetFormat(void) const { return m_format; -}; +} //----------------------------------------------------------------------------- // wxListLineData @@ -257,7 +258,7 @@ wxListLineData::wxListLineData( wxListMainWindow *owner, int mode, wxBrush *hili m_hilightBrush = hilightBrush; m_items.DeleteContents( TRUE ); m_spacing = 0; -}; +} void wxListLineData::CalculateSize( wxPaintDC *dc, int spacing ) { @@ -277,9 +278,9 @@ void wxListLineData::CalculateSize( wxPaintDC *dc, int spacing ) long lw,lh; dc->GetTextExtent( s, &lw, &lh ); if (lw > m_spacing) m_bound_all.width = lw; - }; + } break; - }; + } case wxLC_LIST: { wxNode *node = m_items.First(); @@ -292,9 +293,9 @@ void wxListLineData::CalculateSize( wxPaintDC *dc, int spacing ) dc->GetTextExtent( s, &lw, &lh ); m_bound_all.width = lw; m_bound_all.height = lh; - }; + } break; - }; + } case wxLC_REPORT: { m_bound_all.width = 0; @@ -312,11 +313,11 @@ void wxListLineData::CalculateSize( wxPaintDC *dc, int spacing ) m_bound_all.width += lw; m_bound_all.height = lh; node = node->Next(); - }; + } break; - }; - }; -}; + } + } +} void wxListLineData::SetPosition( wxPaintDC *dc, int x, int y, int window_width ) { @@ -350,8 +351,8 @@ void wxListLineData::SetPosition( wxPaintDC *dc, int x, int y, int window_width m_bound_hilight.y -= 3; m_bound_hilight.width += 7; m_bound_hilight.height += 7; - }; - }; + } + } if (item->HasText()) { wxString s; @@ -366,17 +367,17 @@ void wxListLineData::SetPosition( wxPaintDC *dc, int x, int y, int window_width m_bound_label.width = lw; m_bound_label.height = lh; AssignRect( m_bound_hilight, m_bound_label ); - }; - }; + } + } break; - }; + } case wxLC_LIST: { AssignRect( m_bound_label, m_bound_all ); AssignRect( m_bound_hilight, m_bound_all ); AssignRect( m_bound_icon, 0, 0, 0, 0 ); break; - }; + } case wxLC_REPORT: { long lw,lh; @@ -389,9 +390,9 @@ void wxListLineData::SetPosition( wxPaintDC *dc, int x, int y, int window_width m_bound_hilight.width = window_width-10; m_bound_label.width = window_width-10; break; - }; - }; -}; + } + } +} void wxListLineData::SetColumnPosition( int index, int x ) { @@ -401,14 +402,14 @@ void wxListLineData::SetColumnPosition( int index, int x ) { wxListItemData *item = (wxListItemData*)node->Data(); item->SetPosition( x, m_bound_all.y ); - }; -}; + } +} void wxListLineData::GetSize( int &width, int &height ) { width = m_bound_all.width; height = m_bound_all.height; -}; +} void wxListLineData::GetExtent( int &x, int &y, int &width, int &height ) { @@ -416,7 +417,7 @@ void wxListLineData::GetExtent( int &x, int &y, int &width, int &height ) y = m_bound_all.y; width = m_bound_all.width; height = m_bound_all.height; -}; +} void wxListLineData::GetLabelExtent( int &x, int &y, int &width, int &height ) { @@ -424,12 +425,12 @@ void wxListLineData::GetLabelExtent( int &x, int &y, int &width, int &height ) y = m_bound_label.y; width = m_bound_label.width; height = m_bound_label.height; -}; +} void wxListLineData::GetRect( wxRectangle &rect ) { AssignRect( rect, m_bound_all ); -}; +} long wxListLineData::IsHit( int x, int y ) { @@ -440,16 +441,16 @@ long wxListLineData::IsHit( int x, int y ) if (item->HasImage() && IsInRect( x, y, m_bound_icon )) return wxLIST_HITTEST_ONITEMICON; if (item->HasText() && IsInRect( x, y, m_bound_label )) return wxLIST_HITTEST_ONITEMLABEL; // if (!(item->HasImage() || item->HasText())) return 0; - }; + } // if there is no icon or text = empty if (IsInRect( x, y, m_bound_all )) return wxLIST_HITTEST_ONITEMICON; return 0; -}; +} void wxListLineData::InitItems( int num ) { for (int i = 0; i < num; i++) m_items.Append( new wxListItemData() ); -}; +} void wxListLineData::SetItem( int index, const wxListItem &info ) { @@ -458,8 +459,8 @@ void wxListLineData::SetItem( int index, const wxListItem &info ) { wxListItemData *item = (wxListItemData*)node->Data(); item->SetItem( info ); - }; -}; + } +} void wxListLineData::GetItem( int const index, wxListItem &info ) { @@ -469,8 +470,8 @@ void wxListLineData::GetItem( int const index, wxListItem &info ) { wxListItemData *item = (wxListItemData*)node->Data(); item->GetItem( info ); - }; -}; + } +} void wxListLineData::GetText( int index, wxString &s ) { @@ -481,8 +482,8 @@ void wxListLineData::GetText( int index, wxString &s ) { wxListItemData *item = (wxListItemData*)node->Data(); item->GetText( s ); - }; -}; + } +} void wxListLineData::SetText( int index, const wxString s ) { @@ -492,8 +493,8 @@ void wxListLineData::SetText( int index, const wxString s ) { wxListItemData *item = (wxListItemData*)node->Data(); item->SetText( s ); - }; -}; + } +} int wxListLineData::GetImage( int index ) { @@ -503,9 +504,9 @@ int wxListLineData::GetImage( int index ) { wxListItemData *item = (wxListItemData*)node->Data(); return item->GetImage(); - }; + } return -1; -}; +} void wxListLineData::DoDraw( wxPaintDC *dc, bool hilight, bool paintBG ) { @@ -526,27 +527,38 @@ void wxListLineData::DoDraw( wxPaintDC *dc, bool hilight, bool paintBG ) { dc->SetBrush( wxWHITE_BRUSH ); dc->SetPen( wxTRANSPARENT_PEN ); - }; + } dc->DrawRectangle( m_bound_hilight.x-2, m_bound_hilight.y-2, m_bound_hilight.width+4, m_bound_hilight.height+4 ); - }; + } if (m_mode == wxLC_REPORT) { wxString s; wxNode *node = m_items.First(); while (node) { - wxListItemData *info = (wxListItemData*)node->Data(); - dc->SetClippingRegion( info->GetX(), info->GetY(), info->GetWidth(), info->GetHeight() ); - info->GetText( s ); + wxListItemData *item = (wxListItemData*)node->Data(); + dc->SetClippingRegion( item->GetX(), item->GetY(), item->GetWidth()-3, item->GetHeight() ); + int x = item->GetX(); + if (item->HasImage()) + { + int y = 0; + m_owner->DrawImage( item->GetImage(), dc, x, item->GetY() ); + m_owner->GetImageSize( item->GetImage(), x, y ); + x += item->GetX() + 5; + } + if (item->HasText()) + { + item->GetText( s ); if (hilight) dc->SetTextForeground( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_HIGHLIGHTTEXT ) ); else - dc->SetTextForeground( info->GetColour() ); - dc->DrawText( s, info->GetX()+2, info->GetY() ); + dc->SetTextForeground( *item->GetColour() ); + dc->DrawText( s, x, item->GetY() ); + } dc->DestroyClippingRegion(); node = node->Next(); - }; + } } else { @@ -557,7 +569,7 @@ void wxListLineData::DoDraw( wxPaintDC *dc, bool hilight, bool paintBG ) if (item->HasImage()) { m_owner->DrawImage( item->GetImage(), dc, m_bound_icon.x, m_bound_icon.y ); - }; + } if (item->HasText()) { wxString s; @@ -565,12 +577,12 @@ void wxListLineData::DoDraw( wxPaintDC *dc, bool hilight, bool paintBG ) if (hilight) dc->SetTextForeground( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_HIGHLIGHTTEXT ) ); else - dc->SetTextForeground( item->GetColour() ); + dc->SetTextForeground( * item->GetColour() ); dc->DrawText( s, m_bound_label.x, m_bound_label.y ); - }; - }; - }; -}; + } + } + } +} void wxListLineData::Hilight( bool on ) { @@ -580,7 +592,7 @@ void wxListLineData::Hilight( bool on ) else m_owner->DeselectLine( this ); m_hilighted = on; -}; +} void wxListLineData::ReverseHilight( void ) { @@ -589,7 +601,7 @@ void wxListLineData::ReverseHilight( void ) m_owner->SelectLine( this ); else m_owner->DeselectLine( this ); -}; +} void wxListLineData::DrawRubberBand( wxPaintDC *dc, bool on ) { @@ -599,23 +611,23 @@ void wxListLineData::DrawRubberBand( wxPaintDC *dc, bool on ) dc->SetBrush( wxTRANSPARENT_BRUSH ); dc->DrawRectangle( m_bound_hilight.x-2, m_bound_hilight.y-2, m_bound_hilight.width+4, m_bound_hilight.height+4 ); - }; -}; + } +} void wxListLineData::Draw( wxPaintDC *dc ) { DoDraw( dc, m_hilighted, m_hilighted ); -}; +} bool wxListLineData::IsInRect( int x, int y, const wxRectangle &rect ) { return ((x >= rect.x) && (x <= rect.x+rect.width) && (y >= rect.y) && (y <= rect.y+rect.height)); -}; +} bool wxListLineData::IsHilighted( void ) { return m_hilighted; -}; +} void wxListLineData::AssignRect( wxRectangle &dest, int x, int y, int width, int height ) { @@ -623,7 +635,7 @@ void wxListLineData::AssignRect( wxRectangle &dest, int x, int y, int width, int dest.y = y; dest.width = width; dest.height = height; -}; +} void wxListLineData::AssignRect( wxRectangle &dest, const wxRectangle &source ) { @@ -631,7 +643,7 @@ void wxListLineData::AssignRect( wxRectangle &dest, const wxRectangle &source ) dest.y = source.y; dest.width = source.width; dest.height = source.height; -}; +} //----------------------------------------------------------------------------- // wxListHeaderWindow @@ -647,10 +659,11 @@ END_EVENT_TABLE() wxListHeaderWindow::wxListHeaderWindow( void ) { - m_owner = NULL; - m_currentCursor = NULL; - m_resizeCursor = NULL; -}; + m_owner = (wxListMainWindow *) NULL; + m_currentCursor = (wxCursor *) NULL; + m_resizeCursor = (wxCursor *) NULL; + m_isDraging = FALSE; +} wxListHeaderWindow::wxListHeaderWindow( wxWindow *win, wxWindowID id, wxListMainWindow *owner, const wxPoint &pos, const wxSize &size, @@ -659,13 +672,14 @@ wxListHeaderWindow::wxListHeaderWindow( wxWindow *win, wxWindowID id, wxListMain { m_owner = owner; // m_currentCursor = wxSTANDARD_CURSOR; - m_currentCursor = NULL; + m_currentCursor = (wxCursor *) NULL; m_resizeCursor = new wxCursor( wxCURSOR_SIZEWE ); -}; + m_isDraging = FALSE; +} void wxListHeaderWindow::DoDrawRect( wxPaintDC *dc, int x, int y, int w, int h ) { - const m_corner = 1; + const int m_corner = 1; dc->SetBrush( *wxTRANSPARENT_BRUSH ); @@ -682,7 +696,7 @@ void wxListHeaderWindow::DoDrawRect( wxPaintDC *dc, int x, int y, int w, int h ) // dc->DrawRectangle( x, y+1, w-m_corner, 1 ); // top (inner) dc->DrawRectangle( x, y, 1, h ); // left (outer) // dc->DrawRectangle( x+1, y, 1, h-1 ); // left (inner) -}; +} void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) { @@ -691,7 +705,7 @@ void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) dc.BeginDrawing(); - dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) ); + dc.SetFont( *GetFont() ); int w = 0; int h = 0; @@ -700,6 +714,7 @@ void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) GetClientSize( &w, &h ); dc.SetTextForeground( *wxBLACK ); + if (m_foregroundColour.Ok()) dc.SetTextForeground( m_foregroundColour ); x = 1; y = 1; @@ -718,27 +733,89 @@ void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) dc.DestroyClippingRegion(); x += item.m_width; if (x > w+5) break; - }; + } dc.EndDrawing(); -}; +} + +void wxListHeaderWindow::DrawCurrent() +{ + int x1 = m_currentX; + int y1 = 0; + int x2 = m_currentX-1; + int y2 = 0; + m_owner->GetClientSize( (int*)NULL, &y2 ); + ClientToScreen( &x1, &y1 ); + m_owner->ClientToScreen( &x2, &y2 ); + + wxScreenDC dc; + dc.SetLogicalFunction( wxXOR ); + dc.SetPen( wxPen( *wxBLACK, 2, wxSOLID ) ); + dc.SetBrush( *wxTRANSPARENT_BRUSH ); + + dc.DrawLine( x1, y1, x2, y2 ); + + dc.SetLogicalFunction( wxCOPY ); + + dc.SetPen( wxNullPen ); + dc.SetBrush( wxNullBrush ); +} void wxListHeaderWindow::OnMouse( wxMouseEvent &event ) { - float fx = 0; - float fy = 0; - event.Position( &fx, &fy ); - int x = (int)fx; - int y = (int)fy; - if (event.Moving()) + int x = event.GetX(); + int y = event.GetY(); + if (m_isDraging) { - bool hit = FALSE; - int xpos = 0; - for (int j = 0; j < m_owner->GetColumnCount(); j++) + DrawCurrent(); + if (event.ButtonUp()) { - xpos += m_owner->GetColumnWidth( j ); - if ((abs(x-xpos) < 2) && (y < 14)) { hit = TRUE; break; } - }; - if (hit) +// wxScreenDC::EndDrawingOnTop(); + ReleaseMouse(); + m_isDraging = FALSE; + m_owner->SetColumnWidth( m_column, m_currentX-m_minX ); + } + else + { + int size_x = 0; + GetClientSize( &size_x, (int*) NULL ); + if (x > m_minX+7) + m_currentX = x; + else + m_currentX = m_minX+7; + if (m_currentX > size_x-7) m_currentX = size_x-7; + DrawCurrent(); + } + return; + } + + m_minX = 0; + bool hit_border = FALSE; + int xpos = 0; + for (int j = 0; j < m_owner->GetColumnCount(); j++) + { + xpos += m_owner->GetColumnWidth( j ); + if ((abs(x-xpos) < 3) && (y < 22)) + { + hit_border = TRUE; + m_column = j; + break; + } + m_minX = xpos; + } + + if (event.LeftDown() && hit_border) + { + m_isDraging = TRUE; + m_currentX = x; +// wxScreenDC::StartDrawingOnTop( m_owner ); + DrawCurrent(); + CaptureMouse(); + return; + } + + if (event.Moving()) + { + if (hit_border) { if (m_currentCursor == wxSTANDARD_CURSOR) SetCursor( m_resizeCursor ); m_currentCursor = m_resizeCursor; @@ -747,14 +824,14 @@ void wxListHeaderWindow::OnMouse( wxMouseEvent &event ) { if (m_currentCursor != wxSTANDARD_CURSOR) SetCursor( wxSTANDARD_CURSOR ); m_currentCursor = wxSTANDARD_CURSOR; - }; - }; -}; + } + } +} void wxListHeaderWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) { m_owner->SetFocus(); -}; +} //----------------------------------------------------------------------------- // wxListRenameTimer (internal) @@ -763,12 +840,12 @@ void wxListHeaderWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) wxListRenameTimer::wxListRenameTimer( wxListMainWindow *owner ) { m_owner = owner; -}; +} void wxListRenameTimer::Notify() { m_owner->OnRenameTimer(); -}; +} //----------------------------------------------------------------------------- // wxListTextCtrl (internal) @@ -843,25 +920,23 @@ wxListMainWindow::wxListMainWindow( void ) m_mode = 0; m_lines.DeleteContents( TRUE ); m_columns.DeleteContents( TRUE ); - m_current = NULL; + m_current = (wxListLineData *) NULL; m_visibleLines = 0; - m_hilightBrush = NULL; - m_myFont = NULL; + m_hilightBrush = (wxBrush *) NULL; m_xScroll = 0; m_yScroll = 0; m_dirty = TRUE; - m_small_image_list = NULL; - m_normal_image_list = NULL; + m_small_image_list = (wxImageList *) NULL; + m_normal_image_list = (wxImageList *) NULL; m_small_spacing = 30; m_normal_spacing = 40; m_hasFocus = FALSE; m_usedKeys = TRUE; m_lastOnSame = FALSE; -// m_renameTimer = new wxListRenameTimer( this ); - m_renameTimer = NULL; + m_renameTimer = new wxListRenameTimer( this ); m_isCreated = FALSE; m_dragCount = 0; -}; +} wxListMainWindow::wxListMainWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, @@ -871,16 +946,15 @@ wxListMainWindow::wxListMainWindow( wxWindow *parent, wxWindowID id, m_mode = style; m_lines.DeleteContents( TRUE ); m_columns.DeleteContents( TRUE ); - m_current = NULL; + m_current = (wxListLineData *) NULL; m_dirty = TRUE; m_visibleLines = 0; m_hilightBrush = new wxBrush( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT), wxSOLID ); - m_small_image_list = NULL; - m_normal_image_list = NULL; + m_small_image_list = (wxImageList *) NULL; + m_normal_image_list = (wxImageList *) NULL; m_small_spacing = 30; m_normal_spacing = 40; // AllowDoubleClick( TRUE ); - m_myFont = wxNORMAL_FONT; m_hasFocus = FALSE; m_dragCount = 0; m_isCreated = FALSE; @@ -896,7 +970,7 @@ wxListMainWindow::wxListMainWindow( wxWindow *parent, wxWindowID id, { m_xScroll = 15; m_yScroll = 0; - }; + } SetScrollbars( m_xScroll, m_yScroll, 0, 0, 0, 0 ); m_usedKeys = TRUE; @@ -907,16 +981,15 @@ wxListMainWindow::wxListMainWindow( wxWindow *parent, wxWindowID id, // m_text->Show( FALSE ); SetBackgroundColour( *wxWHITE ); -}; +} wxListMainWindow::~wxListMainWindow( void ) { -// if (m_hilightColour) delete m_hilightColour; -// if (m_hilightBrush) delete m_hilightBrush; -// if (m_myFont) delete m_myFont; + if (m_hilightBrush) delete m_hilightBrush; delete m_renameTimer; +// if (m_hilightColour) delete m_hilightColour; // delete m_text; -}; +} void wxListMainWindow::RefreshLine( wxListLineData *line ) { @@ -935,8 +1008,8 @@ void wxListMainWindow::RefreshLine( wxListLineData *line ) dc.LogicalToDeviceXRel(w+6), dc.LogicalToDeviceXRel(h+6) ); Refresh( TRUE, &rect ); - }; -}; + } +} void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) { @@ -947,8 +1020,7 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) dc.BeginDrawing(); -// dc.SetFont( *m_myFont ); - dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) ); + dc.SetFont( *GetFont() ); wxNode *node = m_lines.First(); while (node) @@ -956,11 +1028,11 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) wxListLineData *line = (wxListLineData*)node->Data(); line->Draw( &dc ); node = node->Next(); - }; + } if (m_current) m_current->DrawRubberBand( &dc, m_hasFocus ); dc.EndDrawing(); -}; +} void wxListMainWindow::HilightAll( bool on ) { @@ -972,78 +1044,78 @@ void wxListMainWindow::HilightAll( bool on ) { line->Hilight( on ); RefreshLine( line ); - }; + } node = node->Next(); - }; -}; + } +} void wxListMainWindow::ActivateLine( wxListLineData *line ) { - if (!m_parent) return; - wxListEvent le( wxEVT_COMMAND_LIST_KEY_DOWN, m_parent->GetId() ); - le.SetEventObject( m_parent ); + if (!GetParent()) return; + wxListEvent le( wxEVT_COMMAND_LIST_KEY_DOWN, GetParent()->GetId() ); + le.SetEventObject( GetParent() ); le.m_code = 0; le.m_itemIndex = GetIndexOfLine( line ); le.m_col = 0; line->GetItem( 0, le.m_item ); OnListNotify( le ); -}; +} void wxListMainWindow::SendNotify( wxListLineData *line, wxEventType command ) { - if (!m_parent) return; - wxListEvent le( command, m_parent->GetId() ); - le.SetEventObject( m_parent ); + if (!GetParent()) return; + wxListEvent le( command, GetParent()->GetId() ); + le.SetEventObject( GetParent() ); le.m_code = 0; le.m_itemIndex = GetIndexOfLine( line ); le.m_col = 0; line->GetItem( 0, le.m_item ); OnListNotify( le ); -}; +} void wxListMainWindow::FocusLine( wxListLineData *WXUNUSED(line) ) { // SendNotify( line, wxEVT_COMMAND_LIST_ITEM_FOCUSSED ); -}; +} void wxListMainWindow::UnfocusLine( wxListLineData *WXUNUSED(line) ) { // SendNotify( line, wxEVT_COMMAND_LIST_ITEM_UNFOCUSSED ); -}; +} void wxListMainWindow::SelectLine( wxListLineData *line ) { SendNotify( line, wxEVT_COMMAND_LIST_ITEM_SELECTED ); -}; +} void wxListMainWindow::DeselectLine( wxListLineData *line ) { SendNotify( line, wxEVT_COMMAND_LIST_ITEM_DESELECTED ); -}; +} void wxListMainWindow::DeleteLine( wxListLineData *line ) { SendNotify( line, wxEVT_COMMAND_LIST_DELETE_ITEM ); -}; +} void wxListMainWindow::StartLabelEdit( wxListLineData *line ) { SendNotify( line, wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT ); -}; +} void wxListMainWindow::RenameLine( wxListLineData *line, const wxString &newName ) { - if (!m_parent) return; + if (!GetParent()) return; - wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, m_parent->GetId() ); - le.SetEventObject( m_parent ); + wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() ); + le.SetEventObject( GetParent() ); le.m_code = 0; le.m_itemIndex = GetIndexOfLine( line ); le.m_col = 0; line->GetItem( 0, le.m_item ); le.m_item.m_text = newName; OnListNotify( le ); -}; +} void wxListMainWindow::OnRenameTimer() { @@ -1077,18 +1149,18 @@ void wxListMainWindow::OnRenameTimer() m_dirty = TRUE; s = res; RenameLine( m_current, s ); - }; + } */ -}; +} void wxListMainWindow::OnRenameAccept() { RenameLine( m_current, m_renameRes ); -}; +} void wxListMainWindow::OnMouse( wxMouseEvent &event ) { - if (m_parent->ProcessEvent( event)) return; + if (GetParent()->GetEventHandler()->ProcessEvent( event)) return; if (!m_current) return; if (m_dirty) return; @@ -1100,15 +1172,15 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) long hitResult = 0; wxNode *node = m_lines.First(); - wxListLineData *line = NULL; + wxListLineData *line = (wxListLineData *) NULL; while (node) { line = (wxListLineData*)node->Data(); hitResult = line->IsHit( x, y ); if (hitResult) break; - line = NULL; + line = (wxListLineData *) NULL; node = node->Next(); - }; + } if (!event.Dragging()) m_dragCount = 0; @@ -1118,13 +1190,13 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) if (event.Dragging() && (m_dragCount > 3)) { m_dragCount = 0; - wxListEvent le( wxEVT_COMMAND_LIST_BEGIN_DRAG, m_parent->GetId() ); + wxListEvent le( wxEVT_COMMAND_LIST_BEGIN_DRAG, GetParent()->GetId() ); le.SetEventObject( this ); le.m_code = 0; le.m_itemIndex = 0; le.m_col = 0; OnListNotify( le ); - }; + } if (!line) return; @@ -1135,20 +1207,21 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) m_renameTimer->Stop(); ActivateLine( line ); return; - }; + } if (event.LeftUp() && m_lastOnSame) { m_usedKeys = FALSE; if ((line == m_current) && - (hitResult == wxLIST_HITTEST_ONITEMLABEL) /* && - (m_mode & wxLC_ICON) */ ) + (hitResult == wxLIST_HITTEST_ONITEMLABEL) && +// (m_mode & wxLC_ICON) && + (m_mode & wxLC_EDIT_LABELS) ) { m_renameTimer->Start( 100, TRUE ); - }; + } m_lastOnSame = FALSE; return; - }; + } if (event.LeftDown()) { @@ -1180,7 +1253,7 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) numOfCurrent++; if (test_line == oldCurrent) break; node = node->Next(); - }; + } int numOfLine = -1; node = m_lines.First(); while (node) @@ -1189,7 +1262,7 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) numOfLine++; if (test_line == line) break; node = node->Next(); - }; + } if (numOfLine < numOfCurrent) { int i = numOfLine; numOfLine = numOfCurrent; numOfCurrent = i; } @@ -1215,12 +1288,12 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) RefreshLine( oldCurrent ); UnfocusLine( oldCurrent ); FocusLine( m_current ); - }; + } m_lastOnSame = (m_current == oldCurrent); return; - }; + } -}; +} void wxListMainWindow::MoveToFocus( void ) { @@ -1249,9 +1322,9 @@ void wxListMainWindow::MoveToFocus( void ) if ((x > x_s) && (x+w < x_s+w_p)) return; if (x-x_s < 5) SetScrollPos( wxHORIZONTAL, (x-5)/m_xScroll ); if (x+w > x_s+w_p) SetScrollPos( wxHORIZONTAL, (x+w-w_p+5)/m_xScroll ); - }; + } */ -}; +} void wxListMainWindow::OnArrowChar( wxListLineData *newCurrent, bool shiftDown ) { @@ -1264,7 +1337,7 @@ void wxListMainWindow::OnArrowChar( wxListLineData *newCurrent, bool shiftDown ) RefreshLine( oldCurrent ); FocusLine( m_current ); UnfocusLine( oldCurrent ); -}; +} void wxListMainWindow::OnChar( wxKeyEvent &event ) { @@ -1276,7 +1349,7 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) else TravNext( &event ); return; - }; + } */ if (!m_current) return; switch (event.KeyCode()) @@ -1286,25 +1359,25 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) wxNode *node = m_lines.Member( m_current )->Previous(); if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() ); break; - }; + } case WXK_DOWN: { wxNode *node = m_lines.Member( m_current )->Next(); if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() ); break; - }; + } case WXK_END: { wxNode *node = m_lines.Last(); OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() ); break; - }; + } case WXK_HOME: { wxNode *node = m_lines.First(); OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() ); break; - }; + } case WXK_PRIOR: { int steps = 0; @@ -1313,14 +1386,14 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) { int pos = 0; wxNode *node = m_lines.First(); - for (;;) { if (m_current == (wxListLineData*)node->Data()) break; pos++; node = node->Next(); }; + for (;;) { if (m_current == (wxListLineData*)node->Data()) break; pos++; node = node->Next(); } steps = pos % m_visibleLines; - }; + } wxNode *node = m_lines.Member( m_current ); for (int i = 0; i < steps; i++) if (node->Previous()) node = node->Previous(); if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() ); break; - }; + } case WXK_NEXT: { int steps = 0; @@ -1328,14 +1401,14 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) else { int pos = 0; wxNode *node = m_lines.First(); - for (;;) { if (m_current == (wxListLineData*)node->Data()) break; pos++; node = node->Next(); }; + for (;;) { if (m_current == (wxListLineData*)node->Data()) break; pos++; node = node->Next(); } steps = m_visibleLines-(pos % m_visibleLines)-1; - }; + } wxNode *node = m_lines.Member( m_current ); for (int i = 0; i < steps; i++) if (node->Next()) node = node->Next(); if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() ); break; - }; + } case WXK_LEFT: { if (!(m_mode & wxLC_REPORT)) @@ -1343,9 +1416,9 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) wxNode *node = m_lines.Member( m_current ); for (int i = 0; i Previous()) node = node->Previous(); if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() ); - }; + } break; - }; + } case WXK_RIGHT: { if (!(m_mode & wxLC_REPORT)) @@ -1353,14 +1426,14 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) wxNode *node = m_lines.Member( m_current ); for (int i = 0; i Next()) node = node->Next(); if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() ); - }; + } break; - }; + } case WXK_SPACE: { m_current->ReverseHilight(); RefreshLine( m_current ); - }; + } break; case WXK_INSERT: { @@ -1375,41 +1448,41 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) RefreshLine( m_current ); UnfocusLine( oldCurrent ); FocusLine( m_current ); - }; - }; + } + } break; case WXK_RETURN: case WXK_EXECUTE: { ActivateLine( m_current ); - }; + } break; default: { event.Skip(); return; - }; - }; + } + } m_usedKeys = TRUE; -}; +} void wxListMainWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) { m_hasFocus = TRUE; RefreshLine( m_current ); - if (!m_parent) return; + if (!GetParent()) return; - wxFocusEvent event( wxEVT_SET_FOCUS, m_parent->GetId() ); - event.SetEventObject( m_parent ); - m_parent->ProcessEvent( event ); -}; + wxFocusEvent event( wxEVT_SET_FOCUS, GetParent()->GetId() ); + event.SetEventObject( GetParent() ); + GetParent()->GetEventHandler()->ProcessEvent( event ); +} void wxListMainWindow::OnKillFocus( wxFocusEvent &WXUNUSED(event) ) { m_hasFocus = FALSE; RefreshLine( m_current ); -}; +} void wxListMainWindow::OnSize( wxSizeEvent &WXUNUSED(event) ) { @@ -1421,12 +1494,7 @@ void wxListMainWindow::OnSize( wxSizeEvent &WXUNUSED(event) ) Refresh(); event.Skip(); */ -}; - -wxFont *wxListMainWindow::GetMyFont( void ) -{ - return m_myFont; -}; +} void wxListMainWindow::DrawImage( int index, wxPaintDC *dc, int x, int y ) { @@ -1434,12 +1502,17 @@ void wxListMainWindow::DrawImage( int index, wxPaintDC *dc, int x, int y ) { m_normal_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT ); return; - }; + } if ((m_mode & wxLC_SMALL_ICON) && (m_small_image_list)) { m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT ); - }; -}; + } + if ((m_mode & wxLC_REPORT) && (m_small_image_list)) + { + m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT ); + return; + } +} void wxListMainWindow::GetImageSize( int index, int &width, int &height ) { @@ -1447,15 +1520,20 @@ void wxListMainWindow::GetImageSize( int index, int &width, int &height ) { m_normal_image_list->GetSize( index, width, height ); return; - }; + } if ((m_mode & wxLC_SMALL_ICON) && (m_small_image_list)) { m_small_image_list->GetSize( index, width, height ); return; - }; + } + if ((m_mode & wxLC_REPORT) && (m_small_image_list)) + { + m_small_image_list->GetSize( index, width, height ); + return; + } width = 0; height = 0; -}; +} int wxListMainWindow::GetTextLength( wxString &s ) { @@ -1464,7 +1542,7 @@ int wxListMainWindow::GetTextLength( wxString &s ) long lh = 0; dc.GetTextExtent( s, &lw, &lh ); return lw + 6; -}; +} int wxListMainWindow::GetIndexOfLine( const wxListLineData *line ) { @@ -1475,16 +1553,16 @@ int wxListMainWindow::GetIndexOfLine( const wxListLineData *line ) if (line == (wxListLineData*)node->Data()) return i; i++; node = node->Next(); - }; + } return -1; -}; +} void wxListMainWindow::SetImageList( wxImageList *imageList, int which ) { m_dirty = TRUE; if (which == wxIMAGE_LIST_NORMAL) m_normal_image_list = imageList; if (which == wxIMAGE_LIST_SMALL) m_small_image_list = imageList; -}; +} void wxListMainWindow::SetItemSpacing( int spacing, bool isSmall ) { @@ -1496,13 +1574,13 @@ void wxListMainWindow::SetItemSpacing( int spacing, bool isSmall ) else { m_normal_spacing = spacing; - }; -}; + } +} int wxListMainWindow::GetItemSpacing( bool isSmall ) { if (isSmall) return m_small_spacing; else return m_normal_spacing; -}; +} void wxListMainWindow::SetColumn( int col, wxListItem &item ) { @@ -1513,19 +1591,40 @@ void wxListMainWindow::SetColumn( int col, wxListItem &item ) if (item.m_width == wxLIST_AUTOSIZE_USEHEADER) item.m_width = GetTextLength( item.m_text )+7; wxListHeaderData *column = (wxListHeaderData*)node->Data(); column->SetItem( item ); - }; -}; + } + wxListCtrl *lc = (wxListCtrl*) GetParent(); + if (lc->m_headerWin) lc->m_headerWin->Refresh(); +} void wxListMainWindow::SetColumnWidth( int col, int width ) { + if (!(m_mode & wxLC_REPORT)) return; + m_dirty = TRUE; + wxNode *node = m_columns.Nth( col ); if (node) { wxListHeaderData *column = (wxListHeaderData*)node->Data(); column->SetWidth( width ); - }; -}; + } + + node = m_lines.First(); + while (node) + { + wxListLineData *line = (wxListLineData*)node->Data(); + wxNode *n = line->m_items.Nth( col ); + if (n) + { + wxListItemData *item = (wxListItemData*)n->Data(); + item->SetSize( width, -1 ); + } + node = node->Next(); + } + + wxListCtrl *lc = (wxListCtrl*) GetParent(); + if (lc->m_headerWin) lc->m_headerWin->Refresh(); +} void wxListMainWindow::GetColumn( int col, wxListItem &item ) { @@ -1542,8 +1641,8 @@ void wxListMainWindow::GetColumn( int col, wxListItem &item ) item.m_text = ""; item.m_image = 0; item.m_data = 0; - }; -}; + } +} int wxListMainWindow::GetColumnWidth( int col ) { @@ -1555,17 +1654,17 @@ int wxListMainWindow::GetColumnWidth( int col ) } else return 0; -}; +} int wxListMainWindow::GetColumnCount( void ) { return m_columns.Number(); -}; +} int wxListMainWindow::GetCountPerPage( void ) { return m_visibleLines; -}; +} void wxListMainWindow::SetItem( wxListItem &item ) { @@ -1576,13 +1675,15 @@ void wxListMainWindow::SetItem( wxListItem &item ) wxListLineData *line = (wxListLineData*)node->Data(); if (m_mode & wxLC_REPORT) item.m_width = GetColumnWidth( item.m_col )-3; line->SetItem( item.m_col, item ); - }; -}; + } +} void wxListMainWindow::SetItemState( long item, long state, long stateMask ) { // m_dirty = TRUE; no recalcs needed + wxListLineData *oldCurrent = m_current; + if (stateMask & wxLIST_STATE_FOCUSED) { wxNode *node = m_lines.Nth( item ); @@ -1594,21 +1695,33 @@ void wxListMainWindow::SetItemState( long item, long state, long stateMask ) FocusLine( m_current ); RefreshLine( m_current ); RefreshLine( oldCurrent ); - }; - }; + } + } + if (stateMask & wxLIST_STATE_SELECTED) { + bool on = state & wxLIST_STATE_SELECTED; + if (!on && (m_mode & wxLC_SINGLE_SEL)) return; + wxNode *node = m_lines.Nth( item ); if (node) { wxListLineData *line = (wxListLineData*)node->Data(); + if (m_mode & wxLC_SINGLE_SEL) + { + UnfocusLine( m_current ); + m_current = line; + FocusLine( m_current ); + oldCurrent->Hilight( FALSE ); + RefreshLine( m_current ); + RefreshLine( oldCurrent ); + } bool on = state & wxLIST_STATE_SELECTED; line->Hilight( on ); - RefreshLine( m_current ); - RefreshLine( oldCurrent ); - }; - }; -}; + RefreshLine( line ); + } + } +} int wxListMainWindow::GetItemState( long item, long stateMask ) { @@ -1620,8 +1733,8 @@ int wxListMainWindow::GetItemState( long item, long stateMask ) { wxListLineData *line = (wxListLineData*)node->Data(); if (line == m_current) ret |= wxLIST_STATE_FOCUSED; - }; - }; + } + } if (stateMask & wxLIST_STATE_SELECTED) { wxNode *node = m_lines.Nth( item ); @@ -1629,10 +1742,10 @@ int wxListMainWindow::GetItemState( long item, long stateMask ) { wxListLineData *line = (wxListLineData*)node->Data(); if (line->IsHilighted()) ret |= wxLIST_STATE_FOCUSED; - }; - }; + } + } return ret; -}; +} void wxListMainWindow::GetItem( wxListItem &item ) { @@ -1648,13 +1761,13 @@ void wxListMainWindow::GetItem( wxListItem &item ) item.m_text = ""; item.m_image = 0; item.m_data = 0; - }; -}; + } +} int wxListMainWindow::GetItemCount( void ) { return m_lines.Number(); -}; +} void wxListMainWindow::GetItemRect( long index, wxRectangle &rect ) { @@ -1670,8 +1783,8 @@ void wxListMainWindow::GetItemRect( long index, wxRectangle &rect ) rect.y = 0; rect.width = 0; rect.height = 0; - }; -}; + } +} bool wxListMainWindow::GetItemPosition(long item, wxPoint& pos) { @@ -1688,9 +1801,9 @@ bool wxListMainWindow::GetItemPosition(long item, wxPoint& pos) { pos.x = 0; pos.y = 0; - }; + } return TRUE; -}; +} int wxListMainWindow::GetSelectedItemCount( void ) { @@ -1701,9 +1814,9 @@ int wxListMainWindow::GetSelectedItemCount( void ) wxListLineData *line = (wxListLineData*)node->Data(); if (line->IsHilighted()) ret++; node = node->Next(); - }; - return 0; -}; + } + return ret; +} void wxListMainWindow::SetMode( long mode ) { @@ -1721,18 +1834,18 @@ void wxListMainWindow::SetMode( long mode ) { m_xScroll = 15; m_yScroll = 0; - }; -}; + } +} long wxListMainWindow::GetMode( void ) const { return m_mode; -}; +} void wxListMainWindow::CalculatePositions( void ) { wxPaintDC dc( this ); - dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) ); + dc.SetFont( *GetFont() ); int iconSpacing = 0; if (m_mode & wxLC_ICON) iconSpacing = m_normal_spacing; @@ -1743,7 +1856,7 @@ void wxListMainWindow::CalculatePositions( void ) wxListLineData *line = (wxListLineData*)node->Data(); line->CalculateSize( &dc, iconSpacing ); node = node->Next(); - }; + } int lineWidth = 0; int lineHeight = 0; @@ -1761,7 +1874,7 @@ void wxListMainWindow::CalculatePositions( void ) { // just in case lineSpacing = 6 + (int)dc.GetCharHeight(); - }; + } int clientWidth = 0; int clientHeight = 0; @@ -1783,10 +1896,10 @@ void wxListMainWindow::CalculatePositions( void ) { line->SetColumnPosition( i, col_x ); col_x += GetColumnWidth( i ); - }; + } y += lineSpacing; node = node->Next(); - }; + } } else { @@ -1815,21 +1928,21 @@ void wxListMainWindow::CalculatePositions( void ) x += maxWidth+13; entireWidth += maxWidth+13; maxWidth = 0; - }; + } node = node->Next(); if (!node) entireWidth += maxWidth; if ((tries == 0) && (entireWidth > clientWidth)) { clientHeight -= 14; // scrollbar height break; - }; + } if (!node) tries = 1; - }; - }; + } + } SetScrollbars( m_xScroll, m_yScroll, (entireWidth+15) / m_xScroll, 0, 0, 0, TRUE ); - }; + } m_visibleLines = (clientHeight-4) / (lineSpacing); -}; +} void wxListMainWindow::RealizeChanges( void ) { @@ -1837,13 +1950,13 @@ void wxListMainWindow::RealizeChanges( void ) { wxNode *node = m_lines.First(); if (node) m_current = (wxListLineData*)node->Data(); - }; + } if (m_current) { FocusLine( m_current ); if (m_mode & wxLC_SINGLE_SEL) m_current->Hilight( TRUE ); - }; -}; + } +} long wxListMainWindow::GetNextItem( long item, int WXUNUSED(geometry), int state ) { @@ -1858,9 +1971,9 @@ long wxListMainWindow::GetNextItem( long item, int WXUNUSED(geometry), int state if (!state) return ret; ret++; node = node->Next(); - }; + } return -1; -}; +} void wxListMainWindow::DeleteItem( long index ) { @@ -1869,59 +1982,59 @@ void wxListMainWindow::DeleteItem( long index ) if (node) { wxListLineData *line = (wxListLineData*)node->Data(); - if (m_current == line) m_current = NULL; + if (m_current == line) m_current = (wxListLineData *) NULL; DeleteLine( line ); m_lines.DeleteNode( node ); - }; -}; + } +} void wxListMainWindow::DeleteColumn( int col ) { m_dirty = TRUE; wxNode *node = m_columns.Nth( col ); if (node) m_columns.DeleteNode( node ); -}; +} void wxListMainWindow::DeleteAllItems( void ) { m_dirty = TRUE; - m_current = NULL; + m_current = (wxListLineData *) NULL; wxNode *node = m_lines.First(); while (node) { wxListLineData *line = (wxListLineData*)node->Data(); DeleteLine( line ); node = node->Next(); - }; + } m_lines.Clear(); -}; +} void wxListMainWindow::DeleteEverything( void ) { m_dirty = TRUE; - m_current = NULL; + m_current = (wxListLineData *) NULL; wxNode *node = m_lines.First(); while (node) { wxListLineData *line = (wxListLineData*)node->Data(); DeleteLine( line ); node = node->Next(); - }; + } m_lines.Clear(); - m_current = NULL; + m_current = (wxListLineData *) NULL; m_columns.Clear(); -}; +} void wxListMainWindow::EnsureVisible( long index ) { wxListLineData *oldCurrent = m_current; - m_current = NULL; + m_current = (wxListLineData *) NULL; int i = index; wxNode *node = m_lines.Nth( i ); if (node) m_current = (wxListLineData*)node->Data(); if (m_current) MoveToFocus(); m_current = oldCurrent; -}; +} long wxListMainWindow::FindItem(long start, const wxString& str, bool WXUNUSED(partial) ) { @@ -1937,9 +2050,9 @@ long wxListMainWindow::FindItem(long start, const wxString& str, bool WXUNUSED(p if (s == tmp) return pos; node = node->Next(); pos++; - }; + } return -1; -}; +} long wxListMainWindow::FindItem(long start, long data) { @@ -1954,9 +2067,9 @@ long wxListMainWindow::FindItem(long start, long data) if (item.m_data == data) return pos; node = node->Next(); pos++; - }; + } return -1; -}; +} long wxListMainWindow::HitTest( int x, int y, int &flags ) { @@ -1970,12 +2083,12 @@ long wxListMainWindow::HitTest( int x, int y, int &flags ) { flags = ret; return count; - }; + } node = node->Next(); count++; - }; + } return -1; -}; +} void wxListMainWindow::InsertItem( wxListItem &item ) { @@ -1999,7 +2112,7 @@ void wxListMainWindow::InsertItem( wxListItem &item ) m_lines.Insert( node, line ); else m_lines.Append( line ); -}; +} void wxListMainWindow::InsertColumn( long col, wxListItem &item ) { @@ -2013,8 +2126,8 @@ void wxListMainWindow::InsertColumn( long col, wxListItem &item ) m_columns.Insert( node, column ); else m_columns.Append( column ); - }; -}; + } +} wxListCtrlCompare list_ctrl_compare_func_2; long list_ctrl_compare_data; @@ -2029,20 +2142,20 @@ int list_ctrl_compare_func_1( const void *arg1, const void *arg2 ) line2->GetItem( 0, item ); long data2 = item.m_data; return list_ctrl_compare_func_2( data1, data2, list_ctrl_compare_data ); -}; +} void wxListMainWindow::SortItems( wxListCtrlCompare fn, long data ) { list_ctrl_compare_func_2 = fn; list_ctrl_compare_data = data; m_lines.Sort( list_ctrl_compare_func_1 ); -}; +} bool wxListMainWindow::OnListNotify( wxListEvent &event ) { - if (m_parent) m_parent->ProcessEvent( event ); + if (GetParent()) GetParent()->GetEventHandler()->ProcessEvent( event ); return FALSE; -}; +} // ------------------------------------------------------------------------------------- // wxListItem @@ -2077,7 +2190,7 @@ wxListEvent::wxListEvent( wxEventType commandType, int id ): m_itemIndex = 0; m_col = 0; m_cancelled = FALSE; -}; +} // ------------------------------------------------------------------------------------- // wxListCtrl @@ -2092,30 +2205,23 @@ END_EVENT_TABLE() wxListCtrl::wxListCtrl(void) { - m_imageListNormal = NULL; - m_imageListSmall = NULL; - m_imageListState = NULL; + m_imageListNormal = (wxImageList *) NULL; + m_imageListSmall = (wxImageList *) NULL; + m_imageListState = (wxImageList *) NULL; } -wxListCtrl::wxListCtrl( wxWindow *parent, wxWindowID id, - const wxPoint &pos, const wxSize &size, - long style, const wxString &name ) - -{ - Create( parent, id, pos, size, style, name ); -}; - wxListCtrl::~wxListCtrl(void) { } bool wxListCtrl::Create( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, - long style, const wxString &name ) + long style, const wxValidator &validator, + const wxString &name ) { - m_imageListNormal = NULL; - m_imageListSmall = NULL; - m_imageListState = NULL; + m_imageListNormal = (wxImageList *) NULL; + m_imageListSmall = (wxImageList *) NULL; + m_imageListState = (wxImageList *) NULL; long s = style; @@ -2126,22 +2232,24 @@ bool wxListCtrl::Create( wxWindow *parent, wxWindowID id, bool ret = wxControl::Create( parent, id, pos, size, s, name ); + SetValidator( validator ); + m_mainWin = new wxListMainWindow( this, -1, wxPoint(0,0), size, s ); if (GetWindowStyleFlag() & wxLC_REPORT) m_headerWin = new wxListHeaderWindow( this, -1, m_mainWin, wxPoint(0,0), wxSize(size.x,23) ); else - m_headerWin = NULL; + m_headerWin = (wxListHeaderWindow *) NULL; return ret; -}; +} void wxListCtrl::OnSize( wxSizeEvent &WXUNUSED(event) ) { // handled in OnIdle if (m_mainWin) m_mainWin->m_dirty = TRUE; -}; +} void wxListCtrl::SetSingleStyle( long style, bool add ) { @@ -2152,7 +2260,7 @@ void wxListCtrl::SetSingleStyle( long style, bool add ) if (style & wxLC_MASK_TYPE) flag = flag & ~wxLC_MASK_TYPE; if (style & wxLC_MASK_ALIGN) flag = flag & ~wxLC_MASK_ALIGN; if (style & wxLC_MASK_SORT) flag = flag & ~wxLC_MASK_SORT; - }; + } if (add) { @@ -2161,10 +2269,10 @@ void wxListCtrl::SetSingleStyle( long style, bool add ) else { if (flag & style) flag -= style; - }; + } SetWindowStyleFlag( flag ); -}; +} void wxListCtrl::SetWindowStyleFlag( long flag ) { @@ -2189,8 +2297,8 @@ void wxListCtrl::SetWindowStyleFlag( long flag ) { // m_headerWin->SetSize( 0, 0, width, 23 ); m_headerWin->Show( TRUE ); - }; - }; + } + } } else { @@ -2198,57 +2306,57 @@ void wxListCtrl::SetWindowStyleFlag( long flag ) { // m_mainWin->SetSize( 0, 0, width, height ); m_headerWin->Show( FALSE ); - }; - }; + } + } wxWindow::SetWindowStyleFlag( flag ); -}; +} bool wxListCtrl::GetColumn(int col, wxListItem &item) { m_mainWin->GetColumn( col, item ); return TRUE; -}; +} bool wxListCtrl::SetColumn( int col, wxListItem& item ) { m_mainWin->SetColumn( col, item ); return TRUE; -}; +} int wxListCtrl::GetColumnWidth( int col ) { return m_mainWin->GetColumnWidth( col ); -}; +} bool wxListCtrl::SetColumnWidth( int col, int width ) { m_mainWin->SetColumnWidth( col, width ); return TRUE; -}; +} int wxListCtrl::GetCountPerPage(void) { return m_mainWin->GetCountPerPage(); // different from Windows ? -}; +} /* wxText& wxListCtrl::GetEditControl(void) const { -}; +} */ bool wxListCtrl::GetItem( wxListItem &info ) { m_mainWin->GetItem( info ); return TRUE; -}; +} bool wxListCtrl::SetItem( wxListItem &info ) { m_mainWin->SetItem( info ); return TRUE; -}; +} long wxListCtrl::SetItem( long index, int col, const wxString& label, int imageId ) { @@ -2265,18 +2373,18 @@ long wxListCtrl::SetItem( long index, int col, const wxString& label, int imageI ; m_mainWin->SetItem(info); return TRUE; -}; +} int wxListCtrl::GetItemState( long item, long stateMask ) { return m_mainWin->GetItemState( item, stateMask ); -}; +} bool wxListCtrl::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) ) { @@ -2286,7 +2394,7 @@ bool wxListCtrl::SetItemImage( long item, int image, int WXUNUSED(selImage) ) info.m_itemId = item; m_mainWin->SetItem( info ); return TRUE; -}; +} wxString wxListCtrl::GetItemText( long item ) { @@ -2294,7 +2402,7 @@ wxString wxListCtrl::GetItemText( long item ) info.m_itemId = item; m_mainWin->GetItem( info ); return info.m_text; -}; +} void wxListCtrl::SetItemText( long item, const wxString &str ) { @@ -2303,7 +2411,7 @@ void wxListCtrl::SetItemText( long item, const wxString &str ) info.m_itemId = item; info.m_text = str; m_mainWin->SetItem( info ); -}; +} long wxListCtrl::GetItemData( long item ) { @@ -2311,7 +2419,7 @@ long wxListCtrl::GetItemData( long item ) info.m_itemId = item; m_mainWin->GetItem( info ); return info.m_data; -}; +} bool wxListCtrl::SetItemData( long item, long data ) { @@ -2321,64 +2429,64 @@ bool wxListCtrl::SetItemData( long item, long data ) info.m_data = data; m_mainWin->SetItem( info ); return TRUE; -}; +} bool wxListCtrl::GetItemRect( long item, wxRectangle &rect, int WXUNUSED(code) ) { m_mainWin->GetItemRect( item, rect ); return TRUE; -}; +} bool wxListCtrl::GetItemPosition( long item, wxPoint& pos ) { m_mainWin->GetItemPosition( item, pos ); return TRUE; -}; +} bool wxListCtrl::SetItemPosition( long WXUNUSED(item), const wxPoint& WXUNUSED(pos) ) { return 0; -}; +} int wxListCtrl::GetItemCount(void) { return m_mainWin->GetItemCount(); -}; +} void wxListCtrl::SetItemSpacing( int spacing, bool isSmall ) { m_mainWin->SetItemSpacing( spacing, isSmall ); -}; +} int wxListCtrl::GetItemSpacing( bool isSmall ) { return m_mainWin->GetItemSpacing( isSmall ); -}; +} int wxListCtrl::GetSelectedItemCount(void) { return m_mainWin->GetSelectedItemCount(); -}; +} /* wxColour wxListCtrl::GetTextColour(void) const { -}; +} void wxListCtrl::SetTextColour(const wxColour& WXUNUSED(col)) { -}; +} */ long wxListCtrl::GetTopItem(void) { return 0; -}; +} long wxListCtrl::GetNextItem( long item, int geom, int state ) const { return m_mainWin->GetNextItem( item, geom, state ); -}; +} wxImageList *wxListCtrl::GetImageList(int which) { @@ -2393,76 +2501,76 @@ wxImageList *wxListCtrl::GetImageList(int which) else if (which == wxIMAGE_LIST_STATE) { return m_imageListState; - }; - return NULL; -}; + } + return (wxImageList *) NULL; +} void wxListCtrl::SetImageList( wxImageList *imageList, int which ) { m_mainWin->SetImageList( imageList, which ); -}; +} bool wxListCtrl::Arrange( int WXUNUSED(flag) ) { return 0; -}; +} bool wxListCtrl::DeleteItem( long item ) { m_mainWin->DeleteItem( item ); return TRUE; -}; +} bool wxListCtrl::DeleteAllItems(void) { m_mainWin->DeleteAllItems(); return TRUE; -}; +} bool wxListCtrl::DeleteColumn( int col ) { m_mainWin->DeleteColumn( col ); return TRUE; -}; +} /* wxText& wxListCtrl::Edit( long WXUNUSED(item ) ) { -}; +} */ bool wxListCtrl::EnsureVisible( long item ) { m_mainWin->EnsureVisible( item ); return TRUE; -}; +} long wxListCtrl::FindItem( long start, const wxString& str, bool partial ) { return m_mainWin->FindItem( start, str, partial ); -}; +} long wxListCtrl::FindItem( long start, long data ) { return m_mainWin->FindItem( start, data ); -}; +} long wxListCtrl::FindItem( long WXUNUSED(start), const wxPoint& WXUNUSED(pt), int WXUNUSED(direction)) { return 0; -}; +} long wxListCtrl::HitTest( const wxPoint &point, int &flags ) { return m_mainWin->HitTest( (int)point.x, (int)point.y, flags ); -}; +} long wxListCtrl::InsertItem( wxListItem& info ) { m_mainWin->InsertItem( info ); return 0; -}; +} long wxListCtrl::InsertItem( long index, const wxString &label ) { @@ -2471,7 +2579,7 @@ long wxListCtrl::InsertItem( long index, const wxString &label ) info.m_mask = wxLIST_MASK_TEXT; info.m_itemId = index; return InsertItem( info ); -}; +} long wxListCtrl::InsertItem( long index, int imageIndex ) { @@ -2480,7 +2588,7 @@ long wxListCtrl::InsertItem( long index, int imageIndex ) info.m_image = imageIndex; info.m_itemId = index; return InsertItem( info ); -}; +} long wxListCtrl::InsertItem( long index, const wxString &label, int imageIndex ) { @@ -2490,13 +2598,13 @@ long wxListCtrl::InsertItem( long index, const wxString &label, int imageIndex ) info.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_IMAGE; info.m_itemId = index; return InsertItem( info ); -}; +} long wxListCtrl::InsertColumn( long col, wxListItem &item ) { m_mainWin->InsertColumn( col, item ); return 0; -}; +} long wxListCtrl::InsertColumn( long col, const wxString &heading, int format, int width ) @@ -2513,12 +2621,12 @@ long wxListCtrl::InsertColumn( long col, const wxString &heading, item.m_format = format; return InsertColumn( col, item ); -}; +} bool wxListCtrl::ScrollList( int WXUNUSED(dx), int WXUNUSED(dy) ) { return 0; -}; +} // Sort items. // fn is a function which takes 3 long arguments: item1, item2, data. @@ -2534,7 +2642,7 @@ bool wxListCtrl::SortItems( wxListCtrlCompare fn, long data ) { m_mainWin->SortItems( fn, data ); return TRUE; -}; +} void wxListCtrl::OnIdle( wxIdleEvent &WXUNUSED(event) ) { @@ -2567,12 +2675,32 @@ void wxListCtrl::OnIdle( wxIdleEvent &WXUNUSED(event) ) m_mainWin->GetSize( &w, &h ); if ((x != 0) || (y != 24) || (w != cw) || (h != ch)) m_mainWin->SetSize( 0, 0, cw, ch ); - }; + } m_mainWin->CalculatePositions(); m_mainWin->RealizeChanges(); m_mainWin->m_dirty = FALSE; m_mainWin->Refresh(); -}; +} + +void wxListCtrl::SetBackgroundColour( const wxColour &colour ) +{ + m_mainWin->SetBackgroundColour( colour ); + m_headerWin->SetBackgroundColour( colour ); + m_mainWin->m_dirty = TRUE; +} +void wxListCtrl::SetForegroundColour( const wxColour &colour ) +{ + m_mainWin->SetForegroundColour( colour ); + m_headerWin->SetForegroundColour( colour ); + m_mainWin->m_dirty = TRUE; +} + +void wxListCtrl::SetFont( const wxFont &font ) +{ + m_mainWin->SetFont( font ); + m_headerWin->SetFont( font ); + m_mainWin->m_dirty = TRUE; +}