Allow wxSTC to have scrollbars

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16060 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2002-07-06 06:46:24 +00:00
parent 4fcf77bc06
commit 14c9cbdb1e
2 changed files with 276 additions and 272 deletions

View File

@@ -18,7 +18,7 @@
#include "wx/window.h" #include "wx/window.h"
#include "wx/dc.h" #include "wx/dc.h"
#include "wx/dcclient.h" #include "wx/dcclient.h"
#include "wx/utils.h" #include "wx/utils.h"
#include "wx/app.h" #include "wx/app.h"
#include "wx/panel.h" #include "wx/panel.h"
#include "wx/layout.h" #include "wx/layout.h"
@@ -119,7 +119,7 @@ void wxWindowMac::Init()
m_isShown = TRUE; m_isShown = TRUE;
m_x = 0; m_x = 0;
m_y = 0 ; m_y = 0 ;
m_width = 0 ; m_width = 0 ;
m_height = 0 ; m_height = 0 ;
@@ -142,10 +142,10 @@ wxWindowMac::~wxWindowMac()
break ; break ;
} }
iter = iter->GetParent() ; iter = iter->GetParent() ;
} }
} }
m_isBeingDeleted = TRUE; m_isBeingDeleted = TRUE;
#ifndef __WXUNIVERSAL__ #ifndef __WXUNIVERSAL__
@@ -200,7 +200,9 @@ bool wxWindowMac::Create(wxWindowMac *parent, wxWindowID id,
m_width = WidthDefault( size.x ); m_width = WidthDefault( size.x );
m_height = HeightDefault( size.y ) ; m_height = HeightDefault( size.y ) ;
#ifndef __WXUNIVERSAL__ #ifndef __WXUNIVERSAL__
if ( ! IsKindOf( CLASSINFO ( wxControl ) ) && ! IsKindOf( CLASSINFO( wxStatusBar ) ) ) // Don't give scrollbars to wxControls unless they ask for them
if ( (! IsKindOf(CLASSINFO(wxControl)) && ! IsKindOf(CLASSINFO(wxStatusBar))) ||
(IsKindOf(CLASSINFO(wxControl)) && ( style & wxHSCROLL || style & wxVSCROLL)))
{ {
MacCreateScrollBars( style ) ; MacCreateScrollBars( style ) ;
} }
@@ -212,7 +214,7 @@ void wxWindowMac::SetFocus()
{ {
if ( gFocusWindow == this ) if ( gFocusWindow == this )
return ; return ;
if ( AcceptsFocus() ) if ( AcceptsFocus() )
{ {
if (gFocusWindow ) if (gFocusWindow )
@@ -321,7 +323,7 @@ void wxWindowMac::DoGetSize(int *x, int *y) const
void wxWindowMac::DoGetPosition(int *x, int *y) const void wxWindowMac::DoGetPosition(int *x, int *y) const
{ {
int xx,yy; int xx,yy;
xx = m_x ; xx = m_x ;
yy = m_y ; yy = m_y ;
if ( !IsTopLevel() && GetParent()) if ( !IsTopLevel() && GetParent())
@@ -360,7 +362,7 @@ void wxWindowMac::DoScreenToClient(int *x, int *y) const
if(x) localwhere.h = * x ; if(x) localwhere.h = * x ;
if(y) localwhere.v = * y ; if(y) localwhere.v = * y ;
GrafPtr port ; GrafPtr port ;
::GetPort( &port ) ; ::GetPort( &port ) ;
::SetPort( UMAGetWindowPort( window ) ) ; ::SetPort( UMAGetWindowPort( window ) ) ;
::GlobalToLocal( &localwhere ) ; ::GlobalToLocal( &localwhere ) ;
@@ -368,7 +370,7 @@ void wxWindowMac::DoScreenToClient(int *x, int *y) const
if(x) *x = localwhere.h ; if(x) *x = localwhere.h ;
if(y) *y = localwhere.v ; if(y) *y = localwhere.v ;
MacRootWindowToWindow( x , y ) ; MacRootWindowToWindow( x , y ) ;
if ( x ) if ( x )
x -= MacGetLeftBorderSize() ; x -= MacGetLeftBorderSize() ;
@@ -379,19 +381,19 @@ void wxWindowMac::DoScreenToClient(int *x, int *y) const
void wxWindowMac::DoClientToScreen(int *x, int *y) const void wxWindowMac::DoClientToScreen(int *x, int *y) const
{ {
WindowRef window = (WindowRef) MacGetRootWindow() ; WindowRef window = (WindowRef) MacGetRootWindow() ;
if ( x ) if ( x )
x += MacGetLeftBorderSize() ; x += MacGetLeftBorderSize() ;
if ( y ) if ( y )
y += MacGetTopBorderSize() ; y += MacGetTopBorderSize() ;
MacWindowToRootWindow( x , y ) ; MacWindowToRootWindow( x , y ) ;
Point localwhere = { 0,0 }; Point localwhere = { 0,0 };
if(x) localwhere.h = * x ; if(x) localwhere.h = * x ;
if(y) localwhere.v = * y ; if(y) localwhere.v = * y ;
GrafPtr port ; GrafPtr port ;
::GetPort( &port ) ; ::GetPort( &port ) ;
::SetPort( UMAGetWindowPort( window ) ) ; ::SetPort( UMAGetWindowPort( window ) ) ;
@@ -406,7 +408,7 @@ void wxWindowMac::MacClientToRootWindow( int *x , int *y ) const
wxPoint origin = GetClientAreaOrigin() ; wxPoint origin = GetClientAreaOrigin() ;
if(x) *x += origin.x ; if(x) *x += origin.x ;
if(y) *y += origin.y ; if(y) *y += origin.y ;
MacWindowToRootWindow( x , y ) ; MacWindowToRootWindow( x , y ) ;
} }
@@ -460,7 +462,7 @@ bool wxWindowMac::SetCursor(const wxCursor& cursor)
Point pt ; Point pt ;
wxWindowMac *mouseWin ; wxWindowMac *mouseWin ;
GetMouse( &pt ) ; GetMouse( &pt ) ;
// Change the cursor NOW if we're within the correct window // Change the cursor NOW if we're within the correct window
if ( MacGetWindowFromPoint( wxPoint( pt.h , pt.v ) , &mouseWin ) ) if ( MacGetWindowFromPoint( wxPoint( pt.h , pt.v ) , &mouseWin ) )
@@ -484,19 +486,19 @@ void wxWindowMac::DoGetClientSize(int *x, int *y) const
ww -= MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ; ww -= MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ;
hh -= MacGetTopBorderSize( ) + MacGetBottomBorderSize( ); hh -= MacGetTopBorderSize( ) + MacGetBottomBorderSize( );
if ( (m_vScrollBar && m_vScrollBar->IsShown()) || (m_hScrollBar && m_hScrollBar->IsShown()) ) if ( (m_vScrollBar && m_vScrollBar->IsShown()) || (m_hScrollBar && m_hScrollBar->IsShown()) )
{ {
int x1 = 0 ; int x1 = 0 ;
int y1 = 0 ; int y1 = 0 ;
int w = m_width ; int w = m_width ;
int h = m_height ; int h = m_height ;
MacClientToRootWindow( &x1 , &y1 ) ; MacClientToRootWindow( &x1 , &y1 ) ;
MacClientToRootWindow( &w , &h ) ; MacClientToRootWindow( &w , &h ) ;
wxWindowMac *iter = (wxWindowMac*)this ; wxWindowMac *iter = (wxWindowMac*)this ;
int totW = 10000 , totH = 10000; int totW = 10000 , totH = 10000;
while( iter ) while( iter )
{ {
@@ -508,8 +510,8 @@ void wxWindowMac::DoGetClientSize(int *x, int *y) const
} }
iter = iter->GetParent() ; iter = iter->GetParent() ;
} }
if (m_hScrollBar && m_hScrollBar->IsShown() ) if (m_hScrollBar && m_hScrollBar->IsShown() )
{ {
hh -= MAC_SCROLLBAR_SIZE; hh -= MAC_SCROLLBAR_SIZE;
@@ -554,24 +556,24 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
int former_y = m_y ; int former_y = m_y ;
int former_w = m_width ; int former_w = m_width ;
int former_h = m_height ; int former_h = m_height ;
int actualWidth = width; int actualWidth = width;
int actualHeight = height; int actualHeight = height;
int actualX = x; int actualX = x;
int actualY = y; int actualY = y;
if ((m_minWidth != -1) && (actualWidth < m_minWidth)) if ((m_minWidth != -1) && (actualWidth < m_minWidth))
actualWidth = m_minWidth; actualWidth = m_minWidth;
if ((m_minHeight != -1) && (actualHeight < m_minHeight)) if ((m_minHeight != -1) && (actualHeight < m_minHeight))
actualHeight = m_minHeight; actualHeight = m_minHeight;
if ((m_maxWidth != -1) && (actualWidth > m_maxWidth)) if ((m_maxWidth != -1) && (actualWidth > m_maxWidth))
actualWidth = m_maxWidth; actualWidth = m_maxWidth;
if ((m_maxHeight != -1) && (actualHeight > m_maxHeight)) if ((m_maxHeight != -1) && (actualHeight > m_maxHeight))
actualHeight = m_maxHeight; actualHeight = m_maxHeight;
bool doMove = false ; bool doMove = false ;
bool doResize = false ; bool doResize = false ;
if ( actualX != former_x || actualY != former_y ) if ( actualX != former_x || actualY != former_y )
{ {
doMove = true ; doMove = true ;
@@ -615,7 +617,7 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
GetEventHandler()->ProcessEvent(event); GetEventHandler()->ProcessEvent(event);
} }
} }
} }
// set the size of the window: if the dimensions are positive, just use them, // set the size of the window: if the dimensions are positive, just use them,
@@ -631,7 +633,7 @@ void wxWindowMac::DoSetSize(int x, int y, int width, int height, int sizeFlags)
// get the current size and position... // get the current size and position...
int currentX, currentY; int currentX, currentY;
GetPosition(&currentX, &currentY); GetPosition(&currentX, &currentY);
int currentW,currentH; int currentW,currentH;
GetSize(&currentW, &currentH); GetSize(&currentW, &currentH);
@@ -715,24 +717,24 @@ bool wxWindowMac::Show(bool show)
wxWindowMac* win = wxFindWinFromMacWindow( window ) ; wxWindowMac* win = wxFindWinFromMacWindow( window ) ;
if ( win == NULL && win->m_isBeingDeleted ) if ( win == NULL && win->m_isBeingDeleted )
return FALSE ; return FALSE ;
*/ */
MacSuperShown( show ) ; MacSuperShown( show ) ;
Refresh() ; Refresh() ;
/* /*
if ( !show ) if ( !show )
{ {
if ( win && !win->m_isBeingDeleted ) if ( win && !win->m_isBeingDeleted )
Refresh() ; Refresh() ;
} }
else else
{ {
Refresh() ; Refresh() ;
} }
*/ */
return TRUE; return TRUE;
} }
void wxWindowMac::MacSuperShown( bool show ) void wxWindowMac::MacSuperShown( bool show )
{ {
wxNode *node = GetChildren().First(); wxNode *node = GetChildren().First();
while ( node ) while ( node )
@@ -744,11 +746,11 @@ void wxWindowMac::MacSuperShown( bool show )
} }
} }
void wxWindowMac::MacSuperEnabled( bool enabled ) void wxWindowMac::MacSuperEnabled( bool enabled )
{ {
if ( !IsTopLevel() ) if ( !IsTopLevel() )
{ {
// to be absolutely correct we'd have to invalidate (with eraseBkground // to be absolutely correct we'd have to invalidate (with eraseBkground
// because unter MacOSX the frames are drawn with an addXXX mode) // because unter MacOSX the frames are drawn with an addXXX mode)
// the borders area // the borders area
} }
@@ -762,13 +764,13 @@ void wxWindowMac::MacSuperEnabled( bool enabled )
} }
} }
bool wxWindowMac::MacIsReallyShown() const bool wxWindowMac::MacIsReallyShown() const
{ {
if ( m_isShown && (m_parent != NULL) ) { if ( m_isShown && (m_parent != NULL) ) {
return m_parent->MacIsReallyShown(); return m_parent->MacIsReallyShown();
} }
return m_isShown; return m_isShown;
/* /*
bool status = m_isShown ; bool status = m_isShown ;
wxWindowMac * win = this ; wxWindowMac * win = this ;
while ( status && win->m_parent != NULL ) while ( status && win->m_parent != NULL )
@@ -798,7 +800,7 @@ void wxWindowMac::GetTextExtent(const wxString& string, int *x, int *y,
const wxFont *fontToUse = theFont; const wxFont *fontToUse = theFont;
if ( !fontToUse ) if ( !fontToUse )
fontToUse = &m_font; fontToUse = &m_font;
wxClientDC dc( (wxWindowMac*) this ) ; wxClientDC dc( (wxWindowMac*) this ) ;
long lx,ly,ld,le ; long lx,ly,ld,le ;
dc.GetTextExtent( string , &lx , &ly , &ld, &le, (wxFont *)fontToUse ) ; dc.GetTextExtent( string , &lx , &ly , &ld, &le, (wxFont *)fontToUse ) ;
@@ -813,15 +815,15 @@ void wxWindowMac::GetTextExtent(const wxString& string, int *x, int *y,
} }
/* /*
* Rect is given in client coordinates, for further reading, read wxTopLevelWindowMac::InvalidateRect * Rect is given in client coordinates, for further reading, read wxTopLevelWindowMac::InvalidateRect
* we always intersect with the entire window, not only with the client area * we always intersect with the entire window, not only with the client area
*/ */
void wxWindowMac::Refresh(bool eraseBack, const wxRect *rect) void wxWindowMac::Refresh(bool eraseBack, const wxRect *rect)
{ {
if ( MacGetTopLevelWindow() == NULL ) if ( MacGetTopLevelWindow() == NULL )
return ; return ;
wxPoint client = GetClientAreaOrigin(); wxPoint client = GetClientAreaOrigin();
int x1 = -client.x; int x1 = -client.x;
int y1 = -client.y; int y1 = -client.y;
@@ -838,20 +840,20 @@ void wxWindowMac::Refresh(bool eraseBack, const wxRect *rect)
} }
Rect clientrect = { y1, x1, y2, x2 }; Rect clientrect = { y1, x1, y2, x2 };
if ( rect ) if ( rect )
{ {
Rect r = { rect->y , rect->x , rect->y + rect->height , rect->x + rect->width } ; Rect r = { rect->y , rect->x , rect->y + rect->height , rect->x + rect->width } ;
SectRect( &clientrect , &r , &clientrect ) ; SectRect( &clientrect , &r , &clientrect ) ;
} }
if ( !EmptyRect( &clientrect ) ) if ( !EmptyRect( &clientrect ) )
{ {
int top = 0 , left = 0 ; int top = 0 , left = 0 ;
MacClientToRootWindow( &left , &top ) ; MacClientToRootWindow( &left , &top ) ;
OffsetRect( &clientrect , left , top ) ; OffsetRect( &clientrect , left , top ) ;
MacGetTopLevelWindow()->MacInvalidate( &clientrect , eraseBack ) ; MacGetTopLevelWindow()->MacInvalidate( &clientrect , eraseBack ) ;
} }
} }
@@ -910,7 +912,7 @@ void wxWindowMac::WarpPointer (int x_pos, int y_pos)
// We really dont move the mouse programmatically under mac // We really dont move the mouse programmatically under mac
} }
const wxBrush& wxWindowMac::MacGetBackgroundBrush() const wxBrush& wxWindowMac::MacGetBackgroundBrush()
{ {
if ( m_backgroundColour == wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE) ) if ( m_backgroundColour == wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE) )
{ {
@@ -921,9 +923,9 @@ const wxBrush& wxWindowMac::MacGetBackgroundBrush()
// on mac we have the difficult situation, that 3dface gray can be different colours, depending whether // on mac we have the difficult situation, that 3dface gray can be different colours, depending whether
// it is on a notebook panel or not, in order to take care of that we walk up the hierarchy until we have // it is on a notebook panel or not, in order to take care of that we walk up the hierarchy until we have
// either a non gray background color or a non control window // either a non gray background color or a non control window
WindowRef window = (WindowRef) MacGetRootWindow() ; WindowRef window = (WindowRef) MacGetRootWindow() ;
wxWindowMac* parent = GetParent() ; wxWindowMac* parent = GetParent() ;
while( parent ) while( parent )
{ {
@@ -935,7 +937,7 @@ const wxBrush& wxWindowMac::MacGetBackgroundBrush()
} }
{ {
if ( parent->m_backgroundColour != wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE ) if ( parent->m_backgroundColour != wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE )
&& parent->m_backgroundColour != wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE) ) && parent->m_backgroundColour != wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE) )
{ {
// if we have any other colours in the hierarchy // if we have any other colours in the hierarchy
@@ -972,7 +974,7 @@ const wxBrush& wxWindowMac::MacGetBackgroundBrush()
} }
return m_macBackgroundBrush ; return m_macBackgroundBrush ;
} }
void wxWindowMac::OnEraseBackground(wxEraseEvent& event) void wxWindowMac::OnEraseBackground(wxEraseEvent& event)
@@ -984,7 +986,7 @@ void wxWindowMac::OnNcPaint( wxNcPaintEvent& event )
{ {
wxWindowDC dc(this) ; wxWindowDC dc(this) ;
wxMacPortSetter helper(&dc) ; wxMacPortSetter helper(&dc) ;
MacPaintBorders( dc.m_macLocalOrigin.x , dc.m_macLocalOrigin.y) ; MacPaintBorders( dc.m_macLocalOrigin.x , dc.m_macLocalOrigin.y) ;
} }
@@ -1049,11 +1051,11 @@ void wxWindowMac::SetScrollPos(int orient, int pos, bool refresh)
} }
} }
void wxWindowMac::MacPaintBorders( int left , int top ) void wxWindowMac::MacPaintBorders( int left , int top )
{ {
if( IsTopLevel() ) if( IsTopLevel() )
return ; return ;
RGBColor white = { 0xFFFF, 0xFFFF , 0xFFFF } ; RGBColor white = { 0xFFFF, 0xFFFF , 0xFFFF } ;
RGBColor black = { 0x0000, 0x0000 , 0x0000 } ; RGBColor black = { 0x0000, 0x0000 , 0x0000 } ;
RGBColor face = { 0xDDDD, 0xDDDD , 0xDDDD } ; RGBColor face = { 0xDDDD, 0xDDDD , 0xDDDD } ;
@@ -1070,7 +1072,7 @@ void wxWindowMac::MacPaintBorders( int left , int top )
InsetRect( &rect , border , border ); InsetRect( &rect , border , border );
DrawThemeListBoxFrame(&rect,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ; DrawThemeListBoxFrame(&rect,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ;
*/ */
DrawThemePrimaryGroup(&rect ,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ; DrawThemePrimaryGroup(&rect ,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ;
#else #else
bool sunken = HasFlag( wxSUNKEN_BORDER ) ; bool sunken = HasFlag( wxSUNKEN_BORDER ) ;
@@ -1118,7 +1120,7 @@ void wxWindowMac::RemoveChild( wxWindowBase *child )
m_hScrollBar = NULL ; m_hScrollBar = NULL ;
if ( child == m_vScrollBar ) if ( child == m_vScrollBar )
m_vScrollBar = NULL ; m_vScrollBar = NULL ;
wxWindowBase::RemoveChild( child ) ; wxWindowBase::RemoveChild( child ) ;
} }
@@ -1178,15 +1180,15 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
ClipRect( &scrollrect ) ; ClipRect( &scrollrect ) ;
if ( rect ) if ( rect )
{ {
Rect r = { dc.YLOG2DEVMAC(rect->y) , dc.XLOG2DEVMAC(rect->x) , dc.YLOG2DEVMAC(rect->y + rect->height) , Rect r = { dc.YLOG2DEVMAC(rect->y) , dc.XLOG2DEVMAC(rect->x) , dc.YLOG2DEVMAC(rect->y + rect->height) ,
dc.XLOG2DEVMAC(rect->x + rect->width) } ; dc.XLOG2DEVMAC(rect->x + rect->width) } ;
SectRect( &scrollrect , &r , &scrollrect ) ; SectRect( &scrollrect , &r , &scrollrect ) ;
} }
ScrollRect( &scrollrect , dx , dy , updateRgn ) ; ScrollRect( &scrollrect , dx , dy , updateRgn ) ;
InvalWindowRgn( (WindowRef) MacGetRootWindow() , updateRgn ) ; InvalWindowRgn( (WindowRef) MacGetRootWindow() , updateRgn ) ;
DisposeRgn( updateRgn ) ; DisposeRgn( updateRgn ) ;
} }
for (wxNode *node = GetChildren().First(); node; node = node->Next()) for (wxNode *node = GetChildren().First(); node; node = node->Next())
{ {
wxWindowMac *child = (wxWindowMac*)node->Data(); wxWindowMac *child = (wxWindowMac*)node->Data();
@@ -1199,7 +1201,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
child->GetSize( &w, &h ); child->GetSize( &w, &h );
child->SetSize( x+dx, y+dy, w, h ); child->SetSize( x+dx, y+dy, w, h );
} }
} }
void wxWindowMac::MacOnScroll(wxScrollEvent &event ) void wxWindowMac::MacOnScroll(wxScrollEvent &event )
@@ -1210,7 +1212,7 @@ void wxWindowMac::MacOnScroll(wxScrollEvent &event )
wevent.SetPosition(event.GetPosition()); wevent.SetPosition(event.GetPosition());
wevent.SetOrientation(event.GetOrientation()); wevent.SetOrientation(event.GetOrientation());
wevent.m_eventObject = this; wevent.m_eventObject = this;
if (event.m_eventType == wxEVT_SCROLL_TOP) { if (event.m_eventType == wxEVT_SCROLL_TOP) {
wevent.m_eventType = wxEVT_SCROLLWIN_TOP; wevent.m_eventType = wxEVT_SCROLLWIN_TOP;
} else } else
@@ -1232,7 +1234,7 @@ void wxWindowMac::MacOnScroll(wxScrollEvent &event )
if (event.m_eventType == wxEVT_SCROLL_THUMBTRACK) { if (event.m_eventType == wxEVT_SCROLL_THUMBTRACK) {
wevent.m_eventType = wxEVT_SCROLLWIN_THUMBTRACK; wevent.m_eventType = wxEVT_SCROLLWIN_THUMBTRACK;
} }
GetEventHandler()->ProcessEvent(wevent); GetEventHandler()->ProcessEvent(wevent);
} }
} }
@@ -1282,7 +1284,7 @@ void wxWindowMac::OnSetFocus(wxFocusEvent& event)
// notice that it's also important to do it upwards the tree becaus // notice that it's also important to do it upwards the tree becaus
// otherwise when the top level panel gets focus, it won't set it back to // otherwise when the top level panel gets focus, it won't set it back to
// us, but to some other sibling // us, but to some other sibling
// CS:don't know if this is still needed: // CS:don't know if this is still needed:
//wxChildFocusEvent eventFocus(this); //wxChildFocusEvent eventFocus(this);
//(void)GetEventHandler()->ProcessEvent(eventFocus); //(void)GetEventHandler()->ProcessEvent(eventFocus);
@@ -1341,7 +1343,7 @@ void wxWindowMac::DoSetClientSize(int width, int height)
{ {
if ( width != -1 || height != -1 ) if ( width != -1 || height != -1 )
{ {
if ( width != -1 && m_vScrollBar ) if ( width != -1 && m_vScrollBar )
width += MAC_SCROLLBAR_SIZE ; width += MAC_SCROLLBAR_SIZE ;
if ( height != -1 && m_vScrollBar ) if ( height != -1 && m_vScrollBar )
@@ -1357,7 +1359,7 @@ void wxWindowMac::DoSetClientSize(int width, int height)
wxWindowMac* wxWindowMac::s_lastMouseWindow = NULL ; wxWindowMac* wxWindowMac::s_lastMouseWindow = NULL ;
bool wxWindowMac::MacGetWindowFromPointSub( const wxPoint &point , wxWindowMac** outWin ) bool wxWindowMac::MacGetWindowFromPointSub( const wxPoint &point , wxWindowMac** outWin )
{ {
if ( IsTopLevel() ) if ( IsTopLevel() )
{ {
@@ -1371,7 +1373,7 @@ bool wxWindowMac::MacGetWindowFromPointSub( const wxPoint &point , wxWindowMac**
(point.x > (m_x + m_width)) || (point.y > (m_y + m_height))) (point.x > (m_x + m_width)) || (point.y > (m_y + m_height)))
return FALSE; return FALSE;
} }
WindowRef window = (WindowRef) MacGetRootWindow() ; WindowRef window = (WindowRef) MacGetRootWindow() ;
wxPoint newPoint( point ) ; wxPoint newPoint( point ) ;
@@ -1381,7 +1383,7 @@ bool wxWindowMac::MacGetWindowFromPointSub( const wxPoint &point , wxWindowMac**
newPoint.x -= m_x; newPoint.x -= m_x;
newPoint.y -= m_y; newPoint.y -= m_y;
} }
for (wxNode *node = GetChildren().First(); node; node = node->Next()) for (wxNode *node = GetChildren().First(); node; node = node->Next())
{ {
wxWindowMac *child = (wxWindowMac*)node->Data(); wxWindowMac *child = (wxWindowMac*)node->Data();
@@ -1397,28 +1399,28 @@ bool wxWindowMac::MacGetWindowFromPointSub( const wxPoint &point , wxWindowMac**
return TRUE; return TRUE;
} }
bool wxWindowMac::MacGetWindowFromPoint( const wxPoint &screenpoint , wxWindowMac** outWin ) bool wxWindowMac::MacGetWindowFromPoint( const wxPoint &screenpoint , wxWindowMac** outWin )
{ {
WindowRef window ; WindowRef window ;
Point pt = { screenpoint.y , screenpoint.x } ; Point pt = { screenpoint.y , screenpoint.x } ;
if ( ::FindWindow( pt , &window ) == 3 ) if ( ::FindWindow( pt , &window ) == 3 )
{ {
wxWindowMac* win = wxFindWinFromMacWindow( window ) ; wxWindowMac* win = wxFindWinFromMacWindow( window ) ;
if ( win ) if ( win )
{ {
// No, this yields the CLIENT are, we need the whole frame. RR. // No, this yields the CLIENT are, we need the whole frame. RR.
// point = win->ScreenToClient( point ) ; // point = win->ScreenToClient( point ) ;
GrafPtr port; GrafPtr port;
::GetPort( &port ) ; ::GetPort( &port ) ;
::SetPort( UMAGetWindowPort( window ) ) ; ::SetPort( UMAGetWindowPort( window ) ) ;
::GlobalToLocal( &pt ) ; ::GlobalToLocal( &pt ) ;
::SetPort( port ) ; ::SetPort( port ) ;
wxPoint point( pt.h, pt.v ) ; wxPoint point( pt.h, pt.v ) ;
return win->MacGetWindowFromPointSub( point , outWin ) ; return win->MacGetWindowFromPointSub( point , outWin ) ;
} }
} }
@@ -1433,16 +1435,16 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event)
if ((event.m_x < m_x) || (event.m_y < m_y) || if ((event.m_x < m_x) || (event.m_y < m_y) ||
(event.m_x > (m_x + m_width)) || (event.m_y > (m_y + m_height))) (event.m_x > (m_x + m_width)) || (event.m_y > (m_y + m_height)))
return FALSE; return FALSE;
if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxSpinCtrl ) )) if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxSpinCtrl ) ))
return FALSE ; return FALSE ;
WindowRef window = (WindowRef) MacGetRootWindow() ; WindowRef window = (WindowRef) MacGetRootWindow() ;
event.m_x -= m_x; event.m_x -= m_x;
event.m_y -= m_y; event.m_y -= m_y;
int x = event.m_x ; int x = event.m_x ;
int y = event.m_y ; int y = event.m_y ;
@@ -1459,21 +1461,21 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event)
event.m_x = x ; event.m_x = x ;
event.m_y = y ; event.m_y = y ;
event.SetEventObject( this ) ; event.SetEventObject( this ) ;
if ( wxBusyCursorCount == 0 ) if ( wxBusyCursorCount == 0 )
{ {
m_cursor.MacInstall() ; m_cursor.MacInstall() ;
} }
if ( event.GetEventType() == wxEVT_LEFT_DOWN ) if ( event.GetEventType() == wxEVT_LEFT_DOWN )
{ {
// set focus to this window // set focus to this window
if (AcceptsFocus() && FindFocus()!=this) if (AcceptsFocus() && FindFocus()!=this)
SetFocus(); SetFocus();
} }
#if wxUSE_TOOLTIPS #if wxUSE_TOOLTIPS
if ( event.GetEventType() == wxEVT_MOTION if ( event.GetEventType() == wxEVT_MOTION
|| event.GetEventType() == wxEVT_ENTER_WINDOW || event.GetEventType() == wxEVT_ENTER_WINDOW
|| event.GetEventType() == wxEVT_LEAVE_WINDOW ) || event.GetEventType() == wxEVT_LEAVE_WINDOW )
wxToolTip::RelayEvent( this , event); wxToolTip::RelayEvent( this , event);
@@ -1482,13 +1484,13 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event)
if (gs_lastWhich != this) if (gs_lastWhich != this)
{ {
gs_lastWhich = this; gs_lastWhich = this;
// Double clicks must always occur on the same window // Double clicks must always occur on the same window
if (event.GetEventType() == wxEVT_LEFT_DCLICK) if (event.GetEventType() == wxEVT_LEFT_DCLICK)
event.SetEventType( wxEVT_LEFT_DOWN ); event.SetEventType( wxEVT_LEFT_DOWN );
if (event.GetEventType() == wxEVT_RIGHT_DCLICK) if (event.GetEventType() == wxEVT_RIGHT_DCLICK)
event.SetEventType( wxEVT_RIGHT_DOWN ); event.SetEventType( wxEVT_RIGHT_DOWN );
// Same for mouse up events // Same for mouse up events
if (event.GetEventType() == wxEVT_LEFT_UP) if (event.GetEventType() == wxEVT_LEFT_UP)
return TRUE; return TRUE;
@@ -1525,14 +1527,14 @@ void wxWindowMac::Update()
} }
} }
wxTopLevelWindowMac* wxWindowMac::MacGetTopLevelWindow() const wxTopLevelWindowMac* wxWindowMac::MacGetTopLevelWindow() const
{ {
wxTopLevelWindowMac* win = NULL ; wxTopLevelWindowMac* win = NULL ;
WindowRef window = (WindowRef) MacGetRootWindow() ; WindowRef window = (WindowRef) MacGetRootWindow() ;
if ( window ) if ( window )
{ {
win = wxFindWinFromMacWindow( window ) ; win = wxFindWinFromMacWindow( window ) ;
} }
return win ; return win ;
} }
@@ -1540,7 +1542,7 @@ const wxRegion& wxWindowMac::MacGetVisibleRegion()
{ {
RgnHandle visRgn = NewRgn() ; RgnHandle visRgn = NewRgn() ;
RgnHandle tempRgn = NewRgn() ; RgnHandle tempRgn = NewRgn() ;
SetRectRgn( visRgn , 0 , 0 , m_width , m_height ) ; SetRectRgn( visRgn , 0 , 0 , m_width , m_height ) ;
//TODO : as soon as the new scheme has proven to work correctly, move this to wxStaticBox //TODO : as soon as the new scheme has proven to work correctly, move this to wxStaticBox
@@ -1548,7 +1550,7 @@ const wxRegion& wxWindowMac::MacGetVisibleRegion()
{ {
int borderTop = 14 ; int borderTop = 14 ;
int borderOther = 4 ; int borderOther = 4 ;
SetRectRgn( tempRgn , borderOther , borderTop , m_width - borderOther , m_height - borderOther ) ; SetRectRgn( tempRgn , borderOther , borderTop , m_width - borderOther , m_height - borderOther ) ;
DiffRgn( visRgn , tempRgn , visRgn ) ; DiffRgn( visRgn , tempRgn , visRgn ) ;
} }
@@ -1581,9 +1583,9 @@ const wxRegion& wxWindowMac::MacGetVisibleRegion()
SetRectRgn( tempRgn , child->m_x , child->m_y , child->m_x + child->m_width , child->m_y + child->m_height ) ; SetRectRgn( tempRgn , child->m_x , child->m_y , child->m_x + child->m_width , child->m_y + child->m_height ) ;
DiffRgn( visRgn , tempRgn , visRgn ) ; DiffRgn( visRgn , tempRgn , visRgn ) ;
} }
} }
} }
if ( (GetWindowStyle() & wxCLIP_SIBLINGS) && GetParent() ) if ( (GetWindowStyle() & wxCLIP_SIBLINGS) && GetParent() )
{ {
bool thisWindowThrough = false ; bool thisWindowThrough = false ;
@@ -1605,7 +1607,7 @@ const wxRegion& wxWindowMac::MacGetVisibleRegion()
SetRectRgn( tempRgn , sibling->m_x - m_x , sibling->m_y - m_y , sibling->m_x + sibling->m_width - m_x , sibling->m_y + sibling->m_height - m_y ) ; SetRectRgn( tempRgn , sibling->m_x - m_x , sibling->m_y - m_y , sibling->m_x + sibling->m_width - m_x , sibling->m_y + sibling->m_height - m_y ) ;
DiffRgn( visRgn , tempRgn , visRgn ) ; DiffRgn( visRgn , tempRgn , visRgn ) ;
} }
} }
} }
m_macVisibleRegion = visRgn ; m_macVisibleRegion = visRgn ;
DisposeRgn( visRgn ) ; DisposeRgn( visRgn ) ;
@@ -1618,16 +1620,16 @@ void wxWindowMac::MacRedraw( WXHRGN updatergnr , long time, bool erase)
RgnHandle updatergn = (RgnHandle) updatergnr ; RgnHandle updatergn = (RgnHandle) updatergnr ;
// updatergn is always already clipped to our boundaries // updatergn is always already clipped to our boundaries
// it is in window coordinates, not in client coordinates // it is in window coordinates, not in client coordinates
WindowRef window = (WindowRef) MacGetRootWindow() ; WindowRef window = (WindowRef) MacGetRootWindow() ;
{ {
// ownUpdateRgn is the area that this window has to repaint, it is in window coordinates // ownUpdateRgn is the area that this window has to repaint, it is in window coordinates
RgnHandle ownUpdateRgn = NewRgn() ; RgnHandle ownUpdateRgn = NewRgn() ;
CopyRgn( updatergn , ownUpdateRgn ) ; CopyRgn( updatergn , ownUpdateRgn ) ;
SectRgn( ownUpdateRgn , (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , ownUpdateRgn ) ; SectRgn( ownUpdateRgn , (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , ownUpdateRgn ) ;
// newupdate is the update region in client coordinates // newupdate is the update region in client coordinates
RgnHandle newupdate = NewRgn() ; RgnHandle newupdate = NewRgn() ;
wxSize point = GetClientSize() ; wxSize point = GetClientSize() ;
@@ -1637,9 +1639,9 @@ void wxWindowMac::MacRedraw( WXHRGN updatergnr , long time, bool erase)
OffsetRgn( newupdate , -origin.x , -origin.y ) ; OffsetRgn( newupdate , -origin.x , -origin.y ) ;
m_updateRegion = newupdate ; m_updateRegion = newupdate ;
DisposeRgn( newupdate ) ; // it's been cloned to m_updateRegion DisposeRgn( newupdate ) ; // it's been cloned to m_updateRegion
if ( erase && !EmptyRgn(ownUpdateRgn) ) if ( erase && !EmptyRgn(ownUpdateRgn) )
{ {
wxWindowDC dc(this); wxWindowDC dc(this);
dc.SetClippingRegion(wxRegion(ownUpdateRgn)); dc.SetClippingRegion(wxRegion(ownUpdateRgn));
wxEraseEvent eevent( GetId(), &dc ); wxEraseEvent eevent( GetId(), &dc );
@@ -1650,19 +1652,19 @@ void wxWindowMac::MacRedraw( WXHRGN updatergnr , long time, bool erase)
eventNc.SetEventObject( this ); eventNc.SetEventObject( this );
GetEventHandler()->ProcessEvent( eventNc ); GetEventHandler()->ProcessEvent( eventNc );
} }
DisposeRgn( ownUpdateRgn ) ; DisposeRgn( ownUpdateRgn ) ;
if ( !m_updateRegion.Empty() ) if ( !m_updateRegion.Empty() )
{ {
wxPaintEvent event; wxPaintEvent event;
event.m_timeStamp = time ; event.m_timeStamp = time ;
event.SetEventObject(this); event.SetEventObject(this);
GetEventHandler()->ProcessEvent(event); GetEventHandler()->ProcessEvent(event);
} }
} }
// now intersect for each of the children their rect with the updateRgn and call MacRedraw recursively // now intersect for each of the children their rect with the updateRgn and call MacRedraw recursively
RgnHandle childupdate = NewRgn() ; RgnHandle childupdate = NewRgn() ;
for (wxNode *node = GetChildren().First(); node; node = node->Next()) for (wxNode *node = GetChildren().First(); node; node = node->Next())
{ {
// calculate the update region for the child windows by intersecting the window rectangle with our own // calculate the update region for the child windows by intersecting the window rectangle with our own
@@ -1679,50 +1681,50 @@ void wxWindowMac::MacRedraw( WXHRGN updatergnr , long time, bool erase)
} }
DisposeRgn( childupdate ) ; DisposeRgn( childupdate ) ;
// eventually a draw grow box here // eventually a draw grow box here
} }
WXHWND wxWindowMac::MacGetRootWindow() const WXHWND wxWindowMac::MacGetRootWindow() const
{ {
wxWindowMac *iter = (wxWindowMac*)this ; wxWindowMac *iter = (wxWindowMac*)this ;
while( iter ) while( iter )
{ {
if ( iter->IsTopLevel() ) if ( iter->IsTopLevel() )
return ((wxTopLevelWindow*)iter)->MacGetWindowRef() ; return ((wxTopLevelWindow*)iter)->MacGetWindowRef() ;
iter = iter->GetParent() ; iter = iter->GetParent() ;
} }
wxASSERT_MSG( 1 , "No valid mac root window" ) ; wxASSERT_MSG( 1 , "No valid mac root window" ) ;
return NULL ; return NULL ;
} }
void wxWindowMac::MacCreateScrollBars( long style ) void wxWindowMac::MacCreateScrollBars( long style )
{ {
wxASSERT_MSG( m_vScrollBar == NULL && m_hScrollBar == NULL , "attempt to create window twice" ) ; wxASSERT_MSG( m_vScrollBar == NULL && m_hScrollBar == NULL , "attempt to create window twice" ) ;
bool hasBoth = ( style & wxVSCROLL ) && ( style & wxHSCROLL ) ; bool hasBoth = ( style & wxVSCROLL ) && ( style & wxHSCROLL ) ;
int adjust = hasBoth ? MAC_SCROLLBAR_SIZE - 1: 0 ; int adjust = hasBoth ? MAC_SCROLLBAR_SIZE - 1: 0 ;
int width, height ; int width, height ;
GetClientSize( &width , &height ) ; GetClientSize( &width , &height ) ;
wxPoint vPoint(width-MAC_SCROLLBAR_SIZE, 0) ; wxPoint vPoint(width-MAC_SCROLLBAR_SIZE, 0) ;
wxSize vSize(MAC_SCROLLBAR_SIZE, height - adjust) ; wxSize vSize(MAC_SCROLLBAR_SIZE, height - adjust) ;
wxPoint hPoint(0 , height-MAC_SCROLLBAR_SIZE ) ; wxPoint hPoint(0 , height-MAC_SCROLLBAR_SIZE ) ;
wxSize hSize( width - adjust, MAC_SCROLLBAR_SIZE) ; wxSize hSize( width - adjust, MAC_SCROLLBAR_SIZE) ;
m_vScrollBar = new wxScrollBar(this, wxWINDOW_VSCROLL, vPoint, m_vScrollBar = new wxScrollBar(this, wxWINDOW_VSCROLL, vPoint,
vSize , wxVERTICAL); vSize , wxVERTICAL);
if ( style & wxVSCROLL ) if ( style & wxVSCROLL )
{ {
} }
else else
{ {
m_vScrollBar->Show(false) ; m_vScrollBar->Show(false) ;
} }
m_hScrollBar = new wxScrollBar(this, wxWINDOW_HSCROLL, hPoint, m_hScrollBar = new wxScrollBar(this, wxWINDOW_HSCROLL, hPoint,
hSize , wxHORIZONTAL); hSize , wxHORIZONTAL);
if ( style & wxHSCROLL ) if ( style & wxHSCROLL )
{ {
@@ -1731,7 +1733,7 @@ void wxWindowMac::MacCreateScrollBars( long style )
{ {
m_hScrollBar->Show(false) ; m_hScrollBar->Show(false) ;
} }
// because the create does not take into account the client area origin // because the create does not take into account the client area origin
MacRepositionScrollBars() ; // we might have a real position shift MacRepositionScrollBars() ; // we might have a real position shift
} }
@@ -1740,30 +1742,30 @@ void wxWindowMac::MacRepositionScrollBars()
{ {
bool hasBoth = ( m_hScrollBar && m_hScrollBar->IsShown()) && ( m_vScrollBar && m_vScrollBar->IsShown()) ; bool hasBoth = ( m_hScrollBar && m_hScrollBar->IsShown()) && ( m_vScrollBar && m_vScrollBar->IsShown()) ;
int adjust = hasBoth ? MAC_SCROLLBAR_SIZE - 1 : 0 ; int adjust = hasBoth ? MAC_SCROLLBAR_SIZE - 1 : 0 ;
// get real client area // get real client area
int width = m_width ; int width = m_width ;
int height = m_height ; int height = m_height ;
width -= MacGetLeftBorderSize() + MacGetRightBorderSize(); width -= MacGetLeftBorderSize() + MacGetRightBorderSize();
height -= MacGetTopBorderSize() + MacGetBottomBorderSize(); height -= MacGetTopBorderSize() + MacGetBottomBorderSize();
wxPoint vPoint(width-MAC_SCROLLBAR_SIZE, 0) ; wxPoint vPoint(width-MAC_SCROLLBAR_SIZE, 0) ;
wxSize vSize(MAC_SCROLLBAR_SIZE, height - adjust) ; wxSize vSize(MAC_SCROLLBAR_SIZE, height - adjust) ;
wxPoint hPoint(0 , height-MAC_SCROLLBAR_SIZE ) ; wxPoint hPoint(0 , height-MAC_SCROLLBAR_SIZE ) ;
wxSize hSize( width - adjust, MAC_SCROLLBAR_SIZE) ; wxSize hSize( width - adjust, MAC_SCROLLBAR_SIZE) ;
int x = 0 ; int x = 0 ;
int y = 0 ; int y = 0 ;
int w = m_width ; int w = m_width ;
int h = m_height ; int h = m_height ;
MacClientToRootWindow( &x , &y ) ; MacClientToRootWindow( &x , &y ) ;
MacClientToRootWindow( &w , &h ) ; MacClientToRootWindow( &w , &h ) ;
wxWindowMac *iter = (wxWindowMac*)this ; wxWindowMac *iter = (wxWindowMac*)this ;
int totW = 10000 , totH = 10000; int totW = 10000 , totH = 10000;
while( iter ) while( iter )
{ {
@@ -1775,8 +1777,8 @@ void wxWindowMac::MacRepositionScrollBars()
} }
iter = iter->GetParent() ; iter = iter->GetParent() ;
} }
if ( x == 0 ) if ( x == 0 )
{ {
hPoint.x = -1 ; hPoint.x = -1 ;
@@ -1787,13 +1789,13 @@ void wxWindowMac::MacRepositionScrollBars()
vPoint.y = -1 ; vPoint.y = -1 ;
vSize.y += 1 ; vSize.y += 1 ;
} }
if ( w-x >= totW ) if ( w-x >= totW )
{ {
hSize.x += 1 ; hSize.x += 1 ;
vPoint.x += 1 ; vPoint.x += 1 ;
} }
if ( h-y >= totH ) if ( h-y >= totH )
{ {
vSize.y += 1 ; vSize.y += 1 ;
@@ -1815,12 +1817,12 @@ bool wxWindowMac::AcceptsFocus() const
return MacCanFocus() && wxWindowBase::AcceptsFocus(); return MacCanFocus() && wxWindowBase::AcceptsFocus();
} }
WXWidget wxWindowMac::MacGetContainerForEmbedding() WXWidget wxWindowMac::MacGetContainerForEmbedding()
{ {
return GetParent()->MacGetContainerForEmbedding() ; return GetParent()->MacGetContainerForEmbedding() ;
} }
void wxWindowMac::MacSuperChangedPosition() void wxWindowMac::MacSuperChangedPosition()
{ {
// only window-absolute structures have to be moved i.e. controls // only window-absolute structures have to be moved i.e. controls
@@ -1833,7 +1835,7 @@ void wxWindowMac::MacSuperChangedPosition()
} }
} }
void wxWindowMac::MacTopLevelWindowChangedPosition() void wxWindowMac::MacTopLevelWindowChangedPosition()
{ {
// only screen-absolute structures have to be moved i.e. glcanvas // only screen-absolute structures have to be moved i.e. glcanvas
@@ -1854,7 +1856,7 @@ long wxWindowMac::MacGetLeftBorderSize( ) const
{ {
SInt32 border = 3 ; SInt32 border = 3 ;
#if wxMAC_USE_THEME_BORDER #if wxMAC_USE_THEME_BORDER
#if TARGET_CARBON #if TARGET_CARBON
GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ; GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ;
#endif #endif
#endif #endif
@@ -1864,7 +1866,7 @@ long wxWindowMac::MacGetLeftBorderSize( ) const
{ {
SInt32 border = 3 ; SInt32 border = 3 ;
#if wxMAC_USE_THEME_BORDER #if wxMAC_USE_THEME_BORDER
#if TARGET_CARBON #if TARGET_CARBON
GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ; GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ;
#endif #endif
#endif #endif
@@ -1895,7 +1897,7 @@ long wxWindowMac::MacGetBottomBorderSize( ) const
return MacGetLeftBorderSize() ; return MacGetLeftBorderSize() ;
} }
long wxWindowMac::MacRemoveBordersFromStyle( long style ) long wxWindowMac::MacRemoveBordersFromStyle( long style )
{ {
return style & ~( wxDOUBLE_BORDER | wxSUNKEN_BORDER | wxRAISED_BORDER | wxBORDER | wxSTATIC_BORDER ) ; return style & ~( wxDOUBLE_BORDER | wxSUNKEN_BORDER | wxRAISED_BORDER | wxBORDER | wxSTATIC_BORDER ) ;
} }

View File

@@ -18,7 +18,7 @@
#include "wx/window.h" #include "wx/window.h"
#include "wx/dc.h" #include "wx/dc.h"
#include "wx/dcclient.h" #include "wx/dcclient.h"
#include "wx/utils.h" #include "wx/utils.h"
#include "wx/app.h" #include "wx/app.h"
#include "wx/panel.h" #include "wx/panel.h"
#include "wx/layout.h" #include "wx/layout.h"
@@ -119,7 +119,7 @@ void wxWindowMac::Init()
m_isShown = TRUE; m_isShown = TRUE;
m_x = 0; m_x = 0;
m_y = 0 ; m_y = 0 ;
m_width = 0 ; m_width = 0 ;
m_height = 0 ; m_height = 0 ;
@@ -142,10 +142,10 @@ wxWindowMac::~wxWindowMac()
break ; break ;
} }
iter = iter->GetParent() ; iter = iter->GetParent() ;
} }
} }
m_isBeingDeleted = TRUE; m_isBeingDeleted = TRUE;
#ifndef __WXUNIVERSAL__ #ifndef __WXUNIVERSAL__
@@ -200,7 +200,9 @@ bool wxWindowMac::Create(wxWindowMac *parent, wxWindowID id,
m_width = WidthDefault( size.x ); m_width = WidthDefault( size.x );
m_height = HeightDefault( size.y ) ; m_height = HeightDefault( size.y ) ;
#ifndef __WXUNIVERSAL__ #ifndef __WXUNIVERSAL__
if ( ! IsKindOf( CLASSINFO ( wxControl ) ) && ! IsKindOf( CLASSINFO( wxStatusBar ) ) ) // Don't give scrollbars to wxControls unless they ask for them
if ( (! IsKindOf(CLASSINFO(wxControl)) && ! IsKindOf(CLASSINFO(wxStatusBar))) ||
(IsKindOf(CLASSINFO(wxControl)) && ( style & wxHSCROLL || style & wxVSCROLL)))
{ {
MacCreateScrollBars( style ) ; MacCreateScrollBars( style ) ;
} }
@@ -212,7 +214,7 @@ void wxWindowMac::SetFocus()
{ {
if ( gFocusWindow == this ) if ( gFocusWindow == this )
return ; return ;
if ( AcceptsFocus() ) if ( AcceptsFocus() )
{ {
if (gFocusWindow ) if (gFocusWindow )
@@ -321,7 +323,7 @@ void wxWindowMac::DoGetSize(int *x, int *y) const
void wxWindowMac::DoGetPosition(int *x, int *y) const void wxWindowMac::DoGetPosition(int *x, int *y) const
{ {
int xx,yy; int xx,yy;
xx = m_x ; xx = m_x ;
yy = m_y ; yy = m_y ;
if ( !IsTopLevel() && GetParent()) if ( !IsTopLevel() && GetParent())
@@ -360,7 +362,7 @@ void wxWindowMac::DoScreenToClient(int *x, int *y) const
if(x) localwhere.h = * x ; if(x) localwhere.h = * x ;
if(y) localwhere.v = * y ; if(y) localwhere.v = * y ;
GrafPtr port ; GrafPtr port ;
::GetPort( &port ) ; ::GetPort( &port ) ;
::SetPort( UMAGetWindowPort( window ) ) ; ::SetPort( UMAGetWindowPort( window ) ) ;
::GlobalToLocal( &localwhere ) ; ::GlobalToLocal( &localwhere ) ;
@@ -368,7 +370,7 @@ void wxWindowMac::DoScreenToClient(int *x, int *y) const
if(x) *x = localwhere.h ; if(x) *x = localwhere.h ;
if(y) *y = localwhere.v ; if(y) *y = localwhere.v ;
MacRootWindowToWindow( x , y ) ; MacRootWindowToWindow( x , y ) ;
if ( x ) if ( x )
x -= MacGetLeftBorderSize() ; x -= MacGetLeftBorderSize() ;
@@ -379,19 +381,19 @@ void wxWindowMac::DoScreenToClient(int *x, int *y) const
void wxWindowMac::DoClientToScreen(int *x, int *y) const void wxWindowMac::DoClientToScreen(int *x, int *y) const
{ {
WindowRef window = (WindowRef) MacGetRootWindow() ; WindowRef window = (WindowRef) MacGetRootWindow() ;
if ( x ) if ( x )
x += MacGetLeftBorderSize() ; x += MacGetLeftBorderSize() ;
if ( y ) if ( y )
y += MacGetTopBorderSize() ; y += MacGetTopBorderSize() ;
MacWindowToRootWindow( x , y ) ; MacWindowToRootWindow( x , y ) ;
Point localwhere = { 0,0 }; Point localwhere = { 0,0 };
if(x) localwhere.h = * x ; if(x) localwhere.h = * x ;
if(y) localwhere.v = * y ; if(y) localwhere.v = * y ;
GrafPtr port ; GrafPtr port ;
::GetPort( &port ) ; ::GetPort( &port ) ;
::SetPort( UMAGetWindowPort( window ) ) ; ::SetPort( UMAGetWindowPort( window ) ) ;
@@ -406,7 +408,7 @@ void wxWindowMac::MacClientToRootWindow( int *x , int *y ) const
wxPoint origin = GetClientAreaOrigin() ; wxPoint origin = GetClientAreaOrigin() ;
if(x) *x += origin.x ; if(x) *x += origin.x ;
if(y) *y += origin.y ; if(y) *y += origin.y ;
MacWindowToRootWindow( x , y ) ; MacWindowToRootWindow( x , y ) ;
} }
@@ -460,7 +462,7 @@ bool wxWindowMac::SetCursor(const wxCursor& cursor)
Point pt ; Point pt ;
wxWindowMac *mouseWin ; wxWindowMac *mouseWin ;
GetMouse( &pt ) ; GetMouse( &pt ) ;
// Change the cursor NOW if we're within the correct window // Change the cursor NOW if we're within the correct window
if ( MacGetWindowFromPoint( wxPoint( pt.h , pt.v ) , &mouseWin ) ) if ( MacGetWindowFromPoint( wxPoint( pt.h , pt.v ) , &mouseWin ) )
@@ -484,19 +486,19 @@ void wxWindowMac::DoGetClientSize(int *x, int *y) const
ww -= MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ; ww -= MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ;
hh -= MacGetTopBorderSize( ) + MacGetBottomBorderSize( ); hh -= MacGetTopBorderSize( ) + MacGetBottomBorderSize( );
if ( (m_vScrollBar && m_vScrollBar->IsShown()) || (m_hScrollBar && m_hScrollBar->IsShown()) ) if ( (m_vScrollBar && m_vScrollBar->IsShown()) || (m_hScrollBar && m_hScrollBar->IsShown()) )
{ {
int x1 = 0 ; int x1 = 0 ;
int y1 = 0 ; int y1 = 0 ;
int w = m_width ; int w = m_width ;
int h = m_height ; int h = m_height ;
MacClientToRootWindow( &x1 , &y1 ) ; MacClientToRootWindow( &x1 , &y1 ) ;
MacClientToRootWindow( &w , &h ) ; MacClientToRootWindow( &w , &h ) ;
wxWindowMac *iter = (wxWindowMac*)this ; wxWindowMac *iter = (wxWindowMac*)this ;
int totW = 10000 , totH = 10000; int totW = 10000 , totH = 10000;
while( iter ) while( iter )
{ {
@@ -508,8 +510,8 @@ void wxWindowMac::DoGetClientSize(int *x, int *y) const
} }
iter = iter->GetParent() ; iter = iter->GetParent() ;
} }
if (m_hScrollBar && m_hScrollBar->IsShown() ) if (m_hScrollBar && m_hScrollBar->IsShown() )
{ {
hh -= MAC_SCROLLBAR_SIZE; hh -= MAC_SCROLLBAR_SIZE;
@@ -554,24 +556,24 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
int former_y = m_y ; int former_y = m_y ;
int former_w = m_width ; int former_w = m_width ;
int former_h = m_height ; int former_h = m_height ;
int actualWidth = width; int actualWidth = width;
int actualHeight = height; int actualHeight = height;
int actualX = x; int actualX = x;
int actualY = y; int actualY = y;
if ((m_minWidth != -1) && (actualWidth < m_minWidth)) if ((m_minWidth != -1) && (actualWidth < m_minWidth))
actualWidth = m_minWidth; actualWidth = m_minWidth;
if ((m_minHeight != -1) && (actualHeight < m_minHeight)) if ((m_minHeight != -1) && (actualHeight < m_minHeight))
actualHeight = m_minHeight; actualHeight = m_minHeight;
if ((m_maxWidth != -1) && (actualWidth > m_maxWidth)) if ((m_maxWidth != -1) && (actualWidth > m_maxWidth))
actualWidth = m_maxWidth; actualWidth = m_maxWidth;
if ((m_maxHeight != -1) && (actualHeight > m_maxHeight)) if ((m_maxHeight != -1) && (actualHeight > m_maxHeight))
actualHeight = m_maxHeight; actualHeight = m_maxHeight;
bool doMove = false ; bool doMove = false ;
bool doResize = false ; bool doResize = false ;
if ( actualX != former_x || actualY != former_y ) if ( actualX != former_x || actualY != former_y )
{ {
doMove = true ; doMove = true ;
@@ -615,7 +617,7 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
GetEventHandler()->ProcessEvent(event); GetEventHandler()->ProcessEvent(event);
} }
} }
} }
// set the size of the window: if the dimensions are positive, just use them, // set the size of the window: if the dimensions are positive, just use them,
@@ -631,7 +633,7 @@ void wxWindowMac::DoSetSize(int x, int y, int width, int height, int sizeFlags)
// get the current size and position... // get the current size and position...
int currentX, currentY; int currentX, currentY;
GetPosition(&currentX, &currentY); GetPosition(&currentX, &currentY);
int currentW,currentH; int currentW,currentH;
GetSize(&currentW, &currentH); GetSize(&currentW, &currentH);
@@ -715,24 +717,24 @@ bool wxWindowMac::Show(bool show)
wxWindowMac* win = wxFindWinFromMacWindow( window ) ; wxWindowMac* win = wxFindWinFromMacWindow( window ) ;
if ( win == NULL && win->m_isBeingDeleted ) if ( win == NULL && win->m_isBeingDeleted )
return FALSE ; return FALSE ;
*/ */
MacSuperShown( show ) ; MacSuperShown( show ) ;
Refresh() ; Refresh() ;
/* /*
if ( !show ) if ( !show )
{ {
if ( win && !win->m_isBeingDeleted ) if ( win && !win->m_isBeingDeleted )
Refresh() ; Refresh() ;
} }
else else
{ {
Refresh() ; Refresh() ;
} }
*/ */
return TRUE; return TRUE;
} }
void wxWindowMac::MacSuperShown( bool show ) void wxWindowMac::MacSuperShown( bool show )
{ {
wxNode *node = GetChildren().First(); wxNode *node = GetChildren().First();
while ( node ) while ( node )
@@ -744,11 +746,11 @@ void wxWindowMac::MacSuperShown( bool show )
} }
} }
void wxWindowMac::MacSuperEnabled( bool enabled ) void wxWindowMac::MacSuperEnabled( bool enabled )
{ {
if ( !IsTopLevel() ) if ( !IsTopLevel() )
{ {
// to be absolutely correct we'd have to invalidate (with eraseBkground // to be absolutely correct we'd have to invalidate (with eraseBkground
// because unter MacOSX the frames are drawn with an addXXX mode) // because unter MacOSX the frames are drawn with an addXXX mode)
// the borders area // the borders area
} }
@@ -762,13 +764,13 @@ void wxWindowMac::MacSuperEnabled( bool enabled )
} }
} }
bool wxWindowMac::MacIsReallyShown() const bool wxWindowMac::MacIsReallyShown() const
{ {
if ( m_isShown && (m_parent != NULL) ) { if ( m_isShown && (m_parent != NULL) ) {
return m_parent->MacIsReallyShown(); return m_parent->MacIsReallyShown();
} }
return m_isShown; return m_isShown;
/* /*
bool status = m_isShown ; bool status = m_isShown ;
wxWindowMac * win = this ; wxWindowMac * win = this ;
while ( status && win->m_parent != NULL ) while ( status && win->m_parent != NULL )
@@ -798,7 +800,7 @@ void wxWindowMac::GetTextExtent(const wxString& string, int *x, int *y,
const wxFont *fontToUse = theFont; const wxFont *fontToUse = theFont;
if ( !fontToUse ) if ( !fontToUse )
fontToUse = &m_font; fontToUse = &m_font;
wxClientDC dc( (wxWindowMac*) this ) ; wxClientDC dc( (wxWindowMac*) this ) ;
long lx,ly,ld,le ; long lx,ly,ld,le ;
dc.GetTextExtent( string , &lx , &ly , &ld, &le, (wxFont *)fontToUse ) ; dc.GetTextExtent( string , &lx , &ly , &ld, &le, (wxFont *)fontToUse ) ;
@@ -813,15 +815,15 @@ void wxWindowMac::GetTextExtent(const wxString& string, int *x, int *y,
} }
/* /*
* Rect is given in client coordinates, for further reading, read wxTopLevelWindowMac::InvalidateRect * Rect is given in client coordinates, for further reading, read wxTopLevelWindowMac::InvalidateRect
* we always intersect with the entire window, not only with the client area * we always intersect with the entire window, not only with the client area
*/ */
void wxWindowMac::Refresh(bool eraseBack, const wxRect *rect) void wxWindowMac::Refresh(bool eraseBack, const wxRect *rect)
{ {
if ( MacGetTopLevelWindow() == NULL ) if ( MacGetTopLevelWindow() == NULL )
return ; return ;
wxPoint client = GetClientAreaOrigin(); wxPoint client = GetClientAreaOrigin();
int x1 = -client.x; int x1 = -client.x;
int y1 = -client.y; int y1 = -client.y;
@@ -838,20 +840,20 @@ void wxWindowMac::Refresh(bool eraseBack, const wxRect *rect)
} }
Rect clientrect = { y1, x1, y2, x2 }; Rect clientrect = { y1, x1, y2, x2 };
if ( rect ) if ( rect )
{ {
Rect r = { rect->y , rect->x , rect->y + rect->height , rect->x + rect->width } ; Rect r = { rect->y , rect->x , rect->y + rect->height , rect->x + rect->width } ;
SectRect( &clientrect , &r , &clientrect ) ; SectRect( &clientrect , &r , &clientrect ) ;
} }
if ( !EmptyRect( &clientrect ) ) if ( !EmptyRect( &clientrect ) )
{ {
int top = 0 , left = 0 ; int top = 0 , left = 0 ;
MacClientToRootWindow( &left , &top ) ; MacClientToRootWindow( &left , &top ) ;
OffsetRect( &clientrect , left , top ) ; OffsetRect( &clientrect , left , top ) ;
MacGetTopLevelWindow()->MacInvalidate( &clientrect , eraseBack ) ; MacGetTopLevelWindow()->MacInvalidate( &clientrect , eraseBack ) ;
} }
} }
@@ -910,7 +912,7 @@ void wxWindowMac::WarpPointer (int x_pos, int y_pos)
// We really dont move the mouse programmatically under mac // We really dont move the mouse programmatically under mac
} }
const wxBrush& wxWindowMac::MacGetBackgroundBrush() const wxBrush& wxWindowMac::MacGetBackgroundBrush()
{ {
if ( m_backgroundColour == wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE) ) if ( m_backgroundColour == wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE) )
{ {
@@ -921,9 +923,9 @@ const wxBrush& wxWindowMac::MacGetBackgroundBrush()
// on mac we have the difficult situation, that 3dface gray can be different colours, depending whether // on mac we have the difficult situation, that 3dface gray can be different colours, depending whether
// it is on a notebook panel or not, in order to take care of that we walk up the hierarchy until we have // it is on a notebook panel or not, in order to take care of that we walk up the hierarchy until we have
// either a non gray background color or a non control window // either a non gray background color or a non control window
WindowRef window = (WindowRef) MacGetRootWindow() ; WindowRef window = (WindowRef) MacGetRootWindow() ;
wxWindowMac* parent = GetParent() ; wxWindowMac* parent = GetParent() ;
while( parent ) while( parent )
{ {
@@ -935,7 +937,7 @@ const wxBrush& wxWindowMac::MacGetBackgroundBrush()
} }
{ {
if ( parent->m_backgroundColour != wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE ) if ( parent->m_backgroundColour != wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE )
&& parent->m_backgroundColour != wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE) ) && parent->m_backgroundColour != wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE) )
{ {
// if we have any other colours in the hierarchy // if we have any other colours in the hierarchy
@@ -972,7 +974,7 @@ const wxBrush& wxWindowMac::MacGetBackgroundBrush()
} }
return m_macBackgroundBrush ; return m_macBackgroundBrush ;
} }
void wxWindowMac::OnEraseBackground(wxEraseEvent& event) void wxWindowMac::OnEraseBackground(wxEraseEvent& event)
@@ -984,7 +986,7 @@ void wxWindowMac::OnNcPaint( wxNcPaintEvent& event )
{ {
wxWindowDC dc(this) ; wxWindowDC dc(this) ;
wxMacPortSetter helper(&dc) ; wxMacPortSetter helper(&dc) ;
MacPaintBorders( dc.m_macLocalOrigin.x , dc.m_macLocalOrigin.y) ; MacPaintBorders( dc.m_macLocalOrigin.x , dc.m_macLocalOrigin.y) ;
} }
@@ -1049,11 +1051,11 @@ void wxWindowMac::SetScrollPos(int orient, int pos, bool refresh)
} }
} }
void wxWindowMac::MacPaintBorders( int left , int top ) void wxWindowMac::MacPaintBorders( int left , int top )
{ {
if( IsTopLevel() ) if( IsTopLevel() )
return ; return ;
RGBColor white = { 0xFFFF, 0xFFFF , 0xFFFF } ; RGBColor white = { 0xFFFF, 0xFFFF , 0xFFFF } ;
RGBColor black = { 0x0000, 0x0000 , 0x0000 } ; RGBColor black = { 0x0000, 0x0000 , 0x0000 } ;
RGBColor face = { 0xDDDD, 0xDDDD , 0xDDDD } ; RGBColor face = { 0xDDDD, 0xDDDD , 0xDDDD } ;
@@ -1070,7 +1072,7 @@ void wxWindowMac::MacPaintBorders( int left , int top )
InsetRect( &rect , border , border ); InsetRect( &rect , border , border );
DrawThemeListBoxFrame(&rect,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ; DrawThemeListBoxFrame(&rect,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ;
*/ */
DrawThemePrimaryGroup(&rect ,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ; DrawThemePrimaryGroup(&rect ,IsEnabled() ? kThemeStateActive : kThemeStateInactive) ;
#else #else
bool sunken = HasFlag( wxSUNKEN_BORDER ) ; bool sunken = HasFlag( wxSUNKEN_BORDER ) ;
@@ -1118,7 +1120,7 @@ void wxWindowMac::RemoveChild( wxWindowBase *child )
m_hScrollBar = NULL ; m_hScrollBar = NULL ;
if ( child == m_vScrollBar ) if ( child == m_vScrollBar )
m_vScrollBar = NULL ; m_vScrollBar = NULL ;
wxWindowBase::RemoveChild( child ) ; wxWindowBase::RemoveChild( child ) ;
} }
@@ -1178,15 +1180,15 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
ClipRect( &scrollrect ) ; ClipRect( &scrollrect ) ;
if ( rect ) if ( rect )
{ {
Rect r = { dc.YLOG2DEVMAC(rect->y) , dc.XLOG2DEVMAC(rect->x) , dc.YLOG2DEVMAC(rect->y + rect->height) , Rect r = { dc.YLOG2DEVMAC(rect->y) , dc.XLOG2DEVMAC(rect->x) , dc.YLOG2DEVMAC(rect->y + rect->height) ,
dc.XLOG2DEVMAC(rect->x + rect->width) } ; dc.XLOG2DEVMAC(rect->x + rect->width) } ;
SectRect( &scrollrect , &r , &scrollrect ) ; SectRect( &scrollrect , &r , &scrollrect ) ;
} }
ScrollRect( &scrollrect , dx , dy , updateRgn ) ; ScrollRect( &scrollrect , dx , dy , updateRgn ) ;
InvalWindowRgn( (WindowRef) MacGetRootWindow() , updateRgn ) ; InvalWindowRgn( (WindowRef) MacGetRootWindow() , updateRgn ) ;
DisposeRgn( updateRgn ) ; DisposeRgn( updateRgn ) ;
} }
for (wxNode *node = GetChildren().First(); node; node = node->Next()) for (wxNode *node = GetChildren().First(); node; node = node->Next())
{ {
wxWindowMac *child = (wxWindowMac*)node->Data(); wxWindowMac *child = (wxWindowMac*)node->Data();
@@ -1199,7 +1201,7 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
child->GetSize( &w, &h ); child->GetSize( &w, &h );
child->SetSize( x+dx, y+dy, w, h ); child->SetSize( x+dx, y+dy, w, h );
} }
} }
void wxWindowMac::MacOnScroll(wxScrollEvent &event ) void wxWindowMac::MacOnScroll(wxScrollEvent &event )
@@ -1210,7 +1212,7 @@ void wxWindowMac::MacOnScroll(wxScrollEvent &event )
wevent.SetPosition(event.GetPosition()); wevent.SetPosition(event.GetPosition());
wevent.SetOrientation(event.GetOrientation()); wevent.SetOrientation(event.GetOrientation());
wevent.m_eventObject = this; wevent.m_eventObject = this;
if (event.m_eventType == wxEVT_SCROLL_TOP) { if (event.m_eventType == wxEVT_SCROLL_TOP) {
wevent.m_eventType = wxEVT_SCROLLWIN_TOP; wevent.m_eventType = wxEVT_SCROLLWIN_TOP;
} else } else
@@ -1232,7 +1234,7 @@ void wxWindowMac::MacOnScroll(wxScrollEvent &event )
if (event.m_eventType == wxEVT_SCROLL_THUMBTRACK) { if (event.m_eventType == wxEVT_SCROLL_THUMBTRACK) {
wevent.m_eventType = wxEVT_SCROLLWIN_THUMBTRACK; wevent.m_eventType = wxEVT_SCROLLWIN_THUMBTRACK;
} }
GetEventHandler()->ProcessEvent(wevent); GetEventHandler()->ProcessEvent(wevent);
} }
} }
@@ -1282,7 +1284,7 @@ void wxWindowMac::OnSetFocus(wxFocusEvent& event)
// notice that it's also important to do it upwards the tree becaus // notice that it's also important to do it upwards the tree becaus
// otherwise when the top level panel gets focus, it won't set it back to // otherwise when the top level panel gets focus, it won't set it back to
// us, but to some other sibling // us, but to some other sibling
// CS:don't know if this is still needed: // CS:don't know if this is still needed:
//wxChildFocusEvent eventFocus(this); //wxChildFocusEvent eventFocus(this);
//(void)GetEventHandler()->ProcessEvent(eventFocus); //(void)GetEventHandler()->ProcessEvent(eventFocus);
@@ -1341,7 +1343,7 @@ void wxWindowMac::DoSetClientSize(int width, int height)
{ {
if ( width != -1 || height != -1 ) if ( width != -1 || height != -1 )
{ {
if ( width != -1 && m_vScrollBar ) if ( width != -1 && m_vScrollBar )
width += MAC_SCROLLBAR_SIZE ; width += MAC_SCROLLBAR_SIZE ;
if ( height != -1 && m_vScrollBar ) if ( height != -1 && m_vScrollBar )
@@ -1357,7 +1359,7 @@ void wxWindowMac::DoSetClientSize(int width, int height)
wxWindowMac* wxWindowMac::s_lastMouseWindow = NULL ; wxWindowMac* wxWindowMac::s_lastMouseWindow = NULL ;
bool wxWindowMac::MacGetWindowFromPointSub( const wxPoint &point , wxWindowMac** outWin ) bool wxWindowMac::MacGetWindowFromPointSub( const wxPoint &point , wxWindowMac** outWin )
{ {
if ( IsTopLevel() ) if ( IsTopLevel() )
{ {
@@ -1371,7 +1373,7 @@ bool wxWindowMac::MacGetWindowFromPointSub( const wxPoint &point , wxWindowMac**
(point.x > (m_x + m_width)) || (point.y > (m_y + m_height))) (point.x > (m_x + m_width)) || (point.y > (m_y + m_height)))
return FALSE; return FALSE;
} }
WindowRef window = (WindowRef) MacGetRootWindow() ; WindowRef window = (WindowRef) MacGetRootWindow() ;
wxPoint newPoint( point ) ; wxPoint newPoint( point ) ;
@@ -1381,7 +1383,7 @@ bool wxWindowMac::MacGetWindowFromPointSub( const wxPoint &point , wxWindowMac**
newPoint.x -= m_x; newPoint.x -= m_x;
newPoint.y -= m_y; newPoint.y -= m_y;
} }
for (wxNode *node = GetChildren().First(); node; node = node->Next()) for (wxNode *node = GetChildren().First(); node; node = node->Next())
{ {
wxWindowMac *child = (wxWindowMac*)node->Data(); wxWindowMac *child = (wxWindowMac*)node->Data();
@@ -1397,28 +1399,28 @@ bool wxWindowMac::MacGetWindowFromPointSub( const wxPoint &point , wxWindowMac**
return TRUE; return TRUE;
} }
bool wxWindowMac::MacGetWindowFromPoint( const wxPoint &screenpoint , wxWindowMac** outWin ) bool wxWindowMac::MacGetWindowFromPoint( const wxPoint &screenpoint , wxWindowMac** outWin )
{ {
WindowRef window ; WindowRef window ;
Point pt = { screenpoint.y , screenpoint.x } ; Point pt = { screenpoint.y , screenpoint.x } ;
if ( ::FindWindow( pt , &window ) == 3 ) if ( ::FindWindow( pt , &window ) == 3 )
{ {
wxWindowMac* win = wxFindWinFromMacWindow( window ) ; wxWindowMac* win = wxFindWinFromMacWindow( window ) ;
if ( win ) if ( win )
{ {
// No, this yields the CLIENT are, we need the whole frame. RR. // No, this yields the CLIENT are, we need the whole frame. RR.
// point = win->ScreenToClient( point ) ; // point = win->ScreenToClient( point ) ;
GrafPtr port; GrafPtr port;
::GetPort( &port ) ; ::GetPort( &port ) ;
::SetPort( UMAGetWindowPort( window ) ) ; ::SetPort( UMAGetWindowPort( window ) ) ;
::GlobalToLocal( &pt ) ; ::GlobalToLocal( &pt ) ;
::SetPort( port ) ; ::SetPort( port ) ;
wxPoint point( pt.h, pt.v ) ; wxPoint point( pt.h, pt.v ) ;
return win->MacGetWindowFromPointSub( point , outWin ) ; return win->MacGetWindowFromPointSub( point , outWin ) ;
} }
} }
@@ -1433,16 +1435,16 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event)
if ((event.m_x < m_x) || (event.m_y < m_y) || if ((event.m_x < m_x) || (event.m_y < m_y) ||
(event.m_x > (m_x + m_width)) || (event.m_y > (m_y + m_height))) (event.m_x > (m_x + m_width)) || (event.m_y > (m_y + m_height)))
return FALSE; return FALSE;
if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxSpinCtrl ) )) if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) || IsKindOf( CLASSINFO( wxSpinCtrl ) ))
return FALSE ; return FALSE ;
WindowRef window = (WindowRef) MacGetRootWindow() ; WindowRef window = (WindowRef) MacGetRootWindow() ;
event.m_x -= m_x; event.m_x -= m_x;
event.m_y -= m_y; event.m_y -= m_y;
int x = event.m_x ; int x = event.m_x ;
int y = event.m_y ; int y = event.m_y ;
@@ -1459,21 +1461,21 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event)
event.m_x = x ; event.m_x = x ;
event.m_y = y ; event.m_y = y ;
event.SetEventObject( this ) ; event.SetEventObject( this ) ;
if ( wxBusyCursorCount == 0 ) if ( wxBusyCursorCount == 0 )
{ {
m_cursor.MacInstall() ; m_cursor.MacInstall() ;
} }
if ( event.GetEventType() == wxEVT_LEFT_DOWN ) if ( event.GetEventType() == wxEVT_LEFT_DOWN )
{ {
// set focus to this window // set focus to this window
if (AcceptsFocus() && FindFocus()!=this) if (AcceptsFocus() && FindFocus()!=this)
SetFocus(); SetFocus();
} }
#if wxUSE_TOOLTIPS #if wxUSE_TOOLTIPS
if ( event.GetEventType() == wxEVT_MOTION if ( event.GetEventType() == wxEVT_MOTION
|| event.GetEventType() == wxEVT_ENTER_WINDOW || event.GetEventType() == wxEVT_ENTER_WINDOW
|| event.GetEventType() == wxEVT_LEAVE_WINDOW ) || event.GetEventType() == wxEVT_LEAVE_WINDOW )
wxToolTip::RelayEvent( this , event); wxToolTip::RelayEvent( this , event);
@@ -1482,13 +1484,13 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event)
if (gs_lastWhich != this) if (gs_lastWhich != this)
{ {
gs_lastWhich = this; gs_lastWhich = this;
// Double clicks must always occur on the same window // Double clicks must always occur on the same window
if (event.GetEventType() == wxEVT_LEFT_DCLICK) if (event.GetEventType() == wxEVT_LEFT_DCLICK)
event.SetEventType( wxEVT_LEFT_DOWN ); event.SetEventType( wxEVT_LEFT_DOWN );
if (event.GetEventType() == wxEVT_RIGHT_DCLICK) if (event.GetEventType() == wxEVT_RIGHT_DCLICK)
event.SetEventType( wxEVT_RIGHT_DOWN ); event.SetEventType( wxEVT_RIGHT_DOWN );
// Same for mouse up events // Same for mouse up events
if (event.GetEventType() == wxEVT_LEFT_UP) if (event.GetEventType() == wxEVT_LEFT_UP)
return TRUE; return TRUE;
@@ -1525,14 +1527,14 @@ void wxWindowMac::Update()
} }
} }
wxTopLevelWindowMac* wxWindowMac::MacGetTopLevelWindow() const wxTopLevelWindowMac* wxWindowMac::MacGetTopLevelWindow() const
{ {
wxTopLevelWindowMac* win = NULL ; wxTopLevelWindowMac* win = NULL ;
WindowRef window = (WindowRef) MacGetRootWindow() ; WindowRef window = (WindowRef) MacGetRootWindow() ;
if ( window ) if ( window )
{ {
win = wxFindWinFromMacWindow( window ) ; win = wxFindWinFromMacWindow( window ) ;
} }
return win ; return win ;
} }
@@ -1540,7 +1542,7 @@ const wxRegion& wxWindowMac::MacGetVisibleRegion()
{ {
RgnHandle visRgn = NewRgn() ; RgnHandle visRgn = NewRgn() ;
RgnHandle tempRgn = NewRgn() ; RgnHandle tempRgn = NewRgn() ;
SetRectRgn( visRgn , 0 , 0 , m_width , m_height ) ; SetRectRgn( visRgn , 0 , 0 , m_width , m_height ) ;
//TODO : as soon as the new scheme has proven to work correctly, move this to wxStaticBox //TODO : as soon as the new scheme has proven to work correctly, move this to wxStaticBox
@@ -1548,7 +1550,7 @@ const wxRegion& wxWindowMac::MacGetVisibleRegion()
{ {
int borderTop = 14 ; int borderTop = 14 ;
int borderOther = 4 ; int borderOther = 4 ;
SetRectRgn( tempRgn , borderOther , borderTop , m_width - borderOther , m_height - borderOther ) ; SetRectRgn( tempRgn , borderOther , borderTop , m_width - borderOther , m_height - borderOther ) ;
DiffRgn( visRgn , tempRgn , visRgn ) ; DiffRgn( visRgn , tempRgn , visRgn ) ;
} }
@@ -1581,9 +1583,9 @@ const wxRegion& wxWindowMac::MacGetVisibleRegion()
SetRectRgn( tempRgn , child->m_x , child->m_y , child->m_x + child->m_width , child->m_y + child->m_height ) ; SetRectRgn( tempRgn , child->m_x , child->m_y , child->m_x + child->m_width , child->m_y + child->m_height ) ;
DiffRgn( visRgn , tempRgn , visRgn ) ; DiffRgn( visRgn , tempRgn , visRgn ) ;
} }
} }
} }
if ( (GetWindowStyle() & wxCLIP_SIBLINGS) && GetParent() ) if ( (GetWindowStyle() & wxCLIP_SIBLINGS) && GetParent() )
{ {
bool thisWindowThrough = false ; bool thisWindowThrough = false ;
@@ -1605,7 +1607,7 @@ const wxRegion& wxWindowMac::MacGetVisibleRegion()
SetRectRgn( tempRgn , sibling->m_x - m_x , sibling->m_y - m_y , sibling->m_x + sibling->m_width - m_x , sibling->m_y + sibling->m_height - m_y ) ; SetRectRgn( tempRgn , sibling->m_x - m_x , sibling->m_y - m_y , sibling->m_x + sibling->m_width - m_x , sibling->m_y + sibling->m_height - m_y ) ;
DiffRgn( visRgn , tempRgn , visRgn ) ; DiffRgn( visRgn , tempRgn , visRgn ) ;
} }
} }
} }
m_macVisibleRegion = visRgn ; m_macVisibleRegion = visRgn ;
DisposeRgn( visRgn ) ; DisposeRgn( visRgn ) ;
@@ -1618,16 +1620,16 @@ void wxWindowMac::MacRedraw( WXHRGN updatergnr , long time, bool erase)
RgnHandle updatergn = (RgnHandle) updatergnr ; RgnHandle updatergn = (RgnHandle) updatergnr ;
// updatergn is always already clipped to our boundaries // updatergn is always already clipped to our boundaries
// it is in window coordinates, not in client coordinates // it is in window coordinates, not in client coordinates
WindowRef window = (WindowRef) MacGetRootWindow() ; WindowRef window = (WindowRef) MacGetRootWindow() ;
{ {
// ownUpdateRgn is the area that this window has to repaint, it is in window coordinates // ownUpdateRgn is the area that this window has to repaint, it is in window coordinates
RgnHandle ownUpdateRgn = NewRgn() ; RgnHandle ownUpdateRgn = NewRgn() ;
CopyRgn( updatergn , ownUpdateRgn ) ; CopyRgn( updatergn , ownUpdateRgn ) ;
SectRgn( ownUpdateRgn , (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , ownUpdateRgn ) ; SectRgn( ownUpdateRgn , (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , ownUpdateRgn ) ;
// newupdate is the update region in client coordinates // newupdate is the update region in client coordinates
RgnHandle newupdate = NewRgn() ; RgnHandle newupdate = NewRgn() ;
wxSize point = GetClientSize() ; wxSize point = GetClientSize() ;
@@ -1637,9 +1639,9 @@ void wxWindowMac::MacRedraw( WXHRGN updatergnr , long time, bool erase)
OffsetRgn( newupdate , -origin.x , -origin.y ) ; OffsetRgn( newupdate , -origin.x , -origin.y ) ;
m_updateRegion = newupdate ; m_updateRegion = newupdate ;
DisposeRgn( newupdate ) ; // it's been cloned to m_updateRegion DisposeRgn( newupdate ) ; // it's been cloned to m_updateRegion
if ( erase && !EmptyRgn(ownUpdateRgn) ) if ( erase && !EmptyRgn(ownUpdateRgn) )
{ {
wxWindowDC dc(this); wxWindowDC dc(this);
dc.SetClippingRegion(wxRegion(ownUpdateRgn)); dc.SetClippingRegion(wxRegion(ownUpdateRgn));
wxEraseEvent eevent( GetId(), &dc ); wxEraseEvent eevent( GetId(), &dc );
@@ -1650,19 +1652,19 @@ void wxWindowMac::MacRedraw( WXHRGN updatergnr , long time, bool erase)
eventNc.SetEventObject( this ); eventNc.SetEventObject( this );
GetEventHandler()->ProcessEvent( eventNc ); GetEventHandler()->ProcessEvent( eventNc );
} }
DisposeRgn( ownUpdateRgn ) ; DisposeRgn( ownUpdateRgn ) ;
if ( !m_updateRegion.Empty() ) if ( !m_updateRegion.Empty() )
{ {
wxPaintEvent event; wxPaintEvent event;
event.m_timeStamp = time ; event.m_timeStamp = time ;
event.SetEventObject(this); event.SetEventObject(this);
GetEventHandler()->ProcessEvent(event); GetEventHandler()->ProcessEvent(event);
} }
} }
// now intersect for each of the children their rect with the updateRgn and call MacRedraw recursively // now intersect for each of the children their rect with the updateRgn and call MacRedraw recursively
RgnHandle childupdate = NewRgn() ; RgnHandle childupdate = NewRgn() ;
for (wxNode *node = GetChildren().First(); node; node = node->Next()) for (wxNode *node = GetChildren().First(); node; node = node->Next())
{ {
// calculate the update region for the child windows by intersecting the window rectangle with our own // calculate the update region for the child windows by intersecting the window rectangle with our own
@@ -1679,50 +1681,50 @@ void wxWindowMac::MacRedraw( WXHRGN updatergnr , long time, bool erase)
} }
DisposeRgn( childupdate ) ; DisposeRgn( childupdate ) ;
// eventually a draw grow box here // eventually a draw grow box here
} }
WXHWND wxWindowMac::MacGetRootWindow() const WXHWND wxWindowMac::MacGetRootWindow() const
{ {
wxWindowMac *iter = (wxWindowMac*)this ; wxWindowMac *iter = (wxWindowMac*)this ;
while( iter ) while( iter )
{ {
if ( iter->IsTopLevel() ) if ( iter->IsTopLevel() )
return ((wxTopLevelWindow*)iter)->MacGetWindowRef() ; return ((wxTopLevelWindow*)iter)->MacGetWindowRef() ;
iter = iter->GetParent() ; iter = iter->GetParent() ;
} }
wxASSERT_MSG( 1 , "No valid mac root window" ) ; wxASSERT_MSG( 1 , "No valid mac root window" ) ;
return NULL ; return NULL ;
} }
void wxWindowMac::MacCreateScrollBars( long style ) void wxWindowMac::MacCreateScrollBars( long style )
{ {
wxASSERT_MSG( m_vScrollBar == NULL && m_hScrollBar == NULL , "attempt to create window twice" ) ; wxASSERT_MSG( m_vScrollBar == NULL && m_hScrollBar == NULL , "attempt to create window twice" ) ;
bool hasBoth = ( style & wxVSCROLL ) && ( style & wxHSCROLL ) ; bool hasBoth = ( style & wxVSCROLL ) && ( style & wxHSCROLL ) ;
int adjust = hasBoth ? MAC_SCROLLBAR_SIZE - 1: 0 ; int adjust = hasBoth ? MAC_SCROLLBAR_SIZE - 1: 0 ;
int width, height ; int width, height ;
GetClientSize( &width , &height ) ; GetClientSize( &width , &height ) ;
wxPoint vPoint(width-MAC_SCROLLBAR_SIZE, 0) ; wxPoint vPoint(width-MAC_SCROLLBAR_SIZE, 0) ;
wxSize vSize(MAC_SCROLLBAR_SIZE, height - adjust) ; wxSize vSize(MAC_SCROLLBAR_SIZE, height - adjust) ;
wxPoint hPoint(0 , height-MAC_SCROLLBAR_SIZE ) ; wxPoint hPoint(0 , height-MAC_SCROLLBAR_SIZE ) ;
wxSize hSize( width - adjust, MAC_SCROLLBAR_SIZE) ; wxSize hSize( width - adjust, MAC_SCROLLBAR_SIZE) ;
m_vScrollBar = new wxScrollBar(this, wxWINDOW_VSCROLL, vPoint, m_vScrollBar = new wxScrollBar(this, wxWINDOW_VSCROLL, vPoint,
vSize , wxVERTICAL); vSize , wxVERTICAL);
if ( style & wxVSCROLL ) if ( style & wxVSCROLL )
{ {
} }
else else
{ {
m_vScrollBar->Show(false) ; m_vScrollBar->Show(false) ;
} }
m_hScrollBar = new wxScrollBar(this, wxWINDOW_HSCROLL, hPoint, m_hScrollBar = new wxScrollBar(this, wxWINDOW_HSCROLL, hPoint,
hSize , wxHORIZONTAL); hSize , wxHORIZONTAL);
if ( style & wxHSCROLL ) if ( style & wxHSCROLL )
{ {
@@ -1731,7 +1733,7 @@ void wxWindowMac::MacCreateScrollBars( long style )
{ {
m_hScrollBar->Show(false) ; m_hScrollBar->Show(false) ;
} }
// because the create does not take into account the client area origin // because the create does not take into account the client area origin
MacRepositionScrollBars() ; // we might have a real position shift MacRepositionScrollBars() ; // we might have a real position shift
} }
@@ -1740,30 +1742,30 @@ void wxWindowMac::MacRepositionScrollBars()
{ {
bool hasBoth = ( m_hScrollBar && m_hScrollBar->IsShown()) && ( m_vScrollBar && m_vScrollBar->IsShown()) ; bool hasBoth = ( m_hScrollBar && m_hScrollBar->IsShown()) && ( m_vScrollBar && m_vScrollBar->IsShown()) ;
int adjust = hasBoth ? MAC_SCROLLBAR_SIZE - 1 : 0 ; int adjust = hasBoth ? MAC_SCROLLBAR_SIZE - 1 : 0 ;
// get real client area // get real client area
int width = m_width ; int width = m_width ;
int height = m_height ; int height = m_height ;
width -= MacGetLeftBorderSize() + MacGetRightBorderSize(); width -= MacGetLeftBorderSize() + MacGetRightBorderSize();
height -= MacGetTopBorderSize() + MacGetBottomBorderSize(); height -= MacGetTopBorderSize() + MacGetBottomBorderSize();
wxPoint vPoint(width-MAC_SCROLLBAR_SIZE, 0) ; wxPoint vPoint(width-MAC_SCROLLBAR_SIZE, 0) ;
wxSize vSize(MAC_SCROLLBAR_SIZE, height - adjust) ; wxSize vSize(MAC_SCROLLBAR_SIZE, height - adjust) ;
wxPoint hPoint(0 , height-MAC_SCROLLBAR_SIZE ) ; wxPoint hPoint(0 , height-MAC_SCROLLBAR_SIZE ) ;
wxSize hSize( width - adjust, MAC_SCROLLBAR_SIZE) ; wxSize hSize( width - adjust, MAC_SCROLLBAR_SIZE) ;
int x = 0 ; int x = 0 ;
int y = 0 ; int y = 0 ;
int w = m_width ; int w = m_width ;
int h = m_height ; int h = m_height ;
MacClientToRootWindow( &x , &y ) ; MacClientToRootWindow( &x , &y ) ;
MacClientToRootWindow( &w , &h ) ; MacClientToRootWindow( &w , &h ) ;
wxWindowMac *iter = (wxWindowMac*)this ; wxWindowMac *iter = (wxWindowMac*)this ;
int totW = 10000 , totH = 10000; int totW = 10000 , totH = 10000;
while( iter ) while( iter )
{ {
@@ -1775,8 +1777,8 @@ void wxWindowMac::MacRepositionScrollBars()
} }
iter = iter->GetParent() ; iter = iter->GetParent() ;
} }
if ( x == 0 ) if ( x == 0 )
{ {
hPoint.x = -1 ; hPoint.x = -1 ;
@@ -1787,13 +1789,13 @@ void wxWindowMac::MacRepositionScrollBars()
vPoint.y = -1 ; vPoint.y = -1 ;
vSize.y += 1 ; vSize.y += 1 ;
} }
if ( w-x >= totW ) if ( w-x >= totW )
{ {
hSize.x += 1 ; hSize.x += 1 ;
vPoint.x += 1 ; vPoint.x += 1 ;
} }
if ( h-y >= totH ) if ( h-y >= totH )
{ {
vSize.y += 1 ; vSize.y += 1 ;
@@ -1815,12 +1817,12 @@ bool wxWindowMac::AcceptsFocus() const
return MacCanFocus() && wxWindowBase::AcceptsFocus(); return MacCanFocus() && wxWindowBase::AcceptsFocus();
} }
WXWidget wxWindowMac::MacGetContainerForEmbedding() WXWidget wxWindowMac::MacGetContainerForEmbedding()
{ {
return GetParent()->MacGetContainerForEmbedding() ; return GetParent()->MacGetContainerForEmbedding() ;
} }
void wxWindowMac::MacSuperChangedPosition() void wxWindowMac::MacSuperChangedPosition()
{ {
// only window-absolute structures have to be moved i.e. controls // only window-absolute structures have to be moved i.e. controls
@@ -1833,7 +1835,7 @@ void wxWindowMac::MacSuperChangedPosition()
} }
} }
void wxWindowMac::MacTopLevelWindowChangedPosition() void wxWindowMac::MacTopLevelWindowChangedPosition()
{ {
// only screen-absolute structures have to be moved i.e. glcanvas // only screen-absolute structures have to be moved i.e. glcanvas
@@ -1854,7 +1856,7 @@ long wxWindowMac::MacGetLeftBorderSize( ) const
{ {
SInt32 border = 3 ; SInt32 border = 3 ;
#if wxMAC_USE_THEME_BORDER #if wxMAC_USE_THEME_BORDER
#if TARGET_CARBON #if TARGET_CARBON
GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ; GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ;
#endif #endif
#endif #endif
@@ -1864,7 +1866,7 @@ long wxWindowMac::MacGetLeftBorderSize( ) const
{ {
SInt32 border = 3 ; SInt32 border = 3 ;
#if wxMAC_USE_THEME_BORDER #if wxMAC_USE_THEME_BORDER
#if TARGET_CARBON #if TARGET_CARBON
GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ; GetThemeMetric( kThemeMetricListBoxFrameOutset , &border ) ;
#endif #endif
#endif #endif
@@ -1895,7 +1897,7 @@ long wxWindowMac::MacGetBottomBorderSize( ) const
return MacGetLeftBorderSize() ; return MacGetLeftBorderSize() ;
} }
long wxWindowMac::MacRemoveBordersFromStyle( long style ) long wxWindowMac::MacRemoveBordersFromStyle( long style )
{ {
return style & ~( wxDOUBLE_BORDER | wxSUNKEN_BORDER | wxRAISED_BORDER | wxBORDER | wxSTATIC_BORDER ) ; return style & ~( wxDOUBLE_BORDER | wxSUNKEN_BORDER | wxRAISED_BORDER | wxBORDER | wxSTATIC_BORDER ) ;
} }