]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/scrlwing.cpp
Added wxFile::write_excl and use it from wxTempFile to securely open the
[wxWidgets.git] / src / generic / scrlwing.cpp
index fc39dd6d169cf9e2c06441e2d48d90c17c6195fd..b1849b2589f508ea6e50137cf4729c5610e3c830 100644 (file)
@@ -173,13 +173,6 @@ bool wxScrollHelperEvtHandler::ProcessEvent(wxEvent& event)
 {
     wxEventType evType = event.GetEventType();
 
-    // always process the size events ourselves, even if the user code handles
-    // them as well, as we need to AdjustScrollbars()
-    if ( evType == wxEVT_SIZE )
-    {
-        m_scrollHelper->HandleOnSize((wxSizeEvent &)event);
-    }
-
     // the explanation of wxEVT_PAINT processing hack: for historic reasons
     // there are 2 ways to process this event in classes deriving from
     // wxScrolledWindow. The user code may
@@ -198,7 +191,24 @@ bool wxScrollHelperEvtHandler::ProcessEvent(wxEvent& event)
     // user code defined OnPaint() in the derived class)
     m_hasDrawnWindow = TRUE;
 
-    if ( wxEvtHandler::ProcessEvent(event) )
+    // pass it on to the real handler
+    bool processed = wxEvtHandler::ProcessEvent(event);
+
+    // always process the size events ourselves, even if the user code handles
+    // them as well, as we need to AdjustScrollbars()
+    //
+    // NB: it is important to do it after processing the event in the normal
+    //     way as HandleOnSize() may generate a wxEVT_SIZE itself if the
+    //     scrollbar[s] (dis)appear and it should be seen by the user code
+    //     after this one
+    if ( evType == wxEVT_SIZE )
+    {
+        m_scrollHelper->HandleOnSize((wxSizeEvent &)event);
+
+        return TRUE;
+    }
+
+    if ( processed )
     {
         // normally, nothing more to do here - except if it was a paint event
         // which wasn't really processed, then we'll try to call our
@@ -392,29 +402,33 @@ void wxScrollHelper::SetWindow(wxWindow *win)
 
     m_win = win;
 
-    DoSetTargetWindow(win);
+    DoSetTargetWindow(win, TRUE);
 }
 
-void wxScrollHelper::DoSetTargetWindow(wxWindow *target)
+void wxScrollHelper::DoSetTargetWindow(wxWindow *target, bool pushEventHandler)
 {
     m_targetWindow = target;
 
     // install the event handler which will intercept the events we're
     // interested in
-    m_handler = new wxScrollHelperEvtHandler(this);
-    m_targetWindow->PushEventHandler(m_handler);
+    if (pushEventHandler)
+    {
+        m_handler = new wxScrollHelperEvtHandler(this);
+        m_targetWindow->PushEventHandler(m_handler);
+    }
 }
 
-void wxScrollHelper::SetTargetWindow( wxWindow *target )
+void wxScrollHelper::SetTargetWindow( wxWindow *target, bool pushEventHandler )
 {
     wxCHECK_RET( target, wxT("target window must not be NULL") );
 
     if ( target == m_targetWindow )
         return;
 
-    DeleteEvtHandler();
+    if (pushEventHandler)
+        DeleteEvtHandler();
 
-    DoSetTargetWindow(target);
+    DoSetTargetWindow(target, pushEventHandler);
 }
 
 wxWindow *wxScrollHelper::GetTargetWindow() const