#include "wx/utils.h"
#include "wx/dcclient.h"
-#ifdef __WXMSW__
-#include "windows.h"
-#endif
-
#ifdef __BORLANDC__
#pragma hdrstop
#endif
IMPLEMENT_DYNAMIC_CLASS(wxScrolledWindow, wxWindow)
#endif
+#ifdef __WXMSW__
+#include "windows.h"
+#endif
+
+#ifdef __WXMOTIF__
+// For wxRETAINED implementation
+#include <Xm/Xm.h>
+#endif
+
wxScrolledWindow::wxScrolledWindow(void)
{
m_xScrollPixelsPerLine = 0;
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();
if (do_refresh && !noRefresh) Refresh();
#ifdef __WXMSW__
+ // Necessary?
UpdateWindow ((HWND) GetHWND());
#endif
}
int nScrollInc = CalcScrollInc(event);
if (nScrollInc == 0) return;
- // TODO: should we store the scroll position here as well as in wxWindow?
if (orient == wxHORIZONTAL)
{
int newPos = m_xScrollPosition + nScrollInc;
SetScrollPos(wxVERTICAL, newPos, TRUE );
}
-/*
- // TODO We need to multiply the ScrollWindow amount by the scaling
- // factor, but how do we know what this is in wxWin 2.0???
- float scaleX = 1.0;
- float scaleY = 1.0;
-
- if ( this->IsKindOf(CLASSINFO(wxCanvas)) )
- {
- wxDC* dc = ((wxCanvas *)this)->GetDC();
- dc->GetUserScale(&scaleX, &scaleY);
- }
-*/
-
if (orient == wxHORIZONTAL)
{
m_xScrollPosition += nScrollInc;
break;
}
}
+
if (orient == wxHORIZONTAL)
{
if (m_xScrollPixelsPerLine > 0) {
m_xScrollPosition = wxMax( 0, m_xScrollPosition );
SetScrollbar(wxHORIZONTAL, m_xScrollPosition, noPagePositions, m_xScrollLines);
-// SetScrollPageSize(wxHORIZONTAL, noPagePositions);
+ // The amount by which we scroll when paging
+ SetScrollPageSize(wxHORIZONTAL, noPagePositions);
}
else
{
m_yScrollPosition = wxMax( 0, m_yScrollPosition );
SetScrollbar(wxVERTICAL, m_yScrollPosition, noPagePositions, m_yScrollLines);
-// SetScrollPageSize(wxVERTICAL, noPagePositions);
+ // The amount by which we scroll when paging
+ SetScrollPageSize(wxVERTICAL, noPagePositions);
}
else
{
SetScrollPos( wxVERTICAL, m_yScrollPosition, TRUE );
}
- Refresh();
+ // BAD, BAD, can cause event loops if called from OnPaint(). (KB)
+ // Refresh();
#ifdef __WXMSW__
+ // Necessary?
::UpdateWindow ((HWND) GetHWND());
#endif
}