]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/scrolwin.cpp
More makefiles, distrib things,
[wxWidgets.git] / src / generic / scrolwin.cpp
index 4bb0b3a77c716a0cf15dcd4f2af94f806466b552..81a4a152de1a0a90ea0a13f296ee8f455a4d51bd 100644 (file)
 #include "wx/utils.h"
 #include "wx/dcclient.h"
 
 #include "wx/utils.h"
 #include "wx/dcclient.h"
 
-#ifdef __WXMSW__
-#include "windows.h"
-#endif
-
 #ifdef __BORLANDC__
 #pragma hdrstop
 #endif
 
 #include "wx/generic/scrolwin.h"
 #ifdef __BORLANDC__
 #pragma hdrstop
 #endif
 
 #include "wx/generic/scrolwin.h"
+#include "wx/panel.h"
 
 #if !USE_SHARED_LIBRARY
 
 #if !USE_SHARED_LIBRARY
-BEGIN_EVENT_TABLE(wxScrolledWindow, wxWindow)
-    EVT_SCROLL(wxScrolledWindow::OnScroll)
+BEGIN_EVENT_TABLE(wxScrolledWindow, wxPanel)
+    EVT_SCROLLWIN(wxScrolledWindow::OnScroll)
     EVT_SIZE(wxScrolledWindow::OnSize)
     EVT_PAINT(wxScrolledWindow::OnPaint)
 END_EVENT_TABLE()
 
     EVT_SIZE(wxScrolledWindow::OnSize)
     EVT_PAINT(wxScrolledWindow::OnPaint)
 END_EVENT_TABLE()
 
-IMPLEMENT_DYNAMIC_CLASS(wxScrolledWindow, wxWindow)
+IMPLEMENT_DYNAMIC_CLASS(wxScrolledWindow, wxPanel)
+#endif
+
+#ifdef __WXMSW__
+#include "windows.h"
+#endif
+
+#ifdef __WXMOTIF__
+// For wxRETAINED implementation
+#include <Xm/Xm.h>
 #endif
 
 #endif
 
-wxScrolledWindow::wxScrolledWindow(void)
+wxScrolledWindow::wxScrolledWindow()
 {
     m_xScrollPixelsPerLine = 0;
     m_yScrollPixelsPerLine = 0;
 {
     m_xScrollPixelsPerLine = 0;
     m_yScrollPixelsPerLine = 0;
@@ -75,7 +81,7 @@ bool wxScrolledWindow::Create(wxWindow *parent, wxWindowID id,
     m_scaleX = 1.0;
     m_scaleY = 1.0;
 
     m_scaleX = 1.0;
     m_scaleY = 1.0;
 
-    return wxWindow::Create(parent, id, pos, size, style, name);
+    return wxPanel::Create(parent, id, pos, size, style, name);
 }
 
 /*
 }
 
 /*
@@ -89,9 +95,9 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
     bool do_refresh =
     (
       (noUnitsX != 0 && m_xScrollLines == 0) ||
     bool do_refresh =
     (
       (noUnitsX != 0 && m_xScrollLines == 0) ||
-      (noUnitsX < m_xScrollPosition) ||
+      (noUnitsX < m_xScrollLines) ||
       (noUnitsY != 0 && m_yScrollLines == 0) ||
       (noUnitsY != 0 && m_yScrollLines == 0) ||
-      (noUnitsY < m_yScrollPosition) ||
+      (noUnitsY < m_yScrollLines) ||
       (xPos != m_xScrollPosition) ||
       (yPos != m_yScrollPosition) ||
       (pixelsPerUnitX != m_xScrollPixelsPerLine) ||
       (xPos != m_xScrollPosition) ||
       (yPos != m_yScrollPosition) ||
       (pixelsPerUnitX != m_xScrollPixelsPerLine) ||
@@ -104,17 +110,52 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
     m_yScrollPosition = yPos;
     m_xScrollLines = noUnitsX;
     m_yScrollLines = noUnitsY;
     m_yScrollPosition = yPos;
     m_xScrollLines = noUnitsX;
     m_yScrollLines = noUnitsY;
+
+#ifdef __WXMOTIF__
+    // Sorry, some Motif-specific code to implement a backing pixmap
+    // for the wxRETAINED style. Implementing a backing store can't
+    // be entirely generic because it relies on the wxWindowDC implementation
+    // to duplicate X drawing calls for the backing pixmap.
+
+    if ((m_windowStyle & wxRETAINED) == wxRETAINED)
+    {
+        Display* dpy = XtDisplay((Widget) GetMainWidget());
+
+        int totalPixelWidth = m_xScrollLines * m_xScrollPixelsPerLine;
+        int totalPixelHeight = m_yScrollLines * m_yScrollPixelsPerLine;
+        if (m_backingPixmap &&
+           !((m_pixmapWidth == totalPixelWidth) &&
+             (m_pixmapHeight == totalPixelHeight)))
+        {
+            XFreePixmap (dpy, (Pixmap) m_backingPixmap);
+            m_backingPixmap = (WXPixmap) 0;
+        }
+
+        if (!m_backingPixmap &&
+           (noUnitsX != 0) && (noUnitsY != 0))
+        {
+            int depth = wxDisplayDepth();
+            m_pixmapWidth = totalPixelWidth;
+            m_pixmapHeight = totalPixelHeight;
+            m_backingPixmap = (WXPixmap) XCreatePixmap (dpy, RootWindow (dpy, DefaultScreen (dpy)),
+            m_pixmapWidth, m_pixmapHeight, depth);
+       }
+
+    }
+#endif
       
     AdjustScrollbars();
    
       
     AdjustScrollbars();
    
-   if (do_refresh && !noRefresh) Refresh();
+    if (do_refresh && !noRefresh) 
+       Refresh(); 
    
 #ifdef __WXMSW__
    
 #ifdef __WXMSW__
+   // Necessary?
     UpdateWindow ((HWND) GetHWND());
 #endif
 }
 
     UpdateWindow ((HWND) GetHWND());
 #endif
 }
 
-void wxScrolledWindow::OnScroll(wxScrollEvent& event)
+void wxScrolledWindow::OnScroll(wxScrollWinEvent& event)
 {
     int orient = event.GetOrientation();
 
 {
     int orient = event.GetOrientation();
 
@@ -157,7 +198,7 @@ void wxScrolledWindow::OnScroll(wxScrollEvent& event)
   }
 }
 
   }
 }
 
-int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event)
+int wxScrolledWindow::CalcScrollInc(wxScrollWinEvent& event)
 {
   int pos = event.GetPosition();
   int orient = event.GetOrientation();
 {
   int pos = event.GetPosition();
   int orient = event.GetOrientation();
@@ -165,7 +206,7 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event)
   int nScrollInc = 0;
   switch (event.GetEventType())
   {
   int nScrollInc = 0;
   switch (event.GetEventType())
   {
-    case wxEVT_SCROLL_TOP:
+    case wxEVT_SCROLLWIN_TOP:
     {
       if (orient == wxHORIZONTAL)
         nScrollInc = - m_xScrollPosition;
     {
       if (orient == wxHORIZONTAL)
         nScrollInc = - m_xScrollPosition;
@@ -173,7 +214,7 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event)
         nScrollInc = - m_yScrollPosition;
       break;
     }
         nScrollInc = - m_yScrollPosition;
       break;
     }
-    case wxEVT_SCROLL_BOTTOM:
+    case wxEVT_SCROLLWIN_BOTTOM:
     {
       if (orient == wxHORIZONTAL)
         nScrollInc = m_xScrollLines - m_xScrollPosition;
     {
       if (orient == wxHORIZONTAL)
         nScrollInc = m_xScrollLines - m_xScrollPosition;
@@ -181,17 +222,17 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event)
         nScrollInc = m_yScrollLines - m_yScrollPosition;
       break;
     }
         nScrollInc = m_yScrollLines - m_yScrollPosition;
       break;
     }
-    case wxEVT_SCROLL_LINEUP:
+    case wxEVT_SCROLLWIN_LINEUP:
     {
       nScrollInc = -1;
       break;
     }
     {
       nScrollInc = -1;
       break;
     }
-    case wxEVT_SCROLL_LINEDOWN:
+    case wxEVT_SCROLLWIN_LINEDOWN:
     {
       nScrollInc = 1;
       break;
     }
     {
       nScrollInc = 1;
       break;
     }
-    case wxEVT_SCROLL_PAGEUP:
+    case wxEVT_SCROLLWIN_PAGEUP:
     {
       if (orient == wxHORIZONTAL)
         nScrollInc = -GetScrollPageSize(wxHORIZONTAL);
     {
       if (orient == wxHORIZONTAL)
         nScrollInc = -GetScrollPageSize(wxHORIZONTAL);
@@ -199,7 +240,7 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event)
         nScrollInc = -GetScrollPageSize(wxVERTICAL);
       break;
     }
         nScrollInc = -GetScrollPageSize(wxVERTICAL);
       break;
     }
-    case wxEVT_SCROLL_PAGEDOWN:
+    case wxEVT_SCROLLWIN_PAGEDOWN:
     {
       if (orient == wxHORIZONTAL)
         nScrollInc = GetScrollPageSize(wxHORIZONTAL);
     {
       if (orient == wxHORIZONTAL)
         nScrollInc = GetScrollPageSize(wxHORIZONTAL);
@@ -207,7 +248,7 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event)
         nScrollInc = GetScrollPageSize(wxVERTICAL);
       break;
     }
         nScrollInc = GetScrollPageSize(wxVERTICAL);
       break;
     }
-    case wxEVT_SCROLL_THUMBTRACK:
+    case wxEVT_SCROLLWIN_THUMBTRACK:
     {
       if (orient == wxHORIZONTAL)
         nScrollInc = pos - m_xScrollPosition;
     {
       if (orient == wxHORIZONTAL)
         nScrollInc = pos - m_xScrollPosition;
@@ -264,10 +305,13 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event)
 }
 
 // Adjust the scrollbars - new version.
 }
 
 // Adjust the scrollbars - new version.
-void wxScrolledWindow::AdjustScrollbars(void)
+void wxScrolledWindow::AdjustScrollbars()
 {
     int w, h;
     GetClientSize(&w, &h);
 {
     int w, h;
     GetClientSize(&w, &h);
+    
+    int oldXScroll = m_xScrollPosition;
+    int oldYScroll = m_yScrollPosition;
 
     if (m_xScrollLines > 0)
     {
 
     if (m_xScrollLines > 0)
     {
@@ -312,6 +356,22 @@ void wxScrolledWindow::AdjustScrollbars(void)
         m_yScrollPosition = 0;
         SetScrollbar (wxVERTICAL, 0, 0, 0, FALSE); 
     }
         m_yScrollPosition = 0;
         SetScrollbar (wxVERTICAL, 0, 0, 0, FALSE); 
     }
+    
+    if (oldXScroll != m_xScrollPosition)
+    {
+       if (m_xScrollingEnabled)
+            ScrollWindow( m_xScrollPixelsPerLine * (oldXScroll-m_xScrollPosition), 0, (const wxRect *) NULL );
+       else
+            Refresh();
+    }
+    
+    if (oldYScroll != m_yScrollPosition)
+    {
+        if (m_yScrollingEnabled)
+            ScrollWindow( 0, m_yScrollPixelsPerLine * (oldYScroll-m_yScrollPosition), (const wxRect *) NULL );
+        else
+            Refresh();
+    }
 }
 
 // Default OnSize resets scrollbars, if any
 }
 
 // Default OnSize resets scrollbars, if any
@@ -349,12 +409,22 @@ void wxScrolledWindow::GetScrollUnitsPerPage (int *x_page, int *y_page) const
       *x_page = GetScrollPageSize(wxHORIZONTAL);
       *y_page = GetScrollPageSize(wxVERTICAL);
 }
       *x_page = GetScrollPageSize(wxHORIZONTAL);
       *y_page = GetScrollPageSize(wxVERTICAL);
 }
-#endif
+
+void wxScrolledWindow::CalcUnscrolledPosition(int x, int y, float *xx, float *yy) const
+{
+    if ( xx )
+        *xx = (float)(x + m_xScrollPosition * m_xScrollPixelsPerLine);
+    if ( yy )
+        *yy = (float)(y + m_yScrollPosition * m_yScrollPixelsPerLine);
+}
+#endif // WXWIN_COMPATIBILITY
 
 void wxScrolledWindow::GetScrollPixelsPerUnit (int *x_unit, int *y_unit) const
 {
 
 void wxScrolledWindow::GetScrollPixelsPerUnit (int *x_unit, int *y_unit) const
 {
-      *x_unit = m_xScrollPixelsPerLine;
-      *y_unit = m_yScrollPixelsPerLine;
+    if ( x_unit )
+        *x_unit = m_xScrollPixelsPerLine;
+    if ( y_unit )
+        *y_unit = m_yScrollPixelsPerLine;
 }
 
 int wxScrolledWindow::GetScrollPageSize(int orient) const
 }
 
 int wxScrolledWindow::GetScrollPageSize(int orient) const
@@ -386,6 +456,7 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
 
     if (x_pos != -1)
     {
 
     if (x_pos != -1)
     {
+        int old_x = m_xScrollPosition;
         m_xScrollPosition = x_pos;
     
        // Calculate page size i.e. number of scroll units you get on the
         m_xScrollPosition = x_pos;
     
        // Calculate page size i.e. number of scroll units you get on the
@@ -399,9 +470,12 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
         m_xScrollPosition = wxMax( 0, m_xScrollPosition );
       
         SetScrollPos( wxHORIZONTAL, m_xScrollPosition, TRUE );
         m_xScrollPosition = wxMax( 0, m_xScrollPosition );
       
         SetScrollPos( wxHORIZONTAL, m_xScrollPosition, TRUE );
+       
+       ScrollWindow( (old_x-m_xScrollPosition)*m_xScrollPixelsPerLine, 0 );
     }
     if (y_pos != -1)
     {
     }
     if (y_pos != -1)
     {
+        int old_y = m_yScrollPosition;
         m_yScrollPosition = y_pos;
        
        // Calculate page size i.e. number of scroll units you get on the
         m_yScrollPosition = y_pos;
        
        // Calculate page size i.e. number of scroll units you get on the
@@ -415,12 +489,15 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
         m_yScrollPosition = wxMax( 0, m_yScrollPosition );
        
         SetScrollPos( wxVERTICAL, m_yScrollPosition, TRUE );
         m_yScrollPosition = wxMax( 0, m_yScrollPosition );
        
         SetScrollPos( wxVERTICAL, m_yScrollPosition, TRUE );
+       
+       ScrollWindow( 0, (old_y-m_yScrollPosition)*m_yScrollPixelsPerLine );
     }
     
     }
     
-    Refresh();
     
 #ifdef __WXMSW__
     
 #ifdef __WXMSW__
-    ::UpdateWindow ((HWND) GetHWND());
+//    ::UpdateWindow ((HWND) GetHWND());
+#else
+//    Refresh();
 #endif
 }
 
 #endif
 }
 
@@ -432,27 +509,33 @@ void wxScrolledWindow::EnableScrolling (bool x_scroll, bool y_scroll)
 
 void wxScrolledWindow::GetVirtualSize (int *x, int *y) const
 {
 
 void wxScrolledWindow::GetVirtualSize (int *x, int *y) const
 {
-    *x = m_xScrollPixelsPerLine * m_xScrollLines;
-    *y = m_yScrollPixelsPerLine * m_yScrollLines;
+    if ( x )
+        *x = m_xScrollPixelsPerLine * m_xScrollLines;
+    if ( y )
+        *y = m_yScrollPixelsPerLine * m_yScrollLines;
 }
 
 // Where the current view starts from
 void wxScrolledWindow::ViewStart (int *x, int *y) const
 {
 }
 
 // Where the current view starts from
 void wxScrolledWindow::ViewStart (int *x, int *y) const
 {
-    *x = m_xScrollPosition;
-    *y = m_yScrollPosition;
+    if ( x )
+        *x = m_xScrollPosition;
+    if ( y )
+        *y = m_yScrollPosition;
 }
 
 void wxScrolledWindow::CalcScrolledPosition(int x, int y, int *xx, int *yy) const
 {
 }
 
 void wxScrolledWindow::CalcScrolledPosition(int x, int y, int *xx, int *yy) const
 {
-    *xx = x - m_xScrollPosition * m_xScrollPixelsPerLine;
-    *yy = y - m_yScrollPosition * m_yScrollPixelsPerLine;
+    if ( xx )
+        *xx = x - m_xScrollPosition * m_xScrollPixelsPerLine;
+    if ( yy )
+        *yy = y - m_yScrollPosition * m_yScrollPixelsPerLine;
 }
 
 }
 
-void wxScrolledWindow::CalcUnscrolledPosition(int x, int y, float *xx, float *yy) const
+void wxScrolledWindow::CalcUnscrolledPosition(int x, int y, int *xx, int *yy) const
 {
 {
-    *xx = (float)(x + m_xScrollPosition * m_xScrollPixelsPerLine);
-    *yy = (float)(y + m_yScrollPosition * m_yScrollPixelsPerLine);
+    if ( xx )
+        *xx = x + m_xScrollPosition * m_xScrollPixelsPerLine;
+    if ( yy )
+        *yy = y + m_yScrollPosition * m_yScrollPixelsPerLine;
 }
 }
-
-