]> git.saurik.com Git - wxWidgets.git/blobdiff - src/dfb/window.cpp
fixed to make wxVariant compatible with both ANSI and Unicode modes
[wxWidgets.git] / src / dfb / window.cpp
index 70ee92126693fe889df78b99dff7975769c52e71..f82ffb8ed60ecb344ba970291cd8f6bf10a93e52 100644 (file)
@@ -28,6 +28,7 @@
 
 #ifndef WX_PRECOMP
     #include "wx/dcclient.h"
+    #include "wx/nonownedwnd.h"
 #endif
 
 #include "wx/caret.h"
@@ -93,25 +94,6 @@ wxWindowDFB::~wxWindowDFB()
     if ( gs_mouseCapture == this )
         ReleaseMouse();
 
-#warning "FIXME: what to do with gs_activeFrame here and elsewhere?"
-#if 0
-    if (gs_activeFrame == this)
-    {
-        gs_activeFrame = NULL;
-        // activate next frame in Z-order:
-        if ( m_wnd->prev )
-        {
-            wxWindowDFB *win = (wxWindowDFB*)m_wnd->prev->userData;
-            win->SetFocus();
-        }
-        else if ( m_wnd->next )
-        {
-            wxWindowDFB *win = (wxWindowDFB*)m_wnd->next->userData;
-            win->SetFocus();
-        }
-    }
-#endif
-
     if ( gs_focusedWindow == this )
         DFBKillFocus();
 
@@ -212,7 +194,8 @@ void wxWindowDFB::SetFocus()
 
     gs_focusedWindow = this;
 
-    if ( IsShownOnScreen() )
+    if ( IsShownOnScreen() &&
+         (!oldFocusedWindow || oldFocusedWindow->GetTLW() != m_tlw) )
     {
         m_tlw->SetDfbFocus();
     }
@@ -220,26 +203,6 @@ void wxWindowDFB::SetFocus()
     //       are hidden; when the TLW becomes visible, it will set the focus
     //       to use from wxTLW::Show()
 
-    #warning "FIXME: implement in terms of DWET_{GOT,LOST}FOCUS"
-    #warning "FIXME: keep this or not? not, think multiapp core"
-#if 0
-    wxWindowDFB *active = wxGetTopLevelParent((wxWindow*)this);
-    if ( !(m_windowStyle & wxPOPUP_WINDOW) && active != gs_activeFrame )
-    {
-        if ( gs_activeFrame )
-        {
-            wxActivateEvent event(wxEVT_ACTIVATE, false, gs_activeFrame->GetId());
-            event.SetEventObject(gs_activeFrame);
-            gs_activeFrame->GetEventHandler()->ProcessEvent(event);
-        }
-
-        gs_activeFrame = active;
-        wxActivateEvent event(wxEVT_ACTIVATE, true, gs_activeFrame->GetId());
-        event.SetEventObject(gs_activeFrame);
-        gs_activeFrame->GetEventHandler()->ProcessEvent(event);
-    }
-#endif
-
     // notify the parent keeping track of focus for the kbd navigation
     // purposes that we got it
     wxChildFocusEvent eventFocus((wxWindow*)this);
@@ -300,30 +263,6 @@ bool wxWindowDFB::Show(bool show)
     // parent area at the place of this window (if hiding):
     DoRefreshWindow();
 
-#warning "FIXME: all of this must be implemented for DFB"
-#if 0
-    DFB_wmShowWindow(m_wnd, show);
-
-    if (!show && gs_activeFrame == this)
-    {
-        // activate next frame in Z-order:
-        if ( m_wnd->prev )
-        {
-            wxWindowDFB *win = (wxWindowDFB*)m_wnd->prev->userData;
-            win->SetFocus();
-        }
-        else if ( m_wnd->next )
-        {
-            wxWindowDFB *win = (wxWindowDFB*)m_wnd->next->userData;
-            win->SetFocus();
-        }
-        else
-        {
-            gs_activeFrame = NULL;
-        }
-    }
-#endif
-
     return true;
 }
 
@@ -492,6 +431,15 @@ void wxWindowDFB::DoMoveWindow(int x, int y, int width, int height)
     {
         // queue both former and new position of the window for repainting:
         wxWindow *parent = GetParent();
+
+        // only refresh the visible parts:
+        if ( !CanBeOutsideClientArea() )
+        {
+            wxRect parentClient(parent->GetClientSize());
+            oldpos.Intersect(parentClient);
+            newpos.Intersect(parentClient);
+        }
+
         parent->RefreshRect(oldpos);
         parent->RefreshRect(newpos);
     }
@@ -682,6 +630,11 @@ void wxWindowDFB::DoRefreshRect(const wxRect& rect)
     r.Offset(GetPosition());
     r.Offset(parent->GetClientAreaOrigin());
 
+    // normal windows cannot extend out of its parent's client area, so don't
+    // refresh any hidden parts:
+    if ( !CanBeOutsideClientArea() )
+        r.Intersect(parent->GetClientRect());
+
     parent->DoRefreshRect(r);
 }
 
@@ -763,6 +716,10 @@ void wxWindowDFB::PaintWindow(const wxRect& rect)
 
     m_updateRegion.Clear();
 
+    // client area portion of 'rect':
+    wxRect rectClientOnly(rect);
+    rectClientOnly.Intersect(clientRect);
+
     // paint the children:
     wxPoint origin = GetClientAreaOrigin();
     wxWindowList& children = GetChildren();
@@ -777,7 +734,12 @@ void wxWindowDFB::PaintWindow(const wxRect& rect)
         // compute child's area to repaint
         wxRect childrect(child->GetRect());
         childrect.Offset(origin);
-        childrect.Intersect(rect);
+
+        if ( child->CanBeOutsideClientArea() )
+            childrect.Intersect(rect);
+        else
+            childrect.Intersect(rectClientOnly);
+
         if ( childrect.IsEmpty() )
             continue;
 
@@ -796,7 +758,9 @@ void wxWindowDFB::PaintOverlays(const wxRect& rect)
     for ( wxDfbOverlaysList::const_iterator i = m_overlays->begin();
           i != m_overlays->end(); ++i )
     {
-        wxOverlayImpl *overlay = *i;
+        // FIXME: the cast is necessary for STL build where the iterator
+        //        (incorrectly) returns void* and not wxOverlayImpl*
+        wxOverlayImpl *overlay = (wxOverlayImpl*) *i;
 
         wxRect orectOrig(overlay->GetRect());
         wxRect orect(orectOrig);