summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Geerken <devnull@localhost>2014-06-30 22:35:14 +0200
committerSebastian Geerken <devnull@localhost>2014-06-30 22:35:14 +0200
commite65756c53e14073da8c13b34c89aad4398595cf8 (patch)
tree691ce30256d988b1ff2a4f1d829490f3f630487c
parent28da617bb9be612aa871fd7757d36a8f6f91b1d0 (diff)
Adjusted Widget::getAvailHEIGHT[OfChild]. Also, changed definition of 'intrinsic' extremes (not all widgets updated yet).
-rw-r--r--dw/ruler.cc2
-rw-r--r--dw/table.cc13
-rw-r--r--dw/textblock.cc44
-rw-r--r--dw/textblock.hh4
-rw-r--r--dw/textblock_linebreaking.cc42
-rw-r--r--dw/widget.cc92
6 files changed, 148 insertions, 49 deletions
diff --git a/dw/ruler.cc b/dw/ruler.cc
index 2459c1bd..b624718d 100644
--- a/dw/ruler.cc
+++ b/dw/ruler.cc
@@ -43,6 +43,8 @@ void Ruler::sizeRequestImpl (core::Requisition *requisition)
void Ruler::getExtremesImpl (core::Extremes *extremes)
{
extremes->minWidth = extremes->maxWidth = getStyle()->boxDiffWidth ();
+ extremes->minWidthIntrinsic = extremes->minWidth;
+ extremes->maxWidthIntrinsic = extremes->maxWidth;
correctExtremes (extremes);
}
diff --git a/dw/table.cc b/dw/table.cc
index 52fe00d9..a5ff9929 100644
--- a/dw/table.cc
+++ b/dw/table.cc
@@ -127,16 +127,21 @@ void Table::getExtremesImpl (core::Extremes *extremes)
DBG_OBJ_MSG_START ();
if (numCols == 0)
- extremes->minWidth = extremes->maxWidth = 0;
+ extremes->minWidth = extremes->minWidthIntrinsic = extremes->maxWidth =
+ extremes->maxWidthIntrinsic = boxDiffWidth ();
else {
forceCalcColumnExtremes ();
- extremes->minWidth = extremes->maxWidth =
- (numCols + 1) * getStyle()->hBorderSpacing
- + getStyle()->boxDiffWidth ();
+ extremes->minWidth = extremes->minWidthIntrinsic = extremes->maxWidth =
+ extremes->maxWidthIntrinsic =
+ (numCols + 1) * getStyle()->hBorderSpacing + boxDiffWidth ();
for (int col = 0; col < numCols; col++) {
extremes->minWidth += colExtremes->getRef(col)->minWidth;
+ extremes->minWidthIntrinsic +=
+ colExtremes->getRef(col)->minWidthIntrinsic;
extremes->maxWidth += colExtremes->getRef(col)->maxWidth;
+ extremes->maxWidthIntrinsic +=
+ colExtremes->getRef(col)->maxWidthIntrinsic;
}
}
diff --git a/dw/textblock.cc b/dw/textblock.cc
index 21a9371b..8cb42999 100644
--- a/dw/textblock.cc
+++ b/dw/textblock.cc
@@ -422,7 +422,8 @@ void Textblock::getWordExtremes (Word *word, core::Extremes *extremes)
if (word->content.type == core::Content::WIDGET_IN_FLOW)
word->content.widget->getExtremes (extremes);
else
- extremes->minWidth = extremes->maxWidth = word->size.width;
+ extremes->minWidth = extremes->minWidthIntrinsic = extremes->maxWidth =
+ extremes->maxWidthIntrinsic = word->size.width;
}
void Textblock::getExtremesImpl (core::Extremes *extremes)
@@ -448,40 +449,65 @@ void Textblock::getExtremesImpl (core::Extremes *extremes)
if (paragraphs->size () == 0) {
/* empty page */
extremes->minWidth = 0;
+ extremes->minWidthIntrinsic = 0;
extremes->maxWidth = 0;
+ extremes->maxWidthIntrinsic = 0;
} else {
Paragraph *lastPar = paragraphs->getLastRef ();
extremes->minWidth = lastPar->maxParMin;
+ extremes->minWidthIntrinsic = lastPar->maxParMinIntrinsic;
extremes->maxWidth = lastPar->maxParMax;
+ extremes->maxWidthIntrinsic = lastPar->maxParMaxIntrinsic;
- DBG_OBJ_MSGF ("resize", 1, "paragraphs[%d]->maxParMin = %d",
- paragraphs->size () - 1, lastPar->maxParMin);
- DBG_OBJ_MSGF ("resize", 1, "paragraphs[%d]->maxParMax = %d",
- paragraphs->size () - 1, lastPar->maxParMax);
+ DBG_OBJ_MSGF ("resize", 1, "paragraphs[%d]->maxParMin = %d (%d)",
+ paragraphs->size () - 1, lastPar->maxParMin,
+ lastPar->maxParMinIntrinsic);
+ DBG_OBJ_MSGF ("resize", 1, "paragraphs[%d]->maxParMax = %d (%d)",
+ paragraphs->size () - 1, lastPar->maxParMax,
+ lastPar->maxParMaxIntrinsic);
}
+ DBG_OBJ_MSGF ("resize", 0, "after considering paragraphs: %d (%d) / %d (%d)",
+ extremes->minWidth, extremes->minWidthIntrinsic,
+ extremes->maxWidth, extremes->maxWidthIntrinsic);
+
int diff = leftInnerPadding + getStyle()->boxDiffWidth ();
extremes->minWidth += diff;
+ extremes->minWidthIntrinsic += diff;
extremes->maxWidth += diff;
+ extremes->maxWidthIntrinsic += diff;
+
+ DBG_OBJ_MSGF ("resize", 0, "after adding diff: %d (%d) / %d (%d)",
+ extremes->minWidth, extremes->minWidthIntrinsic,
+ extremes->maxWidth, extremes->maxWidthIntrinsic);
// For the order, see similar reasoning in sizeRequestImpl.
correctExtremes (extremes);
+ DBG_OBJ_MSGF ("resize", 0, "after correction: %d (%d) / %d (%d)",
+ extremes->minWidth, extremes->minWidthIntrinsic,
+ extremes->maxWidth, extremes->maxWidthIntrinsic);
+
if (outOfFlowMgr) {
int oofMinWidth, oofMaxWidth;
outOfFlowMgr->getExtremes (extremes, &oofMinWidth, &oofMaxWidth);
- DBG_OBJ_MSGF ("resize", 1, "extremes: %d / %d, corrected: %d / %d",
- extremes->minWidth, extremes->maxWidth,
+ DBG_OBJ_MSGF ("resize", 1, "OOFM correction: %d / %d",
oofMinWidth, oofMaxWidth);
extremes->minWidth = misc::max (extremes->minWidth, oofMinWidth);
+ extremes->minWidthIntrinsic =
+ misc::max (extremes->minWidthIntrinsic, oofMinWidth);
extremes->maxWidth = misc::max (extremes->maxWidth, oofMaxWidth);
+ extremes->maxWidthIntrinsic =
+ misc::max (extremes->maxWidthIntrinsic, oofMinWidth);
}
- DBG_OBJ_MSGF ("resize", 1, "=> %d / %d",
- extremes->minWidth, extremes->maxWidth);
+ DBG_OBJ_MSGF ("resize", 0,
+ "finally, after considering OOFM: %d (%d) / %d (%d)",
+ extremes->minWidth, extremes->minWidthIntrinsic,
+ extremes->maxWidth, extremes->maxWidthIntrinsic);
DBG_OBJ_MSG_END ();
}
diff --git a/dw/textblock.hh b/dw/textblock.hh
index 48bd424e..0f73736d 100644
--- a/dw/textblock.hh
+++ b/dw/textblock.hh
@@ -306,14 +306,18 @@ protected:
int parMin; /* The sum of all word minima (plus spaces,
hyphen width etc.) since the last possible
break within this paragraph. */
+ int parMinIntrinsic;
int parMax; /* The sum of all word maxima in this
paragraph (plus spaces, hyphen width
etc.). */
+ int parMaxIntrinsic;
int maxParMin; /* Maximum of all paragraph minima (value of
"parMin"), including this paragraph. */
+ int maxParMinIntrinsic;
int maxParMax; /* Maximum of all paragraph maxima (value of
"parMax""), including this paragraph. */
+ int maxParMaxIntrinsic;
};
struct Line
diff --git a/dw/textblock_linebreaking.cc b/dw/textblock_linebreaking.cc
index 217d26ea..bf41436b 100644
--- a/dw/textblock_linebreaking.cc
+++ b/dw/textblock_linebreaking.cc
@@ -1207,12 +1207,15 @@ void Textblock::handleWordExtremes (int wordIndex)
core::Extremes wordExtremes;
getWordExtremes (word, &wordExtremes);
- DBG_OBJ_MSGF ("construct.paragraph", 1, "extremes: %d / %d",
- wordExtremes.minWidth, wordExtremes.maxWidth);
+ DBG_OBJ_MSGF ("construct.paragraph", 1, "extremes: %d (%d) / %d (%d",
+ wordExtremes.minWidth, wordExtremes.minWidthIntrinsic,
+ wordExtremes.maxWidth, wordExtremes.maxWidthIntrinsic);
if (wordIndex == 0) {
wordExtremes.minWidth += line1OffsetEff;
+ wordExtremes.minWidthIntrinsic += line1OffsetEff;
wordExtremes.maxWidth += line1OffsetEff;
+ wordExtremes.maxWidthIntrinsic += line1OffsetEff;
}
if (paragraphs->size() == 0 ||
@@ -1225,13 +1228,17 @@ void Textblock::handleWordExtremes (int wordIndex)
Paragraph *par = paragraphs->getLastRef();
par->firstWord = par->lastWord = wordIndex;
- par->parMin = par->parMax = 0;
+ par->parMin = par->parMinIntrinsic = par->parMax = par->parMaxIntrinsic
+ = 0;
if (prevPar) {
par->maxParMin = prevPar->maxParMin;
+ par->maxParMinIntrinsic = prevPar->maxParMinIntrinsic;
par->maxParMax = prevPar->maxParMax;
+ par->maxParMaxIntrinsic = prevPar->maxParMaxIntrinsic;
} else
- par->maxParMin = par->maxParMax = 0;
+ par->maxParMin = par->maxParMinIntrinsic = par->maxParMax =
+ par->maxParMaxIntrinsic = 0;
DBG_OBJ_MSGF ("construct.paragraph", 1, "new par: %d",
paragraphs->size() - 1);
@@ -1259,22 +1266,41 @@ void Textblock::handleWordExtremes (int wordIndex)
lastPar->firstWord, lastPar->lastWord, corrDiffMin,
corrDiffMax);
+ DBG_OBJ_MSGF ("construct.paragraph", 1,
+ "before: parMin = %d (%d) (max = %d (%d)), "
+ "parMax = %d (%d) (max = %d (%d))",
+ lastPar->parMin, lastPar->parMinIntrinsic,
+ lastPar->maxParMin, lastPar->maxParMinIntrinsic,
+ lastPar->parMax, lastPar->parMaxIntrinsic,
+ lastPar->maxParMax, lastPar->maxParMaxIntrinsic);
+
// Minimum: between two *possible* breaks.
// Shrinkability could be considered, but really does not play a role.
lastPar->parMin += wordExtremes.minWidth + word->hyphenWidth + corrDiffMin;
+ lastPar->parMinIntrinsic +=
+ wordExtremes.minWidthIntrinsic + word->hyphenWidth + corrDiffMin;
lastPar->maxParMin = misc::max (lastPar->maxParMin, lastPar->parMin);
+ lastPar->maxParMinIntrinsic =
+ misc::max (lastPar->maxParMinIntrinsic, lastPar->parMinIntrinsic);
if (word->badnessAndPenalty.lineCanBeBroken (1) &&
(word->flags & Word::UNBREAKABLE_FOR_MIN_WIDTH) == 0)
- lastPar->parMin = 0;
+ lastPar->parMin = lastPar->parMinIntrinsic = 0;
// Maximum: between two *necessary* breaks.
lastPar->parMax += wordExtremes.maxWidth + word->hyphenWidth + corrDiffMax;
+ lastPar->parMaxIntrinsic +=
+ wordExtremes.maxWidthIntrinsic + word->hyphenWidth + corrDiffMax;
lastPar->maxParMax = misc::max (lastPar->maxParMax, lastPar->parMax);
+ lastPar->maxParMaxIntrinsic =
+ misc::max (lastPar->maxParMaxIntrinsic, lastPar->parMaxIntrinsic);
DBG_OBJ_MSGF ("construct.paragraph", 1,
- "=> parMin = %d (max = %d), parMax = %d (max = %d)",
- lastPar->parMin, lastPar->maxParMin, lastPar->parMax,
- lastPar->maxParMax);
+ "after: parMin = %d (%d) (max = %d (%d)), "
+ "parMax = %d (%d) (max = %d (%d))",
+ lastPar->parMin, lastPar->parMinIntrinsic,
+ lastPar->maxParMin, lastPar->maxParMinIntrinsic,
+ lastPar->parMax, lastPar->parMaxIntrinsic,
+ lastPar->maxParMax, lastPar->maxParMaxIntrinsic);
lastPar->lastWord = wordIndex;
DBG_OBJ_MSG_END ();
diff --git a/dw/widget.cc b/dw/widget.cc
index 63640fc6..2271ee1e 100644
--- a/dw/widget.cc
+++ b/dw/widget.cc
@@ -533,21 +533,37 @@ int Widget::getAvailHeight (bool forceValue)
int height;
- if (container == NULL) {
+ if (parent == NULL) {
+ DBG_OBJ_MSG ("resize", 1, "no parent, regarding viewport");
+ DBG_OBJ_MSG_START ();
+
// TODO Consider nested layouts (e. g. <button>).
- if (style::isAbsLength (getStyle()->height))
+ if (style::isAbsLength (getStyle()->height)) {
+ DBG_OBJ_MSGF ("resize", 1, "absolute height: %dpx",
+ style::absLengthVal (getStyle()->height));
height = style::absLengthVal (getStyle()->height) + boxDiffHeight ();
- else if (style::isPerLength (getStyle()->height))
+ } else if (style::isPerLength (getStyle()->height)) {
+ DBG_OBJ_MSGF ("resize", 1, "percentage height: %g%%",
+ 100 * style::perLengthVal_useThisOnlyForDebugging
+ (getStyle()->height));
// Notice that here -- unlike getAvailWidth() --
// layout->hScrollbarThickness is not considered here;
// something like canvasWidthGreater (analogue to
// canvasHeightGreater) would be complicated and lead to
// possibly contradictory self-references.
height = applyPerHeight (layout->viewportHeight, getStyle()->height);
- else
+ } else {
+ DBG_OBJ_MSG ("resize", 1, "no specification");
height = layout->viewportHeight;
- } else
+ }
+
+ DBG_OBJ_MSG_END ();
+ } else {
+ DBG_OBJ_MSG ("resize", 1, "delegated to parent");
+ DBG_OBJ_MSG_START ();
height = container->getAvailHeightOfChild (this, forceValue);
+ DBG_OBJ_MSG_END ();
+ }
DBG_OBJ_MSGF ("resize", 1, "=> %d", height);
DBG_OBJ_MSG_END ();
@@ -614,11 +630,9 @@ void Widget::correctExtremes (Extremes *extremes)
{
// TODO Extremes only corrected?
- extremes->minWidthIntrinsic = extremes->minWidth;
- extremes->maxWidthIntrinsic = extremes->maxWidth;
-
- DBG_OBJ_MSGF ("resize", 0, "<b>correctExtremes</b> (%d / %d)",
- extremes->minWidth, extremes->maxWidth);
+ DBG_OBJ_MSGF ("resize", 0, "<b>correctExtremes</b> (%d (%d) / %d (%d))",
+ extremes->minWidth, extremes->minWidthIntrinsic,
+ extremes->maxWidth, extremes->maxWidthIntrinsic);
DBG_OBJ_MSG_START ();
if (container == NULL) {
@@ -1243,25 +1257,47 @@ int Widget::getAvailHeightOfChild (Widget *child, bool forceValue)
int height;
- if (style::isAbsLength (child->getStyle()->height))
- height = style::absLengthVal (child->getStyle()->height)
- + child->boxDiffHeight ();
- else {
+ if (child->getStyle()->height == style::LENGTH_AUTO) {
+ DBG_OBJ_MSG ("resize", 1, "no specification");
int availHeight = getAvailHeight (forceValue);
if (availHeight == -1)
height = -1;
- else {
- int containerContentHeight = availHeight - boxDiffHeight ();
- DBG_OBJ_MSGF ("resize", 1, "containerContentHeight = %d - %d = %d",
- availHeight, boxDiffHeight (), containerContentHeight);
-
- if (style::isPerLength (child->getStyle()->height))
- height = child->applyPerHeight (containerContentHeight,
- child->getStyle()->height);
- else
- // Although no widget will probably use the whole height, we
- // have to return some value here.
- height = containerContentHeight;
+ else
+ height = misc::max (availHeight - boxDiffHeight (), 0);
+ } else {
+ // In most cases, the toplevel widget should be a container, so
+ // the container is non-NULL when the parent is non-NULL. Just
+ // in case ...:
+ Widget *effContainer =
+ child->container ? child->container : child->parent;
+
+ if (effContainer == this) {
+ if (style::isAbsLength (child->getStyle()->height)) {
+ DBG_OBJ_MSGF ("resize", 1, "absolute height: %dpx",
+ style::absLengthVal (child->getStyle()->height));
+ height = misc::max (style::absLengthVal (child->getStyle()->height)
+ + child->boxDiffHeight (), 0);
+ } else {
+ assert (style::isPerLength (child->getStyle()->height));
+ DBG_OBJ_MSGF ("resize", 1, "percentage height: %g%%",
+ 100 * style::perLengthVal_useThisOnlyForDebugging
+ (child->getStyle()->height));
+
+ int availHeight = getAvailHeight (forceValue);
+ if (availHeight == -1)
+ height = -1;
+ else
+ height =
+ misc::max (child->applyPerHeight (availHeight -
+ boxDiffHeight (),
+ child->getStyle()->height),
+ 0);
+ }
+ } else {
+ DBG_OBJ_MSG ("resize", 1, "delegated to (effective) container");
+ DBG_OBJ_MSG_START ();
+ height = effContainer->getAvailHeightOfChild (child, forceValue);
+ DBG_OBJ_MSG_END ();
}
}
@@ -1332,7 +1368,7 @@ void Widget::correctExtremesOfChild (Widget *child, Extremes *extremes)
if (style::isAbsLength (child->getStyle()->width)) {
DBG_OBJ_MSGF ("resize", 1, "absolute width: %dpx",
style::absLengthVal (child->getStyle()->width));
- extremes->minWidth =extremes->maxWidth =
+ extremes->minWidth = extremes->maxWidth =
style::absLengthVal (child->getStyle()->width)
+ child->boxDiffWidth ();
} else if (style::isPerLength (child->getStyle()->width)) {
@@ -1344,7 +1380,7 @@ void Widget::correctExtremesOfChild (Widget *child, Extremes *extremes)
int containerWidth = availWidth - boxDiffWidth ();
DBG_OBJ_MSGF ("resize", 1, "containerWidth = %d - %d = %d",
availWidth, boxDiffWidth (), containerWidth);
- extremes->minWidth =extremes->maxWidth =
+ extremes->minWidth = extremes->maxWidth =
child->applyPerWidth (containerWidth, child->getStyle()->width);
}
} else