info.m_text = m_text;
info.m_image = m_image;
info.m_data = m_data;
+ info.m_colour = m_colour;
}
wxColour *wxListItemData::GetColour()
dc->GetTextExtent( s, &lw, &lh );
m_bound_all.width = lw;
m_bound_all.height = lh;
+ if (item->HasImage())
+ {
+ int w = 0;
+ int h = 0;
+ m_owner->GetImageSize( item->GetImage(), w, h );
+ m_bound_all.width += 4 + w;
+ if (h > m_bound_all.height) m_bound_all.height = h;
+ }
}
break;
}
wxString s;
item->GetText( s );
if (s.IsNull()) s = "H";
- long lw,lh;
- dc->GetTextExtent( s, &lw, &lh );
+ long lh;
+ dc->GetTextExtent( s, (long*) NULL, &lh );
item->SetSize( item->GetWidth(), lh );
- m_bound_all.width += lw;
m_bound_all.height = lh;
node = node->Next();
}
void wxListLineData::SetPosition( wxDC *dc, int x, int y, int window_width )
{
- m_bound_all.x = x;
- m_bound_all.y = y;
- switch (m_mode)
- {
- case wxLC_ICON:
- {
- AssignRect( m_bound_icon, 0, 0, 0, 0 );
- AssignRect( m_bound_label, 0, 0, 0, 0 );
- AssignRect( m_bound_hilight, m_bound_all );
- wxNode *node = m_items.First();
- if (node)
- {
- wxListItemData *item = (wxListItemData*)node->Data();
- if (item->HasImage())
+ m_bound_all.x = x;
+ m_bound_all.y = y;
+ switch (m_mode)
+ {
+ case wxLC_ICON:
{
- wxListItemData *item = (wxListItemData*)node->Data();
- int w = 0;
- int h = 0;
- m_owner->GetImageSize( item->GetImage(), w, h );
- m_bound_icon.x = m_bound_all.x + (m_spacing/2) - (w/2);
- m_bound_icon.y = m_bound_all.y + m_spacing - h - 5;
- m_bound_icon.width = w;
- m_bound_icon.height = h;
- if (!item->HasText())
- {
- AssignRect( m_bound_hilight, m_bound_icon );
- m_bound_hilight.x -= 5;
- m_bound_hilight.y -= 5;
- m_bound_hilight.width += 9;
- m_bound_hilight.height += 9;
- }
+ AssignRect( m_bound_icon, 0, 0, 0, 0 );
+ AssignRect( m_bound_label, 0, 0, 0, 0 );
+ AssignRect( m_bound_hilight, m_bound_all );
+ wxNode *node = m_items.First();
+ if (node)
+ {
+ wxListItemData *item = (wxListItemData*)node->Data();
+ if (item->HasImage())
+ {
+ wxListItemData *item = (wxListItemData*)node->Data();
+ int w = 0;
+ int h = 0;
+ m_owner->GetImageSize( item->GetImage(), w, h );
+ m_bound_icon.x = m_bound_all.x + (m_spacing/2) - (w/2);
+ m_bound_icon.y = m_bound_all.y + m_spacing - h - 5;
+ m_bound_icon.width = w;
+ m_bound_icon.height = h;
+ if (!item->HasText())
+ {
+ AssignRect( m_bound_hilight, m_bound_icon );
+ m_bound_hilight.x -= 5;
+ m_bound_hilight.y -= 5;
+ m_bound_hilight.width += 9;
+ m_bound_hilight.height += 9;
+ }
+ }
+ if (item->HasText())
+ {
+ wxString s;
+ item->GetText( s );
+ long lw,lh;
+ dc->GetTextExtent( s, &lw, &lh );
+ if (m_bound_all.width > m_spacing)
+ m_bound_label.x = m_bound_all.x;
+ else
+ m_bound_label.x = m_bound_all.x + (m_spacing/2) - lw/2;
+ m_bound_label.y = m_bound_all.y + m_bound_all.height - lh;
+ m_bound_label.width = lw;
+ m_bound_label.height = lh;
+ AssignRect( m_bound_hilight, m_bound_label );
+ m_bound_hilight.x -= 2;
+ m_bound_hilight.y -= 2;
+ m_bound_hilight.width += 4;
+ m_bound_hilight.height += 4;
+ }
+ }
+ break;
}
- if (item->HasText())
+ case wxLC_LIST:
{
- wxString s;
- item->GetText( s );
- long lw,lh;
- dc->GetTextExtent( s, &lw, &lh );
- if (m_bound_all.width > m_spacing)
- m_bound_label.x = m_bound_all.x;
- else
- m_bound_label.x = m_bound_all.x + (m_spacing/2) - lw/2;
- m_bound_label.y = m_bound_all.y + m_bound_all.height - lh;
- m_bound_label.width = lw;
- m_bound_label.height = lh;
- AssignRect( m_bound_hilight, m_bound_label );
- m_bound_hilight.x -= 2;
- m_bound_hilight.y -= 2;
- m_bound_hilight.width += 4;
- m_bound_hilight.height += 4;
+ AssignRect( m_bound_label, m_bound_all );
+ m_bound_all.x -= 2;
+ m_bound_all.y -= 2;
+ m_bound_all.width += 4;
+ m_bound_all.height += 3;
+ AssignRect( m_bound_hilight, m_bound_all );
+ AssignRect( m_bound_icon, 0, 0, 0, 0 );
+ wxNode *node = m_items.First();
+ if (node)
+ {
+ wxListItemData *item = (wxListItemData*)node->Data();
+ if (item->HasImage())
+ {
+ m_bound_icon.x = m_bound_all.x + 2;
+ m_bound_icon.y = m_bound_all.y + 2;
+ int w;
+ int h;
+ m_owner->GetImageSize( item->GetImage(), w, h );
+ m_bound_icon.width = w;
+ m_bound_icon.height = h;
+ m_bound_label.x += 4 + w;
+ m_bound_label.width -= 4 + w;
+ }
+ }
+ break;
+ }
+ case wxLC_REPORT:
+ {
+ long lw,lh;
+ dc->GetTextExtent( "H", &lw, &lh );
+ m_bound_all.x = 0;
+ m_bound_all.y -= 0;
+ m_bound_all.height = lh+3;
+ m_bound_all.width = window_width;
+ AssignRect( m_bound_hilight, m_bound_all );
+ AssignRect( m_bound_label, m_bound_all );
+ AssignRect( m_bound_icon, 0, 0, 0, 0 );
+ wxNode *node = m_items.First();
+ if (node)
+ {
+ wxListItemData *item = (wxListItemData*)node->Data();
+ wxString s;
+ item->GetText( s );
+ if (s.IsEmpty()) s = wxT("H");
+ long lw,lh;
+ dc->GetTextExtent( s, &lw, &lh );
+ m_bound_label.width = lw;
+ m_bound_label.height = lh;
+ if (item->HasImage())
+ {
+ m_bound_icon.x = m_bound_all.x + 2;
+ m_bound_icon.y = m_bound_all.y + 2;
+ int w;
+ int h;
+ m_owner->GetImageSize( item->GetImage(), w, h );
+ m_bound_icon.width = w;
+ m_bound_icon.height = h;
+ m_bound_label.x += 4 + w;
+ }
+ }
+ break;
}
- }
- break;
- }
- case wxLC_LIST:
- {
- AssignRect( m_bound_label, m_bound_all );
- m_bound_all.x -= 2;
- m_bound_all.y -= 2;
- m_bound_all.width += 4;
- m_bound_all.height += 3;
- AssignRect( m_bound_hilight, m_bound_all );
- AssignRect( m_bound_icon, 0, 0, 0, 0 );
- break;
- }
- case wxLC_REPORT:
- {
- long lw,lh;
- dc->GetTextExtent( "H", &lw, &lh );
- m_bound_all.x = 0;
- m_bound_all.y -= 0;
- m_bound_all.height = lh+3;
- m_bound_all.width = window_width;
- AssignRect( m_bound_hilight, m_bound_all );
- AssignRect( m_bound_label, 0, 0, 0 ,0 );
- AssignRect( m_bound_icon, 0, 0, 0, 0 );
- break;
}
- }
}
void wxListLineData::SetColumnPosition( int index, int x )
for (int j = 0; j < m_owner->GetColumnCount(); j++)
{
xpos += m_owner->GetColumnWidth( j );
+ m_column = j;
if ((abs(x-xpos) < 3) && (y < 22))
{
hit_border = TRUE;
- m_column = j;
break;
}
+ if (x-xpos < 0)
+ {
+ break;
+ }
m_minX = xpos;
}
- if (event.LeftDown() && hit_border)
+ if (event.LeftDown())
{
- m_isDragging = TRUE;
- m_currentX = x;
- DrawCurrent();
- CaptureMouse();
- return;
+ if (hit_border)
+ {
+ m_isDragging = TRUE;
+ m_currentX = x;
+ DrawCurrent();
+ CaptureMouse();
+ return;
+ }
+ else
+ {
+ wxListEvent le( wxEVT_COMMAND_LIST_COL_CLICK, GetParent()->GetId() );
+ le.SetEventObject( GetParent() );
+ le.m_col = m_column;
+ GetParent()->GetEventHandler()->ProcessEvent( le );
+ return;
+ }
}
if (event.Moving())
void wxListMainWindow::EditLabel( long item )
{
wxNode *node = m_lines.Nth( item );
- wxCHECK_RET( node, _T("wrong index in wxListCtrl::Edit()") );
+ wxCHECK_RET( node, wxT("wrong index in wxListCtrl::Edit()") );
m_currentEdit = (wxListLineData*) node->Data();
int w = 0;
int h = 0;
m_currentEdit->GetLabelExtent( x, y, w, h );
-
+
wxClientDC dc(this);
PrepareDC( dc );
x = dc.LogicalToDeviceX( x );
void wxListMainWindow::OnRenameTimer()
{
- wxCHECK_RET( m_current, _T("invalid m_current") );
+ wxCHECK_RET( m_current, wxT("invalid m_current") );
Edit( m_lines.IndexOf( m_current ) );
}
info.m_mask = wxLIST_MASK_TEXT;
info.m_itemId = le.m_itemIndex;
info.m_text = m_renameRes;
+ info.m_colour = le.m_item.m_colour;
SetItem( info );
}
if (!m_current) return;
if (m_dirty) return;
- if ( !(event.Dragging() || event.ButtonDown() || event.LeftUp()) ) return;
+ if ( !(event.Dragging() || event.ButtonDown() || event.LeftUp() || event.ButtonDClick()) ) return;
wxClientDC dc(this);
PrepareDC(dc);
{
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 ); Refresh(); }
- if (y+h+5 > y_s+h_p) { Scroll( -1, (y+h-h_p/2+h+15)/m_yScroll); Refresh(); }
+ 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); }
}
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 ); Refresh(); }
- if (x+w-5 > x_s+w_p) { Scroll( (x+w-w_p+15)/m_xScroll, -1 ); Refresh(); }
+ 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 ); }
}
}
m_usedKeys = TRUE;
}
+#ifdef __WXGTK__
+extern wxWindow *g_focusWindow;
+#endif
+
void wxListMainWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) )
{
m_hasFocus = TRUE;
RefreshLine( m_current );
if (!GetParent()) return;
+
+#ifdef __WXGTK__
+ g_focusWindow = GetParent();
+#endif
wxFocusEvent event( wxEVT_SET_FOCUS, GetParent()->GetId() );
event.SetEventObject( GetParent() );
{
m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT );
}
+ if ((m_mode & wxLC_LIST) && (m_small_image_list))
+ {
+ m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT );
+ }
if ((m_mode & wxLC_REPORT) && (m_small_image_list))
{
m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT );
m_small_image_list->GetSize( index, width, height );
return;
}
+ if ((m_mode & wxLC_LIST) && (m_small_image_list))
+ {
+ m_small_image_list->GetSize( index, width, height );
+ return;
+ }
if ((m_mode & wxLC_REPORT) && (m_small_image_list))
{
m_small_image_list->GetSize( index, width, height );
int x = 5; // painting is done at x-2
int y = 5; // painting is done at y-2
int maxWidth = 0;
+ m_visibleLines = 0;
+ int m_currentVisibleLines = 0;
wxNode *node = m_lines.First();
while (node)
{
+ m_currentVisibleLines++;
wxListLineData *line = (wxListLineData*)node->Data();
line->CalculateSize( &dc, iconSpacing );
line->SetPosition( &dc, x, y, clientWidth );
y += lineSpacing;
if (y+lineSpacing-6 >= clientHeight) // -6 for earlier "line breaking"
{
+ if (m_currentVisibleLines > m_visibleLines)
+ m_visibleLines = m_currentVisibleLines;
+ m_currentVisibleLines = 0;
y = 5;
x += maxWidth+6;
entireWidth += maxWidth+6;
if ((tries == 0) && (entireWidth > clientWidth))
{
clientHeight -= 15; // scrollbar height
+ m_visibleLines = 0;
+ m_currentVisibleLines = 0;
break;
}
if (!node) tries = 1; // everything fits, no second try required
}
}
- m_visibleLines = (clientHeight+6) / (lineSpacing); // +6 for earlier "line breaking"
+// m_visibleLines = (5+clientHeight+6) / (lineSpacing); // +6 for earlier "line breaking"
int scroll_pos = GetScrollPos( wxHORIZONTAL );
SetScrollbars( m_xScroll, m_yScroll, (entireWidth+15) / m_xScroll, 0, scroll_pos, 0, TRUE );
void wxListMainWindow::DeleteColumn( int col )
{
wxCHECK_RET( col < (int)m_columns.GetCount(),
- _T("attempting to delete inexistent column in wxListView") );
+ wxT("attempting to delete inexistent column in wxListView") );
m_dirty = TRUE;
wxNode *node = m_columns.Nth( col );
{
m_headerWin = new wxListHeaderWindow( this, -1, m_mainWin,
wxPoint(0,0), wxSize(width,23), wxTAB_TRAVERSAL );
+ if (HasFlag(wxLC_NO_HEADER))
+ m_headerWin->Show( FALSE );
}
else
{
- m_headerWin->Show( TRUE );
+ if (flag & wxLC_NO_HEADER)
+ m_headerWin->Show( FALSE );
+ else
+ m_headerWin->Show( TRUE );
}
}
}
else
{
- if (HasFlag(wxLC_REPORT))
+ if (HasFlag(wxLC_REPORT) && !(HasFlag(wxLC_NO_HEADER)))
{
m_headerWin->Show( FALSE );
}
long wxListCtrl::InsertItem( wxListItem& info )
{
m_mainWin->InsertItem( info );
- return 0;
+ return info.m_itemId;
}
long wxListCtrl::InsertItem( long index, const wxString &label )
int w = 0;
int h = 0;
- if (HasFlag(wxLC_REPORT))
+ if (HasFlag(wxLC_REPORT) && !HasFlag(wxLC_NO_HEADER))
{
m_headerWin->GetPosition( &x, &y );
m_headerWin->GetSize( &w, &h );