X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/844a4451f694840694663dd283c3bed3a3d81947..2e2b69eececf83c7097435e1f4482cc153e8d82c:/src/common/layout.cpp diff --git a/src/common/layout.cpp b/src/common/layout.cpp index 74850c5631..adadfe0be5 100644 --- a/src/common/layout.cpp +++ b/src/common/layout.cpp @@ -5,8 +5,8 @@ // 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 ///////////////////////////////////////////////////////////////////////////// // ============================================================================= @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "layout.h" #endif @@ -56,7 +56,7 @@ wxIndividualLayoutConstraint::wxIndividualLayoutConstraint() value = 0; percent = 0; otherEdge = wxTop; - done = FALSE; + done = false; otherWin = (wxWindowBase *) NULL; } @@ -145,10 +145,10 @@ bool wxIndividualLayoutConstraint::ResetIfWin(wxWindowBase *otherW) percent = 0; otherEdge = wxTop; otherWin = (wxWindowBase *) NULL; - return TRUE; + return true; } - return FALSE; + return false; } // Try to satisfy constraint @@ -156,8 +156,8 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr { if (relationship == wxAbsolute) { - done = TRUE; - return TRUE; + done = true; + return true; } switch (myEdge) @@ -175,11 +175,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr if (edgePos != -1) { value = edgePos - margin; - done = TRUE; - return TRUE; + done = true; + return true; } else - return FALSE; + return false; } case wxRightOf: { @@ -187,11 +187,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr if (edgePos != -1) { value = edgePos + margin; - done = TRUE; - return TRUE; + done = true; + return true; } else - return FALSE; + return false; } case wxPercentOf: { @@ -199,11 +199,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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: { @@ -213,24 +213,24 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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; @@ -250,11 +250,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr if (edgePos != -1) { value = edgePos - margin; - done = TRUE; - return TRUE; + done = true; + return true; } else - return FALSE; + return false; } case wxRightOf: { @@ -262,11 +262,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr if (edgePos != -1) { value = edgePos + margin; - done = TRUE; - return TRUE; + done = true; + return true; } else - return FALSE; + return false; } case wxPercentOf: { @@ -274,11 +274,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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: { @@ -288,17 +288,17 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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: { @@ -307,8 +307,8 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr win->GetSize(&w, &h); win->GetPosition(&x, &y); value = x + w; - done = TRUE; - return TRUE; + done = true; + return true; } default: break; @@ -328,11 +328,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr if (edgePos != -1) { value = edgePos - margin; - done = TRUE; - return TRUE; + done = true; + return true; } else - return FALSE; + return false; } case wxBelow: { @@ -340,11 +340,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr if (edgePos != -1) { value = edgePos + margin; - done = TRUE; - return TRUE; + done = true; + return true; } else - return FALSE; + return false; } case wxPercentOf: { @@ -352,11 +352,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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: { @@ -366,24 +366,24 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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; @@ -403,11 +403,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr if (edgePos != -1) { value = edgePos + margin; - done = TRUE; - return TRUE; + done = true; + return true; } else - return FALSE; + return false; } case wxBelow: { @@ -415,11 +415,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr if (edgePos != -1) { value = edgePos - margin; - done = TRUE; - return TRUE; + done = true; + return true; } else - return FALSE; + return false; } case wxPercentOf: { @@ -427,11 +427,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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: { @@ -441,17 +441,17 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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: { @@ -460,8 +460,8 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr win->GetSize(&w, &h); win->GetPosition(&x, &y); value = h + y; - done = TRUE; - return TRUE; + done = true; + return true; } default: break; @@ -481,11 +481,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr if (edgePos != -1) { value = edgePos - margin; - done = TRUE; - return TRUE; + done = true; + return true; } else - return FALSE; + return false; } case wxRightOf: { @@ -493,11 +493,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr if (edgePos != -1) { value = edgePos + margin; - done = TRUE; - return TRUE; + done = true; + return true; } else - return FALSE; + return false; } case wxPercentOf: { @@ -505,11 +505,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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: { @@ -519,17 +519,17 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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; @@ -549,11 +549,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr if (edgePos != -1) { value = edgePos - margin; - done = TRUE; - return TRUE; + done = true; + return true; } else - return FALSE; + return false; } case wxBelow: { @@ -561,11 +561,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr if (edgePos != -1) { value = edgePos + margin; - done = TRUE; - return TRUE; + done = true; + return true; } else - return FALSE; + return false; } case wxPercentOf: { @@ -573,11 +573,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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: { @@ -587,17 +587,17 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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; @@ -614,11 +614,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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: { @@ -626,10 +626,10 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr { int h; win->GetSize(&value, &h); - done = TRUE; - return TRUE; + done = true; + return true; } - else return FALSE; + else return false; } case wxUnconstrained: { @@ -639,23 +639,23 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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; @@ -672,11 +672,11 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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: { @@ -684,10 +684,10 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr { int w; win->GetSize(&w, &value); - done = TRUE; - return TRUE; + done = true; + return true; } - else return FALSE; + else return false; } case wxUnconstrained: { @@ -697,23 +697,23 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr 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; @@ -723,7 +723,7 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr default: break; } - return FALSE; + return false; } // Get the value of this edge or dimension, or if this is not determinable, -1. @@ -734,7 +734,7 @@ int wxIndividualLayoutConstraint::GetEdge(wxEdge which, // 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) { @@ -969,42 +969,42 @@ bool wxLayoutConstraints::SatisfyConstraints(wxWindowBase *win, int *nChanges) 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 ++; @@ -1013,134 +1013,4 @@ bool wxLayoutConstraints::SatisfyConstraints(wxWindowBase *win, int *nChanges) 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