#include "wx/listctrl.h"
#include "wx/generic/imaglist.h"
+#ifndef wxUSE_GENERIC_LIST_EXTENSIONS
+#define wxUSE_GENERIC_LIST_EXTENSIONS 0
+#endif
+
//-----------------------------------------------------------------------------
// wxListItemData
//-----------------------------------------------------------------------------
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;
- }
+ 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 lh;
- dc->GetTextExtent( s, (long*) NULL, &lh );
+ long lw,lh;
+ dc->GetTextExtent( s, &lw, &lh );
item->SetSize( item->GetWidth(), lh );
+ m_bound_all.width += lw;
m_bound_all.height = lh;
node = node->Next();
}
{
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;
+ 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;
- }
- }
+ m_bound_label.x += 4 + w;
+ m_bound_label.width -= 4 + w;
+ }
+ }
break;
}
case wxLC_REPORT:
wxListItemData *item = (wxListItemData*)node->Data();
wxString s;
item->GetText( s );
- if (s.IsEmpty()) s = wxT("H");
+ 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_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;
+ 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.x += 4 + w;
+ }
+ }
break;
}
}
{
wxPaintDC dc( this );
PrepareDC( dc );
+#if wxUSE_GENERIC_LIST_EXTENSIONS
+ if ( m_owner->GetMode() & wxLC_REPORT )
+ {
+ int x , y ;
+ int xpix , ypix ;
+ m_owner->GetScrollPixelsPerUnit( &xpix , &ypix ) ;
+ m_owner->ViewStart( &x, &y ) ;
+ dc.SetDeviceOrigin( -x * xpix, 0 );
+ }
+#endif
dc.BeginDrawing();
dc.SetFont( GetFont() );
{
m_owner->GetColumn( i, item );
int cw = item.m_width-2;
+#if wxUSE_GENERIC_LIST_EXTENSIONS
+ if ((i+1 == numColumns) || ( dc.LogicalToDeviceX(x+item.m_width) > w-5))
+ cw = dc.DeviceToLogicalX(w)-x-1;
+#else
if ((i+1 == numColumns) || (x+item.m_width > w-5)) cw = w-x-1;
+#endif
dc.SetPen( *wxWHITE_PEN );
DoDrawRect( &dc, x, y, cw, h-2 );
dc.DrawText( item.m_text, x+4, y+3 );
dc.DestroyClippingRegion();
x += item.m_width;
+#if wxUSE_GENERIC_LIST_EXTENSIONS
+ if (dc.LogicalToDeviceX(x) > w+5) break;
+#else
if (x > w+5) break;
+#endif
}
dc.EndDrawing();
}
hit_border = TRUE;
break;
}
- if (x-xpos < 0)
- {
- break;
- }
+ if (x-xpos < 0)
+ {
+ break;
+ }
m_minX = xpos;
}
if (event.LeftDown())
{
if (hit_border)
- {
+ {
m_isDragging = TRUE;
m_currentX = x;
DrawCurrent();
CaptureMouse();
return;
- }
- else
- {
+ }
+ else
+ {
wxListEvent le( wxEVT_COMMAND_LIST_COL_CLICK, GetParent()->GetId() );
le.SetEventObject( GetParent() );
- le.m_col = m_column;
+ le.m_col = m_column;
GetParent()->GetEventHandler()->ProcessEvent( le );
- return;
- }
+ return;
+ }
}
if (event.Moving())
bool *accept, wxString *res, wxListMainWindow *owner,
const wxString &value, const wxPoint &pos, const wxSize &size,
#if wxUSE_VALIDATORS
-# if defined(__VISAGECPP__)
- int style, const wxValidator* validator, const wxString &name ) :
-# else
int style, const wxValidator& validator, const wxString &name ) :
-# endif
#endif
wxTextCtrl( parent, id, value, pos, size, style, validator, name )
{
{
(*m_accept) = TRUE;
(*m_res) = GetValue();
- m_owner->SetFocus();
+ m_owner->SetFocus();
return;
}
if (event.m_keyCode == WXK_ESCAPE)
{
(*m_accept) = FALSE;
(*m_res) = "";
- m_owner->SetFocus();
+ m_owner->SetFocus();
return;
}
event.Skip();
EVT_KEY_DOWN (wxListMainWindow::OnKeyDown)
EVT_SET_FOCUS (wxListMainWindow::OnSetFocus)
EVT_KILL_FOCUS (wxListMainWindow::OnKillFocus)
+ EVT_SCROLLWIN (wxListMainWindow::OnScroll)
END_EVENT_TABLE()
wxListMainWindow::wxListMainWindow()
if (m_mode & wxLC_REPORT)
{
+#if wxUSE_GENERIC_LIST_EXTENSIONS
+ m_xScroll = 15;
+#else
m_xScroll = 0;
+#endif
m_yScroll = 15;
}
else
int dummy = 0;
line->GetSize( dummy, lineSpacing );
lineSpacing += 1;
-
+
int y_s = m_yScroll*GetScrollPos( wxVERTICAL );
-
+
wxNode *node = m_lines.Nth( y_s / lineSpacing );
- for (int i = 0; i < m_visibleLines+2; i++)
- {
- if (!node) break;
-
+ for (int i = 0; i < m_visibleLines+2; i++)
+ {
+ if (!node) break;
+
line = (wxListLineData*)node->Data();
line->Draw( &dc );
node = node->Next();
- }
+ }
}
else
{
le.SetEventObject( GetParent() );
le.m_itemIndex = GetIndexOfLine( line );
line->GetItem( 0, le.m_item );
- GetParent()->GetEventHandler()->ProcessEvent( le );
+// GetParent()->GetEventHandler()->ProcessEvent( le );
+ GetParent()->GetEventHandler()->AddPendingEvent( le );
}
void wxListMainWindow::FocusLine( wxListLineData *WXUNUSED(line) )
if (event.Dragging())
{
if (m_dragCount == 0)
- m_dragStart = wxPoint(x,y);
-
+ m_dragStart = wxPoint(x,y);
+
m_dragCount++;
-
- if (m_dragCount != 3) return;
-
- int command = wxEVT_COMMAND_LIST_BEGIN_DRAG;
- if (event.RightIsDown()) command = wxEVT_COMMAND_LIST_BEGIN_RDRAG;
-
+
+ if (m_dragCount != 3) return;
+
+ int command = wxEVT_COMMAND_LIST_BEGIN_DRAG;
+ if (event.RightIsDown()) command = wxEVT_COMMAND_LIST_BEGIN_RDRAG;
+
wxListEvent le( command, GetParent()->GetId() );
le.SetEventObject( GetParent() );
- le.m_pointDrag = m_dragStart;
- GetParent()->GetEventHandler()->ProcessEvent( le );
-
- return;
+ le.m_pointDrag = m_dragStart;
+ GetParent()->GetEventHandler()->ProcessEvent( le );
+
+ return;
}
else
{
else if (event.ControlDown())
{
m_current = line;
-
+
int numOfCurrent = -1;
node = m_lines.First();
while (node)
if (test_line == oldCurrent) break;
node = node->Next();
}
-
+
int numOfLine = -1;
node = m_lines.First();
while (node)
if (numOfLine < numOfCurrent)
{
- int i = numOfLine;
- numOfLine = numOfCurrent;
- numOfCurrent = i;
- }
-
+ int i = numOfLine;
+ numOfLine = numOfCurrent;
+ numOfCurrent = i;
+ }
+
wxNode *node = m_lines.Nth( numOfCurrent );
for (int i = 0; i <= numOfLine-numOfCurrent; i++)
{
{
int steps = 0;
if (m_mode & wxLC_REPORT)
- {
- steps = m_visibleLines-1;
- }
+ {
+ steps = m_visibleLines-1;
+ }
else
{
int pos = 0;
{
int steps = 0;
if (m_mode & wxLC_REPORT)
- {
- steps = m_visibleLines-1;
- }
+ {
+ steps = m_visibleLines-1;
+ }
else
{
int pos = 0; wxNode *node = m_lines.First();
if (n)
{
wxListItemData *item = (wxListItemData*)n->Data();
- int current = 0, ix = 0, iy = 0;
- long lx = 0, ly = 0;
- if (item->HasImage())
- {
+ 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;
+ 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;
+ width = max+10;
}
node = m_columns.Nth( col );
if (oldCurrent) RefreshLine( oldCurrent );
}
bool on = state & wxLIST_STATE_SELECTED;
- if (on != line->IsHilighted())
- {
+ if (on != line->IsHilighted())
+ {
line->Hilight( on );
RefreshLine( line );
- }
+ }
}
}
}
if (m_mode & wxLC_REPORT)
{
+#if wxUSE_GENERIC_LIST_EXTENSIONS
+ m_xScroll = 15;
+#else
m_xScroll = 0;
+#endif
m_yScroll = 15;
}
else
int y = 1;
int entireHeight = m_lines.Number() * lineSpacing + 2;
int scroll_pos = GetScrollPos( wxVERTICAL );
+#if wxUSE_GENERIC_LIST_EXTENSIONS
+ int x_scroll_pos = GetScrollPos( wxHORIZONTAL );
+#else
SetScrollbars( m_xScroll, m_yScroll, 0, (entireHeight+15) / m_yScroll, 0, scroll_pos, TRUE );
+#endif
GetClientSize( &clientWidth, &clientHeight );
wxNode* node = m_lines.First();
+ int entireWidth = 0 ;
while (node)
{
wxListLineData *line = (wxListLineData*)node->Data();
line->SetColumnPosition( i, col_x );
col_x += GetColumnWidth( i );
}
+ entireWidth = wxMax( entireWidth , col_x ) ;
+#if wxUSE_GENERIC_LIST_EXTENSIONS
+ line->SetPosition( &dc, x, y, col_x );
+#endif
y += lineSpacing; // one pixel blank line between items
node = node->Next();
}
- m_visibleLines = clientHeight / lineSpacing;
+ m_visibleLines = clientHeight / lineSpacing;
+#if wxUSE_GENERIC_LIST_EXTENSIONS
+ SetScrollbars( m_xScroll, m_yScroll, entireWidth / m_xScroll , (entireHeight+15) / m_yScroll, x_scroll_pos , scroll_pos, TRUE );
+#endif
}
else
{
// approximated 15 pt for the horizontal scrollbar
GetSize( &clientWidth, &clientHeight );
- clientHeight -= 4; // sunken frame
+ clientHeight -= 4; // sunken frame
int entireWidth = 0;
int y = 5; // painting is done at y-2
int maxWidth = 0;
m_visibleLines = 0;
- int m_currentVisibleLines = 0;
+ int m_currentVisibleLines = 0;
wxNode *node = m_lines.First();
while (node)
{
- m_currentVisibleLines++;
+ m_currentVisibleLines++;
wxListLineData *line = (wxListLineData*)node->Data();
line->CalculateSize( &dc, iconSpacing );
line->SetPosition( &dc, x, y, clientWidth );
line->GetSize( lineWidth, lineHeight );
if (lineWidth > maxWidth) maxWidth = lineWidth;
y += lineSpacing;
+ if (m_currentVisibleLines > m_visibleLines)
+ m_visibleLines = m_currentVisibleLines;
if (y+lineSpacing-6 >= clientHeight) // -6 for earlier "line breaking"
{
- if (m_currentVisibleLines > m_visibleLines)
- m_visibleLines = m_currentVisibleLines;
- m_currentVisibleLines = 0;
+ m_currentVisibleLines = 0;
y = 5;
x += maxWidth+6;
entireWidth += maxWidth+6;
{
clientHeight -= 15; // scrollbar height
m_visibleLines = 0;
- m_currentVisibleLines = 0;
+ m_currentVisibleLines = 0;
break;
}
if (!node) tries = 1; // everything fits, no second try required
}
}
-// 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 );
}
{
m_dirty = TRUE;
m_current = (wxListLineData *) NULL;
+
+ // to make the deletion of all items faster, we don't send the
+ // notifications in this case: this is compatible with wxMSW and
+ // documented in DeleteAllItems() description
+#if 0
wxNode *node = m_lines.First();
while (node)
{
wxListLineData *line = (wxListLineData*)node->Data();
+
DeleteLine( line );
+
node = node->Next();
}
+#endif // 0
+
m_lines.Clear();
}
m_lines.Sort( list_ctrl_compare_func_1 );
}
+void wxListMainWindow::OnScroll(wxScrollWinEvent& event)
+{
+ wxScrolledWindow::OnScroll( event ) ;
+#if wxUSE_GENERIC_LIST_EXTENSIONS
+
+ if (event.GetOrientation() == wxHORIZONTAL && ( m_mode & wxLC_REPORT ))
+ {
+ wxListCtrl* lc = wxDynamicCast( GetParent() , wxListCtrl ) ;
+ if ( lc )
+ {
+ lc->m_headerWin->Refresh() ;
+#ifdef __WXMAC__
+ lc->m_headerWin->MacUpdateImmediately() ;
+#endif
+ }
+ }
+#endif
+}
+
// -------------------------------------------------------------------------------------
// wxListItem
// -------------------------------------------------------------------------------------
m_pointDrag.y = 0;
}
+void wxListEvent::CopyObject(wxObject& object_dest) const
+{
+ wxListEvent *obj = (wxListEvent *)&object_dest;
+
+ wxNotifyEvent::CopyObject(object_dest);
+
+ obj->m_code = m_code;
+ obj->m_itemIndex = m_itemIndex;
+ obj->m_oldItemIndex = m_oldItemIndex;
+ obj->m_col = m_col;
+ obj->m_cancelled = m_cancelled;
+ obj->m_pointDrag = m_pointDrag;
+ obj->m_item.m_mask = m_item.m_mask;
+ obj->m_item.m_itemId = m_item.m_itemId;
+ obj->m_item.m_col = m_item.m_col;
+ obj->m_item.m_state = m_item.m_state;
+ obj->m_item.m_stateMask = m_item.m_stateMask;
+ obj->m_item.m_text = m_item.m_text;
+ obj->m_item.m_image = m_item.m_image;
+ obj->m_item.m_data = m_item.m_data;
+ obj->m_item.m_format = m_item.m_format;
+ obj->m_item.m_width = m_item.m_width;
+ obj->m_item.m_colour = m_item.m_colour;
+}
+
// -------------------------------------------------------------------------------------
// wxListCtrl
// -------------------------------------------------------------------------------------
bool wxListCtrl::Create( wxWindow *parent, wxWindowID id,
const wxPoint &pos, const wxSize &size,
#if wxUSE_VALIDATORS
-# if defined(__VISAGECPP__)
- long style, const wxValidator *validator,
-# else
long style, const wxValidator &validator,
-# endif
#endif
const wxString &name )
{
long s = style;
- if ((s & wxLC_REPORT == 0) &&
+#ifdef __VMS__
+#pragma message disable codcauunr
+ // VMS reports on this part the warning:
+ // statement either is unreachable or causes unreachable code
+#endif
+ if ((s & wxLC_REPORT == 0) &&
(s & wxLC_LIST == 0) &&
(s & wxLC_ICON == 0))
{
s = s | wxLC_LIST;
}
+#ifdef __VMS__
+#pragma message enable codcauunr
+#endif
bool ret = wxControl::Create( parent, id, pos, size, s, name );
if (!m_headerWin)
{
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 );
+ wxPoint(0,0), wxSize(width,23), wxTAB_TRAVERSAL );
+ if (HasFlag(wxLC_NO_HEADER))
+ m_headerWin->Show( FALSE );
}
else
{
- if (flag & wxLC_NO_HEADER)
- m_headerWin->Show( FALSE );
- else
+ if (flag & wxLC_NO_HEADER)
+ m_headerWin->Show( FALSE );
+ else
m_headerWin->Show( TRUE );
}
}
{
m_headerWin->Show( FALSE );
}
- }
+ }
}
wxWindow::SetWindowStyleFlag( flag );
{
for ( size_t n = 0; n < m_mainWin->m_columns.GetCount(); n++ )
DeleteColumn(n);
-
+
return TRUE;
}