X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/55d99c7a77789ff4904bf96eddca3715eb5af9b9..2cbfa061b44c7460adf3f06d09b4fbf304ed3a87:/src/common/layout.cpp?ds=sidebyside diff --git a/src/common/layout.cpp b/src/common/layout.cpp index 1dd0c63123..c542527219 100644 --- a/src/common/layout.cpp +++ b/src/common/layout.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "layout.h" #endif @@ -56,14 +56,10 @@ wxIndividualLayoutConstraint::wxIndividualLayoutConstraint() value = 0; percent = 0; otherEdge = wxTop; - done = FALSE; + done = false; otherWin = (wxWindowBase *) NULL; } -wxIndividualLayoutConstraint::~wxIndividualLayoutConstraint() -{ -} - void wxIndividualLayoutConstraint::Set(wxRelationship rel, wxWindowBase *otherW, wxEdge otherE, int val, int marg) { if (rel == wxSameAs) @@ -145,10 +141,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 +152,8 @@ bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constr { if (relationship == wxAbsolute) { - done = TRUE; - return TRUE; + done = true; + return true; } switch (myEdge) @@ -175,11 +171,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 +183,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 +195,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 +209,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 +246,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 +258,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 +270,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,27 +284,27 @@ 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: { int x, y; int w, h; - win->GetSize(&w, &h); + win->GetBestSize(&w, &h); win->GetPosition(&x, &y); value = x + w; - done = TRUE; - return TRUE; + done = true; + return true; } default: break; @@ -328,11 +324,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 +336,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 +348,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 +362,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 +399,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 +411,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 +423,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,27 +437,27 @@ 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: { int x, y; int w, h; - win->GetSize(&w, &h); + win->GetBestSize(&w, &h); win->GetPosition(&x, &y); value = h + y; - done = TRUE; - return TRUE; + done = true; + return true; } default: break; @@ -481,11 +477,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 +489,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 +501,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 +515,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 +545,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 +557,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 +569,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 +583,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,22 +610,22 @@ 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: { if (win) { int h; - win->GetSize(&value, &h); - done = TRUE; - return TRUE; + win->GetBestSize(&value, &h); + done = true; + return true; } - else return FALSE; + else return false; } case wxUnconstrained: { @@ -639,23 +635,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,22 +668,22 @@ 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: { if (win) { int w; - win->GetSize(&w, &value); - done = TRUE; - return TRUE; + win->GetBestSize(&w, &value); + done = true; + return true; } - else return FALSE; + else return false; } case wxUnconstrained: { @@ -697,23 +693,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 +719,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 +730,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) { @@ -960,51 +956,47 @@ wxLayoutConstraints::wxLayoutConstraints() height.SetEdge(wxHeight); } -wxLayoutConstraints::~wxLayoutConstraints() -{ -} - 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 +1005,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