several mac fixes (Mark Newsams patches)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10975 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -143,7 +143,50 @@ void wxControl::SetLabel(const wxString& title)
|
||||
|
||||
wxSize wxControl::DoGetBestSize() const
|
||||
{
|
||||
return wxSize(20, 20);
|
||||
Rect bestsize = { 0 , 0 , 0 , 0 } ;
|
||||
short baselineoffset ;
|
||||
int bestWidth, bestHeight ;
|
||||
UMAGetBestControlRect( m_macControl , &bestsize , &baselineoffset ) ;
|
||||
|
||||
if ( EmptyRect( &bestsize ) )
|
||||
{
|
||||
baselineoffset = 0;
|
||||
bestsize.left = bestsize.top = 0 ;
|
||||
bestsize.right = 16 ;
|
||||
bestsize.bottom = 16 ;
|
||||
if ( IsKindOf( CLASSINFO( wxScrollBar ) ) )
|
||||
{
|
||||
bestsize.bottom = 16 ;
|
||||
}
|
||||
else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) )
|
||||
{
|
||||
bestsize.bottom = 24 ;
|
||||
}
|
||||
}
|
||||
|
||||
if ( IsKindOf( CLASSINFO( wxButton ) ) )
|
||||
{
|
||||
bestWidth = m_label.Length() * 8 + 12 ;
|
||||
if ( bestWidth < 70 )
|
||||
bestWidth = 70 ;
|
||||
}
|
||||
else if ( IsKindOf( CLASSINFO( wxStaticText ) ) )
|
||||
{
|
||||
bestWidth = m_label.Length() * 8 ;
|
||||
}
|
||||
else
|
||||
bestWidth = bestsize.right - bestsize.left ;
|
||||
|
||||
bestWidth += 2 * m_macHorizontalBorder ;
|
||||
|
||||
bestHeight = bestsize.bottom - bestsize.top ;
|
||||
if ( bestHeight < 10 )
|
||||
bestHeight = 13 ;
|
||||
|
||||
bestHeight += 2 * m_macVerticalBorder;
|
||||
|
||||
|
||||
return wxSize(bestWidth, bestHeight);
|
||||
}
|
||||
|
||||
bool wxControl::ProcessCommand (wxCommandEvent & event)
|
||||
@@ -203,7 +246,7 @@ void wxControl::MacPreControlCreate( wxWindow *parent, wxWindowID id, wxString l
|
||||
SetValidator(validator);
|
||||
|
||||
m_windowStyle = style;
|
||||
parent->AddChild((wxButton *)this);
|
||||
parent->AddChild(this);
|
||||
|
||||
m_backgroundColour = parent->GetBackgroundColour() ;
|
||||
m_foregroundColour = parent->GetForegroundColour() ;
|
||||
@@ -213,20 +256,17 @@ void wxControl::MacPreControlCreate( wxWindow *parent, wxWindowID id, wxString l
|
||||
else
|
||||
m_windowId = id;
|
||||
|
||||
// These sizes will be adjusted in MacPostControlCreate
|
||||
|
||||
m_width = size.x ;
|
||||
m_height = size.y ;
|
||||
int x = pos.x ;
|
||||
int y = pos.y ;
|
||||
AdjustForParentClientOrigin(x, y, wxSIZE_USE_EXISTING);
|
||||
m_x = x ;
|
||||
m_y = y ;
|
||||
m_x = pos.x ;
|
||||
m_y = pos.y ;
|
||||
|
||||
|
||||
parent->MacClientToRootWindow( &x , &y ) ;
|
||||
outBounds->top = y + m_macVerticalBorder ;
|
||||
outBounds->left = x + m_macHorizontalBorder ;
|
||||
outBounds->bottom = outBounds->top + m_height - 2 * m_macVerticalBorder;
|
||||
outBounds->right = outBounds->left + m_width - 2 * m_macHorizontalBorder ;
|
||||
outBounds->top = -10;
|
||||
outBounds->left = -10;
|
||||
outBounds->bottom = 0;
|
||||
outBounds->right = 0;
|
||||
|
||||
char c_text[255];
|
||||
strcpy( c_text , label ) ;
|
||||
@@ -268,17 +308,35 @@ void wxControl::MacPostControlCreate()
|
||||
::UMASetControlFontStyle( m_macControl , &controlstyle ) ;
|
||||
}
|
||||
ControlHandle container = GetParent()->MacGetContainerForEmbedding() ;
|
||||
wxASSERT_MSG( container != NULL , "No valid mac container control" ) ;
|
||||
wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ;
|
||||
::UMAEmbedControl( m_macControl , container ) ;
|
||||
m_macControlIsShown = true ;
|
||||
MacAdjustControlRect() ;
|
||||
|
||||
wxAssociateControlWithMacControl( m_macControl , this ) ;
|
||||
UMAShowControl( m_macControl ) ;
|
||||
|
||||
|
||||
// Adjust the controls size and position
|
||||
wxPoint pos(m_x, m_y);
|
||||
wxSize best_size( DoGetBestSize() );
|
||||
wxSize new_size( m_width, m_height );
|
||||
|
||||
m_x = m_y = m_width = m_height = -1; // Forces SetSize to move/size the control
|
||||
|
||||
if (new_size.x == -1) {
|
||||
new_size.x = best_size.x;
|
||||
}
|
||||
if (new_size.y == -1) {
|
||||
new_size.y = best_size.y;
|
||||
}
|
||||
|
||||
SetSize(pos.x, pos.y, new_size.x, new_size.y);
|
||||
|
||||
UMAShowControl( m_macControl ) ;
|
||||
}
|
||||
|
||||
void wxControl::MacAdjustControlRect()
|
||||
{
|
||||
wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
|
||||
wxASSERT_MSG( m_macControl != NULL , wxT("No valid mac control") ) ;
|
||||
if ( m_width == -1 || m_height == -1 )
|
||||
{
|
||||
Rect bestsize = { 0 , 0 , 0 , 0 } ;
|
||||
@@ -453,102 +511,127 @@ void wxControl::DoSetSize(int x, int y,
|
||||
return ;
|
||||
}
|
||||
|
||||
WindowRef rootwindow = GetMacRootWindow() ;
|
||||
wxWindow* wxrootwindow = wxFindWinFromMacWindow( rootwindow ) ;
|
||||
UMASetThemeWindowBackground( rootwindow , kThemeBrushDialogBackgroundActive , false ) ;
|
||||
|
||||
int former_x = m_x ;
|
||||
int former_y = m_y ;
|
||||
int former_w = m_width ;
|
||||
int former_h = m_height ;
|
||||
|
||||
Rect contrlRect ;
|
||||
GetControlBounds( m_macControl , &contrlRect ) ;
|
||||
int former_mac_x = contrlRect.left ;
|
||||
int former_mac_y = contrlRect.top ;
|
||||
|
||||
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;
|
||||
if (width == -1)
|
||||
actualWidth = currentW ;
|
||||
if (height == -1)
|
||||
actualHeight = currentH ;
|
||||
|
||||
if ( actualX == currentX && actualY == currentY && actualWidth == currentW && actualHeight == currentH)
|
||||
return ;
|
||||
|
||||
AdjustForParentClientOrigin(actualX, actualY, sizeFlags);
|
||||
WindowRef macrootwindow = GetMacRootWindow() ;
|
||||
wxMacDrawingHelper focus( wxFindWinFromMacWindow( macrootwindow ) ) ;
|
||||
|
||||
int mac_x = actualX ;
|
||||
int mac_y = actualY ;
|
||||
GetParent()->MacClientToRootWindow( & mac_x , & mac_y ) ;
|
||||
|
||||
if ( mac_x != former_mac_x || mac_y != former_mac_y )
|
||||
{
|
||||
{
|
||||
Rect inval = { former_mac_y , former_mac_x , former_mac_y + m_height , former_mac_x + m_width } ;
|
||||
InvalWindowRect( macrootwindow, &inval ) ;
|
||||
}
|
||||
UMAMoveControl( m_macControl , mac_x + m_macHorizontalBorder , mac_y + m_macVerticalBorder ) ;
|
||||
{
|
||||
Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ;
|
||||
InvalWindowRect(macrootwindow, &inval ) ;
|
||||
}
|
||||
}
|
||||
|
||||
if ( actualX != former_x || actualY != former_y )
|
||||
{
|
||||
m_x = actualX ;
|
||||
m_y = actualY ;
|
||||
|
||||
MacRepositionScrollBars() ;
|
||||
// To consider -> should the parameters be the effective or the virtual coordinates (AdjustForParent..)
|
||||
wxPoint point(m_x, m_y);
|
||||
wxMoveEvent event(point, m_windowId);
|
||||
event.SetEventObject(this);
|
||||
GetEventHandler()->ProcessEvent(event);
|
||||
}
|
||||
if ( actualWidth != former_w || actualHeight != former_h )
|
||||
{
|
||||
{
|
||||
Rect inval = { mac_y , mac_x , mac_y + former_h , mac_x + former_w } ;
|
||||
InvalWindowRect( macrootwindow, &inval ) ;
|
||||
}
|
||||
m_width = actualWidth ;
|
||||
m_height = actualHeight ;
|
||||
|
||||
UMASizeControl( m_macControl , m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ;
|
||||
{
|
||||
Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ;
|
||||
InvalWindowRect( macrootwindow , &inval ) ;
|
||||
}
|
||||
|
||||
MacRepositionScrollBars() ;
|
||||
wxSize size(m_width, m_height);
|
||||
wxSizeEvent event(size, m_windowId);
|
||||
event.SetEventObject(this);
|
||||
GetEventHandler()->ProcessEvent(event);
|
||||
}
|
||||
if ( wxrootwindow->IsKindOf( CLASSINFO( wxDialog ) ) )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
UMASetThemeWindowBackground( rootwindow , kThemeBrushDocumentWindowBackground , false ) ;
|
||||
}
|
||||
Rect oldbounds, newbounds;
|
||||
int new_x, new_y, new_width, new_height;
|
||||
int mac_x, mac_y;
|
||||
|
||||
new_x = m_x;
|
||||
new_y = m_y;
|
||||
new_width = m_width;
|
||||
new_height = m_height;
|
||||
|
||||
if (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)
|
||||
{
|
||||
new_x = x;
|
||||
new_y = y;
|
||||
new_width = width;
|
||||
new_height = height;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (x != -1) new_x = x;
|
||||
if (y != -1) new_y = y;
|
||||
if (width != -1) new_width = width;
|
||||
if (height != -1) new_height = height;
|
||||
}
|
||||
|
||||
if(sizeFlags & wxSIZE_AUTO)
|
||||
{
|
||||
wxSize size = GetBestSize();
|
||||
if (sizeFlags & wxSIZE_AUTO_WIDTH)
|
||||
{
|
||||
if (width == -1) new_width = size.x;
|
||||
}
|
||||
if (sizeFlags & wxSIZE_AUTO_HEIGHT)
|
||||
{
|
||||
if (height == -1) new_height = size.y;
|
||||
}
|
||||
}
|
||||
AdjustForParentClientOrigin(new_x, new_y, sizeFlags);
|
||||
|
||||
mac_x = new_x;
|
||||
mac_y = new_y;
|
||||
if(GetParent()) {
|
||||
GetParent()->MacClientToRootWindow(&mac_x, &mac_y);
|
||||
}
|
||||
GetControlBounds(m_macControl, &oldbounds);
|
||||
oldbounds.right = oldbounds.left + m_width;
|
||||
oldbounds.bottom = oldbounds.top + m_height;
|
||||
|
||||
bool doMove = false;
|
||||
bool doResize = false;
|
||||
|
||||
if ( mac_x != (oldbounds.left - m_macHorizontalBorder) ||
|
||||
mac_y != (oldbounds.top - m_macVerticalBorder) )
|
||||
{
|
||||
doMove = true ;
|
||||
}
|
||||
if ( new_width != oldbounds.right - oldbounds.left - 2 * m_macHorizontalBorder ||
|
||||
new_height != oldbounds.bottom - oldbounds.top - 2 * m_macVerticalBorder)
|
||||
{
|
||||
doResize = true ;
|
||||
}
|
||||
|
||||
if ( doMove || doResize )
|
||||
{
|
||||
// Ensure resize is within constraints
|
||||
if ((m_minWidth != -1) && (new_width < m_minWidth)) {
|
||||
new_width = m_minWidth;
|
||||
}
|
||||
if ((m_minHeight != -1) && (new_height < m_minHeight)) {
|
||||
new_height = m_minHeight;
|
||||
}
|
||||
if ((m_maxWidth != -1) && (new_width > m_maxWidth)) {
|
||||
new_width = m_maxWidth;
|
||||
}
|
||||
if ((m_maxHeight != -1) && (new_height > m_maxHeight)) {
|
||||
new_height = m_maxHeight;
|
||||
}
|
||||
|
||||
if ( doMove )
|
||||
{
|
||||
m_x = new_x;
|
||||
m_y = new_y;
|
||||
|
||||
UMAMoveControl(m_macControl,
|
||||
mac_x + m_macHorizontalBorder, mac_y + m_macVerticalBorder);
|
||||
|
||||
wxMoveEvent event(wxPoint(m_x, m_y), m_windowId);
|
||||
event.SetEventObject(this);
|
||||
GetEventHandler()->ProcessEvent(event) ;
|
||||
}
|
||||
if ( doResize )
|
||||
{
|
||||
m_width = new_width;
|
||||
m_height = new_height;
|
||||
|
||||
UMASizeControl( m_macControl,
|
||||
m_width - 2 * m_macHorizontalBorder,
|
||||
m_height - 2 * m_macVerticalBorder ) ;
|
||||
|
||||
wxSizeEvent event(wxSize(m_width, m_height), m_windowId);
|
||||
event.SetEventObject(this);
|
||||
GetEventHandler()->ProcessEvent(event);
|
||||
}
|
||||
|
||||
// Set up port
|
||||
WindowRef rootwindow = GetMacRootWindow() ;
|
||||
wxWindow* wxrootwindow = wxFindWinFromMacWindow( rootwindow ) ;
|
||||
wxMacDrawingHelper focus( wxrootwindow );
|
||||
|
||||
UMASetThemeWindowBackground( rootwindow , kThemeBrushDialogBackgroundActive , false ) ;
|
||||
// Update window at old and new positions
|
||||
SetRect(&newbounds, m_x, m_y, m_x + m_width, m_y + m_height);
|
||||
InvalWindowRect( rootwindow , &oldbounds );
|
||||
InvalWindowRect( rootwindow , &newbounds );
|
||||
|
||||
MacRepositionScrollBars() ;
|
||||
|
||||
if ( !wxrootwindow->IsKindOf( CLASSINFO( wxDialog ) ) )
|
||||
{
|
||||
UMASetThemeWindowBackground( rootwindow, kThemeBrushDocumentWindowBackground, false );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool wxControl::Show(bool show)
|
||||
@@ -619,7 +702,6 @@ void wxControl::MacRedrawControl()
|
||||
// the mac control manager always assumes to have the origin at 0,0
|
||||
SetOrigin( 0 , 0 ) ;
|
||||
|
||||
bool hasTabBehind = false ;
|
||||
wxWindow* parent = GetParent() ;
|
||||
while ( parent )
|
||||
{
|
||||
@@ -660,8 +742,6 @@ void wxControl::OnPaint(wxPaintEvent& event)
|
||||
// the mac control manager always assumes to have the origin at 0,0
|
||||
SetOrigin( 0 , 0 ) ;
|
||||
|
||||
|
||||
bool hasTabBehind = false ;
|
||||
wxWindow* parent = GetParent() ;
|
||||
while ( parent )
|
||||
{
|
||||
@@ -732,7 +812,6 @@ void wxControl::OnMouseEvent( wxMouseEvent &event )
|
||||
|
||||
ControlHandle control ;
|
||||
Point localwhere ;
|
||||
GrafPtr port ;
|
||||
SInt16 controlpart ;
|
||||
WindowRef window = GetMacRootWindow() ;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user