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:
Stefan Csomor
2001-07-11 20:33:12 +00:00
parent aef94d6860
commit 9453cf2bd7
25 changed files with 1198 additions and 622 deletions

View File

@@ -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(&currentX, &currentY);
int currentW,currentH;
GetSize(&currentW, &currentH);
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() ;