X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/33d0b396b23cc198d6966d2ae4bd03762821e56c..c9d9f242e45a5d8399d52f5709b560a63dd804fc:/src/generic/listctrl.cpp?ds=sidebyside diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 788670089a..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( 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 ) { @@ -439,17 +440,17 @@ long wxListLineData::IsHit( int x, 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( 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,10 +527,10 @@ 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; @@ -537,16 +538,16 @@ void wxListLineData::DoDraw( wxPaintDC *dc, bool hilight, bool paintBG ) 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, 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 +566,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 +581,7 @@ void wxListLineData::Hilight( bool on ) else m_owner->DeselectLine( this ); m_hilighted = on; -}; +} void wxListLineData::ReverseHilight( void ) { @@ -589,7 +590,7 @@ void wxListLineData::ReverseHilight( void ) m_owner->SelectLine( this ); else m_owner->DeselectLine( this ); -}; +} void wxListLineData::DrawRubberBand( wxPaintDC *dc, bool on ) { @@ -599,23 +600,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 +624,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 +632,7 @@ void wxListLineData::AssignRect( wxRectangle &dest, const wxRectangle &source ) dest.y = source.y; dest.width = source.width; dest.height = source.height; -}; +} //----------------------------------------------------------------------------- // wxListHeaderWindow @@ -647,10 +648,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 +661,13 @@ 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 ); -}; +} 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,27 +720,90 @@ 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(); + wxYield(); // for debugging + 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 +812,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 +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,24 +908,24 @@ 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, wxWindowID id, const wxPoint &pos, const wxSize &size, @@ -817,18 +935,18 @@ 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_isDragging = FALSE; + m_dragCount = 0; m_isCreated = FALSE; wxSize sz = size; sz.y = 25; @@ -842,7 +960,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; @@ -853,21 +971,16 @@ wxListMainWindow::wxListMainWindow( wxWindow *parent, 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,11 +1020,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 ) { @@ -923,74 +1036,82 @@ 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 ) { - 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,12 +1486,12 @@ 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 ) { @@ -1316,12 +1499,12 @@ 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 ); - }; -}; + } +} 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,16 +1540,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 ) { @@ -1378,13 +1561,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 ) { @@ -1395,19 +1578,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 ) { @@ -1424,8 +1628,8 @@ void wxListMainWindow::GetColumn( int col, wxListItem &item ) item.m_text = ""; item.m_image = 0; item.m_data = 0; - }; -}; + } +} int wxListMainWindow::GetColumnWidth( int col ) { @@ -1437,17 +1641,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 ) { @@ -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( 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,21 +1682,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 ) { @@ -1502,8 +1720,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 ); @@ -1511,10 +1729,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 ) { @@ -1530,13 +1748,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 ) { @@ -1552,8 +1770,27 @@ void wxListMainWindow::GetItemRect( 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,9 +1801,9 @@ int wxListMainWindow::GetSelectedItemCount( void ) wxListLineData *line = (wxListLineData*)node->Data(); if (line->IsHilighted()) ret++; node = node->Next(); - }; + } return 0; -}; +} void wxListMainWindow::SetMode( long mode ) { @@ -1584,13 +1821,13 @@ void wxListMainWindow::SetMode( 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,13 +1937,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 ) { @@ -1721,9 +1958,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 ) { @@ -1732,57 +1969,59 @@ void wxListMainWindow::DeleteItem( long 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( 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( 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) ) { @@ -1798,9 +2037,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) { @@ -1815,9 +2054,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 ) { @@ -1831,12 +2070,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 ) { @@ -1860,7 +2099,7 @@ void wxListMainWindow::InsertItem( wxListItem &item ) m_lines.Insert( node, line ); else m_lines.Append( line ); -}; +} void wxListMainWindow::InsertColumn( long col, wxListItem &item ) { @@ -1874,8 +2113,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; @@ -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 @@ -1938,7 +2177,7 @@ wxListEvent::wxListEvent( wxEventType commandType, int id ): m_itemIndex = 0; m_col = 0; m_cancelled = FALSE; -}; +} // ------------------------------------------------------------------------------------- // wxListCtrl @@ -1953,30 +2192,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; @@ -1987,22 +2219,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 ) { @@ -2013,7 +2247,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) { @@ -2022,10 +2256,10 @@ void wxListCtrl::SetSingleStyle( long style, bool add ) else { if (flag & style) flag -= style; - }; + } SetWindowStyleFlag( flag ); -}; +} void wxListCtrl::SetWindowStyleFlag( long flag ) { @@ -2050,8 +2284,8 @@ void wxListCtrl::SetWindowStyleFlag( long flag ) { // m_headerWin->SetSize( 0, 0, width, 23 ); m_headerWin->Show( TRUE ); - }; - }; + } + } } else { @@ -2059,64 +2293,57 @@ void wxListCtrl::SetWindowStyleFlag( long flag ) { // m_mainWin->SetSize( 0, 0, width, height ); m_headerWin->Show( FALSE ); - }; - }; + } + } wxWindow::SetWindowStyleFlag( flag ); -}; - -void wxListCtrl::SetBackgroundColour(const wxColour& col) -{ - // This is from Julian. You know. - // Not in wxWin 1.xx ??? - wxWindow::SetBackgroundColour( (wxColour&)col ); -}; +} 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 ) { @@ -2133,18 +2360,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) ) { @@ -2154,7 +2381,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 ) { @@ -2162,7 +2389,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 ) { @@ -2171,7 +2398,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 ) { @@ -2179,7 +2406,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 ) { @@ -2189,63 +2416,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 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( 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 ) +long wxListCtrl::GetNextItem( long item, int geom, int state ) const { return m_mainWin->GetNextItem( item, geom, state ); -}; +} wxImageList *wxListCtrl::GetImageList(int which) { @@ -2260,76 +2488,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 ) { @@ -2338,7 +2566,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 ) { @@ -2347,7 +2575,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 ) { @@ -2357,13 +2585,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 ) @@ -2380,12 +2608,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. @@ -2401,9 +2629,9 @@ bool wxListCtrl::SortItems( wxListCtrlCompare fn, long data ) { m_mainWin->SortItems( fn, data ); return TRUE; -}; +} -void wxListCtrl::OnIdle( wxIdleEvent &event ) +void wxListCtrl::OnIdle( wxIdleEvent &WXUNUSED(event) ) { if (!m_mainWin->m_dirty) return; @@ -2434,12 +2662,12 @@ void wxListCtrl::OnIdle( wxIdleEvent &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(); -}; +}