#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/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"
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 ;
void wxWindow::SetFocus()
{
+ if ( gFocusWindow == this )
+ return ;
+
if ( AcceptsFocus() )
{
if (gFocusWindow )
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
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 )
status = win->m_isShown ;
}
return status ;
+*/
}
int wxWindow::GetCharHeight() const
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)
{
wclass = kMovableModalWindowClass ;
}
- else if ( HasFlag( wxDIALOG_MODELESS ) )
+ else
{
wclass = kDocumentWindowClass ;
}
- /*
- else
- {
- if ( HasFlag( wxCAPTION ) )
- {
- wclass = kDocumentWindowClass ;
- }
- else
- {
- wclass = kModalWindowClass ;
- }
- }
- */
}
else
{
}
#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);
if ( GetParent() && m_backgroundColour != GetParent()->GetBackgroundColour() )
eraseBackground = true ;
SetClip( updatergn ) ;
- if ( eraseBackground )
+ if ( eraseBackground && m_macEraseOnRedraw )
{
+ // todo : find a clever algorithm, which only will do this
+ // if really necessary
EraseRgn( updatergn ) ;
}
}
Rect portRect ;
GetPortBounds( m_currentPort , &portRect ) ;
ClipRect( &portRect ) ;
- wxDC::MacInvalidateSetup() ;
}
if ( m_formerPort != m_currentPort )