m_isCurrent = FALSE;
m_renderer = wxTheme::Get()->GetRenderer();
+
+ m_oldSize.x = -1;
+ m_oldSize.y = -1;
}
bool wxWindow::Create(wxWindow *parent,
return;
}
-
+
DoDrawBackground(*event.GetDC());
// if we have both scrollbars, we also have a square in the corner between
void wxWindow::OnSize(wxSizeEvent& event)
{
+ event.Skip();
+
if ( m_scrollbarVert || m_scrollbarHorz )
{
PositionScrollbars();
}
-
- event.Skip();
+
+#ifndef __WXMSW__
+ // Refresh the area (strip) previously occupied by the border
+
+ if (HasFlag( wxNO_FULL_REPAINT_ON_RESIZE ) && IsShown())
+ {
+ // This code assumes that wxSizeEvent.GetSize() returns
+ // the area of the entire window, not just the client
+ // area.
+ wxSize newSize = event.GetSize();
+
+ if (m_oldSize.x == -1 && m_oldSize.y == -1)
+ {
+ m_oldSize = newSize;
+ return;
+ }
+
+ if (HasFlag( wxSIMPLE_BORDER ))
+ {
+ if (newSize.y > m_oldSize.y)
+ {
+ wxRect rect;
+ rect.x = 0;
+ rect.width = m_oldSize.x;
+ rect.y = m_oldSize.y-2;
+ rect.height = 1;
+ Refresh( TRUE, &rect );
+ }
+ else if (newSize.y < m_oldSize.y)
+ {
+ wxRect rect;
+ rect.y = newSize.y;
+ rect.x = 0;
+ rect.height = 1;
+ rect.width = newSize.x;
+ wxWindowNative::Refresh( TRUE, &rect );
+ }
+
+ if (newSize.x > m_oldSize.x)
+ {
+ wxRect rect;
+ rect.y = 0;
+ rect.height = m_oldSize.y;
+ rect.x = m_oldSize.x-2;
+ rect.width = 1;
+ Refresh( TRUE, &rect );
+ }
+ else if (newSize.x < m_oldSize.x)
+ {
+ wxRect rect;
+ rect.x = newSize.x;
+ rect.y = 0;
+ rect.width = 1;
+ rect.height = newSize.y;
+ wxWindowNative::Refresh( TRUE, &rect );
+ }
+ }
+ else
+ if (HasFlag( wxSUNKEN_BORDER ) || HasFlag( wxRAISED_BORDER ))
+ {
+ if (newSize.y > m_oldSize.y)
+ {
+ wxRect rect;
+ rect.x = 0;
+ rect.width = m_oldSize.x;
+ rect.y = m_oldSize.y-4;
+ rect.height = 2;
+ Refresh( TRUE, &rect );
+ }
+ else if (newSize.y < m_oldSize.y)
+ {
+ wxRect rect;
+ rect.y = newSize.y;
+ rect.x = 0;
+ rect.height = 2;
+ rect.width = newSize.x;
+ wxWindowNative::Refresh( TRUE, &rect );
+ }
+
+ if (newSize.x > m_oldSize.x)
+ {
+ wxRect rect;
+ rect.y = 0;
+ rect.height = m_oldSize.y;
+ rect.x = m_oldSize.x-4;
+ rect.width = 2;
+ Refresh( TRUE, &rect );
+ }
+ else if (newSize.x < m_oldSize.x)
+ {
+ wxRect rect;
+ rect.x = newSize.x;
+ rect.y = 0;
+ rect.width = 2;
+ rect.height = newSize.y;
+ wxWindowNative::Refresh( TRUE, &rect );
+ }
+ }
+
+ m_oldSize = newSize;
+ }
+#endif
}
wxSize wxWindow::DoGetBestSize() const
node; node = node->GetNext())
{
wxWindow *child = node->GetData();
- if ( child != m_scrollbarVert && child != m_scrollbarHorz &&
- (rect == NULL || rect->Intersects(child->GetRect())) )
+ if ( child == m_scrollbarVert || child == m_scrollbarHorz )
+ continue;
+
+ // VS: Scrolling children has non-trivial semantics. If rect=NULL then
+ // it is easy: we scroll all children. Otherwise it gets
+ // complicated:
+ // 1. if scrolling in one direction only, scroll only
+ // those children that intersect shaft defined by the rectangle
+ // and scrolling direction
+ // 2. if scrolling in both axes, scroll all children
+
+ if ( rect && (dx * dy == 0 /* moving in only one of x, y axis */) )
+ {
+ wxRect childRect = child->GetRect();
+ if ( dx == 0 && (childRect.GetLeft() <= rect->GetRight() ||
+ childRect.GetRight() >= rect->GetLeft()) )
+ {
+ child->Move(child->GetPosition() + offset);
+ }
+ else if ( dy == 0 && (childRect.GetTop() <= rect->GetBottom() ||
+ childRect.GetBottom() >= rect->GetTop()) )
+ {
+ child->Move(child->GetPosition() + offset);
+ }
+ }
+ else
{
child->Move(child->GetPosition() + offset);
}