// Purpose: generic implementation of wxListCtrl
// Author: Robert Roebling
// Vadim Zeitlin (virtual list control support)
-// Id: $Id$
// Copyright: (c) 1998 Robert Roebling
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
m_resizeCursor = NULL;
}
-wxListHeaderWindow::wxListHeaderWindow( wxWindow *win,
- wxWindowID id,
- wxListMainWindow *owner,
- const wxPoint& pos,
- const wxSize& size,
- long style,
- const wxString &name )
- : wxWindow( win, id, pos, size, style, name )
+bool wxListHeaderWindow::Create( wxWindow *win,
+ wxWindowID id,
+ wxListMainWindow *owner,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString &name )
{
+ if ( !wxWindow::Create(win, id, pos, size, style, name) )
+ return false;
+
Init();
m_owner = owner;
if (!m_hasFont)
SetOwnFont( wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT ));
#endif
+
+ return true;
}
wxListHeaderWindow::~wxListHeaderWindow()
if (m_isDragging)
{
- SendListEvent(wxEVT_COMMAND_LIST_COL_DRAGGING, event.GetPosition());
+ SendListEvent(wxEVT_LIST_COL_DRAGGING, event.GetPosition());
// we don't draw the line beyond our window, but we allow dragging it
// there
m_isDragging = false;
m_dirty = true;
m_owner->SetColumnWidth( m_column, m_currentX - m_minX );
- SendListEvent(wxEVT_COMMAND_LIST_COL_END_DRAG, event.GetPosition());
+ SendListEvent(wxEVT_LIST_COL_END_DRAG, event.GetPosition());
}
else
{
{
if (hit_border && event.LeftDown())
{
- if ( SendListEvent(wxEVT_COMMAND_LIST_COL_BEGIN_DRAG,
+ if ( SendListEvent(wxEVT_LIST_COL_BEGIN_DRAG,
event.GetPosition()) )
{
m_isDragging = true;
}
SendListEvent( event.LeftDown()
- ? wxEVT_COMMAND_LIST_COL_CLICK
- : wxEVT_COMMAND_LIST_COL_RIGHT_CLICK,
+ ? wxEVT_LIST_COL_CLICK
+ : wxEVT_LIST_COL_RIGHT_CLICK,
event.GetPosition());
}
}
if ( changed )
{
- SendNotify( line, highlight ? wxEVT_COMMAND_LIST_ITEM_SELECTED
- : wxEVT_COMMAND_LIST_ITEM_DESELECTED );
+ SendNotify( line, highlight ? wxEVT_LIST_ITEM_SELECTED
+ : wxEVT_LIST_ITEM_DESELECTED );
}
return changed;
// tell the caller cache to cache the data
if ( IsVirtual() )
{
- wxListEvent evCache(wxEVT_COMMAND_LIST_CACHE_HINT,
+ wxListEvent evCache(wxEVT_LIST_CACHE_HINT,
GetParent()->GetId());
evCache.SetEventObject( GetParent() );
evCache.m_oldItemIndex = visibleFrom;
{
GetLine(line)->GetItem( 0, le.m_item );
}
- //else: this happens for wxEVT_COMMAND_LIST_ITEM_FOCUSED event
+ //else: this happens for wxEVT_LIST_ITEM_FOCUSED event
}
//else: there may be no more such item
if ( m_renameTimer->IsRunning() )
m_renameTimer->Stop();
- SendNotify(current, wxEVT_COMMAND_LIST_ITEM_FOCUSED);
+ SendNotify(current, wxEVT_LIST_ITEM_FOCUSED);
}
wxTextCtrl *wxListMainWindow::EditLabel(long item, wxClassInfo* textControlClass)
size_t itemEdit = (size_t)item;
- wxListEvent le( wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT, GetParent()->GetId() );
+ wxListEvent le( wxEVT_LIST_BEGIN_LABEL_EDIT, GetParent()->GetId() );
le.SetEventObject( GetParent() );
le.m_item.m_itemId =
le.m_itemIndex = item;
bool wxListMainWindow::OnRenameAccept(size_t itemEdit, const wxString& value)
{
- wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() );
+ wxListEvent le( wxEVT_LIST_END_LABEL_EDIT, GetParent()->GetId() );
le.SetEventObject( GetParent() );
le.m_item.m_itemId =
le.m_itemIndex = itemEdit;
void wxListMainWindow::OnRenameCancelled(size_t itemEdit)
{
// let owner know that the edit was cancelled
- wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() );
+ wxListEvent le( wxEVT_LIST_END_LABEL_EDIT, GetParent()->GetId() );
le.SetEditCanceled(true);
{
if (event.RightDown())
{
- SendNotify( (size_t)-1, wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, event.GetPosition() );
+ SendNotify( (size_t)-1, wxEVT_LIST_ITEM_RIGHT_CLICK, event.GetPosition() );
wxContextMenuEvent evtCtx(wxEVT_CONTEXT_MENU,
GetParent()->GetId(),
m_dragCount = 0;
// The only mouse event that can be generated without any valid item is
- // wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK as it can be useful to have a global
+ // wxEVT_LIST_ITEM_RIGHT_CLICK as it can be useful to have a global
// popup menu for the list control itself which should be shown even when
// the user clicks outside of any item.
if ( !hitResult )
// outside of any item
if (event.RightDown())
{
- SendNotify( (size_t) -1, wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, event.GetPosition() );
+ SendNotify( (size_t) -1, wxEVT_LIST_ITEM_RIGHT_CLICK, event.GetPosition() );
wxContextMenuEvent evtCtx(
wxEVT_CONTEXT_MENU,
if (m_dragCount != 3)
return;
- int command = event.RightIsDown() ? wxEVT_COMMAND_LIST_BEGIN_RDRAG
- : wxEVT_COMMAND_LIST_BEGIN_DRAG;
+ int command = event.RightIsDown() ? wxEVT_LIST_BEGIN_RDRAG
+ : wxEVT_LIST_BEGIN_DRAG;
SendNotify( m_lineLastClicked, command, m_dragStart );
if ( current == m_lineLastClicked )
{
- SendNotify( current, wxEVT_COMMAND_LIST_ITEM_ACTIVATED );
+ SendNotify( current, wxEVT_LIST_ITEM_ACTIVATED );
return;
}
ReverseHighlight(m_current);
}
- SendNotify( current, wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, event.GetPosition() );
+ SendNotify( current, wxEVT_LIST_ITEM_RIGHT_CLICK, event.GetPosition() );
// Allow generation of context menu event
event.Skip();
}
else if (event.MiddleDown())
{
- SendNotify( current, wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK );
+ SendNotify( current, wxEVT_LIST_ITEM_MIDDLE_CLICK );
}
else if ( event.LeftDown() || forceClick )
{
return;
// send a list event
- wxListEvent le( wxEVT_COMMAND_LIST_KEY_DOWN, parent->GetId() );
+ wxListEvent le( wxEVT_LIST_KEY_DOWN, parent->GetId() );
le.m_item.m_itemId =
le.m_itemIndex = m_current;
if (HasCurrent())
}
else // normal space press
{
- SendNotify( m_current, wxEVT_COMMAND_LIST_ITEM_ACTIVATED );
+ SendNotify( m_current, wxEVT_LIST_ITEM_ACTIVATED );
}
}
else // multiple selection
case WXK_RETURN:
case WXK_EXECUTE:
- SendNotify( m_current, wxEVT_COMMAND_LIST_ITEM_ACTIVATED );
+ SendNotify( m_current, wxEVT_LIST_ITEM_ACTIVATED );
break;
default:
ResetVisibleLinesRange();
}
- SendNotify( index, wxEVT_COMMAND_LIST_DELETE_ITEM, wxDefaultPosition );
+ SendNotify( index, wxEVT_LIST_DELETE_ITEM, wxDefaultPosition );
if ( IsVirtual() )
{
// for all of them: this is compatible with wxMSW and documented in
// DeleteAllItems() description
- wxListEvent event( wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS, GetParent()->GetId() );
+ wxListEvent event( wxEVT_LIST_DELETE_ALL_ITEMS, GetParent()->GetId() );
event.SetEventObject( GetParent() );
GetParent()->GetEventHandler()->ProcessEvent( event );
if ( HasCurrent() && m_current >= id )
m_current++;
- SendNotify(id, wxEVT_COMMAND_LIST_INSERT_ITEM);
+ SendNotify(id, wxEVT_LIST_INSERT_ITEM);
RefreshLines(id, GetItemCount() - 1);
}
if (needs_header)
{
- m_headerWin = new wxListHeaderWindow
+ // Notice that we must initialize m_headerWin first, and create the
+ // real window only later, so that the test in the beginning of the
+ // function blocks repeated creation of the header as it could happen
+ // before via wxNavigationEnabled::AddChild() -> ToggleWindowStyle() ->
+ // SetWindowStyleFlag().
+ m_headerWin = new wxListHeaderWindow();
+ m_headerWin->Create
(
this, wxID_ANY, m_mainWin,
wxPoint(0,0),
),
wxTAB_TRAVERSAL
);
-
+
#if defined( __WXMAC__ )
static wxFont font( wxOSX_SYSTEM_FONT_SMALL );
m_headerWin->SetFont( font );
// the window the next time
m_mainWin->ResetVisibleLinesRange();
- HandleOnScroll( event );
-
if ( event.GetOrientation() == wxHORIZONTAL && HasHeader() )
{
m_headerWin->Refresh();
m_headerWin->Update();
}
+
+ // Let the window be scrolled as usual by the default handler.
+ event.Skip();
}
void wxGenericListCtrl::SetSingleStyle( long style, bool add )
#endif
}
-void wxGenericListCtrl::DoClientToScreen( int *x, int *y ) const
-{
- // It's not clear whether this can be called before m_mainWin is created
- // but it seems better to be on the safe side and check.
- if ( m_mainWin )
- m_mainWin->DoClientToScreen(x, y);
- else
- wxListCtrlBase::DoClientToScreen(x, y);
-}
-
-void wxGenericListCtrl::DoScreenToClient( int *x, int *y ) const
-{
- // At least in wxGTK/Univ build this method can be called before m_mainWin
- // is created so avoid crashes in this case.
- if ( m_mainWin )
- m_mainWin->DoScreenToClient(x, y);
- else
- wxListCtrlBase::DoScreenToClient(x, y);
-}
-
wxSize wxGenericListCtrl::DoGetBestClientSize() const
{
// The base class version can compute the best size in report view only.
return -1;
}
-wxListItemAttr *
-wxGenericListCtrl::OnGetItemAttr(long WXUNUSED_UNLESS_DEBUG(item)) const
-{
- wxASSERT_MSG( item >= 0 && item < GetItemCount(),
- wxT("invalid item index in OnGetItemAttr()") );
-
- // no attributes by default
- return NULL;
-}
-
void wxGenericListCtrl::SetItemCount(long count)
{
wxASSERT_MSG( IsVirtual(), wxT("this is for virtual controls only") );