]> git.saurik.com Git - wxWidgets.git/blobdiff - src/univ/winuniv.cpp
use wxDIB object instead of static ConvertFromBitmap() in CF_DIB case
[wxWidgets.git] / src / univ / winuniv.cpp
index f2b90368df6acb78ba879dde8507b7212fd8ddad..7b6895d5014ab693dc9ac11151d46e9da7d1fc03 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     06.08.00
 // RCS-ID:      $Id$
 // Copyright:   (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
 // ===========================================================================
@@ -17,7 +17,7 @@
 // headers
 // ---------------------------------------------------------------------------
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "univwindow.h"
 #endif
 
@@ -39,6 +39,7 @@
     #include "wx/frame.h"
 #endif // WX_PRECOMP
 
+#include "wx/log.h"
 #include "wx/univ/colschem.h"
 #include "wx/univ/renderer.h"
 #include "wx/univ/theme.h"
@@ -108,7 +109,7 @@ void wxWindow::Init()
     m_isCurrent = FALSE;
 
     m_renderer = wxTheme::Get()->GetRenderer();
-    
+
     m_oldSize.x = -1;
     m_oldSize.y = -1;
 }
@@ -120,17 +121,29 @@ bool wxWindow::Create(wxWindow *parent,
                       long style,
                       const wxString& name)
 {
+    long actualStyle = style;
+    
+    // FIXME: may need this on other platforms
+#ifdef __WXMSW__
+    actualStyle &= ~wxVSCROLL;
+    actualStyle &= ~wxHSCROLL;
+#endif    
+    
     // we add wxCLIP_CHILDREN to get the same ("natural") behaviour under MSW
     // as under the other platforms
     if ( !wxWindowNative::Create(parent, id, pos, size,
-                                 style | wxCLIP_CHILDREN,
+                                 actualStyle | wxCLIP_CHILDREN,
                                  name) )
     {
         return FALSE;
     }
 
-    // if we should always have the scrollbar, do show it
-    if ( GetWindowStyle() & wxALWAYS_SHOW_SB )
+    // Set full style again, including those we didn't want present
+    // when calling the base window Create().
+    wxWindowBase::SetWindowStyleFlag(style);
+
+    // if we should always have a vertical scrollbar, do show it
+    if ( style & wxALWAYS_SHOW_SB )
     {
 #if wxUSE_TWO_WINDOWS
         SetInsertIntoMain( TRUE );
@@ -141,8 +154,25 @@ bool wxWindow::Create(wxWindow *parent,
 #if wxUSE_TWO_WINDOWS
         SetInsertIntoMain( FALSE );
 #endif
+    }
 
-        // and position it
+    // if we should always have a horizontal scrollbar, do show it
+    if ( style & wxHSCROLL )
+    {
+#if wxUSE_TWO_WINDOWS
+        SetInsertIntoMain( TRUE );
+#endif
+        m_scrollbarHorz = new wxScrollBar(this, -1,
+                                          wxDefaultPosition, wxDefaultSize,
+                                          wxSB_HORIZONTAL);
+#if wxUSE_TWO_WINDOWS
+        SetInsertIntoMain( FALSE );
+#endif
+    }
+    
+    if (m_scrollbarHorz || m_scrollbarVert)
+    {
+        // position it/them
         PositionScrollbars();
     }
 
@@ -181,7 +211,7 @@ const wxBitmap& wxWindow::GetBackgroundBitmap(int *alignment,
 // ----------------------------------------------------------------------------
 
 // the event handlers executed when the window must be repainted
-void wxWindow::OnNcPaint(wxPaintEvent& event)
+void wxWindow::OnNcPaint(wxNcPaintEvent& WXUNUSED(event))
 {
     if ( m_renderer )
     {
@@ -239,7 +269,7 @@ void wxWindow::OnErase(wxEraseEvent& event)
 
         return;
     }
-    
+
     DoDrawBackground(*event.GetDC());
 
     // if we have both scrollbars, we also have a square in the corner between
@@ -266,41 +296,45 @@ void wxWindow::OnErase(wxEraseEvent& event)
 bool wxWindow::DoDrawBackground(wxDC& dc)
 {
     wxRect rect;
-    
+
     wxSize size = GetSize();  // Why not GetClientSize() ?
     rect.x = 0;
     rect.y = 0;
     rect.width = size.x;
     rect.height = size.y;
-    
-    if (HasTransparentBackground() && GetParent() && GetParent()->ProvidesBackground())
+
+    wxWindow * const parent = GetParent();
+    if ( HasTransparentBackground() && parent && parent->ProvidesBackground() )
     {
         wxASSERT( !IsTopLevel() );
-    
+
         wxPoint pos = GetPosition();
-        
+
         AdjustForParentClientOrigin( pos.x, pos.y, 0 );
-        
+
         // Adjust DC logical origin
-        wxCoord x,y;
-        dc.GetLogicalOrigin( &x, &y );
-        x += pos.x;
-        y += pos.y;
+        wxCoord org_x, org_y, x, y;
+        dc.GetLogicalOrigin( &org_x, &org_y );
+        x = org_x + pos.x;
+        y = org_y + pos.y;
         dc.SetLogicalOrigin( x, y );
-        
+
         // Adjust draw rect
         rect.x = pos.x;
         rect.y = pos.y;
-        
+
         // Let parent draw the background
-        GetParent()->EraseBackground( dc, rect );
+        parent->EraseBackground( dc, rect );
+
+        // Restore DC logical origin
+        dc.SetLogicalOrigin( org_x, org_y );
     }
     else
     {
         // Draw background ouselves
-         EraseBackground( dc, rect );
+        EraseBackground( dc, rect );
     }
-    
+
     return TRUE;
 }
 
@@ -314,10 +348,10 @@ void wxWindow::EraseBackground(wxDC& dc, const wxRect& rect)
         wxBitmap bmp = GetBackgroundBitmap(&alignment, &stretch);
         wxControlRenderer::DrawBitmap(dc, bmp, rect, alignment, stretch);
     }
-    else 
+    else
     {
         // Just fill it with bg colour if no bitmap
-    
+
         m_renderer->DrawBackground(dc, wxTHEME_BG_COLOUR(this),
                                    rect, GetStateFlags());
     }
@@ -335,7 +369,7 @@ void wxWindow::DoDrawBorder(wxDC& dc, const wxRect& rect)
     }
 }
 
-void wxWindow::DoDraw(wxControlRenderer *renderer)
+void wxWindow::DoDraw(wxControlRenderer * WXUNUSED(renderer))
 {
 }
 
@@ -386,6 +420,19 @@ void wxWindow::Refresh(bool eraseBackground, const wxRect *rectClient)
 #endif // WXDEBUG_REFRESH
 
     wxWindowNative::Refresh(eraseBackground, &rectWin);
+
+    // Refresh all sub controls if any.
+    wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
+    while ( node )
+    {
+        wxWindow *win = node->GetData();
+        // Only refresh sub controls when it is visible 
+        // and when it is in the update region.
+        if(!win->IsKindOf(CLASSINFO(wxTopLevelWindow)) && win->IsShown() && wxRegion(rectWin).Contains(win->GetRect()) != wxOutRegion)
+            win->Refresh(eraseBackground, &rectWin);
+            
+        node = node->GetNext();
+    }
 }
 
 // ----------------------------------------------------------------------------
@@ -477,28 +524,28 @@ int wxWindow::GetStateFlags() const
 void wxWindow::OnSize(wxSizeEvent& event)
 {
     event.Skip();
-    
+
     if ( m_scrollbarVert || m_scrollbarHorz )
     {
         PositionScrollbars();
     }
-    
+
 #if 0   // ndef __WXMSW__
     // Refresh the area (strip) previously occupied by the border
-    
-    if (HasFlag( wxNO_FULL_REPAINT_ON_RESIZE ) && IsShown())
+
+    if ( !HasFlag(wxFULL_REPAINT_ON_RESIZE) && IsShown() )
     {
         // This code assumes that wxSizeEvent.GetSize() returns
         // the area of the entire window, not just the client
         // area.
         wxSize newSize = event.GetSize();
-        
+
         if (m_oldSize.x == -1 && m_oldSize.y == -1)
         {
             m_oldSize = newSize;
             return;
         }
-        
+
         if (HasFlag( wxSIMPLE_BORDER ))
         {
             if (newSize.y > m_oldSize.y)
@@ -519,7 +566,7 @@ void wxWindow::OnSize(wxSizeEvent& event)
                 rect.width = newSize.x;
                 wxWindowNative::Refresh( TRUE, &rect );
             }
-            
+
             if (newSize.x > m_oldSize.x)
             {
                 wxRect rect;
@@ -560,7 +607,7 @@ void wxWindow::OnSize(wxSizeEvent& event)
                 rect.width = newSize.x;
                 wxWindowNative::Refresh( TRUE, &rect );
             }
-            
+
             if (newSize.x > m_oldSize.x)
             {
                 wxRect rect;
@@ -580,7 +627,7 @@ void wxWindow::OnSize(wxSizeEvent& event)
                 wxWindowNative::Refresh( TRUE, &rect );
             }
         }
-        
+
         m_oldSize = newSize;
     }
 #endif
@@ -873,7 +920,7 @@ void wxWindow::SetScrollbar(int orient,
     }
 }
 
-void wxWindow::SetScrollPos(int orient, int pos, bool refresh)
+void wxWindow::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh))
 {
     wxScrollBar *scrollbar = GetScrollbar(orient);
     wxCHECK_RET( scrollbar, _T("no scrollbar to set position for") );
@@ -914,7 +961,7 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
 
     wxWindowNative::ScrollWindow(dx, dy, rect);
 
-#else
+#else // !wxX11
 
     // before scrolling it, ensure that we don't have any unpainted areas
     Update();
@@ -932,11 +979,11 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
         r = ScrollNoRefresh(0, dy, rect);
         Refresh(TRUE /* erase bkgnd */, &r);
     }
-    
-    // scroll children accordingly:    
+
+    // scroll children accordingly:
     wxPoint offset(dx, dy);
-    
-    for (wxWindowList::Node *node = GetChildren().GetFirst(); 
+
+    for (wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
          node; node = node->GetNext())
     {
         wxWindow *child = node->GetData();
@@ -944,13 +991,13 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
             continue;
 
         // VS: Scrolling children has non-trivial semantics. If rect=NULL then
-        //     it is easy: we scroll all children. Otherwise it gets 
+        //     it is easy: we scroll all children. Otherwise it gets
         //     complicated:
         //       1. if scrolling in one direction only, scroll only
         //          those children that intersect shaft defined by the rectangle
         //          and scrolling direction
         //       2. if scrolling in both axes, scroll all children
-        
+
         if ( rect && (dx * dy == 0 /* moving in only one of x, y axis */) )
         {
             wxRect childRect = child->GetRect();
@@ -969,8 +1016,8 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
         {
             child->Move(child->GetPosition() + offset);
         }
-    }    
-#endif
+    }
+#endif // wxX11/!wxX11
 }
 
 wxRect wxWindow::ScrollNoRefresh(int dx, int dy, const wxRect *rectTotal)
@@ -1292,7 +1339,7 @@ void wxWindow::OnKeyUp(wxKeyEvent& event)
 
 #include "wx/msw/private.h"
 
-long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
+WXLRESULT wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
 {
     if ( message == WM_NCHITTEST )
     {