// get the mode (i.e. style) of the list control
inline int GetMode() const;
- void SetAttributes(wxDC *dc,
+ // prepare the DC for drawing with these item's attributes, return true if
+ // we need to draw the items background to highlight it, false otherwise
+ bool SetAttributes(wxDC *dc,
const wxListItemAttr *attr,
- const wxColour& colText,
- const wxFont& font,
bool highlight);
// these are only used by GetImage/SetImage above, we don't support images
item->SetAttr(attr);
}
-void wxListLineData::SetAttributes(wxDC *dc,
+bool wxListLineData::SetAttributes(wxDC *dc,
const wxListItemAttr *attr,
- const wxColour& colText,
- const wxFont& font,
- bool highlight)
+ bool highlighted)
{
- // don't use foregroud colour for drawing highlighted items - this might
+ wxWindow *listctrl = m_owner->GetParent();
+
+ // fg colour
+
+ // don't use foreground colour for drawing highlighted items - this might
// make them completely invisible (and there is no way to do bit
// arithmetics on wxColour, unfortunately)
- if ( !highlight && attr && attr->HasTextColour() )
+ wxColour colText;
+ if ( highlighted )
{
- dc->SetTextForeground(attr->GetTextColour());
+ colText = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHTTEXT);
}
else
{
- dc->SetTextForeground(colText);
+ if ( attr && attr->HasTextColour() )
+ {
+ colText = attr->GetTextColour();
+ }
+ else
+ {
+ colText = listctrl->GetForegroundColour();
+ }
}
+ dc->SetTextForeground(colText);
+
+ // font
+ wxFont font;
if ( attr && attr->HasFont() )
{
- dc->SetFont(attr->GetFont());
+ font = attr->GetFont();
}
else
{
- dc->SetFont(font);
+ font = listctrl->GetFont();
}
+
+ dc->SetFont(font);
+
+ // bg colour
+ bool hasBgCol = attr && attr->HasBackgroundColour();
+ if ( highlighted || hasBgCol )
+ {
+ if ( highlighted )
+ {
+ dc->SetBrush( *m_owner->m_highlightBrush );
+ }
+ else
+ {
+ dc->SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID));
+ }
+
+ dc->SetPen( *wxTRANSPARENT_PEN );
+
+ return TRUE;
+ }
+
+ return FALSE;
}
void wxListLineData::Draw( wxDC *dc )
wxListItemDataList::Node *node = m_items.GetFirst();
wxCHECK_RET( node, _T("no subitems at all??") );
+ bool highlighted = IsHighlighted();
+
+ wxListItemAttr *attr = GetAttr();
+
+ if ( SetAttributes(dc, attr, highlighted) )
+ {
+ dc->DrawRectangle( m_gi->m_rectHighlight );
+ }
+
wxListItemData *item = node->GetData();
if (item->HasImage())
{
if ( !IsVirtual() )
highlighted = m_highlighted;
- // default foreground colour
- wxWindow *listctrl = m_owner->GetParent();
- wxColour colText;
- if ( highlighted )
- {
- colText = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_HIGHLIGHTTEXT );
- }
- else
- {
- colText = listctrl->GetForegroundColour();
- }
-
- // default font
- wxFont font = listctrl->GetFont();
-
// TODO: later we should support setting different attributes for
// different columns - to do it, just add "col" argument to
- // GetAttr() and move this code into the loop below
+ // GetAttr() and move these lines into the loop below
wxListItemAttr *attr = GetAttr();
- SetAttributes(dc, attr, colText, font, highlighted);
-
- bool hasBgCol = attr && attr->HasBackgroundColour();
- if ( highlighted || hasBgCol )
+ if ( SetAttributes(dc, attr, highlighted) )
{
- if ( highlighted )
- {
- dc->SetBrush( *m_owner->m_highlightBrush );
- }
- else
- {
- if ( hasBgCol )
- dc->SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID));
- else
- dc->SetBrush( * wxWHITE_BRUSH );
- }
-
- dc->SetPen( * wxTRANSPARENT_PEN );
dc->DrawRectangle( rectHL );
}
size_t index = (size_t)lindex;
- // select the next item when the selected one is deleted
- if ( m_current >= index )
+ // we don't need to adjust the index for the previous items
+ if ( HasCurrent() && m_current >= index )
{
- m_current--;
+ // if the current item is being deleted, we want the next one to
+ // become selected - unless there is no next one - so don't adjust
+ // m_current in this case
+ if ( m_current != index || m_current == count - 1 )
+ {
+ m_current--;
+ }
}
if ( InReportView() )
{
m_mainWin->DeleteEverything();
- int width = 0;
- int height = 0;
- GetClientSize( &width, &height );
+ // has the header visibility changed?
+ bool hasHeader = HasFlag(wxLC_REPORT) && !HasFlag(wxLC_NO_HEADER),
+ willHaveHeader = (flag & wxLC_REPORT) && !(flag & wxLC_NO_HEADER);
- if (flag & wxLC_REPORT)
+ if ( hasHeader != willHaveHeader )
{
- if (!HasFlag(wxLC_REPORT))
+ // toggle it
+ if ( hasHeader )
+ {
+ if ( m_headerWin )
+ {
+ // don't delete, just hide, as we can reuse it later
+ m_headerWin->Show(FALSE);
+ }
+ //else: nothing to do
+ }
+ else // must show header
{
if (!m_headerWin)
{
CreateHeaderWindow();
-
- if (HasFlag(wxLC_NO_HEADER))
- m_headerWin->Show( FALSE );
}
- else
+ else // already have it, just show
{
- if (flag & wxLC_NO_HEADER)
- m_headerWin->Show( FALSE );
- else
- m_headerWin->Show( TRUE );
+ m_headerWin->Show( TRUE );
}
}
- }
- else // !report
- {
- if ( m_mainWin->HasHeader() )
- {
- m_headerWin->Show( FALSE );
- }
+
+ ResizeReportView(willHaveHeader);
}
}
if ( !m_mainWin )
return;
+ ResizeReportView(m_mainWin->HasHeader());
+
+ m_mainWin->RecalculatePositions();
+}
+
+void wxListCtrl::ResizeReportView(bool showHeader)
+{
int cw, ch;
GetClientSize( &cw, &ch );
- if ( m_mainWin->HasHeader() )
+ if ( showHeader )
{
m_headerWin->SetSize( 0, 0, cw, HEADER_HEIGHT );
m_mainWin->SetSize( 0, HEADER_HEIGHT + 1, cw, ch - HEADER_HEIGHT - 1 );
{
m_mainWin->SetSize( 0, 0, cw, ch );
}
-
- m_mainWin->RecalculatePositions();
}
void wxListCtrl::OnIdle( wxIdleEvent & event )