#include "wx/setup.h"
#include "wx/menu.h"
+#include "wx/window.h"
#include "wx/dc.h"
#include "wx/dcclient.h"
#include "wx/utils.h"
#include "wx/layout.h"
#include "wx/dialog.h"
#include "wx/listbox.h"
+#include "wx/scrolbar.h"
+#include "wx/statbox.h"
#include "wx/button.h"
#include "wx/settings.h"
#include "wx/msgdlg.h"
#include "wx/notebook.h"
#include "wx/tabctrl.h"
#include "wx/tooltip.h"
-// TODO remove the line below, just for lookup-up convenience CS
-#include "wx/mac/window.h"
-
+#include "wx/statusbr.h"
#include "wx/menuitem.h"
#include "wx/log.h"
EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
EVT_INIT_DIALOG(wxWindow::OnInitDialog)
EVT_IDLE(wxWindow::OnIdle)
-// EVT_SCROLL(wxWindow::OnScroll)
+ EVT_SET_FOCUS(wxWindow::OnSetFocus)
END_EVENT_TABLE()
#endif
// constructors and such
// ----------------------------------------------------------------------------
+WindowRef wxWindow::s_macWindowInUpdate = NULL;
+
void wxWindow::Init()
{
// generic
InitBase();
+ m_macEraseOnRedraw = true ;
+
// MSW specific
m_doubleClickAllowed = 0;
m_winCaptured = FALSE;
m_isShown = TRUE;
m_macWindowData = NULL ;
+ m_macEraseOnRedraw = true ;
m_x = 0;
m_y = 0 ;
m_width = WidthDefault( size.x );
m_height = HeightDefault( size.y ) ;
- if ( ! IsKindOf( CLASSINFO ( wxControl ) ) )
+ if ( ! IsKindOf( CLASSINFO ( wxControl ) ) && ! IsKindOf( CLASSINFO( wxStatusBar ) ) )
{
MacCreateScrollBars( style ) ;
}
void wxWindow::SetFocus()
{
+ if ( gFocusWindow == this )
+ return ;
+
if ( AcceptsFocus() )
{
if (gFocusWindow )
bool wxWindow::SetCursor(const wxCursor& cursor)
{
- if ( !wxWindowBase::SetCursor(cursor) )
- {
- // no change
+ if (m_cursor == cursor)
return FALSE;
- }
+
+ if (wxNullCursor == cursor)
+ {
+ if ( ! wxWindowBase::SetCursor( *wxSTANDARD_CURSOR ) )
+ return FALSE ;
+ }
+ else
+ {
+ if ( ! wxWindowBase::SetCursor( cursor ) )
+ return FALSE ;
+ }
wxASSERT_MSG( m_cursor.Ok(),
wxT("cursor must be valid after call to the base version"));
{
if ( mouseWin == this && !wxIsBusy() )
{
- cursor.MacInstall() ;
+ m_cursor.MacInstall() ;
}
}
DoSetSize( x,y, width, height ) ;
}
+// set the size of the window: if the dimensions are positive, just use them,
+// but if any of them is equal to -1, it means that we must find the value for
+// it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in
+// which case -1 is a valid value for x and y)
+//
+// If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate
+// the width/height to best suit our contents, otherwise we reuse the current
+// width/height
void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
{
actualX = currentX;
if (y == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
actualY = currentY;
- if (width == -1)
+
+ wxSize size( -1 , -1 ) ;
+
+ if (width == -1 || height == -1 )
+ {
+ size = DoGetBestSize() ;
+ }
+
+ if ( width == -1 )
+ {
+ if ( sizeFlags & wxSIZE_AUTO_WIDTH )
+ {
+ actualWidth = size.x ;
+ if ( actualWidth == -1 )
+ actualWidth = 80 ;
+ }
+ else
+ {
actualWidth = currentW ;
+ }
+ }
if (height == -1)
+ {
+ if ( sizeFlags & wxSIZE_AUTO_HEIGHT )
+ {
+ actualHeight = size.y ;
+ if ( actualHeight == -1 )
+ actualHeight = 26 ;
+ }
+ else
+ {
actualHeight = currentH ;
+ }
+ }
+ if ((m_minWidth != -1) && (actualWidth < m_minWidth))
+ actualWidth = m_minWidth;
+ if ((m_minHeight != -1) && (actualHeight < m_minHeight))
+ actualHeight = m_minHeight;
+ if ((m_maxWidth != -1) && (actualWidth > m_maxWidth))
+ actualWidth = m_maxWidth;
+ if ((m_maxHeight != -1) && (actualHeight > m_maxHeight))
+ actualHeight = m_maxHeight;
if ( actualX == currentX && actualY == currentY && actualWidth == currentW && actualHeight == currentH)
{
MacRepositionScrollBars() ; // we might have a real position shift
else
{
// erase former position
+ wxMacDrawingHelper focus( this ) ;
+ if ( focus.Ok() )
{
- wxMacDrawingClientHelper focus( this ) ;
- if ( focus.Ok() )
- {
- Rect clientrect = { 0 , 0 , m_height , m_width } ;
- InvalWindowRect( GetMacRootWindow() , &clientrect ) ;
- }
+ Rect clientrect = { 0 , 0 , m_height , m_width } ;
+ ClipRect( &clientrect ) ;
+ InvalWindowRect( GetMacRootWindow() , &clientrect ) ;
}
}
m_x = actualX ;
if ( doResize )
::SizeWindow(m_macWindowData->m_macWindow, m_width, m_height , true);
- // the OS takes care of invalidating and erasing
+ // the OS takes care of invalidating and erasing the new area
+ // we have erased the old one
if ( IsKindOf( CLASSINFO( wxFrame ) ) )
{
else
{
// erase new position
+
{
- wxMacDrawingClientHelper focus( this ) ;
+ wxMacDrawingHelper focus( this ) ;
if ( focus.Ok() )
{
Rect clientrect = { 0 , 0 , m_height , m_width } ;
+ ClipRect( &clientrect ) ;
InvalWindowRect( GetMacRootWindow() , &clientrect ) ;
}
}
+
if ( doMove )
wxWindow::MacSuperChangedPosition() ; // like this only children will be notified
}
}
}
+bool wxWindow::MacIsReallyShown() const
+{
+ if ( m_isShown && (m_parent != NULL) ) {
+ return m_parent->MacIsReallyShown();
+ }
+ return m_isShown;
+/*
+ bool status = m_isShown ;
+ wxWindow * win = this ;
+ while ( status && win->m_parent != NULL )
+ {
+ win = win->m_parent ;
+ status = win->m_isShown ;
+ }
+ return status ;
+*/
+}
+
int wxWindow::GetCharHeight() const
{
wxClientDC dc ( (wxWindow*)this ) ;
wxClientDC dc( (wxWindow*) this ) ;
long lx,ly,ld,le ;
- dc.GetTextExtent( string , &lx , &ly , &ld, &le, fontToUse ) ;
+ dc.GetTextExtent( string , &lx , &ly , &ld, &le, (wxFont *)fontToUse ) ;
if ( externalLeading )
*externalLeading = le ;
if ( descent )
void wxWindow::MacEraseBackground( Rect *rect )
{
+/*
WindowRef window = GetMacRootWindow() ;
if ( m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE) )
{
}
}
}
+*/
}
void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
}
InvalWindowRect( GetMacRootWindow() , &clientrect ) ;
}
+ if ( !eraseBack )
+ m_macEraseOnRedraw = false ;
+ else
+ m_macEraseOnRedraw = true ;
}
// Responds to colour changes: passes event on to children.
// translate the window attributes in the appropriate window class and attributes
- WindowClass wclass ;
- WindowAttributes attr ;
+ WindowClass wclass = 0;
+ WindowAttributes attr = kWindowNoAttributes ;
if ( HasFlag(wxTINY_CAPTION_HORIZ) || HasFlag(wxTINY_CAPTION_VERT) )
{
attr |= kWindowSideTitlebarAttribute ;
}
}
- else if ( HasFlag( wxTHICK_FRAME ) )
+ else if ( HasFlag( wxCAPTION ) )
{
if ( HasFlag( wxDIALOG_MODAL ) )
{
wclass = kMovableModalWindowClass ;
}
- else if ( HasFlag( wxDIALOG_MODELESS ) )
+ else
{
wclass = kDocumentWindowClass ;
}
- else
- {
- if ( HasFlag( wxCAPTION ) )
- {
- wclass = kDocumentWindowClass ;
- }
- else
- {
- wclass = kModalWindowClass ;
- }
- }
}
else
{
wclass = kModalWindowClass ;
}
- attr = kWindowNoAttributes ;
-
if ( HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) )
{
attr |= kWindowFullZoomAttribute ;
}
#endif // WXWIN_COMPATIBILITY
+void wxWindow::OnSetFocus(wxFocusEvent& event)
+{
+ // panel wants to track the window which was the last to have focus in it,
+ // so we want to set ourselves as the window which last had focus
+ //
+ // 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
+ // us, but to some other sibling
+ wxWindow *win = this;
+ while ( win )
+ {
+ wxWindow *parent = win->GetParent();
+ wxPanel *panel = wxDynamicCast(parent, wxPanel);
+ if ( panel )
+ {
+ panel->SetLastFocus(win);
+ }
+
+ win = parent;
+ }
+
+ event.Skip();
+}
+
void wxWindow::Clear()
{
if ( m_macWindowData )
{
m_cursor.MacInstall() ;
}
+
+ if ( event.GetEventType() == wxEVT_LEFT_DOWN )
+ {
+ // set focus to this window
+ if (AcceptsFocus() && FindFocus()!=this)
+ SetFocus();
+ }
#if wxUSE_TOOLTIPS
if ( event.GetEventType() == wxEVT_MOTION
}
void wxWindow::MacActivate( EventRecord *ev , bool inIsActivating )
{
- wxActivateEvent event(wxEVT_ACTIVATE, inIsActivating);
+ wxActivateEvent event(wxEVT_ACTIVATE, inIsActivating , m_windowId);
event.m_timeStamp = ev->when ;
event.SetEventObject(this);
{
// updatergn is always already clipped to our boundaries
WindowRef window = GetMacRootWindow() ;
+ // ownUpdateRgn is the area that this window has to invalidate i.e. its own area without its children
+ RgnHandle ownUpdateRgn = NewRgn() ;
+ CopyRgn( updatergn , ownUpdateRgn ) ;
wxWindow* win = wxFindWinFromMacWindow( window ) ;
{
wxMacDrawingHelper focus( this ) ; // was client
{
RGBBackColor( &m_backgroundColour.GetPixel()) ;
}
+ // subtract all non transparent children from updatergn
+
+ RgnHandle childarea = NewRgn() ;
+ for (wxNode *node = GetChildren().First(); node; node = node->Next())
+ {
+ wxWindow *child = (wxWindow*)node->Data();
+ // eventually test for transparent windows
+ if ( child->GetMacRootWindow() == window && child->IsShown() )
+ {
+ if ( !child->IsKindOf( CLASSINFO( wxNotebook ) ) && !child->IsKindOf( CLASSINFO( wxTabCtrl ) ) )
+ {
+ SetRectRgn( childarea , child->m_x , child->m_y , child->m_x + child->m_width , child->m_y + child->m_height ) ;
+ DiffRgn( ownUpdateRgn , childarea , ownUpdateRgn ) ;
+ }
+ }
+ }
+ DisposeRgn( childarea ) ;
+
if ( GetParent() && m_backgroundColour != GetParent()->GetBackgroundColour() )
eraseBackground = true ;
SetClip( updatergn ) ;
- if ( eraseBackground )
- {
- EraseRgn( updatergn ) ;
- }
+ if ( m_macEraseOnRedraw ) {
+ if ( eraseBackground )
+ {
+ EraseRgn( ownUpdateRgn ) ;
+ }
+ }
+ else {
+ m_macEraseOnRedraw = true ;
+ }
}
- m_macUpdateRgn = updatergn ;
{
RgnHandle newupdate = NewRgn() ;
wxSize point = GetClientSize() ;
wxPoint origin = GetClientAreaOrigin() ;
SetRectRgn( newupdate , origin.x , origin.y , origin.x + point.x , origin.y+point.y ) ;
- SectRgn( newupdate , m_macUpdateRgn , newupdate ) ;
+ SectRgn( newupdate , ownUpdateRgn , newupdate ) ;
OffsetRgn( newupdate , -origin.x , -origin.y ) ;
m_updateRegion = newupdate ;
DisposeRgn( newupdate ) ;
{
wxWindow *child = (wxWindow*)node->Data();
SetRectRgn( childupdate , child->m_x , child->m_y , child->m_x + child->m_width , child->m_y + child->m_height ) ;
- SectRgn( childupdate , m_macUpdateRgn , childupdate ) ;
+ SectRgn( childupdate , updatergn , childupdate ) ;
OffsetRgn( childupdate , -child->m_x , -child->m_y ) ;
if ( child->GetMacRootWindow() == window && child->IsShown() && !EmptyRgn( childupdate ) )
{
node = node->Next();
}
}
-/*
-
-bool wxWindow::MacSetupFocusPort( )
-{
- Point localOrigin ;
- Rect clipRect ;
- WindowRef window ;
- wxWindow *rootwin ;
- GrafPtr port ;
-
- MacGetPortParams( &localOrigin , &clipRect , &window , &rootwin) ;
- return MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ;
-}
-
-bool wxWindow::MacSetupFocusClientPort( )
-{
- Point localOrigin ;
- Rect clipRect ;
- WindowRef window ;
- wxWindow *rootwin ;
- GrafPtr port ;
-
- MacGetPortClientParams( &localOrigin , &clipRect , &window , &rootwin) ;
- return MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ;
-}
-
-bool wxWindow::MacSetupDrawingPort( )
-{
- Point localOrigin ;
- Rect clipRect ;
- WindowRef window ;
- wxWindow *rootwin ;
- GrafPtr port ;
-
- MacGetPortParams( &localOrigin , &clipRect , &window , &rootwin) ;
- return MacSetPortDrawingParams( localOrigin, clipRect, window , rootwin ) ;
-}
-
-bool wxWindow::MacSetupDrawingClientPort( )
-{
- Point localOrigin ;
- Rect clipRect ;
- WindowRef window ;
- wxWindow *rootwin ;
- GrafPtr port ;
-
- MacGetPortClientParams( &localOrigin , &clipRect , &window , &rootwin) ;
- return MacSetPortDrawingParams( localOrigin, clipRect, window , rootwin ) ;
-}
-*/
bool wxWindow::MacSetPortFocusParams( const Point & localOrigin, const Rect & clipRect, WindowRef window , wxWindow* win )
{
{
return style & ~( wxDOUBLE_BORDER | wxSUNKEN_BORDER | wxRAISED_BORDER | wxBORDER | wxSTATIC_BORDER ) ;
}
-/*
-wxMacFocusHelper::wxMacFocusHelper( wxWindow * theWindow )
-{
- m_ok = false ;
- Point localOrigin ;
- Rect clipRect ;
- WindowRef window ;
- wxWindow *rootwin ;
- m_currentPort = NULL ;
- GetPort( &m_formerPort ) ;
- if ( theWindow )
- {
-
- theWindow->MacGetPortParams( &localOrigin , &clipRect , &window , &rootwin) ;
- m_currentPort = UMAGetWindowPort( window ) ;
- theWindow->MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ;
- m_ok = true ;
- }
-}
-
-wxMacFocusHelper::~wxMacFocusHelper()
-{
- if ( m_ok )
- {
- SetPort( m_currentPort ) ;
- SetOrigin( 0 , 0 ) ;
- }
- if ( m_formerPort != m_currentPort )
- SetPort( m_formerPort ) ;
-}
-*/
+
+
wxMacDrawingHelper::wxMacDrawingHelper( wxWindow * theWindow )
{
m_ok = false ;
if ( m_formerPort != m_currentPort )
SetPort( m_formerPort ) ;
}
-/*
-wxMacFocusClientHelper::wxMacFocusClientHelper( wxWindow * theWindow )
-{
- m_ok = false ;
- Point localOrigin ;
- Rect clipRect ;
- WindowRef window ;
- wxWindow *rootwin ;
- m_currentPort = NULL ;
-
- GetPort( &m_formerPort ) ;
-
- if ( theWindow )
- {
- theWindow->MacGetPortClientParams( &localOrigin , &clipRect , &window , &rootwin) ;
- m_currentPort = UMAGetWindowPort( window ) ;
- theWindow->MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ;
- m_ok = true ;
- }
-}
-
-wxMacFocusClientHelper::~wxMacFocusClientHelper()
-{
- if ( m_ok )
- {
- SetPort( m_currentPort ) ;
- SetOrigin( 0 , 0 ) ;
- }
- if ( m_formerPort != m_currentPort )
- SetPort( m_formerPort ) ;
-}
-*/
wxMacDrawingClientHelper::wxMacDrawingClientHelper( wxWindow * theWindow )
{