#if wxUSE_STATUSBAR
static bool m_useNativeStatusBar;
#endif // wxUSE_STATUSBAR
+ // the last focused child: we restore focus to it on activation
+ wxWindow *m_winLastFocused;
private:
DECLARE_EVENT_TABLE()
// event handlers
// --------------
+ void OnSetFocus(wxFocusEvent& event) ;
void OnEraseBackground(wxEraseEvent& event);
void OnIdle(wxIdleEvent& event);
void MacOnScroll(wxScrollEvent&event ) ;
controlpart = FindControl( localwhere , window , &control ) ;
{
+ /*
if ( AcceptsFocus() && FindFocus() != this )
{
SetFocus() ;
}
+ */
if ( control && UMAIsControlActive( control ) )
{
{
m_frameToolBar = NULL ;
#endif
m_frameStatusBar = NULL;
+ m_winLastFocused = NULL ;
SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE));
{
if ( !event.GetActive() )
{
+ // remember the last focused child
+ m_winLastFocused = FindFocus();
+ while ( m_winLastFocused )
+ {
+ if ( GetChildren().Find(m_winLastFocused) )
+ break;
+
+ m_winLastFocused = m_winLastFocused->GetParent();
+ }
+
event.Skip();
- return;
}
-
+ else
+ {
+/*
for ( wxWindowList::Node *node = GetChildren().GetFirst();
node;
node = node->GetNext() )
// restore focus
wxWindow *child = node->GetData();
- if ( !child->IsTopLevel()
+ if ( !child->IsTopLevel() && child->AcceptsFocus()
#if wxUSE_TOOLBAR
&& !wxDynamicCast(child, wxToolBar)
#endif // wxUSE_TOOLBAR
break;
}
}
-
- if ( m_frameMenuBar != NULL )
- {
- m_frameMenuBar->MacInstallMenuBar() ;
- }
+ */
+ wxSetFocusToChild(this, &m_winLastFocused);
+
+ if ( m_frameMenuBar != NULL )
+ {
+ m_frameMenuBar->MacInstallMenuBar() ;
+ }
+ }
}
void wxFrame::DoGetClientSize(int *x, int *y) const
bool wxToolBar::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
long style, const wxString& name)
{
- m_maxWidth = m_maxHeight = 0;
m_defaultWidth = defwidth;
m_defaultHeight = defheight;
wxToolBar::~wxToolBar()
{
- // TODO
+ // we must refresh the frame size when the toolbar is deleted but the frame
+ // is not - otherwise toolbar leaves a hole in the place it used to occupy
}
PicHandle MakePict(GWorldPtr wp, GWorldPtr mask ) ;
WindowRef window ;
wxWindow *win ;
- MacGetPortParams( &localOrigin , &clipRect , &window , &win ) ;
+ GetParent()->MacGetPortParams( &localOrigin , &clipRect , &window , &win ) ;
Rect toolbarrect = { m_y + localOrigin.v , m_x + localOrigin.h ,
m_y + m_height + localOrigin.v , m_x + m_width + localOrigin.h} ;
wxSize toolSize = GetToolSize() ;
int tw, th;
GetSize(& tw, & th);
+ m_maxWidth = m_maxHeight = 0 ;
while (node)
{
wxToolBarTool *tool = (wxToolBarTool *)node->Data();
m_macToolHandles.Add( NULL ) ;
x += (int)toolSize.x / 4;
}
- if ( toolbarrect.left + x + kwxMacToolBarLeftMargin > m_maxWidth)
- m_maxWidth = toolbarrect.left + x + kwxMacToolBarLeftMargin;
- if (toolbarrect.top + kwxMacToolBarTopMargin + toolSize.y > m_maxHeight)
- m_maxHeight = toolbarrect.top + kwxMacToolBarTopMargin ;
+ if ( toolbarrect.left + x + kwxMacToolBarLeftMargin - m_x - localOrigin.h > m_maxWidth)
+ m_maxWidth = toolbarrect.left + x + kwxMacToolBarLeftMargin - m_x - localOrigin.h;
+ if (toolbarrect.top + kwxMacToolBarTopMargin - m_y - localOrigin.v > m_maxHeight)
+ m_maxHeight = toolbarrect.top + kwxMacToolBarTopMargin - m_y - localOrigin.v ;
node = node->Next();
}
if ( GetWindowStyleFlag() & wxTB_HORIZONTAL )
{
- m_maxWidth = tw ; // +=toolSize.x;
+ if ( m_maxRows == 0 )
+ {
+ // if not set yet, only one row
+ SetRows(1);
+ }
+ m_maxWidth = clipRect.right - m_x ;
+ //m_maxWidth = tw ; // +=toolSize.x;
+ //m_maxWidth += m_xMargin ;
m_maxHeight += toolSize.y;
m_maxHeight += m_yMargin;
}
else
{
- m_maxHeight = th ;// += toolSize.y;
+ if ( noButtons > 0 && m_maxRows == 0 )
+ {
+ // if not set yet, have one column
+ SetRows(noButtons);
+ }
+ m_maxHeight = clipRect.bottom - m_y ;
+ //m_maxHeight += m_yMargin ;
m_maxWidth += toolSize.x;
m_maxWidth += m_xMargin;
}
WindowRef window ;
wxWindow *win ;
- MacGetPortParams( &localOrigin , &clipRect , &window , &win ) ;
+ GetParent()->MacGetPortParams( &localOrigin , &clipRect , &window , &win ) ;
if ( window && win )
{
wxMacDrawingHelper help( win ) ;
parent = parent->GetParent() ;
}
+ int w = m_width ;
+ int h = m_height ;
+
+ if ( GetWindowStyleFlag() & wxTB_HORIZONTAL )
+ {
+ w = clipRect.right - m_x ;
+ }
+ else
+ {
+ h = clipRect.bottom - m_y ;
+ }
+
Rect toolbarrect = { m_y + localOrigin.v , m_x + localOrigin.h ,
- m_y + localOrigin.v + m_height , m_x + localOrigin.h + m_width } ;
+ m_y + localOrigin.v + h , m_x + localOrigin.h + w } ;
UMADrawThemePlacard( &toolbarrect , IsEnabled() ? kThemeStateActive : kThemeStateInactive) ;
{
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
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
}
#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
controlpart = FindControl( localwhere , window , &control ) ;
{
+ /*
if ( AcceptsFocus() && FindFocus() != this )
{
SetFocus() ;
}
+ */
if ( control && UMAIsControlActive( control ) )
{
{
m_frameToolBar = NULL ;
#endif
m_frameStatusBar = NULL;
+ m_winLastFocused = NULL ;
SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE));
{
if ( !event.GetActive() )
{
+ // remember the last focused child
+ m_winLastFocused = FindFocus();
+ while ( m_winLastFocused )
+ {
+ if ( GetChildren().Find(m_winLastFocused) )
+ break;
+
+ m_winLastFocused = m_winLastFocused->GetParent();
+ }
+
event.Skip();
- return;
}
-
+ else
+ {
+/*
for ( wxWindowList::Node *node = GetChildren().GetFirst();
node;
node = node->GetNext() )
// restore focus
wxWindow *child = node->GetData();
- if ( !child->IsTopLevel()
+ if ( !child->IsTopLevel() && child->AcceptsFocus()
#if wxUSE_TOOLBAR
&& !wxDynamicCast(child, wxToolBar)
#endif // wxUSE_TOOLBAR
break;
}
}
-
- if ( m_frameMenuBar != NULL )
- {
- m_frameMenuBar->MacInstallMenuBar() ;
- }
+ */
+ wxSetFocusToChild(this, &m_winLastFocused);
+
+ if ( m_frameMenuBar != NULL )
+ {
+ m_frameMenuBar->MacInstallMenuBar() ;
+ }
+ }
}
void wxFrame::DoGetClientSize(int *x, int *y) const
bool wxToolBar::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
long style, const wxString& name)
{
- m_maxWidth = m_maxHeight = 0;
m_defaultWidth = defwidth;
m_defaultHeight = defheight;
wxToolBar::~wxToolBar()
{
- // TODO
+ // we must refresh the frame size when the toolbar is deleted but the frame
+ // is not - otherwise toolbar leaves a hole in the place it used to occupy
}
PicHandle MakePict(GWorldPtr wp, GWorldPtr mask ) ;
WindowRef window ;
wxWindow *win ;
- MacGetPortParams( &localOrigin , &clipRect , &window , &win ) ;
+ GetParent()->MacGetPortParams( &localOrigin , &clipRect , &window , &win ) ;
Rect toolbarrect = { m_y + localOrigin.v , m_x + localOrigin.h ,
m_y + m_height + localOrigin.v , m_x + m_width + localOrigin.h} ;
wxSize toolSize = GetToolSize() ;
int tw, th;
GetSize(& tw, & th);
+ m_maxWidth = m_maxHeight = 0 ;
while (node)
{
wxToolBarTool *tool = (wxToolBarTool *)node->Data();
m_macToolHandles.Add( NULL ) ;
x += (int)toolSize.x / 4;
}
- if ( toolbarrect.left + x + kwxMacToolBarLeftMargin > m_maxWidth)
- m_maxWidth = toolbarrect.left + x + kwxMacToolBarLeftMargin;
- if (toolbarrect.top + kwxMacToolBarTopMargin + toolSize.y > m_maxHeight)
- m_maxHeight = toolbarrect.top + kwxMacToolBarTopMargin ;
+ if ( toolbarrect.left + x + kwxMacToolBarLeftMargin - m_x - localOrigin.h > m_maxWidth)
+ m_maxWidth = toolbarrect.left + x + kwxMacToolBarLeftMargin - m_x - localOrigin.h;
+ if (toolbarrect.top + kwxMacToolBarTopMargin - m_y - localOrigin.v > m_maxHeight)
+ m_maxHeight = toolbarrect.top + kwxMacToolBarTopMargin - m_y - localOrigin.v ;
node = node->Next();
}
if ( GetWindowStyleFlag() & wxTB_HORIZONTAL )
{
- m_maxWidth = tw ; // +=toolSize.x;
+ if ( m_maxRows == 0 )
+ {
+ // if not set yet, only one row
+ SetRows(1);
+ }
+ m_maxWidth = clipRect.right - m_x ;
+ //m_maxWidth = tw ; // +=toolSize.x;
+ //m_maxWidth += m_xMargin ;
m_maxHeight += toolSize.y;
m_maxHeight += m_yMargin;
}
else
{
- m_maxHeight = th ;// += toolSize.y;
+ if ( noButtons > 0 && m_maxRows == 0 )
+ {
+ // if not set yet, have one column
+ SetRows(noButtons);
+ }
+ m_maxHeight = clipRect.bottom - m_y ;
+ //m_maxHeight += m_yMargin ;
m_maxWidth += toolSize.x;
m_maxWidth += m_xMargin;
}
WindowRef window ;
wxWindow *win ;
- MacGetPortParams( &localOrigin , &clipRect , &window , &win ) ;
+ GetParent()->MacGetPortParams( &localOrigin , &clipRect , &window , &win ) ;
if ( window && win )
{
wxMacDrawingHelper help( win ) ;
parent = parent->GetParent() ;
}
+ int w = m_width ;
+ int h = m_height ;
+
+ if ( GetWindowStyleFlag() & wxTB_HORIZONTAL )
+ {
+ w = clipRect.right - m_x ;
+ }
+ else
+ {
+ h = clipRect.bottom - m_y ;
+ }
+
Rect toolbarrect = { m_y + localOrigin.v , m_x + localOrigin.h ,
- m_y + localOrigin.v + m_height , m_x + localOrigin.h + m_width } ;
+ m_y + localOrigin.v + h , m_x + localOrigin.h + w } ;
UMADrawThemePlacard( &toolbarrect , IsEnabled() ? kThemeStateActive : kThemeStateInactive) ;
{
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
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
}
#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