+
+ return s_sizeBtn;
+}
+
+// ----------------------------------------------------------------------------
+// default button handling
+// ----------------------------------------------------------------------------
+
+/*
+ The comment below and all this code is probably due to not using WM_NEXTDLGCTL
+ message when changing focus (but just SetFocus() which is not enough), see
+ http://blogs.msdn.com/oldnewthing/archive/2004/08/02/205624.aspx for the
+ full explanation.
+
+ TODO: Do use WM_NEXTDLGCTL and get rid of all this code.
+
+
+ "Everything you ever wanted to know about the default buttons" or "Why do we
+ have to do all this?"
+
+ In MSW the default button should be activated when the user presses Enter
+ and the current control doesn't process Enter itself somehow. This is
+ handled by ::DefWindowProc() (or maybe ::DefDialogProc()) using DM_SETDEFID
+ Another aspect of "defaultness" is that the default button has different
+ appearance: this is due to BS_DEFPUSHBUTTON style which is completely
+ separate from DM_SETDEFID stuff (!). Also note that BS_DEFPUSHBUTTON should
+ be unset if our parent window is not active so it should be unset whenever
+ we lose activation and set back when we regain it.
+
+ Final complication is that when a button is active, it should be the default
+ one, i.e. pressing Enter on a button always activates it and not another
+ one.
+
+ We handle this by maintaining a permanent and a temporary default items in
+ wxControlContainer (both may be NULL). When a button becomes the current
+ control (i.e. gets focus) it sets itself as the temporary default which
+ ensures that it has the right appearance and that Enter will be redirected
+ to it. When the button loses focus, it unsets the temporary default and so
+ the default item will be the permanent default -- that is the default button
+ if any had been set or none otherwise, which is just what we want.
+
+ NB: all this is quite complicated by now and the worst is that normally
+ it shouldn't be necessary at all as for the normal Windows programs
+ DefWindowProc() and IsDialogMessage() take care of all this
+ automatically -- however in wxWidgets programs this doesn't work for
+ nested hierarchies (i.e. a notebook inside a notebook) for unknown
+ reason and so we have to reproduce all this code ourselves. It would be
+ very nice if we could avoid doing it.
+ */
+
+// set this button as the (permanently) default one in its panel
+wxWindow *wxButton::SetDefault()
+{
+ // set this one as the default button both for wxWidgets ...
+ wxWindow *winOldDefault = wxButtonBase::SetDefault();
+
+ // ... and Windows
+ SetDefaultStyle(wxDynamicCast(winOldDefault, wxButton), false);
+ SetDefaultStyle(this, true);
+
+ return winOldDefault;
+}
+
+// return the top level parent window if it's not being deleted yet, otherwise
+// return NULL
+static wxTopLevelWindow *GetTLWParentIfNotBeingDeleted(wxWindow *win)
+{
+ for ( ;; )