// // the height of the header window (FIXME: should depend on its font!)
// static const int HEADER_HEIGHT = 23;
-// the scrollbar units
static const int SCROLL_UNIT_X = 15;
-static const int SCROLL_UNIT_Y = 15;
// the spacing between the lines (in report mode)
static const int LINE_SPACING = 0;
else // has label
{
dc->GetTextExtent( s, &lw, &lh );
- if (lh < SCROLL_UNIT_Y)
- lh = SCROLL_UNIT_Y;
lw += EXTRA_WIDTH;
lh += EXTRA_HEIGHT;
s = item->GetTextForMeasuring();
dc->GetTextExtent( s, &lw, &lh );
- if (lh < SCROLL_UNIT_Y)
- lh = SCROLL_UNIT_Y;
lw += EXTRA_WIDTH;
lh += EXTRA_HEIGHT;
{
// We must finish regardless of success, otherwise we'll get focus problems
Finish();
-
+
if ( !AcceptChanges() )
m_owner->OnRenameCancelled( m_itemEdited );
}
-
+
event.Skip();
}
wxSize sz = size;
sz.y = 25;
- SetScrollbars( SCROLL_UNIT_X, SCROLL_UNIT_Y, 0, 0, 0, 0 );
+ SetScrollbars( 0, 0, 0, 0, 0, 0 );
SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX ) );
}
wxCoord wxListMainWindow::GetLineHeight() const
{
- wxASSERT_MSG( HasFlag(wxLC_REPORT), _T("only works in report mode") );
-
// we cache the line height as calling GetTextExtent() is slow
if ( !m_lineHeight )
{
wxCoord y;
dc.GetTextExtent(_T("H"), NULL, &y);
- if ( y < SCROLL_UNIT_Y )
- y = SCROLL_UNIT_Y;
-
if ( m_small_image_list && m_small_image_list->GetImageCount() )
{
int iw = 0;
{
wxPen pen(GetRuleColour(), 1, wxSOLID);
- int col = 0;
wxRect firstItemRect;
wxRect lastItemRect;
GetItemRect(visibleFrom, firstItemRect);
int x = firstItemRect.GetX();
dc.SetPen(pen);
dc.SetBrush(* wxTRANSPARENT_BRUSH);
- for (col = 0; col < GetColumnCount(); col++)
+ for (int col = 0; col < GetColumnCount(); col++)
{
int colWidth = GetColumnWidth(col);
x += colWidth;
le.IsAllowed();
}
-#ifdef __VMS__ // Ignore unreacheable code
-# pragma message disable initnotreach
-#endif
-
void wxListMainWindow::OnRenameCancelled(size_t itemEdit)
{
- // wxMSW seems not to notify the program about
- // cancelled label edits.
- return;
-
// let owner know that the edit was cancelled
wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() );
-
- // These only exist for wxTreeCtrl, which should probably be changed
- // le.m_editCancelled = TRUE;
- // le.m_label = wxEmptyString;
-
+
+ le.SetEditCanceled(TRUE);
+
le.SetEventObject( GetParent() );
le.m_itemIndex = itemEdit;
GetEventHandler()->ProcessEvent( le );
}
-#ifdef __VMS__
-# pragma message enable initnotreach
-#endif
void wxListMainWindow::OnMouse( wxMouseEvent &event )
{
int client_w, client_h;
GetClientSize( &client_w, &client_h );
+ const int hLine = GetLineHeight();
+
int view_x = SCROLL_UNIT_X*GetScrollPos( wxHORIZONTAL );
- int view_y = SCROLL_UNIT_Y*GetScrollPos( wxVERTICAL );
+ int view_y = hLine*GetScrollPos( wxVERTICAL );
if ( HasFlag(wxLC_REPORT) )
{
ResetVisibleLinesRange();
if (rect.y < view_y )
- Scroll( -1, rect.y/SCROLL_UNIT_Y );
+ Scroll( -1, rect.y/hLine );
if (rect.y+rect.height+5 > view_y+client_h)
- Scroll( -1, (rect.y+rect.height-client_h+SCROLL_UNIT_Y)/SCROLL_UNIT_Y );
+ Scroll( -1, (rect.y+rect.height-client_h+hLine)/hLine );
}
else // !report
{
case WXK_PRIOR:
{
- int steps = 0;
- if ( HasFlag(wxLC_REPORT) )
- {
- steps = m_linesPerPage - 1;
- }
- else
- {
- steps = m_current % m_linesPerPage;
- }
+ int steps = HasFlag(wxLC_REPORT) ? m_linesPerPage - 1 : m_current % m_linesPerPage;
int index = m_current - steps;
if (index < 0)
case WXK_NEXT:
{
- int steps = 0;
- if ( HasFlag(wxLC_REPORT) )
- {
- steps = m_linesPerPage - 1;
- }
- else
- {
- steps = m_linesPerPage - (m_current % m_linesPerPage) - 1;
- }
+ int steps = HasFlag(wxLC_REPORT)
+ ? m_linesPerPage - 1
+ : m_linesPerPage - (m_current % m_linesPerPage) - 1;
size_t index = m_current + steps;
size_t count = GetItemCount();
void wxListMainWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) )
{
+ if ( GetParent() )
+ {
+ wxFocusEvent event( wxEVT_SET_FOCUS, GetParent()->GetId() );
+ event.SetEventObject( GetParent() );
+ if ( GetParent()->GetEventHandler()->ProcessEvent( event) )
+ return;
+ }
+
// wxGTK sends us EVT_SET_FOCUS events even if we had never got
// EVT_KILL_FOCUS before which means that we finish by redrawing the items
// which are already drawn correctly resulting in horrible flicker - avoid
RefreshSelected();
}
-
- if ( !GetParent() )
- return;
-
- wxFocusEvent event( wxEVT_SET_FOCUS, GetParent()->GetId() );
- event.SetEventObject( GetParent() );
- GetParent()->GetEventHandler()->ProcessEvent( event );
}
void wxListMainWindow::OnKillFocus( wxFocusEvent &WXUNUSED(event) )
{
+ if ( GetParent() )
+ {
+ wxFocusEvent event( wxEVT_KILL_FOCUS, GetParent()->GetId() );
+ event.SetEventObject( GetParent() );
+ if ( GetParent()->GetEventHandler()->ProcessEvent( event) )
+ return;
+ }
m_hasFocus = FALSE;
-
RefreshSelected();
}
clientHeight;
GetSize( &clientWidth, &clientHeight );
+ const int lineHeight = GetLineHeight();
+
if ( HasFlag(wxLC_REPORT) )
{
// all lines have the same height and we scroll one line per step
- int lineHeight = GetLineHeight();
-
int entireHeight = count*lineHeight + LINE_SPACING;
m_linesPerPage = clientHeight / lineHeight;
SetScrollbars
(
SCROLL_UNIT_X,
- SCROLL_UNIT_Y,
+ lineHeight,
(x + SCROLL_UNIT_X) / SCROLL_UNIT_X,
- (y + SCROLL_UNIT_Y) / SCROLL_UNIT_Y,
+ (y + lineHeight) / lineHeight,
GetScrollPos( wxHORIZONTAL ),
GetScrollPos( wxVERTICAL ),
TRUE
// the window, we recalculate after subtracting the space taken by the
// scrollbar
- int entireWidth = 0,
- entireHeight = 0;
+ int entireWidth = 0;
for (int tries = 0; tries < 2; tries++)
{
entireWidth = 2*EXTRA_BORDER_X;
- entireHeight = 2*EXTRA_BORDER_Y;
if (tries == 1)
{
clientHeight -= wxSystemSettings::
GetMetric(wxSYS_HSCROLL_Y);
m_linesPerPage = 0;
- currentlyVisibleLines = 0;
break;
}
SetScrollbars
(
SCROLL_UNIT_X,
- SCROLL_UNIT_Y,
+ lineHeight,
(entireWidth + SCROLL_UNIT_X) / SCROLL_UNIT_X,
0,
GetScrollPos( wxHORIZONTAL ),
m_dirty = TRUE;
+ #if 0
+ // this is unused variable
int mode = 0;
+ #endif
if ( HasFlag(wxLC_REPORT) )
{
+ #if 0
+ // this is unused variable
mode = wxLC_REPORT;
+ #endif
ResetVisibleLinesRange();
}
else if ( HasFlag(wxLC_LIST) )
+ #if 0
+ // this is unused variable
mode = wxLC_LIST;
+ #else
+ {}
+ #endif
else if ( HasFlag(wxLC_ICON) )
+ #if 0
+ // this is unused variable
mode = wxLC_ICON;
+ #else
+ {}
+ #endif
else if ( HasFlag(wxLC_SMALL_ICON) )
+ #if 0
+ // this is unused variable
mode = wxLC_ICON; // no typo
+ #else
+ {}
+ #endif
else
{
wxFAIL_MSG( _T("unknown mode") );
m_dirty = TRUE;
+ // If an item is selected at or below the point of insertion, we need to
+ // increment the member variables because the current row's index has gone
+ // up by one
+ if ( HasCurrent() && m_current >= id )
+ {
+ m_current++;
+ }
+
SendNotify(id, wxEVT_COMMAND_LIST_INSERT_ITEM);
RefreshLines(id, GetItemCount() - 1);
void wxGenericListCtrl::CalculateAndSetHeaderHeight()
{
- // we use the letter "H" for calculating the needed space, basing on the current font
- int w, h;
- m_headerWin->GetTextExtent(wxT("H"), &w, &h);
- m_headerHeight = h + 2 * HEADER_OFFSET_Y + EXTRA_HEIGHT;
- m_headerWin->SetSize(m_headerWin->GetSize().x, m_headerHeight);
+ if ( m_headerWin )
+ {
+ // we use 'g' to get the descent, too
+ int w, h, d;
+ m_headerWin->GetTextExtent(wxT("Hg"), &w, &h, &d);
+ h += d + 2 * HEADER_OFFSET_Y + EXTRA_HEIGHT;
+
+ // only update if changed
+ if ( h != m_headerHeight )
+ {
+ m_headerHeight = h;
+
+ m_headerWin->SetSize(m_headerWin->GetSize().x, m_headerHeight);
+
+ if ( HasFlag(wxLC_REPORT) && !HasFlag(wxLC_NO_HEADER) )
+ ResizeReportView(TRUE);
+ }
+ }
}
void wxGenericListCtrl::CreateHeaderWindow()
void wxGenericListCtrl::OnInternalIdle()
{
wxWindow::OnInternalIdle();
-
+
// do it only if needed
if ( !m_mainWin->m_dirty )
return;
return -1;
}
-wxListItemAttr *wxGenericListCtrl::OnGetItemAttr(long item) const
+wxListItemAttr *
+wxGenericListCtrl::OnGetItemAttr(long WXUNUSED_UNLESS_DEBUG(item)) const
{
wxASSERT_MSG( item >= 0 && item < GetItemCount(),
_T("invalid item index in OnGetItemAttr()") );