m_owner = (wxListMainWindow *) NULL;
m_currentCursor = (wxCursor *) NULL;
m_resizeCursor = (wxCursor *) NULL;
- m_isDraging = FALSE;
+ m_isDragging = FALSE;
}
wxListHeaderWindow::wxListHeaderWindow( wxWindow *win, wxWindowID id, wxListMainWindow *owner,
// m_currentCursor = wxSTANDARD_CURSOR;
m_currentCursor = (wxCursor *) NULL;
m_resizeCursor = new wxCursor( wxCURSOR_SIZEWE );
- m_isDraging = FALSE;
+ m_isDragging = FALSE;
+ SetBackgroundColour( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ) );
}
wxListHeaderWindow::~wxListHeaderWindow( void )
m_owner->ClientToScreen( &x2, &y2 );
wxScreenDC dc;
- dc.SetLogicalFunction( wxXOR );
+ dc.SetLogicalFunction( wxINVERT );
dc.SetPen( wxPen( *wxBLACK, 2, wxSOLID ) );
dc.SetBrush( *wxTRANSPARENT_BRUSH );
{
int x = event.GetX();
int y = event.GetY();
- if (m_isDraging)
+ if (m_isDragging)
{
DrawCurrent();
if (event.ButtonUp())
{
ReleaseMouse();
- m_isDraging = FALSE;
+ m_isDragging = FALSE;
m_owner->SetColumnWidth( m_column, m_currentX-m_minX );
}
else
if (event.LeftDown() && hit_border)
{
- m_isDraging = TRUE;
+ m_isDragging = TRUE;
m_currentX = x;
DrawCurrent();
CaptureMouse();
EVT_SIZE (wxListMainWindow::OnSize)
EVT_MOUSE_EVENTS (wxListMainWindow::OnMouse)
EVT_CHAR (wxListMainWindow::OnChar)
+ EVT_KEY_DOWN (wxListMainWindow::OnKeyDown)
EVT_SET_FOCUS (wxListMainWindow::OnSetFocus)
EVT_KILL_FOCUS (wxListMainWindow::OnKillFocus)
END_EVENT_TABLE()
{
int y_s = m_yScroll*GetScrollPos( wxVERTICAL );
if ((y > y_s) && (y+h < y_s+h_p)) return;
- if (y-y_s < 5) Scroll( -1, (y-5-h_p/2)/m_yScroll );
- if (y+h+5 > y_s+h_p) Scroll( -1, (y+h-h_p/2+h+15)/m_yScroll );
+ if (y-y_s < 5) { Scroll( -1, (y-5-h_p/2)/m_yScroll ); Refresh(); }
+ if (y+h+5 > y_s+h_p) { Scroll( -1, (y+h-h_p/2+h+15)/m_yScroll); Refresh(); }
}
else
{
int x_s = m_xScroll*GetScrollPos( wxHORIZONTAL );
if ((x > x_s) && (x+w < x_s+w_p)) return;
- if (x-x_s < 5) Scroll( (x-5)/m_xScroll, -1 );
- if (x+w-5 > x_s+w_p) Scroll( (x+w-w_p+15)/m_xScroll, -1 );
+ if (x-x_s < 5) { Scroll( (x-5)/m_xScroll, -1 ); Refresh(); }
+ if (x+w-5 > x_s+w_p) { Scroll( (x+w-w_p+15)/m_xScroll, -1 ); Refresh(); }
}
}
UnfocusLine( oldCurrent );
}
+void wxListMainWindow::OnKeyDown( wxKeyEvent &event )
+{
+ wxWindow *parent = GetParent();
+
+ /* we propagate the key event up */
+ wxKeyEvent ke( wxEVT_KEY_DOWN );
+ ke.m_shiftDown = event.m_shiftDown;
+ ke.m_controlDown = event.m_controlDown;
+ ke.m_altDown = event.m_altDown;
+ ke.m_metaDown = event.m_metaDown;
+ ke.m_keyCode = event.m_keyCode;
+ ke.m_x = event.m_x;
+ ke.m_y = event.m_y;
+ ke.SetEventObject( parent );
+ if (parent->GetEventHandler()->ProcessEvent( ke )) return;
+
+ event.Skip();
+}
+
void wxListMainWindow::OnChar( wxKeyEvent &event )
{
wxWindow *parent = GetParent();
le.SetEventObject( parent );
parent->GetEventHandler()->ProcessEvent( le );
- /* we propagate the key event up */
- wxKeyEvent ke( wxEVT_KEY_DOWN );
+ /* we propagate the char event up */
+ wxKeyEvent ke( wxEVT_CHAR );
ke.m_shiftDown = event.m_shiftDown;
ke.m_controlDown = event.m_controlDown;
ke.m_altDown = event.m_altDown;
ke.SetEventObject( parent );
if (parent->GetEventHandler()->ProcessEvent( ke )) return;
+ if (event.KeyCode() == WXK_TAB)
+ {
+ wxNavigationKeyEvent nevent;
+ nevent.SetDirection( !event.ShiftDown() );
+ nevent.SetCurrentFocus( m_parent );
+ if (m_parent->GetEventHandler()->ProcessEvent( nevent )) return;
+ }
+
/* no item -> nothing to do */
if (!m_current)
{
m_dirty = TRUE;
- wxNode *node = m_columns.Nth( col );
+ wxNode *node = (wxNode*) NULL;
+
+ if (width == wxLIST_AUTOSIZE_USEHEADER) width = 80;
+ if (width == wxLIST_AUTOSIZE)
+ {
+ wxClientDC dc(this);
+ dc.SetFont( GetFont() );
+ int max = 10;
+ 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();
+ int current = 0, ix = 0, iy = 0;
+ long lx = 0, ly = 0;
+ if (item->HasImage())
+ {
+ GetImageSize( item->GetImage(), ix, iy );
+ current = ix + 5;
+ }
+ if (item->HasText())
+ {
+ wxString str;
+ item->GetText( str );
+ dc.GetTextExtent( str, &lx, &ly );
+ current += lx;
+ }
+ if (current > max) max = current;
+ }
+ node = node->Next();
+ }
+ width = max+10;
+ }
+
+ node = m_columns.Nth( col );
if (node)
{
wxListHeaderData *column = (wxListHeaderData*)node->Data();
m_current = line;
FocusLine( m_current );
RefreshLine( m_current );
- RefreshLine( oldCurrent );
+ if (oldCurrent) RefreshLine( oldCurrent );
}
}
UnfocusLine( m_current );
m_current = line;
FocusLine( m_current );
- oldCurrent->Hilight( FALSE );
+ if (oldCurrent) oldCurrent->Hilight( FALSE );
RefreshLine( m_current );
- RefreshLine( oldCurrent );
+ if (oldCurrent) RefreshLine( oldCurrent );
}
bool on = state & wxLIST_STATE_SELECTED;
if (on != line->IsHilighted())
{
long ret = 0;
if (item > 0) ret = item;
- if(item >= GetItemCount()) return -1;
+ if(ret >= GetItemCount()) return -1;
wxNode *node = m_lines.Nth( ret );
while (node)
{
void wxListMainWindow::DeleteColumn( int col )
{
wxCHECK_RET( col < (int)m_columns.GetCount(),
- "attempting to delete inexistent column in wxListView" );
+ _T("attempting to delete inexistent column in wxListView") );
m_dirty = TRUE;
wxNode *node = m_columns.Nth( col );
m_mainWin = new wxListMainWindow( this, -1, wxPoint(0,0), size, s );
- if (GetWindowStyleFlag() & wxLC_REPORT)
+ if (HasFlag(wxLC_REPORT))
m_headerWin = new wxListHeaderWindow( this, -1, m_mainWin, wxPoint(0,0), wxSize(size.x,23), wxTAB_TRAVERSAL );
else
m_headerWin = (wxListHeaderWindow *) NULL;
+ SetBackgroundColour( *wxWHITE );
+
return ret;
}
void wxListCtrl::SetSingleStyle( long style, bool add )
{
- long flag = GetWindowStyleFlag();
+ long flag = GetWindowStyle();
if (add)
{
void wxListCtrl::SetWindowStyleFlag( long flag )
{
- m_mainWin->DeleteEverything();
+ if (m_mainWin)
+ {
+ m_mainWin->DeleteEverything();
- int width = 0;
- int height = 0;
- GetClientSize( &width, &height );
+ int width = 0;
+ int height = 0;
+ GetClientSize( &width, &height );
- m_mainWin->SetMode( flag );
+ m_mainWin->SetMode( flag );
- if (flag & wxLC_REPORT)
- {
- if (!(GetWindowStyleFlag() & wxLC_REPORT))
+ if (flag & wxLC_REPORT)
{
-// m_mainWin->SetSize( 0, 24, width, height-24 );
- if (!m_headerWin)
+ if (!HasFlag(wxLC_REPORT))
{
- m_headerWin = new wxListHeaderWindow( this, -1, m_mainWin, wxPoint(0,0), wxSize(width,23), wxTAB_TRAVERSAL );
- }
- else
- {
-// m_headerWin->SetSize( 0, 0, width, 23 );
- m_headerWin->Show( TRUE );
+ if (!m_headerWin)
+ {
+ m_headerWin = new wxListHeaderWindow( this, -1, m_mainWin,
+ wxPoint(0,0), wxSize(width,23), wxTAB_TRAVERSAL );
+ }
+ else
+ {
+ m_headerWin->Show( TRUE );
+ }
}
}
- }
- else
- {
- if (GetWindowStyleFlag() & wxLC_REPORT)
+ else
{
-// m_mainWin->SetSize( 0, 0, width, height );
- m_headerWin->Show( FALSE );
- }
+ if (HasFlag(wxLC_REPORT))
+ {
+ m_headerWin->Show( FALSE );
+ }
+ }
}
-
+
wxWindow::SetWindowStyleFlag( flag );
}
int w = 0;
int h = 0;
- if (GetWindowStyleFlag() & wxLC_REPORT)
+ if (HasFlag(wxLC_REPORT))
{
m_headerWin->GetPosition( &x, &y );
m_headerWin->GetSize( &w, &h );
m_mainWin->Refresh();
}
-void wxListCtrl::SetBackgroundColour( const wxColour &colour )
+bool wxListCtrl::SetBackgroundColour( const wxColour &colour )
{
+ if ( !wxWindow::SetBackgroundColour( colour ) )
+ return FALSE;
+
if (m_mainWin)
{
m_mainWin->SetBackgroundColour( colour );
if (m_headerWin)
{
- m_headerWin->SetBackgroundColour( colour );
+// m_headerWin->SetBackgroundColour( colour );
}
+
+ return TRUE;
}
-void wxListCtrl::SetForegroundColour( const wxColour &colour )
+bool wxListCtrl::SetForegroundColour( const wxColour &colour )
{
+ if ( !wxWindow::SetForegroundColour( colour ) )
+ return FALSE;
+
if (m_mainWin)
{
m_mainWin->SetForegroundColour( colour );
{
m_headerWin->SetForegroundColour( colour );
}
+
+ return TRUE;
}
-void wxListCtrl::SetFont( const wxFont &font )
+bool wxListCtrl::SetFont( const wxFont &font )
{
+ if ( !wxWindow::SetFont( font ) )
+ return FALSE;
+
if (m_mainWin)
{
m_mainWin->SetFont( font );
{
m_headerWin->SetFont( font );
}
+
+ return TRUE;
}