]> git.saurik.com Git - wxWidgets.git/blobdiff - src/propgrid/propgrid.cpp
Added help button
[wxWidgets.git] / src / propgrid / propgrid.cpp
index fcad2acd940222c707b26d7e33b66dd933c2079f..18370b90df7aa76163f3c6f7fc1db799e731aa8b 100644 (file)
@@ -582,6 +582,20 @@ wxPropertyGrid::~wxPropertyGrid()
 {
     size_t i;
 
+#if wxUSE_THREADS
+    wxCriticalSectionLocker(wxPGGlobalVars->m_critSect);
+#endif
+
+    //
+    // Remove grid and property pointers from live wxPropertyGridEvents.
+    for ( i=0; i<m_liveEvents.size(); i++ )
+    {
+        wxPropertyGridEvent* evt = m_liveEvents[i];
+        evt->SetPropertyGrid(NULL);
+        evt->SetProperty(NULL);
+    }
+    m_liveEvents.clear();
+
     if ( m_processedEvent )
     {
         // All right... we are being deleted while wxPropertyGrid event
@@ -592,7 +606,7 @@ wxPropertyGrid::~wxPropertyGrid()
         m_processedEvent->StopPropagation();
 
         // Let's use wxMessageBox to make the message appear more
-        // reliably (and *before* the crash can happend).
+        // reliably (and *before* the crash can happen).
         ::wxMessageBox("wxPropertyGrid was being destroyed in an event "
                        "generated by it. This usually leads to a crash "
                        "so it is recommended to destroy the control "
@@ -3320,7 +3334,12 @@ void wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event )
 
     // Somehow, event is handled after property has been deselected.
     // Possibly, but very rare.
-    if ( !selected || selected->HasFlag(wxPG_PROP_BEING_DELETED) )
+    if ( !selected ||
+          selected->HasFlag(wxPG_PROP_BEING_DELETED) ||
+          // Also don't handle editor event if wxEVT_PG_CHANGED or
+          // similar is currently doing something (showing a
+          // message box, for instance).
+          m_processedEvent )
         return;
 
     if ( m_iFlags & wxPG_FL_IN_HANDLECUSTOMEDITOREVENT )
@@ -4399,25 +4418,26 @@ bool wxPropertyGrid::SendEvent( int eventType, wxPGProperty* p,
     evt.SetEventObject(m_eventObject);
     evt.SetProperty(p);
     evt.SetColumn(column);
-    if ( pValue )
+    if ( eventType == wxEVT_PG_CHANGING )
     {
+        wxASSERT( pValue );
         evt.SetCanVeto(true);
-        evt.SetupValidationInfo();
         m_validationInfo.m_pValue = pValue;
+        evt.SetupValidationInfo();
     }
-    else if ( !(selFlags & wxPG_SEL_NOVALIDATE) )
+    else
     {
-        evt.SetCanVeto(true);
+        if ( p )
+            evt.SetPropertyValue(p->GetValue());
+
+        if ( !(selFlags & wxPG_SEL_NOVALIDATE) )
+            evt.SetCanVeto(true);
     }
 
     m_processedEvent = &evt;
-
-    wxEvtHandler* evtHandler = m_eventObject->GetEventHandler();
-
+    m_eventObject->HandleWindowEvent(evt);
     m_processedEvent = NULL;
 
-    evtHandler->ProcessEvent(evt);
-
     return evt.WasVetoed();
 }
 
@@ -5232,14 +5252,25 @@ void wxPropertyGrid::AddActionTrigger( int action, int keycode, int modifiers )
 void wxPropertyGrid::ClearActionTriggers( int action )
 {
     wxPGHashMapI2I::iterator it;
+    bool didSomething;
 
-    for ( it = m_actionTriggers.begin(); it != m_actionTriggers.end(); ++it )
+    do
     {
-        if ( it->second == action )
+        didSomething = false;
+
+        for ( it = m_actionTriggers.begin();
+              it != m_actionTriggers.end();
+              it++ )
         {
-            m_actionTriggers.erase(it);
+            if ( it->second == action )
+            {
+                m_actionTriggers.erase(it);
+                didSomething = true;
+                break;
+            }
         }
     }
+    while ( didSomething );
 }
 
 void wxPropertyGrid::HandleKeyEvent( wxKeyEvent &event, bool fromChild )
@@ -5849,6 +5880,7 @@ wxPropertyGridEvent::wxPropertyGridEvent(const wxPropertyGridEvent& event)
     m_eventType = event.GetEventType();
     m_eventObject = event.m_eventObject;
     m_pg = event.m_pg;
+    OnPropertyGridSet();
     m_property = event.m_property;
     m_validationInfo = event.m_validationInfo;
     m_canVeto = event.m_canVeto;
@@ -5857,8 +5889,40 @@ wxPropertyGridEvent::wxPropertyGridEvent(const wxPropertyGridEvent& event)
 
 // -----------------------------------------------------------------------
 
+void wxPropertyGridEvent::OnPropertyGridSet()
+{
+    if ( !m_pg )
+        return;
+
+#if wxUSE_THREADS
+    wxCriticalSectionLocker(wxPGGlobalVars->m_critSect);
+#endif
+    m_pg->m_liveEvents.push_back(this);
+}
+
+// -----------------------------------------------------------------------
+
 wxPropertyGridEvent::~wxPropertyGridEvent()
 {
+    if ( m_pg )
+    {
+    #if wxUSE_THREADS
+        wxCriticalSectionLocker(wxPGGlobalVars->m_critSect);
+    #endif
+
+        // Use iterate from the back since it is more likely that the event
+        // being desroyed is at the end of the array.
+        wxVector<wxPropertyGridEvent*>& liveEvents = m_pg->m_liveEvents;
+
+        for ( int i = liveEvents.size()-1; i >= 0; i-- )
+        {
+            if ( liveEvents[i] == this )
+            {
+                liveEvents.erase(liveEvents.begin() + i);
+                break;
+            }
+        }
+    }
 }
 
 // -----------------------------------------------------------------------