#include "wx/textctrl.h"
#include "wx/settings.h"
#include "wx/dialog.h"
+ #include "wx/msgdlg.h"
#endif //WX_PRECOMP
#if wxUSE_CONSTRAINTS
BEGIN_EVENT_TABLE(wxWindowBase, wxEvtHandler)
EVT_SYS_COLOUR_CHANGED(wxWindowBase::OnSysColourChanged)
EVT_INIT_DIALOG(wxWindowBase::OnInitDialog)
+ EVT_MIDDLE_DOWN(wxWindowBase::OnMiddleClick)
END_EVENT_TABLE()
// ============================================================================
// m_foregroundColour = *wxBLACK; // TODO take this from sys settings too?
m_foregroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOWTEXT);
-#if !defined(__WXMAC__) && !defined(__WXGTK__)
+ // GRG, changed Mar/2000
+#if 0 // !defined(__WXMAC__) && !defined(__WXGTK__)
m_font = *wxSWISS_FONT; // and this?
#else
- m_font = settings.GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
+ m_font = settings.GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
#endif
// no style bits
+ m_exStyle =
m_windowStyle = 0;
// an optimization for the event processing: checking this flag is much
SetValidator(validator);
#endif // wxUSE_VALIDATORS
+ // if the parent window has wxWS_EX_VALIDATE_RECURSIVELY set, we want to
+ // have it too - like this it's possible to set it only in the top level
+ // dialog/frame and all children will inherit it by defult
+ if ( parent && (parent->GetExtraStyle() & wxWS_EX_VALIDATE_RECURSIVELY) )
+ {
+ SetExtraStyle(wxWS_EX_VALIDATE_RECURSIVELY);
+ }
+
return TRUE;
}
// controls are always centered on their parent because it doesn't make
// sense to centre them on the screen
- if ( !(direction & wxCENTRE_ON_SCREEN) || wxDynamicCast(this, wxControl) )
+ if ( !(direction & wxCENTRE_ON_SCREEN) || !IsTopLevel() )
{
- // theo nly chance to get this is to have a wxControl without parent
- wxCHECK_RET( parent, wxT("a control must have a parent") );
+ // the only chance to get this is to have a not top level window
+ // without parent which shouldn't happen
+ wxCHECK_RET( parent, wxT("this window must have a parent") );
// adjust to the parents client area origin
wxPoint posParent = parent->ClientToScreen(wxPoint(0, 0));
int wx, wy, ww, wh;
win->GetPosition(&wx, &wy);
+
+ // if the window hadn't been positioned yet, assume that it is in
+ // the origin
+ if ( wx == -1 )
+ wx = 0;
+ if ( wy == -1 )
+ wy = 0;
+
win->GetSize(&ww, &wh);
if ( wx + ww > maxX )
maxX = wx + ww;
bool wxWindowBase::Validate()
{
#if wxUSE_VALIDATORS
+ bool recurse = (GetExtraStyle() & wxWS_EX_VALIDATE_RECURSIVELY) != 0;
+
wxWindowList::Node *node;
for ( node = m_children.GetFirst(); node; node = node->GetNext() )
{
{
return FALSE;
}
+
+ if ( recurse && !child->Validate() )
+ {
+ return FALSE;
+ }
}
#endif // wxUSE_VALIDATORS
bool wxWindowBase::TransferDataToWindow()
{
#if wxUSE_VALIDATORS
+ bool recurse = (GetExtraStyle() & wxWS_EX_VALIDATE_RECURSIVELY) != 0;
+
wxWindowList::Node *node;
for ( node = m_children.GetFirst(); node; node = node->GetNext() )
{
wxValidator *validator = child->GetValidator();
if ( validator && !validator->TransferToWindow() )
{
- wxLog *log = wxLog::GetActiveTarget();
- if ( log )
- {
- wxLogWarning(_("Could not transfer data to window"));
- log->Flush();
- }
+ wxLogWarning(_("Could not transfer data to window"));
+ wxLog::FlushActive();
return FALSE;
}
+
+ if ( recurse )
+ {
+ if ( !child->TransferDataToWindow() )
+ {
+ // warning already given
+ return FALSE;
+ }
+ }
}
#endif // wxUSE_VALIDATORS
bool wxWindowBase::TransferDataFromWindow()
{
#if wxUSE_VALIDATORS
+ bool recurse = (GetExtraStyle() & wxWS_EX_VALIDATE_RECURSIVELY) != 0;
+
wxWindowList::Node *node;
for ( node = m_children.GetFirst(); node; node = node->GetNext() )
{
wxWindow *child = node->GetData();
- if ( child->GetValidator() &&
- !child->GetValidator()->TransferFromWindow() )
+ wxValidator *validator = child->GetValidator();
+ if ( validator && !validator->TransferFromWindow() )
{
+ // nop warning here because the application is supposed to give
+ // one itself - we don't know here what might have gone wrongly
+
return FALSE;
}
+
+ if ( recurse )
+ {
+ if ( !child->TransferDataFromWindow() )
+ {
+ // warning already given
+ return FALSE;
+ }
+ }
}
#endif // wxUSE_VALIDATORS
}
else
{
- // Evaluate child constraints
+ wxLayoutConstraints *constr = GetConstraints();
+ bool wasOk = constr && constr->AreSatisfied();
+
ResetConstraints(); // Mark all constraints as unevaluated
- DoPhase(1); // Just one phase need if no sizers involved
- DoPhase(2);
+
+ // if we're a top level panel (i.e. our parent is frame/dialog), our
+ // own constraints will never be satisfied any more unless we do it
+ // here
+ if ( wasOk )
+ {
+ int noChanges = 1;
+ while ( noChanges > 0 )
+ {
+ constr->SatisfyConstraints(this, &noChanges);
+ }
+ }
+
+ DoPhase(1); // Layout children
+ DoPhase(2); // Layout grand children
SetConstraintSizes(); // Recursively set the real window sizes
}
void wxWindowBase::SetConstraintSizes(bool recurse)
{
wxLayoutConstraints *constr = GetConstraints();
- if ( constr && constr->left.GetDone() && constr->right.GetDone( ) &&
- constr->width.GetDone() && constr->height.GetDone())
+ if ( constr && constr->AreSatisfied() )
{
int x = constr->left.GetValue();
int y = constr->top.GetValue();
}
else if ( constr )
{
- wxString winName = GetName();
- if ( !winName )
- winName = wxT("unnamed");
- wxLogDebug(wxT("Constraint not satisfied for %s, name '%s'."),
+ wxLogDebug(wxT("Constraints not satisfied for %s named '%s'."),
GetClassInfo()->GetClassName(),
- winName.c_str());
+ GetName().c_str());
}
if ( recurse )
TransferDataToWindow();
}
+// process Ctrl-Alt-mclick
+void wxWindowBase::OnMiddleClick( wxMouseEvent& event )
+{
+ if ( event.ControlDown() && event.AltDown() )
+ {
+ // don't translate these strings
+ wxString port;
+ switch ( wxGetOsVersion() )
+ {
+ case wxMOTIF_X: port = _T("Motif"); break;
+ case wxMACINTOSH: port = _T("Mac"); break;
+ case wxBEOS: port = _T("BeOS"); break;
+ case wxGTK:
+ case wxGTK_WIN32:
+ case wxGTK_OS2:
+ case wxGTK_BEOS: port = _T("GTK"); break;
+ case wxWINDOWS:
+ case wxPENWINDOWS:
+ case wxWINDOWS_NT:
+ case wxWIN32S:
+ case wxWIN95:
+ case wxWIN386: port = _T("MS Windows"); break;
+ case wxMGL_UNIX:
+ case wxMGL_X:
+ case wxMGL_WIN32:
+ case wxMGL_OS2: port = _T("MGL"); break;
+ case wxWINDOWS_OS2:
+ case wxOS2_PM: port = _T("OS/2"); break;
+ default: port = _T("unknown"); break;
+ }
+
+ wxMessageBox(wxString::Format(
+ _T(
+ " wxWindows Library (%s port)\n"
+ "Version %u.%u.%u, compiled at %s %s\n"
+ " Copyright (c) 1995-2000 wxWindows team"
+ ),
+ port.c_str(),
+ wxMAJOR_VERSION,
+ wxMINOR_VERSION,
+ wxRELEASE_NUMBER,
+ __DATE__,
+ __TIME__
+ ),
+ _T("wxWindows information"),
+ wxICON_INFORMATION | wxOK,
+ (wxWindow *)this);
+ }
+ else
+ {
+ event.Skip();
+ }
+}
+
// ----------------------------------------------------------------------------
// list classes implementation
// ----------------------------------------------------------------------------