#include "wx/utils.h"
#include "wx/dcclient.h"
-#ifdef __WXMSW__
-#include "windows.h"
-#endif
-
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/generic/scrolwin.h"
+#include "wx/panel.h"
#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()
-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
-wxScrolledWindow::wxScrolledWindow(void)
+wxScrolledWindow::wxScrolledWindow()
{
m_xScrollPixelsPerLine = 0;
m_yScrollPixelsPerLine = 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);
}
/*
bool do_refresh =
(
(noUnitsX != 0 && m_xScrollLines == 0) ||
- (noUnitsX < m_xScrollPosition) ||
+ (noUnitsX < m_xScrollLines) ||
(noUnitsY != 0 && m_yScrollLines == 0) ||
- (noUnitsY < m_yScrollPosition) ||
+ (noUnitsY < m_yScrollLines) ||
(xPos != m_xScrollPosition) ||
(yPos != m_yScrollPosition) ||
(pixelsPerUnitX != m_xScrollPixelsPerLine) ||
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();
+ if (do_refresh && !noRefresh)
+ Refresh();
#ifdef __WXMSW__
+ // Necessary?
UpdateWindow ((HWND) GetHWND());
#endif
}
-void wxScrolledWindow::OnScroll(wxScrollEvent& event)
+void wxScrolledWindow::OnScroll(wxScrollWinEvent& event)
{
int orient = event.GetOrientation();
}
}
-int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event)
+int wxScrolledWindow::CalcScrollInc(wxScrollWinEvent& event)
{
int pos = event.GetPosition();
int orient = event.GetOrientation();
int nScrollInc = 0;
switch (event.GetEventType())
{
- case wxEVT_SCROLL_TOP:
+ case wxEVT_SCROLLWIN_TOP:
{
if (orient == wxHORIZONTAL)
nScrollInc = - m_xScrollPosition;
nScrollInc = - m_yScrollPosition;
break;
}
- case wxEVT_SCROLL_BOTTOM:
+ case wxEVT_SCROLLWIN_BOTTOM:
{
if (orient == wxHORIZONTAL)
nScrollInc = m_xScrollLines - m_xScrollPosition;
nScrollInc = m_yScrollLines - m_yScrollPosition;
break;
}
- case wxEVT_SCROLL_LINEUP:
+ case wxEVT_SCROLLWIN_LINEUP:
{
nScrollInc = -1;
break;
}
- case wxEVT_SCROLL_LINEDOWN:
+ case wxEVT_SCROLLWIN_LINEDOWN:
{
nScrollInc = 1;
break;
}
- case wxEVT_SCROLL_PAGEUP:
+ case wxEVT_SCROLLWIN_PAGEUP:
{
if (orient == wxHORIZONTAL)
nScrollInc = -GetScrollPageSize(wxHORIZONTAL);
nScrollInc = -GetScrollPageSize(wxVERTICAL);
break;
}
- case wxEVT_SCROLL_PAGEDOWN:
+ case wxEVT_SCROLLWIN_PAGEDOWN:
{
if (orient == wxHORIZONTAL)
nScrollInc = GetScrollPageSize(wxHORIZONTAL);
nScrollInc = GetScrollPageSize(wxVERTICAL);
break;
}
- case wxEVT_SCROLL_THUMBTRACK:
+ case wxEVT_SCROLLWIN_THUMBTRACK:
{
if (orient == wxHORIZONTAL)
nScrollInc = pos - m_xScrollPosition;
}
// Adjust the scrollbars - new version.
-void wxScrolledWindow::AdjustScrollbars(void)
+void wxScrolledWindow::AdjustScrollbars()
{
int w, h;
GetClientSize(&w, &h);
+
+ int oldXScroll = m_xScrollPosition;
+ int oldYScroll = m_yScrollPosition;
if (m_xScrollLines > 0)
{
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
*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
{
- *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
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 = wxMax( 0, m_xScrollPosition );
SetScrollPos( wxHORIZONTAL, m_xScrollPosition, TRUE );
+
+ ScrollWindow( (old_x-m_xScrollPosition)*m_xScrollPixelsPerLine, 0 );
}
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 = wxMax( 0, m_yScrollPosition );
SetScrollPos( wxVERTICAL, m_yScrollPosition, TRUE );
+
+ ScrollWindow( 0, (old_y-m_yScrollPosition)*m_yScrollPixelsPerLine );
}
- Refresh();
#ifdef __WXMSW__
- ::UpdateWindow ((HWND) GetHWND());
+// ::UpdateWindow ((HWND) GetHWND());
+#else
+// Refresh();
#endif
}
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
{
- *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
{
- *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;
}
-
-