X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c809f3be86c79dc44854433fec4ccfc030d4f7b9..b97e22c0ca7469762e422960245009648b0e0edf:/src/mac/carbon/window.cpp?ds=sidebyside diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index b88a8a3959..382b71024f 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -15,6 +15,7 @@ #include "wx/setup.h" #include "wx/menu.h" +#include "wx/window.h" #include "wx/dc.h" #include "wx/dcclient.h" #include "wx/utils.h" @@ -33,9 +34,6 @@ #include "wx/tabctrl.h" #include "wx/tooltip.h" #include "wx/statusbr.h" -// TODO remove the line below, just for lookup-up convenience CS -#include "wx/window.h" - #include "wx/menuitem.h" #include "wx/log.h" @@ -65,7 +63,7 @@ BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler) 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 @@ -205,6 +203,9 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, void wxWindow::SetFocus() { + if ( gFocusWindow == this ) + return ; + if ( AcceptsFocus() ) { if (gFocusWindow ) @@ -510,6 +511,14 @@ void wxWindow::DoMoveWindow(int x, int y, int width, int height) 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) { @@ -531,11 +540,49 @@ 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 @@ -714,6 +761,11 @@ void wxWindow::MacSuperShown( bool show ) 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 ) @@ -722,6 +774,7 @@ bool wxWindow::MacIsReallyShown() const status = win->m_isShown ; } return status ; +*/ } int wxWindow::GetCharHeight() const @@ -745,7 +798,7 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y, 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 ) @@ -1028,27 +1081,16 @@ void wxWindow::MacCreateRealWindow( const wxString& title, 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 { @@ -1361,6 +1403,30 @@ wxObject* wxWindow::GetChild(int number) const } #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 ) @@ -1525,6 +1591,13 @@ bool wxWindow::MacDispatchMouseEvent(wxMouseEvent& event) { 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 @@ -1674,7 +1747,7 @@ void wxWindow::MacMouseMoved( EventRecord *ev , short part) } 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); @@ -2023,56 +2096,6 @@ void wxWindow::MacSuperChangedPosition() 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 ) { @@ -2287,7 +2310,37 @@ long wxWindow::MacRemoveBordersFromStyle( long style ) { 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 ) {