// Destructor
wxWindowMac::~wxWindowMac()
{
+ SendDestroyEvent();
+
// deleting a window while it is shown invalidates the region
if ( IsShown() ) {
wxWindowMac* iter = this ;
{
s_lastMouseWindow = NULL ;
}
-
+
wxFrame* frame = wxDynamicCast( wxGetTopLevelParent( this ) , wxFrame ) ;
if ( frame )
{
{
wxCHECK_MSG( parent, FALSE, wxT("can't create wxWindowMac without parent") );
+#if wxUSE_STATBOX
+ // wxGTK doesn't allow to create controls with static box as the parent so
+ // this will result in a crash when the program is ported to wxGTK - warn
+ // about it
+ //
+ // the correct solution is to create the controls as siblings of the
+ // static box
+ wxASSERT_MSG( !wxDynamicCast(parent, wxStaticBox),
+ _T("wxStaticBox can't be used as a window parent!") );
+#endif // wxUSE_STATBOX
+
if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) )
return FALSE;
{
if (gFocusWindow )
{
- #if wxUSE_CARET
+#if wxUSE_CARET
// Deal with caret
if ( gFocusWindow->m_caret )
{
gFocusWindow->m_caret->OnKillFocus();
}
- #endif // wxUSE_CARET
- #ifndef __WXUNIVERSAL__
+#endif // wxUSE_CARET
+#ifndef __WXUNIVERSAL__
wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ;
if ( control && control->GetMacControl() )
{
UMASetKeyboardFocus( (WindowRef) gFocusWindow->MacGetRootWindow() , (ControlHandle) control->GetMacControl() , kControlFocusNoPart ) ;
control->MacRedrawControl() ;
}
- #endif
- wxFocusEvent event(wxEVT_KILL_FOCUS, gFocusWindow->m_windowId);
- event.SetEventObject(gFocusWindow);
- gFocusWindow->GetEventHandler()->ProcessEvent(event) ;
+#endif
+ // Without testing the window id, for some reason
+ // a kill focus event can still be sent to
+ // the control just being focussed.
+ int thisId = this->m_windowId;
+ int gFocusWindowId = gFocusWindow->m_windowId;
+ if (gFocusWindowId != thisId)
+ {
+ wxFocusEvent event(wxEVT_KILL_FOCUS, gFocusWindow->m_windowId);
+ event.SetEventObject(gFocusWindow);
+ gFocusWindow->GetEventHandler()->ProcessEvent(event) ;
+ }
}
gFocusWindow = this ;
{
MacRootWindowToWindow( x , y ) ;
if ( x )
- x -= MacGetLeftBorderSize() ;
+ *x -= MacGetLeftBorderSize() ;
if ( y )
- y -= MacGetTopBorderSize() ;
+ *y -= MacGetTopBorderSize() ;
}
void wxWindowMac::DoClientToScreen(int *x, int *y) const
WindowRef window = (WindowRef) MacGetRootWindow() ;
if ( x )
- x += MacGetLeftBorderSize() ;
+ *x += MacGetLeftBorderSize() ;
if ( y )
- y += MacGetTopBorderSize() ;
+ *y += MacGetTopBorderSize() ;
MacWindowToRootWindow( x , y ) ;
if ( HasFlag(wxNO_FULL_REPAINT_ON_RESIZE) )
{
- wxPoint oldPos( m_x , m_y ) ;
+ wxPoint oldPos( m_x , m_y ) ;
wxPoint newPos( actualX , actualY ) ;
MacWindowToRootWindow( &oldPos.x , &oldPos.y ) ;
MacWindowToRootWindow( &newPos.x , &newPos.y ) ;
void wxWindowMac::MacSuperShown( bool show )
{
- wxNode *node = GetChildren().First();
+ wxWindowListNode *node = GetChildren().GetFirst();
while ( node )
{
- wxWindowMac *child = (wxWindowMac *)node->Data();
+ wxWindowMac *child = (wxWindowMac *)node->GetData();
if ( child->m_isShown )
child->MacSuperShown( show ) ;
- node = node->Next();
+ node = node->GetNext();
}
}
// because unter MacOSX the frames are drawn with an addXXX mode)
// the borders area
}
- wxNode *node = GetChildren().First();
+ wxWindowListNode *node = GetChildren().GetFirst();
while ( node )
{
- wxWindowMac *child = (wxWindowMac *)node->Data();
+ wxWindowMac *child = (wxWindowMac *)node->GetData();
if ( child->m_isShown )
child->MacSuperEnabled( enabled ) ;
- node = node->Next();
+ node = node->GetNext();
}
}
DisposeRgn( updateRgn ) ;
}
- for (wxNode *node = GetChildren().First(); node; node = node->Next())
+ for (wxWindowListNode *node = GetChildren().GetFirst(); node; node = node->GetNext())
{
- wxWindowMac *child = (wxWindowMac*)node->Data();
+ wxWindowMac *child = (wxWindowMac*)node->GetData();
if (child == m_vScrollBar) continue;
if (child == m_hScrollBar) continue;
if (child->IsTopLevel()) continue;
-
+
int x,y;
child->GetPosition( &x, &y );
int w,h;
wxObject* wxWindowMac::GetChild(int number) const
{
// Return a pointer to the Nth object in the Panel
- wxNode *node = GetChildren().First();
+ wxNode *node = GetChildren().GetFirst();
int n = number;
while (node && n--)
- node = node->Next();
+ node = node->GetNext();
if ( node )
{
- wxObject *obj = (wxObject *)node->Data();
+ wxObject *obj = (wxObject *)node->GetData();
return(obj);
}
else
newPoint.y -= m_y;
}
- for (wxNode *node = GetChildren().First(); node; node = node->Next())
+ for (wxWindowListNode *node = GetChildren().GetFirst(); node; node = node->GetNext())
{
- wxWindowMac *child = (wxWindowMac*)node->Data();
+ wxWindowMac *child = (wxWindowMac*)node->GetData();
// added the m_isShown test --dmazzoni
if ( child->MacGetRootWindow() == window && child->m_isShown )
{
return FALSE ;
}
-extern int wxBusyCursorCount ;
static wxWindow *gs_lastWhich = NULL;
-bool wxWindowMac::MacSetupCursor( const wxPoint& pt)
+bool wxWindowMac::MacSetupCursor( const wxPoint& pt)
{
// first trigger a set cursor event
-
+
wxPoint clientorigin = GetClientAreaOrigin() ;
wxSize clientsize = GetClientSize() ;
wxCursor cursor ;
if ( wxRect2DInt( clientorigin.x , clientorigin.y , clientsize.x , clientsize.y ).Contains( wxPoint2DInt( pt ) ) )
- {
+ {
wxSetCursorEvent event( pt.x , pt.y );
bool processedEvtSetCursor = GetEventHandler()->ProcessEvent(event);
}
else
{
-
+
// the test for processedEvtSetCursor is here to prevent using m_cursor
// if the user code caught EVT_SET_CURSOR() and returned nothing from
// it - this is a way to say that our cursor shouldn't be used for this
int x = event.m_x ;
int y = event.m_y ;
- for (wxNode *node = GetChildren().First(); node; node = node->Next())
+ for (wxWindowListNode *node = GetChildren().GetFirst(); node; node = node->GetNext())
{
- wxWindowMac *child = (wxWindowMac*)node->Data();
+ wxWindowMac *child = (wxWindowMac*)node->GetData();
if ( child->MacGetRootWindow() == window && child->IsShown() && child->IsEnabled() )
{
if (child->MacDispatchMouseEvent(event))
{
RgnHandle visRgn = NewRgn() ;
RgnHandle tempRgn = NewRgn() ;
+ RgnHandle tempStaticBoxRgn = NewRgn() ;
SetRectRgn( visRgn , 0 , 0 , m_width , m_height ) ;
int borderTop = 14 ;
int borderOther = 4 ;
- SetRectRgn( tempRgn , borderOther , borderTop , m_width - borderOther , m_height - borderOther ) ;
- DiffRgn( visRgn , tempRgn , visRgn ) ;
+ SetRectRgn( tempStaticBoxRgn , borderOther , borderTop , m_width - borderOther , m_height - borderOther ) ;
+ DiffRgn( visRgn , tempStaticBoxRgn , visRgn ) ;
}
if ( !IsTopLevel() )
parent->MacWindowToRootWindow( &x, &y ) ;
MacRootWindowToWindow( &x , &y ) ;
- SetRectRgn( tempRgn ,
- x + parent->MacGetLeftBorderSize() , y + parent->MacGetTopBorderSize() ,
- x + size.x - parent->MacGetLeftBorderSize() - parent->MacGetRightBorderSize(),
- y + size.y - parent->MacGetTopBorderSize() - parent->MacGetBottomBorderSize()) ;
+ SetRectRgn( tempRgn ,
+ x + parent->MacGetLeftBorderSize() , y + parent->MacGetTopBorderSize() ,
+ x + size.x - parent->MacGetRightBorderSize(),
+ y + size.y - parent->MacGetBottomBorderSize()) ;
SectRgn( visRgn , tempRgn , visRgn ) ;
if ( parent->IsTopLevel() )
{
if ( GetWindowStyle() & wxCLIP_CHILDREN )
{
- for (wxNode *node = GetChildren().First(); node; node = node->Next())
+ for (wxWindowListNode *node = GetChildren().GetFirst(); node; node = node->GetNext())
{
- wxWindowMac *child = (wxWindowMac*)node->Data();
+ wxWindowMac *child = (wxWindowMac*)node->GetData();
if ( !child->IsTopLevel() && child->IsShown() )
{
SetRectRgn( tempRgn , child->m_x , child->m_y , child->m_x + child->m_width , child->m_y + child->m_height ) ;
+ if ( child->IsKindOf( CLASSINFO( wxStaticBox ) ) )
+ {
+ int borderTop = 14 ;
+ int borderOther = 4 ;
+
+ SetRectRgn( tempStaticBoxRgn , child->m_x + borderOther , child->m_y + borderTop , child->m_x + child->m_width - borderOther , child->m_y + child->m_height - borderOther ) ;
+ DiffRgn( tempRgn , tempStaticBoxRgn , tempRgn ) ;
+ }
DiffRgn( visRgn , tempRgn , visRgn ) ;
}
}
if ( (GetWindowStyle() & wxCLIP_SIBLINGS) && GetParent() )
{
bool thisWindowThrough = false ;
- for (wxNode *node = GetParent()->GetChildren().First(); node; node = node->Next())
+ for (wxWindowListNode *node = GetParent()->GetChildren().GetFirst(); node; node = node->GetNext())
{
- wxWindowMac *sibling = (wxWindowMac*)node->Data();
+ wxWindowMac *sibling = (wxWindowMac*)node->GetData();
if ( sibling == this )
{
thisWindowThrough = true ;
if ( !sibling->IsTopLevel() && sibling->IsShown() )
{
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 ) ;
+ if ( sibling->IsKindOf( CLASSINFO( wxStaticBox ) ) )
+ {
+ int borderTop = 14 ;
+ int borderOther = 4 ;
+
+ SetRectRgn( tempStaticBoxRgn , sibling->m_x - m_x + borderOther , sibling->m_y - m_y + borderTop , sibling->m_x + sibling->m_width - m_x - borderOther , sibling->m_y + sibling->m_height - m_y - borderOther ) ;
+ DiffRgn( tempRgn , tempStaticBoxRgn , tempRgn ) ;
+ }
DiffRgn( visRgn , tempRgn , visRgn ) ;
}
}
m_macVisibleRegion = visRgn ;
DisposeRgn( visRgn ) ;
DisposeRgn( tempRgn ) ;
+ DisposeRgn( tempStaticBoxRgn ) ;
return m_macVisibleRegion ;
}
if ( erase && !EmptyRgn(ownUpdateRgn) )
{
wxWindowDC dc(this);
- dc.SetClippingRegion(wxRegion(ownUpdateRgn));
+ if (!EmptyRgn(ownUpdateRgn))
+ dc.SetClippingRegion(wxRegion(ownUpdateRgn));
wxEraseEvent eevent( GetId(), &dc );
eevent.SetEventObject( this );
GetEventHandler()->ProcessEvent( eevent );
// now intersect for each of the children their rect with the updateRgn and call MacRedraw recursively
RgnHandle childupdate = NewRgn() ;
- for (wxNode *node = GetChildren().First(); node; node = node->Next())
+ for (wxWindowListNode *node = GetChildren().GetFirst(); node; node = node->GetNext())
{
// calculate the update region for the child windows by intersecting the window rectangle with our own
// passed in update region and then offset it to be client-wise window coordinates again
- wxWindowMac *child = (wxWindowMac*)node->Data();
+ wxWindowMac *child = (wxWindowMac*)node->GetData();
SetRectRgn( childupdate , child->m_x , child->m_y , child->m_x + child->m_width , child->m_y + child->m_height ) ;
SectRgn( childupdate , updatergn , childupdate ) ;
OffsetRgn( childupdate , -child->m_x , -child->m_y ) ;
{
// only window-absolute structures have to be moved i.e. controls
- wxNode *node = GetChildren().First();
+ wxWindowListNode *node = GetChildren().GetFirst();
while ( node )
{
- wxWindowMac *child = (wxWindowMac *)node->Data();
+ wxWindowMac *child = (wxWindowMac *)node->GetData();
child->MacSuperChangedPosition() ;
- node = node->Next();
+ node = node->GetNext();
}
}
{
// only screen-absolute structures have to be moved i.e. glcanvas
- wxNode *node = GetChildren().First();
+ wxWindowListNode *node = GetChildren().GetFirst();
while ( node )
{
- wxWindowMac *child = (wxWindowMac *)node->Data();
+ wxWindowMac *child = (wxWindowMac *)node->GetData();
child->MacTopLevelWindowChangedPosition() ;
- node = node->Next();
+ node = node->GetNext();
}
}
long wxWindowMac::MacGetLeftBorderSize( ) const