void OnRenameTimer();
bool OnRenameAccept(size_t itemEdit, const wxString& value);
+ void OnRenameCancelled(size_t itemEdit);
void OnMouse( wxMouseEvent &event );
case WXK_ESCAPE:
Finish();
+ m_owner->OnRenameCancelled( m_itemEdited );
break;
default:
{
if ( !m_finished )
{
- (void)AcceptChanges();
-
+ // We must finish regardless of success, otherwise we'll get focus problems
Finish();
+
+ if ( !AcceptChanges() )
+ m_owner->OnRenameCancelled( m_itemEdited );
}
-
+
event.Skip();
}
le.IsAllowed();
}
+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.SetEventObject( GetParent() );
+ le.m_itemIndex = itemEdit;
+
+ wxListLineData *data = GetLine(itemEdit);
+ wxCHECK_RET( data, _T("invalid index in OnRenameCancelled()") );
+
+ data->GetItem( 0, le.m_item );
+
+ GetEventHandler()->ProcessEvent( le );
+}
+
void wxListMainWindow::OnMouse( wxMouseEvent &event )
{
event.SetEventObject( GetParent() );
BEGIN_EVENT_TABLE(wxGenericListCtrl,wxControl)
EVT_SIZE(wxGenericListCtrl::OnSize)
- EVT_IDLE(wxGenericListCtrl::OnIdle)
END_EVENT_TABLE()
wxGenericListCtrl::wxGenericListCtrl()
}
}
-void wxGenericListCtrl::OnIdle( wxIdleEvent & event )
+void wxGenericListCtrl::OnInternalIdle()
{
- event.Skip();
-
+ wxWindow::OnInternalIdle();
+
// do it only if needed
if ( !m_mainWin->m_dirty )
return;
m_mainWin->RefreshLines(itemFrom, itemTo);
}
+/*
+ * Generic wxListCtrl is more or less a container for two other
+ * windows which drawings are done upon. These are namely
+ * 'm_headerWin' and 'm_mainWin'.
+ * Here we override 'virtual wxWindow::Refresh()' to mimic the
+ * behaviour wxListCtrl has under wxMSW.
+ */
+void wxGenericListCtrl::Refresh(bool eraseBackground, const wxRect *rect)
+{
+ if (!rect)
+ {
+ // The easy case, no rectangle specified.
+ if (m_headerWin)
+ m_headerWin->Refresh(eraseBackground);
+
+ if (m_mainWin)
+ m_mainWin->Refresh(eraseBackground);
+ }
+ else
+ {
+ // Refresh the header window
+ if (m_headerWin)
+ {
+ wxRect rectHeader = m_headerWin->GetRect();
+ rectHeader.Intersect(*rect);
+ if (rectHeader.GetWidth() && rectHeader.GetHeight())
+ {
+ int x, y;
+ m_headerWin->GetPosition(&x, &y);
+ rectHeader.Offset(-x, -y);
+ m_headerWin->Refresh(eraseBackground, &rectHeader);
+ }
+
+ }
+
+ // Refresh the main window
+ if (m_mainWin)
+ {
+ wxRect rectMain = m_mainWin->GetRect();
+ rectMain.Intersect(*rect);
+ if (rectMain.GetWidth() && rectMain.GetHeight())
+ {
+ int x, y;
+ m_mainWin->GetPosition(&x, &y);
+ rectMain.Offset(-x, -y);
+ m_mainWin->Refresh(eraseBackground, &rectMain);
+ }
+ }
+ }
+}
+
void wxGenericListCtrl::Freeze()
{
m_mainWin->Freeze();