+// set the size of the window: if the dimensions are positive, just use them,
+// but if any of them is equal to -1, it means that we must find the value for
+// it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in
+// which case -1 is a valid value for x and y)
+//
+// If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate
+// the width/height to best suit our contents, otherwise we reuse the current
+// width/height
+void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
+{
+
+ int former_x = m_x ;
+ int former_y = m_y ;
+ int former_w = m_width ;
+ int former_h = m_height ;
+
+ int currentX, currentY;
+ GetPosition(¤tX, ¤tY);
+ int currentW,currentH;
+ GetSize(¤tW, ¤tH);
+
+ int actualWidth = width;
+ int actualHeight = height;
+ int actualX = x;
+ int actualY = y;
+ if (x == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+ actualX = currentX;
+ if (y == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+ actualY = currentY;
+
+ wxSize size( -1 , -1 ) ;
+
+ if (width == -1 || height == -1 )
+ {
+ size = DoGetBestSize() ;
+ }
+
+ if ( width == -1 )
+ {
+ if ( sizeFlags & wxSIZE_AUTO_WIDTH )
+ {
+ actualWidth = size.x ;
+ if ( actualWidth == -1 )
+ actualWidth = 80 ;
+ }
+ else
+ {
+ actualWidth = currentW ;
+ }
+ }
+ if (height == -1)
+ {
+ if ( sizeFlags & wxSIZE_AUTO_HEIGHT )
+ {
+ actualHeight = size.y ;
+ if ( actualHeight == -1 )
+ actualHeight = 26 ;
+ }
+ else
+ {
+ actualHeight = currentH ;
+ }
+ }
+
+ if ((m_minWidth != -1) && (actualWidth < m_minWidth))
+ actualWidth = m_minWidth;
+ if ((m_minHeight != -1) && (actualHeight < m_minHeight))
+ actualHeight = m_minHeight;
+ if ((m_maxWidth != -1) && (actualWidth > m_maxWidth))
+ actualWidth = m_maxWidth;
+ if ((m_maxHeight != -1) && (actualHeight > m_maxHeight))
+ actualHeight = m_maxHeight;
+ if ( actualX == currentX && actualY == currentY && actualWidth == currentW && actualHeight == currentH)
+ {
+ MacRepositionScrollBars() ; // we might have a real position shift
+ return ;
+ }
+
+ AdjustForParentClientOrigin(actualX, actualY, sizeFlags);
+
+
+ bool doMove = false ;
+ bool doResize = false ;
+
+ if ( actualX != former_x || actualY != former_y )
+ {
+ doMove = true ;
+ }
+ if ( actualWidth != former_w || actualHeight != former_h )
+ {
+ doResize = true ;
+ }
+
+ if ( doMove || doResize )
+ {
+ if ( m_macWindowData )
+ {
+ }
+ else
+ {
+ // erase former position
+ wxMacDrawingHelper focus( this ) ;
+ if ( focus.Ok() )
+ {
+ Rect clientrect = { 0 , 0 , m_height , m_width } ;
+ // ClipRect( &clientrect ) ;
+ InvalWindowRect( GetMacRootWindow() , &clientrect ) ;
+ }
+ }
+ m_x = actualX ;
+ m_y = actualY ;
+ m_width = actualWidth ;
+ m_height = actualHeight ;
+ if ( m_macWindowData )
+ {
+ if ( doMove )
+ ::MoveWindow(m_macWindowData->m_macWindow, m_x, m_y , false); // don't make frontmost
+
+ if ( doResize )
+ ::SizeWindow(m_macWindowData->m_macWindow, m_width, m_height , true);
+
+ // the OS takes care of invalidating and erasing the new area
+ // we have erased the old one
+
+ if ( IsKindOf( CLASSINFO( wxFrame ) ) )
+ {
+ wxFrame* frame = (wxFrame*) this ;
+ frame->PositionStatusBar();
+ frame->PositionToolBar();
+ }
+ }
+ else
+ {
+ // erase new position
+
+ {
+ wxMacDrawingHelper focus( this ) ;
+ if ( focus.Ok() )
+ {
+ Rect clientrect = { 0 , 0 , m_height , m_width } ;
+ // ClipRect( &clientrect ) ;
+ InvalWindowRect( GetMacRootWindow() , &clientrect ) ;
+ }
+ }
+
+ if ( doMove )
+ wxWindow::MacSuperChangedPosition() ; // like this only children will be notified
+ }
+ MacRepositionScrollBars() ;
+ if ( doMove )
+ {
+ wxMoveEvent event(wxPoint(m_x, m_y), m_windowId);
+ event.SetEventObject(this);
+ GetEventHandler()->ProcessEvent(event) ;
+ }
+ if ( doResize )
+ {
+ MacRepositionScrollBars() ;
+ wxSizeEvent event(wxSize(m_width, m_height), m_windowId);
+ event.SetEventObject(this);
+ GetEventHandler()->ProcessEvent(event);
+ }
+ }
+}