/////////////////////////////////////////////////////////////////////////////
-// Name: event.cpp
+// Name: src/common/event.cpp
// Purpose: Event classes
// Author: Julian Smart
// Modified by:
// headers
// ----------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) && !defined(__EMX__)
-// Some older compilers (such as EMX) cannot handle
-// #pragma interface/implementation correctly, iff
-// #pragma implementation is used in _two_ translation
-// units (as created by e.g. event.cpp compiled for
-// libwx_base and event.cpp compiled for libwx_gui_core).
-// So we must not use those pragmas for those compilers in
-// such files.
- #pragma implementation "event.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#endif
#ifndef WX_PRECOMP
- #include "wx/defs.h"
#include "wx/app.h"
#include "wx/list.h"
#include "wx/control.h"
#include "wx/utils.h"
#include "wx/dc.h"
+ #include "wx/textctrl.h"
#endif // wxUSE_GUI
#endif
DEFINE_EVENT_TYPE(wxEVT_SCROLL_PAGEDOWN)
DEFINE_EVENT_TYPE(wxEVT_SCROLL_THUMBTRACK)
DEFINE_EVENT_TYPE(wxEVT_SCROLL_THUMBRELEASE)
-DEFINE_EVENT_TYPE(wxEVT_SCROLL_ENDSCROLL)
+DEFINE_EVENT_TYPE(wxEVT_SCROLL_CHANGED)
// Scroll events from wxWindow
DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_TOP)
DEFINE_EVENT_TYPE(wxEVT_CLOSE_WINDOW)
DEFINE_EVENT_TYPE(wxEVT_END_SESSION)
DEFINE_EVENT_TYPE(wxEVT_QUERY_END_SESSION)
+DEFINE_EVENT_TYPE(wxEVT_HIBERNATE)
DEFINE_EVENT_TYPE(wxEVT_ACTIVATE_APP)
DEFINE_EVENT_TYPE(wxEVT_POWER)
DEFINE_EVENT_TYPE(wxEVT_ACTIVATE)
*
*/
+#ifdef __VISUALC__
+ // 'this' : used in base member initializer list (for m_commandString)
+ #pragma warning(disable:4355)
+#endif
+
wxCommandEvent::wxCommandEvent(wxEventType commandType, int theId)
: wxEvent(theId, commandType)
+#if WXWIN_COMPATIBILITY_2_4
+ , m_commandString(this)
+#endif
{
m_clientData = (char *) NULL;
m_clientObject = (wxClientData *) NULL;
m_propagationLevel = wxEVENT_PROPAGATE_MAX;
}
+#ifdef __VISUALC__
+ #pragma warning(default:4355)
+#endif
+
+wxString wxCommandEvent::GetString() const
+{
+ if(m_eventType != wxEVT_COMMAND_TEXT_UPDATED || !m_eventObject)
+ return m_cmdString;
+ else
+ {
+#if wxUSE_TEXTCTRL
+ wxTextCtrl *txt = wxDynamicCast(m_eventObject, wxTextCtrl);
+ if(txt)
+ return txt->GetValue();
+ else
+#endif // wxUSE_TEXTCTRL
+ return m_cmdString;
+ }
+}
+
/*
* UI update events
*/
delete m_dynamicEvents;
};
+ if (m_pendingEvents)
+ m_pendingEvents->DeleteContents(true);
delete m_pendingEvents;
#if wxUSE_THREADS
// Remove us from wxPendingEvents if necessary.
if(wxPendingEventsLocker)
wxENTER_CRIT_SECT(*wxPendingEventsLocker);
- if ( wxPendingEvents ) {
- wxPendingEvents->DeleteObject(this);
+ if ( wxPendingEvents )
+ {
+ // Delete all occurences of this from the list of pending events
+ while (wxPendingEvents->DeleteObject(this)) { } // Do nothing
}
if(wxPendingEventsLocker)
wxLEAVE_CRIT_SECT(*wxPendingEventsLocker);
delete m_eventsLocker;
m_eventsLocker = NULL;
#endif
-};
+}
#endif // wxUSE_THREADS
wxCHECK_RET( eventCopy,
_T("events of this type aren't supposed to be posted") );
-#if defined(__VISAGECPP__)
- wxENTER_CRIT_SECT( m_eventsLocker);
-#else
- wxENTER_CRIT_SECT( *m_eventsLocker);
-#endif
+ wxENTER_CRIT_SECT( Lock() );
if ( !m_pendingEvents )
m_pendingEvents = new wxList;
m_pendingEvents->Append(eventCopy);
-#if defined(__VISAGECPP__)
- wxLEAVE_CRIT_SECT( m_eventsLocker);
-#else
- wxLEAVE_CRIT_SECT( *m_eventsLocker);
-#endif
+ wxLEAVE_CRIT_SECT( Lock() );
// 2) Add this event handler to list of event handlers that
// have pending events.
wxLEAVE_CRIT_SECT(*wxPendingEventsLocker);
- // 3) Inform the system that new pending events are somwehere,
+ // 3) Inform the system that new pending events are somewhere,
// and that these should be processed in idle time.
wxWakeUpIdle();
}
wxCHECK_RET( m_pendingEvents,
wxT("Please call wxApp::ProcessPendingEvents() instead") );
-#if defined(__VISAGECPP__)
- wxENTER_CRIT_SECT( m_eventsLocker);
-#else
- wxENTER_CRIT_SECT( *m_eventsLocker);
-#endif
+ wxENTER_CRIT_SECT( Lock() );
- wxList::compatibility_iterator node = m_pendingEvents->GetFirst();
- while ( node )
+ // we leave the loop once we have processed all events that were present at
+ // the start of ProcessPendingEvents because otherwise we could get into
+ // infinite loop if the pending event handler execution resulted in another
+ // event being posted
+ size_t n = m_pendingEvents->size();
+ for ( wxList::compatibility_iterator node = m_pendingEvents->GetFirst();
+ node;
+ node = m_pendingEvents->GetFirst() )
{
wxEvent *event = (wxEvent *)node->GetData();
+
+ // It's importan we remove event from list before processing it.
+ // Else a nested event loop, for example from a modal dialog, might
+ // process the same event again.
m_pendingEvents->Erase(node);
- // In ProcessEvent, new events might get added and
- // we can safely leave the crtical section here.
-#if defined(__VISAGECPP__)
- wxLEAVE_CRIT_SECT( m_eventsLocker);
-#else
- wxLEAVE_CRIT_SECT( *m_eventsLocker);
-#endif
+ wxLEAVE_CRIT_SECT( Lock() );
+
ProcessEvent(*event);
delete event;
-#if defined(__VISAGECPP__)
- wxENTER_CRIT_SECT( m_eventsLocker);
-#else
- wxENTER_CRIT_SECT( *m_eventsLocker);
-#endif
- node = m_pendingEvents->GetFirst();
+ wxENTER_CRIT_SECT( Lock() );
+
+ if ( --n == 0 )
+ break;
}
-#if defined(__VISAGECPP__)
- wxLEAVE_CRIT_SECT( m_eventsLocker);
-#else
- wxLEAVE_CRIT_SECT( *m_eventsLocker);
-#endif
+ wxLEAVE_CRIT_SECT( Lock() );
}
/*
wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->GetData();
#endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES
- if ((event.m_eventType == entry->m_eventType) && (entry->m_fn != 0))
+ if ((event.GetEventType() == entry->m_eventType) && (entry->m_fn != 0))
{
wxEvtHandler *handler =
#if !WXWIN_COMPATIBILITY_EVENT_TYPES
}
return false;
-};
+}
void wxEvtHandler::DoSetClientObject( wxClientData *data )
{