X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/139adb6a281e8c1a94519e24a1e7be319b50155e..f377a3b58c509ceba8c9335dbe45d100cca615ad:/src/generic/scrolwin.cpp diff --git a/src/generic/scrolwin.cpp b/src/generic/scrolwin.cpp index 4b99809f81..033b08913b 100644 --- a/src/generic/scrolwin.cpp +++ b/src/generic/scrolwin.cpp @@ -20,27 +20,33 @@ #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 -wxScrolledWindow::wxScrolledWindow(void) +#ifdef __WXMSW__ +#include "windows.h" +#endif + +#ifdef __WXMOTIF__ +// For wxRETAINED implementation +#include +#endif + +wxScrolledWindow::wxScrolledWindow() { 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; - 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) || - (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) || @@ -104,24 +110,58 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY, 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 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; @@ -133,19 +173,6 @@ void wxScrolledWindow::OnScroll(wxScrollEvent& event) 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; @@ -171,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(); @@ -179,7 +206,7 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event) int nScrollInc = 0; switch (event.GetEventType()) { - case wxEVT_SCROLL_TOP: + case wxEVT_SCROLLWIN_TOP: { if (orient == wxHORIZONTAL) nScrollInc = - m_xScrollPosition; @@ -187,7 +214,7 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event) nScrollInc = - m_yScrollPosition; break; } - case wxEVT_SCROLL_BOTTOM: + case wxEVT_SCROLLWIN_BOTTOM: { if (orient == wxHORIZONTAL) nScrollInc = m_xScrollLines - m_xScrollPosition; @@ -195,17 +222,17 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event) 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); @@ -213,7 +240,7 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event) nScrollInc = -GetScrollPageSize(wxVERTICAL); break; } - case wxEVT_SCROLL_PAGEDOWN: + case wxEVT_SCROLLWIN_PAGEDOWN: { if (orient == wxHORIZONTAL) nScrollInc = GetScrollPageSize(wxHORIZONTAL); @@ -221,7 +248,7 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event) nScrollInc = GetScrollPageSize(wxVERTICAL); break; } - case wxEVT_SCROLL_THUMBTRACK: + case wxEVT_SCROLLWIN_THUMBTRACK: { if (orient == wxHORIZONTAL) nScrollInc = pos - m_xScrollPosition; @@ -234,6 +261,7 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event) break; } } + if (orient == wxHORIZONTAL) { if (m_xScrollPixelsPerLine > 0) { @@ -295,7 +323,8 @@ void wxScrolledWindow::AdjustScrollbars(void) 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 { @@ -316,7 +345,8 @@ void wxScrolledWindow::AdjustScrollbars(void) 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 { @@ -428,9 +458,11 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos ) 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 }