// Modified by:
// Created: 04/01/98
// RCS-ID: $Id$
-// Copyright: (c) Julian Smart and Markus Holzem
-// Licence: wxWindows license
+// Copyright: (c) Julian Smart
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// =============================================================================
// headers
// ----------------------------------------------------------------------------
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "layout.h"
#endif
value = 0;
percent = 0;
otherEdge = wxTop;
- done = FALSE;
+ done = false;
otherWin = (wxWindowBase *) NULL;
}
void wxIndividualLayoutConstraint::Set(wxRelationship rel, wxWindowBase *otherW, wxEdge otherE, int val, int marg)
{
+ if (rel == wxSameAs)
+ {
+ // If Set is called by the user with wxSameAs then call SameAs to do
+ // it since it will actually use wxPercent instead.
+ SameAs(otherW, otherE, marg);
+ return;
+ }
+
relationship = rel;
otherWin = otherW;
otherEdge = otherE;
// 'Same edge' alignment
//
void wxIndividualLayoutConstraint::SameAs(wxWindowBase *otherW, wxEdge edge, int marg)
-{
+{
Set(wxPercentOf, otherW, edge, 100, marg);
}
// The edge is a percentage of the other window's edge
void wxIndividualLayoutConstraint::PercentOf(wxWindowBase *otherW, wxEdge wh, int per)
-{
+{
Set(wxPercentOf, otherW, wh, per);
}
percent = 0;
otherEdge = wxTop;
otherWin = (wxWindowBase *) NULL;
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
// Try to satisfy constraint
{
if (relationship == wxAbsolute)
{
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
switch (myEdge)
if (edgePos != -1)
{
value = edgePos - margin;
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxRightOf:
{
if (edgePos != -1)
{
value = edgePos + margin;
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxPercentOf:
{
if (edgePos != -1)
{
value = (int)(edgePos*(((float)percent)*0.01) + margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxUnconstrained:
{
if (constraints->right.GetDone() && constraints->width.GetDone())
{
value = (constraints->right.GetValue() - constraints->width.GetValue() + margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else if (constraints->centreX.GetDone() && constraints->width.GetDone())
{
value = (int)(constraints->centreX.GetValue() - (constraints->width.GetValue()/2) + margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxAsIs:
{
int y;
win->GetPosition(&value, &y);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
default:
break;
if (edgePos != -1)
{
value = edgePos - margin;
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxRightOf:
{
if (edgePos != -1)
{
value = edgePos + margin;
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxPercentOf:
{
if (edgePos != -1)
{
value = (int)(edgePos*(((float)percent)*0.01) - margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxUnconstrained:
{
if (constraints->left.GetDone() && constraints->width.GetDone())
{
value = (constraints->left.GetValue() + constraints->width.GetValue() - margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else if (constraints->centreX.GetDone() && constraints->width.GetDone())
{
value = (int)(constraints->centreX.GetValue() + (constraints->width.GetValue()/2) - margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxAsIs:
{
win->GetSize(&w, &h);
win->GetPosition(&x, &y);
value = x + w;
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
default:
break;
if (edgePos != -1)
{
value = edgePos - margin;
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxBelow:
{
if (edgePos != -1)
{
value = edgePos + margin;
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxPercentOf:
{
if (edgePos != -1)
{
value = (int)(edgePos*(((float)percent)*0.01) + margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxUnconstrained:
{
if (constraints->bottom.GetDone() && constraints->height.GetDone())
{
value = (constraints->bottom.GetValue() - constraints->height.GetValue() + margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else if (constraints->centreY.GetDone() && constraints->height.GetDone())
{
value = (constraints->centreY.GetValue() - (constraints->height.GetValue()/2) + margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxAsIs:
{
int x;
win->GetPosition(&x, &value);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
default:
break;
if (edgePos != -1)
{
value = edgePos + margin;
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxBelow:
{
if (edgePos != -1)
{
value = edgePos - margin;
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxPercentOf:
{
if (edgePos != -1)
{
value = (int)(edgePos*(((float)percent)*0.01) - margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxUnconstrained:
{
if (constraints->top.GetDone() && constraints->height.GetDone())
{
value = (constraints->top.GetValue() + constraints->height.GetValue() - margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else if (constraints->centreY.GetDone() && constraints->height.GetDone())
{
value = (constraints->centreY.GetValue() + (constraints->height.GetValue()/2) - margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxAsIs:
{
win->GetSize(&w, &h);
win->GetPosition(&x, &y);
value = h + y;
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
default:
break;
if (edgePos != -1)
{
value = edgePos - margin;
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxRightOf:
{
if (edgePos != -1)
{
value = edgePos + margin;
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxPercentOf:
{
if (edgePos != -1)
{
value = (int)(edgePos*(((float)percent)*0.01) + margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxUnconstrained:
{
if (constraints->left.GetDone() && constraints->width.GetDone())
{
value = (int)(constraints->left.GetValue() + (constraints->width.GetValue()/2) + margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else if (constraints->right.GetDone() && constraints->width.GetDone())
{
value = (int)(constraints->left.GetValue() - (constraints->width.GetValue()/2) + margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
default:
break;
if (edgePos != -1)
{
value = edgePos - margin;
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxBelow:
{
if (edgePos != -1)
{
value = edgePos + margin;
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxPercentOf:
{
if (edgePos != -1)
{
value = (int)(edgePos*(((float)percent)*0.01) + margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxUnconstrained:
{
if (constraints->bottom.GetDone() && constraints->height.GetDone())
{
value = (int)(constraints->bottom.GetValue() - (constraints->height.GetValue()/2) + margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else if (constraints->top.GetDone() && constraints->height.GetDone())
{
value = (int)(constraints->top.GetValue() + (constraints->height.GetValue()/2) + margin);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
default:
break;
if (edgePos != -1)
{
value = (int)(edgePos*(((float)percent)*0.01));
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxAsIs:
{
{
int h;
win->GetSize(&value, &h);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
- else return FALSE;
+ else return false;
}
case wxUnconstrained:
{
if (constraints->left.GetDone() && constraints->right.GetDone())
{
value = constraints->right.GetValue() - constraints->left.GetValue();
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else if (constraints->centreX.GetDone() && constraints->left.GetDone())
{
value = (int)(2*(constraints->centreX.GetValue() - constraints->left.GetValue()));
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else if (constraints->centreX.GetDone() && constraints->right.GetDone())
{
value = (int)(2*(constraints->right.GetValue() - constraints->centreX.GetValue()));
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
default:
break;
if (edgePos != -1)
{
value = (int)(edgePos*(((float)percent)*0.01));
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
case wxAsIs:
{
{
int w;
win->GetSize(&w, &value);
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
- else return FALSE;
+ else return false;
}
case wxUnconstrained:
{
if (constraints->top.GetDone() && constraints->bottom.GetDone())
{
value = constraints->bottom.GetValue() - constraints->top.GetValue();
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else if (constraints->top.GetDone() && constraints->centreY.GetDone())
{
value = (int)(2*(constraints->centreY.GetValue() - constraints->top.GetValue()));
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else if (constraints->bottom.GetDone() && constraints->centreY.GetDone())
{
value = (int)(2*(constraints->bottom.GetValue() - constraints->centreY.GetValue()));
- done = TRUE;
- return TRUE;
+ done = true;
+ return true;
}
else
- return FALSE;
+ return false;
}
default:
break;
default:
break;
}
- return FALSE;
+ return false;
}
// Get the value of this edge or dimension, or if this is not determinable, -1.
// If the edge or dimension belongs to the parent, then we know the
// dimension is obtainable immediately. E.g. a wxExpandSizer may contain a
// button (but the button's true parent is a panel, not the sizer)
- if (other->GetChildren().Find(thisWin))
+ if (other->GetChildren().Find((wxWindow*)thisWin))
{
switch (which)
{
int noChanges = 0;
bool done = width.GetDone();
- bool newDone = (done ? TRUE : width.SatisfyConstraint(this, win));
+ bool newDone = (done ? true : width.SatisfyConstraint(this, win));
if (newDone != done)
noChanges ++;
done = height.GetDone();
- newDone = (done ? TRUE : height.SatisfyConstraint(this, win));
+ newDone = (done ? true : height.SatisfyConstraint(this, win));
if (newDone != done)
noChanges ++;
done = left.GetDone();
- newDone = (done ? TRUE : left.SatisfyConstraint(this, win));
+ newDone = (done ? true : left.SatisfyConstraint(this, win));
if (newDone != done)
noChanges ++;
done = top.GetDone();
- newDone = (done ? TRUE : top.SatisfyConstraint(this, win));
+ newDone = (done ? true : top.SatisfyConstraint(this, win));
if (newDone != done)
noChanges ++;
done = right.GetDone();
- newDone = (done ? TRUE : right.SatisfyConstraint(this, win));
+ newDone = (done ? true : right.SatisfyConstraint(this, win));
if (newDone != done)
noChanges ++;
done = bottom.GetDone();
- newDone = (done ? TRUE : bottom.SatisfyConstraint(this, win));
+ newDone = (done ? true : bottom.SatisfyConstraint(this, win));
if (newDone != done)
noChanges ++;
done = centreX.GetDone();
- newDone = (done ? TRUE : centreX.SatisfyConstraint(this, win));
+ newDone = (done ? true : centreX.SatisfyConstraint(this, win));
if (newDone != done)
noChanges ++;
done = centreY.GetDone();
- newDone = (done ? TRUE : centreY.SatisfyConstraint(this, win));
+ newDone = (done ? true : centreY.SatisfyConstraint(this, win));
if (newDone != done)
noChanges ++;
return AreSatisfied();
}
-/*
- * Main constrained layout algorithm. Look at all the child
- * windows, and their constraints (if any).
- * The idea is to keep iterating through the constraints
- * until all left, right, bottom and top edges, and widths and heights,
- * are known (or no change occurs and we've failed to resolve all
- * constraints).
- *
- * If the user has not specified a dimension or edge, it will be
- * be calculated from the other known values. E.g. If we know
- * the right hand edge and the left hand edge, we now know the width.
- * The snag here is that this means we must specify absolute dimensions
- * twice (in constructor and in constraint), if we wish to use the
- * constraint notation to just set the position, for example.
- * Otherwise, if we only set ONE edge and no dimension, it would never
- * find the other edge.
- *
- * Algorithm:
-
- Mark all constraints as not done.
-
- iterations = 0;
- until no change or iterations >= max iterations
- For each child:
- {
- Calculate all constraints
- }
- iterations ++;
-
- For each child
- Set each calculated position and size
-
- */
-
-#if WXWIN_COMPATIBILITY
-bool wxOldDoLayout(wxWindowBase *win)
-{
- // Make sure this isn't called recursively from below
- static wxList doneSoFar;
-
- if (doneSoFar.Member(win))
- return TRUE;
-
- doneSoFar.Append(win);
-
- wxNode *node = win->GetChildren().First();
- while (node)
- {
- wxWindowBase *child = (wxWindowBase *)node->Data();
- wxLayoutConstraints *constr = child->GetConstraints();
- if (constr)
- {
- constr->left.SetDone(FALSE);
- constr->top.SetDone(FALSE);
- constr->right.SetDone(FALSE);
- constr->bottom.SetDone(FALSE);
- constr->width.SetDone(FALSE);
- constr->height.SetDone(FALSE);
- constr->centreX.SetDone(FALSE);
- constr->centreY.SetDone(FALSE);
- }
- node = node->Next();
- }
- int noIterations = 0;
- int maxIterations = 500;
- int noChanges = 1;
-
- while ((noChanges > 0) && (noIterations < maxIterations))
- {
- noChanges = 0;
- wxNode *node = win->GetChildren().First();
- while (node)
- {
- wxWindowBase *child = (wxWindowBase *)node->Data();
- wxLayoutConstraints *constr = child->GetConstraints();
- if (constr)
- {
- int tempNoChanges = 0;
- (void)constr->SatisfyConstraints(child, &tempNoChanges);
- noChanges += tempNoChanges;
- }
- node = node->Next();
- }
- noIterations ++;
- }
-/*
- // Would be nice to have a test here to see _which_ constraint(s)
- // failed, so we can print a specific diagnostic message.
- if (noFailures > 0)
- {
- wxDebugMsg(_("wxWindowBase::Layout() failed.\n"));
- }
-*/
- // Now set the sizes and positions of the children, and
- // recursively call Layout().
- node = win->GetChildren().First();
- while (node)
- {
- wxWindowBase *child = (wxWindowBase *)node->Data();
- wxLayoutConstraints *constr = child->GetConstraints();
- if (constr && constr->left.GetDone() && constr->right.GetDone() &&
- constr->width.GetDone() && constr->height.GetDone())
- {
- int x = constr->left.GetValue();
- int y = constr->top.GetValue();
- int w = constr->width.GetValue();
- int h = constr->height.GetValue();
-
- // If we don't want to resize this window, just move it...
- if ((constr->width.GetRelationship() != wxAsIs) ||
- (constr->height.GetRelationship() != wxAsIs))
- {
- // _Should_ call Layout() recursively.
- child->SetSize(x, y, w, h);
- }
- else
- {
- child->Move(x, y);
- }
- }
- else
- child->Layout();
- node = node->Next();
- }
- doneSoFar.DeleteObject(win);
-
- return TRUE;
-}
-#endif // WXWIN_COMPATIBILITY
-
#endif // wxUSE_CONSTRAINTS