scrolling of foreign windowsplus sample

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4000 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
1999-10-15 14:59:44 +00:00
parent 9c40a88dbb
commit ecab4dba7d
16 changed files with 628 additions and 178 deletions

View File

@@ -80,6 +80,8 @@ bool wxScrolledWindow::Create(wxWindow *parent, wxWindowID id,
m_yScrollLinesPerPage = 0;
m_scaleX = 1.0;
m_scaleY = 1.0;
m_targetWindow = this;
return wxPanel::Create(parent, id, pos, size, style, name);
}
@@ -147,7 +149,7 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
AdjustScrollbars();
if (do_refresh && !noRefresh)
Refresh();
m_targetWindow->Refresh();
#ifdef __WXMSW__
// Necessary?
@@ -155,6 +157,21 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
#endif
}
wxScrolledWindow::~wxScrolledWindow()
{
}
void wxScrolledWindow::SetTargetWindow( wxWindow *target )
{
wxASSERT_MSG( target, wxT("target window must not be NULL") );
m_targetWindow = target;
}
wxWindow *wxScrolledWindow::GetTargetWindow()
{
return m_targetWindow;
}
void wxScrolledWindow::OnScroll(wxScrollWinEvent& event)
{
int orient = event.GetOrientation();
@@ -185,130 +202,132 @@ void wxScrolledWindow::OnScroll(wxScrollWinEvent& event)
if (orient == wxHORIZONTAL)
{
if (m_xScrollingEnabled)
ScrollWindow(-m_xScrollPixelsPerLine * nScrollInc, 0, (const wxRect *) NULL);
m_targetWindow->ScrollWindow(-m_xScrollPixelsPerLine * nScrollInc, 0, (const wxRect *) NULL);
else
Refresh();
m_targetWindow->Refresh();
}
else
{
if (m_yScrollingEnabled)
ScrollWindow(0, -m_yScrollPixelsPerLine * nScrollInc, (const wxRect *) NULL);
m_targetWindow->ScrollWindow(0, -m_yScrollPixelsPerLine * nScrollInc, (const wxRect *) NULL);
else
Refresh();
m_targetWindow->Refresh();
}
}
int wxScrolledWindow::CalcScrollInc(wxScrollWinEvent& event)
{
int pos = event.GetPosition();
int orient = event.GetOrientation();
int pos = event.GetPosition();
int orient = event.GetOrientation();
int nScrollInc = 0;
switch (event.GetEventType())
{
case wxEVT_SCROLLWIN_TOP:
int nScrollInc = 0;
switch (event.GetEventType())
{
if (orient == wxHORIZONTAL)
nScrollInc = - m_xScrollPosition;
else
nScrollInc = - m_yScrollPosition;
break;
case wxEVT_SCROLLWIN_TOP:
{
if (orient == wxHORIZONTAL)
nScrollInc = - m_xScrollPosition;
else
nScrollInc = - m_yScrollPosition;
break;
}
case wxEVT_SCROLLWIN_BOTTOM:
{
if (orient == wxHORIZONTAL)
nScrollInc = m_xScrollLines - m_xScrollPosition;
else
nScrollInc = m_yScrollLines - m_yScrollPosition;
break;
}
case wxEVT_SCROLLWIN_LINEUP:
{
nScrollInc = -1;
break;
}
case wxEVT_SCROLLWIN_LINEDOWN:
{
nScrollInc = 1;
break;
}
case wxEVT_SCROLLWIN_PAGEUP:
{
if (orient == wxHORIZONTAL)
nScrollInc = -GetScrollPageSize(wxHORIZONTAL);
else
nScrollInc = -GetScrollPageSize(wxVERTICAL);
break;
}
case wxEVT_SCROLLWIN_PAGEDOWN:
{
if (orient == wxHORIZONTAL)
nScrollInc = GetScrollPageSize(wxHORIZONTAL);
else
nScrollInc = GetScrollPageSize(wxVERTICAL);
break;
}
case wxEVT_SCROLLWIN_THUMBTRACK:
{
if (orient == wxHORIZONTAL)
nScrollInc = pos - m_xScrollPosition;
else
nScrollInc = pos - m_yScrollPosition;
break;
}
default:
{
break;
}
}
case wxEVT_SCROLLWIN_BOTTOM:
{
if (orient == wxHORIZONTAL)
nScrollInc = m_xScrollLines - m_xScrollPosition;
else
nScrollInc = m_yScrollLines - m_yScrollPosition;
break;
}
case wxEVT_SCROLLWIN_LINEUP:
{
nScrollInc = -1;
break;
}
case wxEVT_SCROLLWIN_LINEDOWN:
{
nScrollInc = 1;
break;
}
case wxEVT_SCROLLWIN_PAGEUP:
{
if (orient == wxHORIZONTAL)
nScrollInc = -GetScrollPageSize(wxHORIZONTAL);
else
nScrollInc = -GetScrollPageSize(wxVERTICAL);
break;
}
case wxEVT_SCROLLWIN_PAGEDOWN:
{
if (orient == wxHORIZONTAL)
nScrollInc = GetScrollPageSize(wxHORIZONTAL);
else
nScrollInc = GetScrollPageSize(wxVERTICAL);
break;
}
case wxEVT_SCROLLWIN_THUMBTRACK:
{
if (orient == wxHORIZONTAL)
nScrollInc = pos - m_xScrollPosition;
else
nScrollInc = pos - m_yScrollPosition;
break;
}
default:
{
break;
}
}
if (orient == wxHORIZONTAL)
{
if (m_xScrollPixelsPerLine > 0) {
int w, h;
GetClientSize(&w, &h);
if (orient == wxHORIZONTAL)
{
if (m_xScrollPixelsPerLine > 0)
{
int w, h;
m_targetWindow->GetClientSize(&w, &h);
int nMaxWidth = m_xScrollLines*m_xScrollPixelsPerLine;
int noPositions = (int) ( ((nMaxWidth - w)/(float)m_xScrollPixelsPerLine) + 0.5 );
if (noPositions < 0)
noPositions = 0;
int nMaxWidth = m_xScrollLines*m_xScrollPixelsPerLine;
int noPositions = (int) ( ((nMaxWidth - w)/(double)m_xScrollPixelsPerLine) + 0.5 );
if (noPositions < 0)
noPositions = 0;
if ( (m_xScrollPosition + nScrollInc) < 0 )
nScrollInc = -m_xScrollPosition; // As -ve as we can go
else if ( (m_xScrollPosition + nScrollInc) > noPositions )
nScrollInc = noPositions - m_xScrollPosition; // As +ve as we can go
if ( (m_xScrollPosition + nScrollInc) < 0 )
nScrollInc = -m_xScrollPosition; // As -ve as we can go
else if ( (m_xScrollPosition + nScrollInc) > noPositions )
nScrollInc = noPositions - m_xScrollPosition; // As +ve as we can go
}
else
m_targetWindow->Refresh();
}
else
Refresh();
}
else
{
if (m_yScrollPixelsPerLine > 0) {
int w, h;
GetClientSize(&w, &h);
{
if (m_yScrollPixelsPerLine > 0)
{
int w, h;
m_targetWindow->GetClientSize(&w, &h);
int nMaxHeight = m_yScrollLines*m_yScrollPixelsPerLine;
int noPositions = (int) ( ((nMaxHeight - h)/(float)m_yScrollPixelsPerLine) + 0.5 );
if (noPositions < 0)
noPositions = 0;
int nMaxHeight = m_yScrollLines*m_yScrollPixelsPerLine;
int noPositions = (int) ( ((nMaxHeight - h)/(double)m_yScrollPixelsPerLine) + 0.5 );
if (noPositions < 0)
noPositions = 0;
if ( (m_yScrollPosition + nScrollInc) < 0 )
nScrollInc = -m_yScrollPosition; // As -ve as we can go
else if ( (m_yScrollPosition + nScrollInc) > noPositions )
nScrollInc = noPositions - m_yScrollPosition; // As +ve as we can go
if ( (m_yScrollPosition + nScrollInc) < 0 )
nScrollInc = -m_yScrollPosition; // As -ve as we can go
else if ( (m_yScrollPosition + nScrollInc) > noPositions )
nScrollInc = noPositions - m_yScrollPosition; // As +ve as we can go
}
else
m_targetWindow->Refresh();
}
else
Refresh();
}
return nScrollInc;
return nScrollInc;
}
// Adjust the scrollbars - new version.
void wxScrolledWindow::AdjustScrollbars()
{
int w, h;
GetClientSize(&w, &h);
m_targetWindow->GetClientSize(&w, &h);
int oldXScroll = m_xScrollPosition;
int oldYScroll = m_yScrollPosition;
@@ -317,7 +336,7 @@ void wxScrolledWindow::AdjustScrollbars()
{
// Calculate page size i.e. number of scroll units you get on the
// current client window
int noPagePositions = (int) ( (w/(float)m_xScrollPixelsPerLine) + 0.5 );
int noPagePositions = (int) ( (w/(double)m_xScrollPixelsPerLine) + 0.5 );
if (noPagePositions < 1) noPagePositions = 1;
// Correct position if greater than extent of canvas minus
@@ -339,7 +358,7 @@ void wxScrolledWindow::AdjustScrollbars()
{
// Calculate page size i.e. number of scroll units you get on the
// current client window
int noPagePositions = (int) ( (h/(float)m_yScrollPixelsPerLine) + 0.5 );
int noPagePositions = (int) ( (h/(double)m_yScrollPixelsPerLine) + 0.5 );
if (noPagePositions < 1) noPagePositions = 1;
// Correct position if greater than extent of canvas minus
@@ -360,17 +379,17 @@ void wxScrolledWindow::AdjustScrollbars()
if (oldXScroll != m_xScrollPosition)
{
if (m_xScrollingEnabled)
ScrollWindow( m_xScrollPixelsPerLine * (oldXScroll-m_xScrollPosition), 0, (const wxRect *) NULL );
m_targetWindow->ScrollWindow( m_xScrollPixelsPerLine * (oldXScroll-m_xScrollPosition), 0, (const wxRect *) NULL );
else
Refresh();
m_targetWindow->Refresh();
}
if (oldYScroll != m_yScrollPosition)
{
if (m_yScrollingEnabled)
ScrollWindow( 0, m_yScrollPixelsPerLine * (oldYScroll-m_yScrollPosition), (const wxRect *) NULL );
m_targetWindow->ScrollWindow( 0, m_yScrollPixelsPerLine * (oldYScroll-m_yScrollPosition), (const wxRect *) NULL );
else
Refresh();
m_targetWindow->Refresh();
}
}
@@ -452,7 +471,7 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
((y_pos == -1) || (y_pos == m_yScrollPosition))) return;
int w, h;
GetClientSize(&w, &h);
m_targetWindow->GetClientSize(&w, &h);
if (x_pos != -1)
{
@@ -461,7 +480,7 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
// Calculate page size i.e. number of scroll units you get on the
// current client window
int noPagePositions = (int) ( (w/(float)m_xScrollPixelsPerLine) + 0.5 );
int noPagePositions = (int) ( (w/(double)m_xScrollPixelsPerLine) + 0.5 );
if (noPagePositions < 1) noPagePositions = 1;
// Correct position if greater than extent of canvas minus
@@ -469,9 +488,9 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
m_xScrollPosition = wxMin( m_xScrollLines-noPagePositions, m_xScrollPosition );
m_xScrollPosition = wxMax( 0, m_xScrollPosition );
SetScrollPos( wxHORIZONTAL, m_xScrollPosition, TRUE );
m_targetWindow->SetScrollPos( wxHORIZONTAL, m_xScrollPosition, TRUE );
ScrollWindow( (old_x-m_xScrollPosition)*m_xScrollPixelsPerLine, 0 );
m_targetWindow->ScrollWindow( (old_x-m_xScrollPosition)*m_xScrollPixelsPerLine, 0 );
}
if (y_pos != -1)
{
@@ -480,7 +499,7 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
// Calculate page size i.e. number of scroll units you get on the
// current client window
int noPagePositions = (int) ( (h/(float)m_yScrollPixelsPerLine) + 0.5 );
int noPagePositions = (int) ( (h/(double)m_yScrollPixelsPerLine) + 0.5 );
if (noPagePositions < 1) noPagePositions = 1;
// Correct position if greater than extent of canvas minus
@@ -488,9 +507,9 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
m_yScrollPosition = wxMin( m_yScrollLines-noPagePositions, m_yScrollPosition );
m_yScrollPosition = wxMax( 0, m_yScrollPosition );
SetScrollPos( wxVERTICAL, m_yScrollPosition, TRUE );
m_targetWindow->SetScrollPos( wxVERTICAL, m_yScrollPosition, TRUE );
ScrollWindow( 0, (old_y-m_yScrollPosition)*m_yScrollPixelsPerLine );
m_targetWindow->ScrollWindow( 0, (old_y-m_yScrollPosition)*m_yScrollPixelsPerLine );
}