X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c801d85f158c4cba50b588807daabdcbd0ed3853..c9d9f242e45a5d8399d52f5709b560a63dd804fc:/src/generic/listctrl.cpp diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index a1090aff83..6ee97c89f6 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( const int image ) +void wxListItemData::SetImage( int image ) { m_image = image; -}; +} -void wxListItemData::SetData( const long data ) +void wxListItemData::SetData( long data ) { m_data = data; -}; +} -void wxListItemData::SetPosition( const int x, const int y ) +void wxListItemData::SetPosition( int x, int y ) { m_xpos = x; m_ypos = y; -}; +} -void wxListItemData::SetSize( int const width, const int height ) +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( const int x, const int y ) const +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( const int x, const int y ) +void wxListHeaderData::SetPosition( int x, int y ) { m_xpos = x; m_ypos = y; -}; +} -void wxListHeaderData::SetHeight( const int h ) +void wxListHeaderData::SetHeight( int h ) { m_height = h; -}; +} -void wxListHeaderData::SetWidth( const int w ) +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( const int format ) +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 @@ -249,7 +250,7 @@ int wxListHeaderData::GetFormat(void) const IMPLEMENT_DYNAMIC_CLASS(wxListLineData,wxObject); -wxListLineData::wxListLineData( wxListMainWindow *owner, const int mode, wxBrush *hilightBrush ) +wxListLineData::wxListLineData( wxListMainWindow *owner, int mode, wxBrush *hilightBrush ) { m_mode = mode; m_hilighted = FALSE; @@ -257,9 +258,9 @@ wxListLineData::wxListLineData( wxListMainWindow *owner, const int mode, wxBrush m_hilightBrush = hilightBrush; m_items.DeleteContents( TRUE ); m_spacing = 0; -}; +} -void wxListLineData::CalculateSize( wxPaintDC *dc, const int spacing ) +void wxListLineData::CalculateSize( wxPaintDC *dc, int spacing ) { m_spacing = spacing; switch (m_mode) @@ -277,9 +278,9 @@ void wxListLineData::CalculateSize( wxPaintDC *dc, const 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, const 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,13 +313,13 @@ void wxListLineData::CalculateSize( wxPaintDC *dc, const int spacing ) m_bound_all.width += lw; m_bound_all.height = lh; node = node->Next(); - }; + } break; - }; - }; -}; + } + } +} -void wxListLineData::SetPosition( wxPaintDC *dc, const int x, const int y, const int window_width ) +void wxListLineData::SetPosition( wxPaintDC *dc, int x, int y, int window_width ) { m_bound_all.x = x; m_bound_all.y = y; @@ -350,8 +351,8 @@ void wxListLineData::SetPosition( wxPaintDC *dc, const int x, const int y, const 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, const int x, const int y, const 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,11 +390,11 @@ void wxListLineData::SetPosition( wxPaintDC *dc, const int x, const int y, const m_bound_hilight.width = window_width-10; m_bound_label.width = window_width-10; break; - }; - }; -}; + } + } +} -void wxListLineData::SetColumnPosition( const int index, const int x ) +void wxListLineData::SetColumnPosition( int index, int x ) { int i = index; wxNode *node = m_items.Nth( i ); @@ -401,14 +402,14 @@ void wxListLineData::SetColumnPosition( const int index, const 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,14 +425,14 @@ 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( const int x, const int y ) +long wxListLineData::IsHit( int x, int y ) { wxNode *node = m_items.First(); if (node) @@ -439,27 +440,27 @@ long wxListLineData::IsHit( const int x, const int y ) wxListItemData *item = (wxListItemData*)node->Data(); 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 (!(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( const int num ) +void wxListLineData::InitItems( int num ) { for (int i = 0; i < num; i++) m_items.Append( new wxListItemData() ); -}; +} -void wxListLineData::SetItem( const int index, const wxListItem &info ) +void wxListLineData::SetItem( int index, const wxListItem &info ) { wxNode *node = m_items.Nth( index ); if (node) { wxListItemData *item = (wxListItemData*)node->Data(); item->SetItem( info ); - }; -}; + } +} void wxListLineData::GetItem( int const index, wxListItem &info ) { @@ -469,10 +470,10 @@ void wxListLineData::GetItem( int const index, wxListItem &info ) { wxListItemData *item = (wxListItemData*)node->Data(); item->GetItem( info ); - }; -}; + } +} -void wxListLineData::GetText( const int index, wxString &s ) +void wxListLineData::GetText( int index, wxString &s ) { int i = index; wxNode *node = m_items.Nth( i ); @@ -481,10 +482,10 @@ void wxListLineData::GetText( const int index, wxString &s ) { wxListItemData *item = (wxListItemData*)node->Data(); item->GetText( s ); - }; -}; + } +} -void wxListLineData::SetText( const int index, const wxString s ) +void wxListLineData::SetText( int index, const wxString s ) { int i = index; wxNode *node = m_items.Nth( i ); @@ -492,10 +493,10 @@ void wxListLineData::SetText( const int index, const wxString s ) { wxListItemData *item = (wxListItemData*)node->Data(); item->SetText( s ); - }; -}; + } +} -int wxListLineData::GetImage( const int index ) +int wxListLineData::GetImage( int index ) { int i = index; wxNode *node = m_items.Nth( i ); @@ -503,11 +504,11 @@ int wxListLineData::GetImage( const int index ) { wxListItemData *item = (wxListItemData*)node->Data(); return item->GetImage(); - }; + } return -1; -}; +} -void wxListLineData::DoDraw( wxPaintDC *dc, const bool hilight, const bool paintBG ) +void wxListLineData::DoDraw( wxPaintDC *dc, bool hilight, bool paintBG ) { long dev_x = dc->LogicalToDeviceX( m_bound_all.x-2 ); long dev_y = dc->LogicalToDeviceY( m_bound_all.y-2 ); @@ -526,10 +527,10 @@ void wxListLineData::DoDraw( wxPaintDC *dc, const bool hilight, const bool paint { 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; @@ -537,16 +538,16 @@ void wxListLineData::DoDraw( wxPaintDC *dc, const bool hilight, const bool paint while (node) { wxListItemData *info = (wxListItemData*)node->Data(); - dc->SetClippingRegion( info->GetX(), info->GetY(), info->GetWidth(), info->GetHeight() ); + dc->SetClippingRegion( info->GetX(), info->GetY(), info->GetWidth()-3, info->GetHeight() ); info->GetText( s ); if (hilight) dc->SetTextForeground( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_HIGHLIGHTTEXT ) ); else - dc->SetTextForeground( info->GetColour() ); + dc->SetTextForeground( * info->GetColour() ); dc->DrawText( s, info->GetX()+2, info->GetY() ); dc->DestroyClippingRegion(); node = node->Next(); - }; + } } else { @@ -557,7 +558,7 @@ void wxListLineData::DoDraw( wxPaintDC *dc, const bool hilight, const bool paint if (item->HasImage()) { m_owner->DrawImage( item->GetImage(), dc, m_bound_icon.x, m_bound_icon.y ); - }; + } if (item->HasText()) { wxString s; @@ -565,14 +566,14 @@ void wxListLineData::DoDraw( wxPaintDC *dc, const bool hilight, const bool paint 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( const bool on ) +void wxListLineData::Hilight( bool on ) { if (on == m_hilighted) return; if (on) @@ -580,7 +581,7 @@ void wxListLineData::Hilight( const bool on ) else m_owner->DeselectLine( this ); m_hilighted = on; -}; +} void wxListLineData::ReverseHilight( void ) { @@ -589,9 +590,9 @@ void wxListLineData::ReverseHilight( void ) m_owner->SelectLine( this ); else m_owner->DeselectLine( this ); -}; +} -void wxListLineData::DrawRubberBand( wxPaintDC *dc, const bool on ) +void wxListLineData::DrawRubberBand( wxPaintDC *dc, bool on ) { if (on) { @@ -599,31 +600,31 @@ void wxListLineData::DrawRubberBand( wxPaintDC *dc, const 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( const int x, const int y, const wxRectangle &rect ) +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, const int x, const int y, const int width, const int height ) +void wxListLineData::AssignRect( wxRectangle &dest, int x, int y, int width, int height ) { dest.x = x; dest.y = y; dest.width = width; dest.height = height; -}; +} void wxListLineData::AssignRect( wxRectangle &dest, const wxRectangle &source ) { @@ -631,7 +632,7 @@ void wxListLineData::AssignRect( wxRectangle &dest, const wxRectangle &source ) dest.y = source.y; dest.width = source.width; dest.height = source.height; -}; +} //----------------------------------------------------------------------------- // wxListHeaderWindow @@ -647,25 +648,26 @@ 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, const wxWindowID id, wxListMainWindow *owner, - const wxPoint &pos, const wxSize &size, - const long style, const wxString &name ) : +wxListHeaderWindow::wxListHeaderWindow( wxWindow *win, wxWindowID id, wxListMainWindow *owner, + const wxPoint &pos, const wxSize &size, + long style, const wxString &name ) : wxWindow( win, id, pos, size, style, name ) { m_owner = owner; // m_currentCursor = wxSTANDARD_CURSOR; - m_currentCursor = NULL; + m_currentCursor = (wxCursor *) NULL; m_resizeCursor = new wxCursor( wxCURSOR_SIZEWE ); -}; +} 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 +684,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) ) { @@ -718,43 +720,106 @@ 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()) + { +// wxScreenDC::EndDrawingOnTop(); + ReleaseMouse(); + wxYield(); // for debugging + m_isDraging = FALSE; + m_owner->SetColumnWidth( m_column, m_currentX-m_minX ); + } + else { - xpos += m_owner->GetColumnWidth( j ); - if ((abs(x-xpos) < 2) && (y < 14)) { hit = TRUE; break; } - }; - if (hit) + 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; + if (m_currentCursor == wxSTANDARD_CURSOR) SetCursor( m_resizeCursor ); + m_currentCursor = m_resizeCursor; } else { -// if (m_currentCursor != wxSTANDARD_CURSOR) SetCursor( wxSTANDARD_CURSOR ); -// m_currentCursor = wxSTANDARD_CURSOR; - }; - }; -}; + 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 +828,65 @@ void wxListHeaderWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) wxListRenameTimer::wxListRenameTimer( wxListMainWindow *owner ) { m_owner = owner; -}; +} void wxListRenameTimer::Notify() { m_owner->OnRenameTimer(); -}; +} + +//----------------------------------------------------------------------------- +// wxListTextCtrl (internal) +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxListTextCtrl,wxTextCtrl); + +BEGIN_EVENT_TABLE(wxListTextCtrl,wxTextCtrl) + EVT_CHAR (wxListTextCtrl::OnChar) + 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; + m_owner = owner; +} + +void wxListTextCtrl::OnChar( wxKeyEvent &event ) +{ + if (event.m_keyCode == WXK_RETURN) + { + (*m_accept) = TRUE; + (*m_res) = GetValue(); + m_owner->OnRenameAccept(); +// Show( FALSE ); + Destroy(); + return; + } + if (event.m_keyCode == WXK_ESCAPE) + { + (*m_accept) = FALSE; + (*m_res) = ""; +// Show( FALSE ); + Destroy(); + return; + } + event.Skip(); +} + +void wxListTextCtrl::OnKillFocus( wxFocusEvent &WXUNUSED(event) ) +{ + (*m_accept) = FALSE; + (*m_res) = ""; +// Show( FALSE ); + Destroy(); + return; +} //----------------------------------------------------------------------------- // wxListMainWindow @@ -790,45 +908,45 @@ 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_myFont = (wxFont *) 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 wxRenameTimer( this ); + m_renameTimer = new wxListRenameTimer( this ); m_isCreated = FALSE; - m_isDragging = FALSE; -}; + m_dragCount = 0; +} -wxListMainWindow::wxListMainWindow( wxWindow *parent, const wxWindowID id, +wxListMainWindow::wxListMainWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, - const long style, const wxString &name ) : - wxScrolledWindow( parent, id, pos, size, style, name ) + long style, const wxString &name ) : + wxScrolledWindow( parent, id, pos, size, style, name ) { 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_isDragging = FALSE; + m_dragCount = 0; m_isCreated = FALSE; wxSize sz = size; sz.y = 25; @@ -842,7 +960,7 @@ wxListMainWindow::wxListMainWindow( wxWindow *parent, const wxWindowID id, { m_xScroll = 15; m_yScroll = 0; - }; + } SetScrollbars( m_xScroll, m_yScroll, 0, 0, 0, 0 ); m_usedKeys = TRUE; @@ -853,21 +971,16 @@ wxListMainWindow::wxListMainWindow( wxWindow *parent, const wxWindowID id, // m_text->Show( FALSE ); SetBackgroundColour( *wxWHITE ); - -/* - char *accepted_drop_types[] = { "text/plain" }; - gtk_widget_dnd_drag_set( m_wxwindow, TRUE, accepted_drop_types, 1 ); -*/ -}; +} wxListMainWindow::~wxListMainWindow( void ) { + if (m_hilightBrush) delete m_hilightBrush; + delete m_renameTimer; // if (m_hilightColour) delete m_hilightColour; -// if (m_hilightBrush) delete m_hilightBrush; // if (m_myFont) delete m_myFont; - delete m_renameTimer; // delete m_text; -}; +} void wxListMainWindow::RefreshLine( wxListLineData *line ) { @@ -886,8 +999,8 @@ void wxListMainWindow::RefreshLine( wxListLineData *line ) dc.LogicalToDeviceXRel(w+6), dc.LogicalToDeviceXRel(h+6) ); Refresh( TRUE, &rect ); - }; -}; + } +} void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) { @@ -907,13 +1020,13 @@ 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( const bool on ) +void wxListMainWindow::HilightAll( bool on ) { wxNode *node = m_lines.First(); while (node) @@ -923,74 +1036,82 @@ void wxListMainWindow::HilightAll( const 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, long command ) +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 ) { - wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT ); + if (!GetParent()) return; + + 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() { - return; + StartLabelEdit( m_current ); wxString s; m_current->GetText( 0, s ); int x = 0; @@ -998,16 +1119,15 @@ void wxListMainWindow::OnRenameTimer() int w = 0; int h = 0; m_current->GetLabelExtent( x, y, w, h ); - int dx = 0; - int dy = 0; - GetPosition( &dx, &dy ); - x += dx; - y += dy; -/* - wxRawListTextCtrl *text = new wxRawListTextCtrl( - GetParent(), s, &m_renameAccept, &m_renameRes, this, x+2, y+2, w+8, h+8 ); + + wxClientDC dc(this); + PrepareDC( dc ); + x = dc.LogicalToDeviceX( x ); + y = dc.LogicalToDeviceY( y ); + + wxListTextCtrl *text = new wxListTextCtrl( + this, -1, &m_renameAccept, &m_renameRes, this, s, wxPoint(x-4,y-4), wxSize(w+11,h+8) ); text->SetFocus(); -*/ /* m_text->SetSize( x+3, y+3, w+6, h+6 ); m_text->SetValue( s ); @@ -1015,26 +1135,27 @@ void wxListMainWindow::OnRenameTimer() m_text->SetFocus(); */ /* - char *res = wxGetTextFromUser( "Enter new name:", "", s ); + char *res = wxGetTextFromUser( _("Enter new name:"), "", s ); if (res) { m_dirty = TRUE; s = res; RenameLine( m_current, s ); - }; + } */ -}; +} void wxListMainWindow::OnRenameAccept() { RenameLine( m_current, m_renameRes ); -}; +} void wxListMainWindow::OnMouse( wxMouseEvent &event ) { + if (GetParent()->GetEventHandler()->ProcessEvent( event)) return; + if (!m_current) return; if (m_dirty) return; -// wxDragCanvas::OnEvent( event ); wxClientDC dc(this); PrepareDC(dc); @@ -1043,28 +1164,31 @@ 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_isDragging = FALSE; + if (!event.Dragging()) + m_dragCount = 0; + else + m_dragCount++; - if (event.Dragging() && (!m_isDragging)) + if (event.Dragging() && (m_dragCount > 3)) { - m_isDragging = TRUE; - wxListEvent le( wxEVT_COMMAND_LIST_BEGIN_DRAG, m_parent->GetId() ); + m_dragCount = 0; + 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; @@ -1075,40 +1199,93 @@ 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( 330, TRUE ); - }; + m_renameTimer->Start( 100, TRUE ); + } m_lastOnSame = FALSE; return; - }; + } if (event.LeftDown()) { m_usedKeys = FALSE; wxListLineData *oldCurrent = m_current; - m_current = line; - if (!event.ShiftDown() || (m_mode & wxLC_SINGLE_SEL)) HilightAll( FALSE ); - m_current->ReverseHilight(); - RefreshLine( m_current ); + if (m_mode & wxLC_SINGLE_SEL) + { + m_current = line; + HilightAll( FALSE ); + m_current->ReverseHilight(); + RefreshLine( m_current ); + } + else + { + if (event.ShiftDown()) + { + m_current = line; + m_current->ReverseHilight(); + RefreshLine( m_current ); + } + else if (event.ControlDown()) + { + m_current = line; + int numOfCurrent = -1; + node = m_lines.First(); + while (node) + { + wxListLineData *test_line = (wxListLineData*)node->Data(); + numOfCurrent++; + if (test_line == oldCurrent) break; + node = node->Next(); + } + int numOfLine = -1; + node = m_lines.First(); + while (node) + { + wxListLineData *test_line = (wxListLineData*)node->Data(); + numOfLine++; + if (test_line == line) break; + node = node->Next(); + } + + if (numOfLine < numOfCurrent) + { int i = numOfLine; numOfLine = numOfCurrent; numOfCurrent = i; } + wxNode *node = m_lines.Nth( numOfCurrent ); + for (int i = 0; i <= numOfLine-numOfCurrent; i++) + { + wxListLineData *test_line= (wxListLineData*)node->Data(); + test_line->Hilight(TRUE); + RefreshLine( test_line ); + node = node->Next(); + } + } + else + { + m_current = line; + HilightAll( FALSE ); + m_current->ReverseHilight(); + RefreshLine( m_current ); + } + } if (m_current != oldCurrent) { + RefreshLine( oldCurrent ); UnfocusLine( oldCurrent ); FocusLine( m_current ); - RefreshLine( oldCurrent ); - }; + } m_lastOnSame = (m_current == oldCurrent); return; - }; + } -}; +} void wxListMainWindow::MoveToFocus( void ) { @@ -1137,22 +1314,22 @@ 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 ) { - UnfocusLine( m_current ); if ((m_mode & wxLC_SINGLE_SEL) || (m_usedKeys == FALSE)) m_current->Hilight( FALSE ); wxListLineData *oldCurrent = m_current; m_current = newCurrent; MoveToFocus(); if (shiftDown || (m_mode & wxLC_SINGLE_SEL)) m_current->Hilight( TRUE ); - FocusLine( m_current ); RefreshLine( m_current ); RefreshLine( oldCurrent ); -}; + FocusLine( m_current ); + UnfocusLine( oldCurrent ); +} void wxListMainWindow::OnChar( wxKeyEvent &event ) { @@ -1164,7 +1341,7 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) else TravNext( &event ); return; - }; + } */ if (!m_current) return; switch (event.KeyCode()) @@ -1174,25 +1351,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; @@ -1201,14 +1378,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; @@ -1216,14 +1393,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)) @@ -1231,9 +1408,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)) @@ -1241,57 +1418,63 @@ 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: { if (!(m_mode & wxLC_SINGLE_SEL)) { wxListLineData *oldCurrent = m_current; - UnfocusLine( m_current ); m_current->ReverseHilight(); wxNode *node = m_lines.Member( m_current )->Next(); if (node) m_current = (wxListLineData*)node->Data(); MoveToFocus(); - FocusLine( m_current ); - RefreshLine( m_current ); RefreshLine( oldCurrent ); - }; - }; + 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) ) { @@ -1303,25 +1486,25 @@ 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 ) { if ((m_mode & wxLC_ICON) && (m_normal_image_list)) { - m_normal_image_list->Draw( index, *dc, x, 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 ); - }; -}; + m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT ); + } +} void wxListMainWindow::GetImageSize( int index, int &width, int &height ) { @@ -1329,15 +1512,15 @@ 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; - }; + } width = 0; height = 0; -}; +} int wxListMainWindow::GetTextLength( wxString &s ) { @@ -1346,7 +1529,7 @@ int wxListMainWindow::GetTextLength( wxString &s ) long lh = 0; dc.GetTextExtent( s, &lw, &lh ); return lw + 6; -}; +} int wxListMainWindow::GetIndexOfLine( const wxListLineData *line ) { @@ -1357,18 +1540,18 @@ int wxListMainWindow::GetIndexOfLine( const wxListLineData *line ) if (line == (wxListLineData*)node->Data()) return i; i++; node = node->Next(); - }; + } return -1; -}; +} -void wxListMainWindow::SetImageList( wxImageList *imageList, const int which ) +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( const int spacing, const bool isSmall ) +void wxListMainWindow::SetItemSpacing( int spacing, bool isSmall ) { m_dirty = TRUE; if (isSmall) @@ -1378,15 +1561,15 @@ void wxListMainWindow::SetItemSpacing( const int spacing, const bool isSmall ) else { m_normal_spacing = spacing; - }; -}; + } +} -int wxListMainWindow::GetItemSpacing( const bool isSmall ) +int wxListMainWindow::GetItemSpacing( bool isSmall ) { if (isSmall) return m_small_spacing; else return m_normal_spacing; -}; +} -void wxListMainWindow::SetColumn( const int col, wxListItem &item ) +void wxListMainWindow::SetColumn( int col, wxListItem &item ) { m_dirty = TRUE; wxNode *node = m_columns.Nth( col ); @@ -1395,21 +1578,42 @@ void wxListMainWindow::SetColumn( const 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( const int col, const int width ) +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( const int col, wxListItem &item ) +void wxListMainWindow::GetColumn( int col, wxListItem &item ) { wxNode *node = m_columns.Nth( col ); if (node) @@ -1424,10 +1628,10 @@ void wxListMainWindow::GetColumn( const int col, wxListItem &item ) item.m_text = ""; item.m_image = 0; item.m_data = 0; - }; -}; + } +} -int wxListMainWindow::GetColumnWidth( const int col ) +int wxListMainWindow::GetColumnWidth( int col ) { wxNode *node = m_columns.Nth( col ); if (node) @@ -1437,17 +1641,17 @@ int wxListMainWindow::GetColumnWidth( const 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 ) { @@ -1458,13 +1662,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( const long item, const long state, const long stateMask ) +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 ); @@ -1476,23 +1682,35 @@ void wxListMainWindow::SetItemState( const long item, const long state, const lo 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( const long item, const long stateMask ) +int wxListMainWindow::GetItemState( long item, long stateMask ) { int ret = wxLIST_STATE_DONTCARE; if (stateMask & wxLIST_STATE_FOCUSED) @@ -1502,8 +1720,8 @@ int wxListMainWindow::GetItemState( const long item, const 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 ); @@ -1511,10 +1729,10 @@ int wxListMainWindow::GetItemState( const long item, const long stateMask ) { wxListLineData *line = (wxListLineData*)node->Data(); if (line->IsHilighted()) ret |= wxLIST_STATE_FOCUSED; - }; - }; + } + } return ret; -}; +} void wxListMainWindow::GetItem( wxListItem &item ) { @@ -1530,15 +1748,15 @@ 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( const long index, wxRectangle &rect ) +void wxListMainWindow::GetItemRect( long index, wxRectangle &rect ) { wxNode *node = m_lines.Nth( index ); if (node) @@ -1552,8 +1770,27 @@ void wxListMainWindow::GetItemRect( const long index, wxRectangle &rect ) rect.y = 0; rect.width = 0; rect.height = 0; - }; -}; + } +} + +bool wxListMainWindow::GetItemPosition(long item, wxPoint& pos) +{ + wxNode *node = m_lines.Nth( item ); + if (node) + { + wxRectangle rect; + wxListLineData *line = (wxListLineData*)node->Data(); + line->GetRect( rect ); + pos.x = rect.x; + pos.y = rect.y; + } + else + { + pos.x = 0; + pos.y = 0; + } + return TRUE; +} int wxListMainWindow::GetSelectedItemCount( void ) { @@ -1564,11 +1801,11 @@ int wxListMainWindow::GetSelectedItemCount( void ) wxListLineData *line = (wxListLineData*)node->Data(); if (line->IsHilighted()) ret++; node = node->Next(); - }; + } return 0; -}; +} -void wxListMainWindow::SetMode( const long mode ) +void wxListMainWindow::SetMode( long mode ) { m_dirty = TRUE; m_mode = mode; @@ -1584,13 +1821,13 @@ void wxListMainWindow::SetMode( const long mode ) { m_xScroll = 15; m_yScroll = 0; - }; -}; + } +} long wxListMainWindow::GetMode( void ) const { return m_mode; -}; +} void wxListMainWindow::CalculatePositions( void ) { @@ -1606,7 +1843,7 @@ void wxListMainWindow::CalculatePositions( void ) wxListLineData *line = (wxListLineData*)node->Data(); line->CalculateSize( &dc, iconSpacing ); node = node->Next(); - }; + } int lineWidth = 0; int lineHeight = 0; @@ -1624,7 +1861,7 @@ void wxListMainWindow::CalculatePositions( void ) { // just in case lineSpacing = 6 + (int)dc.GetCharHeight(); - }; + } int clientWidth = 0; int clientHeight = 0; @@ -1646,10 +1883,10 @@ void wxListMainWindow::CalculatePositions( void ) { line->SetColumnPosition( i, col_x ); col_x += GetColumnWidth( i ); - }; + } y += lineSpacing; node = node->Next(); - }; + } } else { @@ -1678,21 +1915,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 ) { @@ -1700,15 +1937,15 @@ 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( const long item, int WXUNUSED(geometry), int state ) +long wxListMainWindow::GetNextItem( long item, int WXUNUSED(geometry), int state ) { long ret = 0; if (item > 0) ret = item; @@ -1721,70 +1958,72 @@ long wxListMainWindow::GetNextItem( const long item, int WXUNUSED(geometry), int if (!state) return ret; ret++; node = node->Next(); - }; + } return -1; -}; +} -void wxListMainWindow::DeleteItem( const long index ) +void wxListMainWindow::DeleteItem( long index ) { m_dirty = TRUE; wxNode *node = m_lines.Nth( index ); if (node) { wxListLineData *line = (wxListLineData*)node->Data(); + if (m_current == line) m_current = (wxListLineData *) NULL; DeleteLine( line ); m_lines.DeleteNode( node ); - }; -}; + } +} -void wxListMainWindow::DeleteColumn( const int col ) +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 = (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; -}; +} void wxListMainWindow::DeleteEverything( void ) { m_dirty = TRUE; + 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( const long index ) +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(const long start, const wxString& str, const bool WXUNUSED(partial) ) +long wxListMainWindow::FindItem(long start, const wxString& str, bool WXUNUSED(partial) ) { long pos = start; wxString tmp = str; @@ -1798,11 +2037,11 @@ long wxListMainWindow::FindItem(const long start, const wxString& str, const boo if (s == tmp) return pos; node = node->Next(); pos++; - }; + } return -1; -}; +} -long wxListMainWindow::FindItem(const long start, const long data) +long wxListMainWindow::FindItem(long start, long data) { long pos = start; if (pos < 0) pos = 0; @@ -1815,11 +2054,11 @@ long wxListMainWindow::FindItem(const long start, const long data) if (item.m_data == data) return pos; node = node->Next(); pos++; - }; + } return -1; -}; +} -long wxListMainWindow::HitTest( const int x, const int y, int &flags ) +long wxListMainWindow::HitTest( int x, int y, int &flags ) { wxNode *node = m_lines.First(); int count = 0; @@ -1831,12 +2070,12 @@ long wxListMainWindow::HitTest( const int x, const int y, int &flags ) { flags = ret; return count; - }; + } node = node->Next(); count++; - }; + } return -1; -}; +} void wxListMainWindow::InsertItem( wxListItem &item ) { @@ -1860,9 +2099,9 @@ void wxListMainWindow::InsertItem( wxListItem &item ) m_lines.Insert( node, line ); else m_lines.Append( line ); -}; +} -void wxListMainWindow::InsertColumn( const long col, wxListItem &item ) +void wxListMainWindow::InsertColumn( long col, wxListItem &item ) { m_dirty = TRUE; if (m_mode & wxLC_REPORT) @@ -1874,8 +2113,8 @@ void wxListMainWindow::InsertColumn( const 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; @@ -1890,20 +2129,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 @@ -1931,14 +2170,14 @@ wxListItem::wxListItem(void) IMPLEMENT_DYNAMIC_CLASS(wxListEvent, wxCommandEvent) -wxListEvent::wxListEvent( WXTYPE commandType, int id ): +wxListEvent::wxListEvent( wxEventType commandType, int id ): wxCommandEvent( commandType, id ) { m_code = 0; m_itemIndex = 0; m_col = 0; m_cancelled = FALSE; -}; +} // ------------------------------------------------------------------------------------- // wxListCtrl @@ -1948,34 +2187,28 @@ IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl) BEGIN_EVENT_TABLE(wxListCtrl,wxControl) EVT_SIZE (wxListCtrl::OnSize) + EVT_IDLE (wxListCtrl::OnIdle) 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, const wxWindowID id, - const wxPoint &pos, const wxSize &size, - const long style, const wxString &name ) - -{ - Create( parent, id, pos, size, style, name ); -}; - wxListCtrl::~wxListCtrl(void) { } -bool wxListCtrl::Create( wxWindow *parent, const wxWindowID id, - const wxPoint &pos, const wxSize &size, - const long style, const wxString &name ) +bool wxListCtrl::Create( wxWindow *parent, wxWindowID id, + const wxPoint &pos, const wxSize &size, + 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; @@ -1986,39 +2219,26 @@ bool wxListCtrl::Create( wxWindow *parent, const 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) ) { - RealizeChanges(); -/* - wxWindow::OnSize( event ); - - int cw = 0; - int ch = 0; - GetClientSize( &cw, &ch ); + // handled in OnIdle - if (GetWindowStyleFlag() & wxLC_REPORT) - { - m_headerWin->SetSize( 0, 0, cw, 23 ); - m_mainWin->SetSize( 0, 24, cw, ch-24 ); - } - else - { - m_mainWin->SetSize( 0, 0, cw, ch ); - }; -*/ -}; + if (m_mainWin) m_mainWin->m_dirty = TRUE; +} -void wxListCtrl::SetSingleStyle( const long style, const bool add ) +void wxListCtrl::SetSingleStyle( long style, bool add ) { long flag = GetWindowStyleFlag(); @@ -2027,7 +2247,7 @@ void wxListCtrl::SetSingleStyle( const long style, const 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) { @@ -2036,12 +2256,12 @@ void wxListCtrl::SetSingleStyle( const long style, const bool add ) else { if (flag & style) flag -= style; - }; + } SetWindowStyleFlag( flag ); -}; +} -void wxListCtrl::SetWindowStyleFlag( const long flag ) +void wxListCtrl::SetWindowStyleFlag( long flag ) { m_mainWin->DeleteEverything(); @@ -2064,8 +2284,8 @@ void wxListCtrl::SetWindowStyleFlag( const long flag ) { // m_headerWin->SetSize( 0, 0, width, 23 ); m_headerWin->Show( TRUE ); - }; - }; + } + } } else { @@ -2073,105 +2293,59 @@ void wxListCtrl::SetWindowStyleFlag( const long flag ) { // m_mainWin->SetSize( 0, 0, width, height ); m_headerWin->Show( FALSE ); - }; - }; + } + } wxWindow::SetWindowStyleFlag( flag ); -}; - -void wxListCtrl::RealizeChanges( void ) -{ - m_mainWin->m_dirty = TRUE; - - int cw = 0; - int ch = 0; - GetClientSize( &cw, &ch ); - - int x = 0; - int y = 0; - int w = 0; - int h = 0; - - if (GetWindowStyleFlag() & wxLC_REPORT) - { - m_headerWin->GetPosition( &x, &y ); - m_headerWin->GetSize( &w, &h ); - if ((x != 0) || (y != 0) || (w != cw) || (h != 23)) - m_headerWin->SetSize( 0, 0, cw, 23 ); - - m_mainWin->GetPosition( &x, &y ); - m_mainWin->GetSize( &w, &h ); - if ((x != 0) || (y != 24) || (w != cw) || (h != ch-24)) - m_mainWin->SetSize( 0, 24, cw, ch-24 ); - } - else - { - m_mainWin->GetPosition( &x, &y ); - 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& col) -{ - // This is from Julian. You know. - // Not in wxWin 1.xx ??? - wxWindow::SetBackgroundColour( (wxColour&)col ); -}; +} -bool wxListCtrl::GetColumn(const int col, wxListItem &item) +bool wxListCtrl::GetColumn(int col, wxListItem &item) { m_mainWin->GetColumn( col, item ); return TRUE; -}; +} -bool wxListCtrl::SetColumn( const int col, wxListItem& item ) +bool wxListCtrl::SetColumn( int col, wxListItem& item ) { m_mainWin->SetColumn( col, item ); return TRUE; -}; +} -int wxListCtrl::GetColumnWidth( const int col ) +int wxListCtrl::GetColumnWidth( int col ) { return m_mainWin->GetColumnWidth( col ); -}; +} -bool wxListCtrl::SetColumnWidth( const int col, const int width ) +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( const long index, const int col, const wxString& label, const int imageId ) +long wxListCtrl::SetItem( long index, int col, const wxString& label, int imageId ) { wxListItem info; info.m_text = label; @@ -2186,20 +2360,20 @@ long wxListCtrl::SetItem( const long index, const int col, const wxString& label ; m_mainWin->SetItem(info); return TRUE; -}; +} -int wxListCtrl::GetItemState( const long item, const long stateMask ) +int wxListCtrl::GetItemState( long item, long stateMask ) { return m_mainWin->GetItemState( item, stateMask ); -}; +} -bool wxListCtrl::SetItemState( const long item, const long state, const long stateMask ) +bool wxListCtrl::SetItemState( long item, long state, long stateMask ) { m_mainWin->SetItemState( item, state, stateMask ); return TRUE; -}; +} -bool wxListCtrl::SetItemImage( const long item, const int image, const int WXUNUSED(selImage) ) +bool wxListCtrl::SetItemImage( long item, int image, int WXUNUSED(selImage) ) { wxListItem info; info.m_image = image; @@ -2207,34 +2381,34 @@ bool wxListCtrl::SetItemImage( const long item, const int image, const int WXUNU info.m_itemId = item; m_mainWin->SetItem( info ); return TRUE; -}; +} -wxString wxListCtrl::GetItemText( const long item ) +wxString wxListCtrl::GetItemText( long item ) { wxListItem info; info.m_itemId = item; m_mainWin->GetItem( info ); return info.m_text; -}; +} -void wxListCtrl::SetItemText( const long item, const wxString &str ) +void wxListCtrl::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 ); -}; +} -long wxListCtrl::GetItemData( const long item ) +long wxListCtrl::GetItemData( long item ) { wxListItem info; info.m_itemId = item; m_mainWin->GetItem( info ); return info.m_data; -}; +} -bool wxListCtrl::SetItemData( const long item, long data ) +bool wxListCtrl::SetItemData( long item, long data ) { wxListItem info; info.m_mask = wxLIST_MASK_DATA; @@ -2242,60 +2416,66 @@ bool wxListCtrl::SetItemData( const long item, long data ) info.m_data = data; m_mainWin->SetItem( info ); return TRUE; -}; +} -bool wxListCtrl::GetItemRect( const long item, wxRectangle &rect, const int WXUNUSED(code) ) +bool wxListCtrl::GetItemRect( long item, wxRectangle &rect, int WXUNUSED(code) ) { m_mainWin->GetItemRect( item, rect ); return TRUE; -}; +} -bool wxListCtrl::GetItemPosition( const long WXUNUSED(item), wxPoint& WXUNUSED(pos) ) const +bool wxListCtrl::GetItemPosition( long item, wxPoint& pos ) { - return 0; -}; + m_mainWin->GetItemPosition( item, pos ); + return TRUE; +} -bool wxListCtrl::SetItemPosition( const long WXUNUSED(item), const wxPoint& WXUNUSED(pos) ) +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( const long item, int geom, int state ) +long wxListCtrl::GetNextItem( long item, int geom, int state ) const { return m_mainWin->GetNextItem( item, geom, state ); -}; +} -wxImageList *wxListCtrl::GetImageList(const int which) +wxImageList *wxListCtrl::GetImageList(int which) { if (which == wxIMAGE_LIST_NORMAL) { @@ -2308,96 +2488,96 @@ wxImageList *wxListCtrl::GetImageList(const int which) else if (which == wxIMAGE_LIST_STATE) { return m_imageListState; - }; - return NULL; -}; + } + return (wxImageList *) NULL; +} -void wxListCtrl::SetImageList( wxImageList *imageList, const int which ) +void wxListCtrl::SetImageList( wxImageList *imageList, int which ) { m_mainWin->SetImageList( imageList, which ); -}; +} -bool wxListCtrl::Arrange( const int WXUNUSED(flag) ) +bool wxListCtrl::Arrange( int WXUNUSED(flag) ) { return 0; -}; +} -bool wxListCtrl::DeleteItem( const long item ) +bool wxListCtrl::DeleteItem( long item ) { m_mainWin->DeleteItem( item ); return TRUE; -}; +} bool wxListCtrl::DeleteAllItems(void) { m_mainWin->DeleteAllItems(); return TRUE; -}; +} -bool wxListCtrl::DeleteColumn( const int col ) +bool wxListCtrl::DeleteColumn( int col ) { m_mainWin->DeleteColumn( col ); return TRUE; -}; +} /* -wxText& wxListCtrl::Edit( const long WXUNUSED(item ) ) +wxText& wxListCtrl::Edit( long WXUNUSED(item ) ) { -}; +} */ -bool wxListCtrl::EnsureVisible( const long item ) +bool wxListCtrl::EnsureVisible( long item ) { m_mainWin->EnsureVisible( item ); return TRUE; -}; +} -long wxListCtrl::FindItem( const long start, const wxString& str, const bool partial ) +long wxListCtrl::FindItem( long start, const wxString& str, bool partial ) { return m_mainWin->FindItem( start, str, partial ); -}; +} -long wxListCtrl::FindItem( const long start, const long data ) +long wxListCtrl::FindItem( long start, long data ) { return m_mainWin->FindItem( start, data ); -}; +} -long wxListCtrl::FindItem( const long WXUNUSED(start), const wxPoint& WXUNUSED(pt), - const int WXUNUSED(direction)) +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( const long index, const wxString &label ) +long wxListCtrl::InsertItem( long index, const wxString &label ) { wxListItem info; info.m_text = label; info.m_mask = wxLIST_MASK_TEXT; info.m_itemId = index; return InsertItem( info ); -}; +} -long wxListCtrl::InsertItem( const long index, const int imageIndex ) +long wxListCtrl::InsertItem( long index, int imageIndex ) { wxListItem info; info.m_mask = wxLIST_MASK_IMAGE; info.m_image = imageIndex; info.m_itemId = index; return InsertItem( info ); -}; +} -long wxListCtrl::InsertItem( const long index, const wxString &label, const int imageIndex ) +long wxListCtrl::InsertItem( long index, const wxString &label, int imageIndex ) { wxListItem info; info.m_text = label; @@ -2405,16 +2585,16 @@ long wxListCtrl::InsertItem( const long index, const wxString &label, const int info.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_IMAGE; info.m_itemId = index; return InsertItem( info ); -}; +} -long wxListCtrl::InsertColumn( const long col, wxListItem &item ) +long wxListCtrl::InsertColumn( long col, wxListItem &item ) { m_mainWin->InsertColumn( col, item ); return 0; -}; +} -long wxListCtrl::InsertColumn( const long col, const wxString &heading, - const int format, const int width ) +long wxListCtrl::InsertColumn( long col, const wxString &heading, + int format, int width ) { wxListItem item; item.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_FORMAT; @@ -2428,12 +2608,12 @@ long wxListCtrl::InsertColumn( const long col, const wxString &heading, item.m_format = format; return InsertColumn( col, item ); -}; +} -bool wxListCtrl::ScrollList( const int WXUNUSED(dx), const int WXUNUSED(dy) ) +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. @@ -2449,6 +2629,45 @@ bool wxListCtrl::SortItems( wxListCtrlCompare fn, long data ) { m_mainWin->SortItems( fn, data ); return TRUE; -}; +} + +void wxListCtrl::OnIdle( wxIdleEvent &WXUNUSED(event) ) +{ + if (!m_mainWin->m_dirty) return; + + int cw = 0; + int ch = 0; + GetClientSize( &cw, &ch ); + + int x = 0; + int y = 0; + int w = 0; + int h = 0; + + if (GetWindowStyleFlag() & wxLC_REPORT) + { + m_headerWin->GetPosition( &x, &y ); + m_headerWin->GetSize( &w, &h ); + if ((x != 0) || (y != 0) || (w != cw) || (h != 23)) + m_headerWin->SetSize( 0, 0, cw, 23 ); + + m_mainWin->GetPosition( &x, &y ); + m_mainWin->GetSize( &w, &h ); + if ((x != 0) || (y != 24) || (w != cw) || (h != ch-24)) + m_mainWin->SetSize( 0, 24, cw, ch-24 ); + } + else + { + m_mainWin->GetPosition( &x, &y ); + 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(); +}