summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/dw-grows.doc10
-rw-r--r--dw/alignedtablecell.cc9
-rw-r--r--dw/alignedtablecell.hh3
-rw-r--r--dw/image.cc2
-rw-r--r--dw/ruler.cc2
-rw-r--r--dw/simpletablecell.cc8
-rw-r--r--dw/simpletablecell.hh3
-rw-r--r--dw/table.cc2
-rw-r--r--dw/tablecell.cc3
-rw-r--r--dw/tablecell.hh3
-rw-r--r--dw/textblock.cc2
-rw-r--r--dw/ui.cc16
-rw-r--r--dw/ui.hh14
-rw-r--r--dw/widget.cc58
-rw-r--r--dw/widget.hh7
-rw-r--r--test/dw_simple_container.cc5
16 files changed, 84 insertions, 63 deletions
diff --git a/doc/dw-grows.doc b/doc/dw-grows.doc
index a8e182f0..0d123d61 100644
--- a/doc/dw-grows.doc
+++ b/doc/dw-grows.doc
@@ -101,10 +101,12 @@ The rules for the calculation:
2. A widget must calculate *adjustmentWidth* from *adjustmentWidth* of
its children.
-*Note:* An implementation of dw::core::Widget::getExtremesImpl
-typically sets this value after calling
-dw::core::Widget::correctExtremesOfChild, so that it cannot be used
-for the correction of extremes.
+*Note:* An implementation of dw::core::Widget::getExtremesImpl may set
+this value *after* calling dw::core::Widget::correctExtremesOfChild,
+so that it cannot be used for the correction of extremes. In this case
+*useAdjustmentWidth = false* should be passed to
+dw::core::Widget::correctExtremesOfChild. On the other hand, if known
+before, *useAdjustmentWidth* should be set to *true*.
Rules for *new* methods related to resizing
===========================================
diff --git a/dw/alignedtablecell.cc b/dw/alignedtablecell.cc
index 3dbb73a2..e65bbf2c 100644
--- a/dw/alignedtablecell.cc
+++ b/dw/alignedtablecell.cc
@@ -109,15 +109,18 @@ void AlignedTableCell::correctRequisitionOfChild (Widget *child,
}
void AlignedTableCell::correctExtremesOfChild (Widget *child,
- core::Extremes *extremes)
+ core::Extremes *extremes,
+ bool useAdjustmentWidth)
{
DBG_OBJ_ENTER ("resize", 0, "AlignedTableCell/correctExtremesOfChild",
"%p, %d (%d) / %d (%d)",
child, extremes->minWidth, extremes->minWidthIntrinsic,
extremes->maxWidth, extremes->maxWidthIntrinsic);
- AlignedTextblock::correctExtremesOfChild (child, extremes);
- tablecell::correctCorrectedExtremesOfChild (this, child, extremes);
+ AlignedTextblock::correctExtremesOfChild (child, extremes,
+ useAdjustmentWidth);
+ tablecell::correctCorrectedExtremesOfChild (this, child, extremes,
+ useAdjustmentWidth);
DBG_OBJ_LEAVE ();
}
diff --git a/dw/alignedtablecell.hh b/dw/alignedtablecell.hh
index 57b92d5f..b4203047 100644
--- a/dw/alignedtablecell.hh
+++ b/dw/alignedtablecell.hh
@@ -18,7 +18,8 @@ protected:
void correctRequisitionOfChild (Widget *child,
core::Requisition *requisition,
void (*splitHeightFun) (int, int*, int*));
- void correctExtremesOfChild (Widget *child, core::Extremes *extremes);
+ void correctExtremesOfChild (Widget *child, core::Extremes *extremes,
+ bool useAdjustmentWidth);
bool getAdjustMinWidth ();
diff --git a/dw/image.cc b/dw/image.cc
index b9a1abeb..fd959695 100644
--- a/dw/image.cc
+++ b/dw/image.cc
@@ -264,7 +264,7 @@ void Image::getExtremesImpl (core::Extremes *extremes)
extremes->minWidthIntrinsic = extremes->minWidth;
extremes->maxWidthIntrinsic = extremes->maxWidth;
- correctExtremes (extremes);
+ correctExtremes (extremes, false);
extremes->adjustmentWidth =
misc::min (extremes->minWidthIntrinsic, extremes->minWidth);
diff --git a/dw/ruler.cc b/dw/ruler.cc
index 73651257..8b647548 100644
--- a/dw/ruler.cc
+++ b/dw/ruler.cc
@@ -43,7 +43,7 @@ void Ruler::getExtremesImpl (core::Extremes *extremes)
extremes->minWidth = extremes->maxWidth = getStyle()->boxDiffWidth ();
extremes->minWidthIntrinsic = extremes->minWidth;
extremes->maxWidthIntrinsic = extremes->maxWidth;
- correctExtremes (extremes);
+ correctExtremes (extremes, false);
extremes->adjustmentWidth =
lout::misc::min (extremes->minWidthIntrinsic, extremes->minWidth);
}
diff --git a/dw/simpletablecell.cc b/dw/simpletablecell.cc
index a5851680..feec46c8 100644
--- a/dw/simpletablecell.cc
+++ b/dw/simpletablecell.cc
@@ -99,15 +99,17 @@ void SimpleTableCell::correctRequisitionOfChild (Widget *child,
}
void SimpleTableCell::correctExtremesOfChild (Widget *child,
- core::Extremes *extremes)
+ core::Extremes *extremes,
+ bool useAdjustmentWidth)
{
DBG_OBJ_ENTER ("resize", 0, "SimpleTableCell/correctExtremesOfChild",
"%p, %d (%d) / %d (%d)",
child, extremes->minWidth, extremes->minWidthIntrinsic,
extremes->maxWidth, extremes->maxWidthIntrinsic);
- Textblock::correctExtremesOfChild (child, extremes);
- tablecell::correctCorrectedExtremesOfChild (this, child, extremes);
+ Textblock::correctExtremesOfChild (child, extremes, useAdjustmentWidth);
+ tablecell::correctCorrectedExtremesOfChild (this, child, extremes,
+ useAdjustmentWidth);
DBG_OBJ_LEAVE ();
}
diff --git a/dw/simpletablecell.hh b/dw/simpletablecell.hh
index 6eef5096..60715d90 100644
--- a/dw/simpletablecell.hh
+++ b/dw/simpletablecell.hh
@@ -14,7 +14,8 @@ protected:
void correctRequisitionOfChild (Widget *child,
core::Requisition *requisition,
void (*splitHeightFun) (int, int*, int*));
- void correctExtremesOfChild (Widget *child, core::Extremes *extremes);
+ void correctExtremesOfChild (Widget *child, core::Extremes *extremes,
+ bool useAdjustmentWidth);
bool getAdjustMinWidth ();
diff --git a/dw/table.cc b/dw/table.cc
index 5aaebb4b..432f1ae5 100644
--- a/dw/table.cc
+++ b/dw/table.cc
@@ -152,7 +152,7 @@ void Table::getExtremesImpl (core::Extremes *extremes)
}
}
- correctExtremes (extremes);
+ correctExtremes (extremes, true);
DBG_OBJ_LEAVE ();
}
diff --git a/dw/tablecell.cc b/dw/tablecell.cc
index 5c34c781..3e143c96 100644
--- a/dw/tablecell.cc
+++ b/dw/tablecell.cc
@@ -98,7 +98,8 @@ void correctCorrectedRequisitionOfChild (core::Widget *widget,
}
void correctCorrectedExtremesOfChild (core::Widget *widget, core::Widget *child,
- core::Extremes *extremes)
+ core::Extremes *extremes,
+ bool useAdjustmentWidth)
{
// Something to do?
}
diff --git a/dw/tablecell.hh b/dw/tablecell.hh
index 95c2e78e..257f87c7 100644
--- a/dw/tablecell.hh
+++ b/dw/tablecell.hh
@@ -23,7 +23,8 @@ void correctCorrectedRequisitionOfChild (core::Widget *widget,
void (*splitHeightFun) (int, int*,
int*));
void correctCorrectedExtremesOfChild (core::Widget *widget, core::Widget *child,
- core::Extremes *extremes);
+ core::Extremes *extremes,
+ bool useAdjustmentWidth);
int applyPerWidth (core::Widget *widget, int containerWidth,
core::style::Length perWidth);
diff --git a/dw/textblock.cc b/dw/textblock.cc
index e3873b11..a9fa87c5 100644
--- a/dw/textblock.cc
+++ b/dw/textblock.cc
@@ -528,7 +528,7 @@ void Textblock::getExtremesImpl (core::Extremes *extremes)
// For the order, see similar reasoning in sizeRequestImpl.
- correctExtremes (extremes);
+ correctExtremes (extremes, true);
DBG_OBJ_MSGF ("resize", 0, "after correction: %d (%d) / %d (%d)",
extremes->minWidth, extremes->minWidthIntrinsic,
diff --git a/dw/ui.cc b/dw/ui.cc
index 6d687d99..1ea10ebc 100644
--- a/dw/ui.cc
+++ b/dw/ui.cc
@@ -56,7 +56,7 @@ void Embed::sizeRequestImpl (Requisition *requisition)
void Embed::getExtremesImpl (Extremes *extremes)
{
resource->getExtremes (extremes);
- correctExtremes (extremes);
+ correctExtremes (extremes, false);
extremes->adjustmentWidth =
misc::max (extremes->minWidthIntrinsic, extremes->minWidth);
}
@@ -83,9 +83,10 @@ void Embed::correctRequisitionOfChild (Widget *child,
resource->correctRequisitionOfChild (child, requisition, splitHeightFun);
}
-void Embed::correctExtremesOfChild (Widget *child, Extremes *extremes)
+void Embed::correctExtremesOfChild (Widget *child, Extremes *extremes,
+ bool useAdjustmentWidth)
{
- resource->correctExtremesOfChild (child, extremes);
+ resource->correctExtremesOfChild (child, extremes, useAdjustmentWidth);
}
void Embed::containerSizeChangedForChildren ()
@@ -249,7 +250,8 @@ void Resource::correctRequisitionOfChild (Widget *child,
misc::assertNotReached ();
}
-void Resource::correctExtremesOfChild (Widget *child, Extremes *extremes)
+void Resource::correctExtremesOfChild (Widget *child, Extremes *extremes,
+ bool useAdjustmentWidth)
{
// Only used when the resource contains other dillo widgets.
misc::assertNotReached ();
@@ -439,7 +441,8 @@ void ComplexButtonResource::correctRequisitionOfChild (Widget *child,
}
void ComplexButtonResource::correctExtremesOfChild (Widget *child,
- Extremes *extremes)
+ Extremes *extremes,
+ bool useAdjustmentWidth)
{
// Similar to Widget::correctExtremesOfChild, but for percentage
// the relief has to be considered.
@@ -455,7 +458,8 @@ void ComplexButtonResource::correctExtremesOfChild (Widget *child,
child->applyPerWidth (baseWidth, child->getStyle()->width);
}
} else
- getEmbed()->correctExtremesOfChildNoRec (child, extremes);
+ getEmbed()->correctExtremesOfChildNoRec (child, extremes,
+ useAdjustmentWidth);
}
void ComplexButtonResource::containerSizeChangedForChildren ()
diff --git a/dw/ui.hh b/dw/ui.hh
index 6703ccca..78dc3cef 100644
--- a/dw/ui.hh
+++ b/dw/ui.hh
@@ -237,7 +237,8 @@ protected:
void correctRequisitionOfChild (Widget *child,
Requisition *requisition,
void (*splitHeightFun) (int, int*, int*));
- void correctExtremesOfChild (Widget *child, Extremes *extremes);
+ void correctExtremesOfChild (Widget *child, Extremes *extremes,
+ bool useAdjustmentWidth);
void containerSizeChangedForChildren ();
@@ -269,8 +270,9 @@ public:
int*))
{ Widget::correctReqHeightOfChild (child, requisition, splitHeightFun); }
- virtual void correctExtremesOfChildNoRec (Widget *child, Extremes *extremes)
- { Widget::correctExtremesOfChild (child, extremes); }
+ virtual void correctExtremesOfChildNoRec (Widget *child, Extremes *extremes,
+ bool useAdjustmentWidth)
+ { Widget::correctExtremesOfChild (child, extremes, useAdjustmentWidth); }
};
/**
@@ -362,7 +364,8 @@ public:
Requisition *requisition,
void (*splitHeightFun) (int, int*,
int*));
- virtual void correctExtremesOfChild (Widget *child, Extremes *extremes);
+ virtual void correctExtremesOfChild (Widget *child, Extremes *extremes,
+ bool useAdjustmentWidth);
virtual void containerSizeChangedForChildren ();
virtual void setDisplayed (bool displayed);
@@ -438,7 +441,8 @@ public:
void correctRequisitionOfChild (Widget *child,
Requisition *requisition,
void (*splitHeightFun) (int, int*, int*));
- void correctExtremesOfChild (Widget *child, Extremes *extremes);
+ void correctExtremesOfChild (Widget *child, Extremes *extremes,
+ bool useAdjustmentWidth);
void containerSizeChangedForChildren ();
Iterator *iterator (Content::Type mask, bool atEnd);
diff --git a/dw/widget.cc b/dw/widget.cc
index ac46daf5..464459ba 100644
--- a/dw/widget.cc
+++ b/dw/widget.cc
@@ -515,18 +515,18 @@ void Widget::sizeRequest (Requisition *requisition)
* context of correctExtemes etc., to avoid cyclic dependencies.
*
*/
-int Widget::getMinWidth (Extremes *extremes, bool useCorrected, bool forceValue)
-{
- if (extremes)
- DBG_OBJ_ENTER ("resize", 0, "getMinWidth", "[%d (%d) / %d (%d), %s, %s",
- extremes->minWidth, extremes->minWidthIntrinsic,
- extremes->maxWidth, extremes->maxWidthIntrinsic,
- useCorrected ? "true" : "false",
- forceValue ? "true" : "false");
- else
- DBG_OBJ_ENTER ("resize", 0, "getMinWidth", "(nil), %s, %s",
- useCorrected ? "true" : "false",
- forceValue ? "true" : "false");
+int Widget::getMinWidth (Extremes *extremes, bool forceValue)
+{
+ DBG_IF_RTFL {
+ if (extremes)
+ DBG_OBJ_ENTER ("resize", 0, "getMinWidth", "[%d (%d) / %d (%d), %s",
+ extremes->minWidth, extremes->minWidthIntrinsic,
+ extremes->maxWidth, extremes->maxWidthIntrinsic,
+ forceValue ? "true" : "false");
+ else
+ DBG_OBJ_ENTER ("resize", 0, "getMinWidth", "(nil), %s",
+ forceValue ? "true" : "false");
+ }
int minWidth;
@@ -542,15 +542,9 @@ int Widget::getMinWidth (Extremes *extremes, bool useCorrected, bool forceValue)
// TODO Not completely clear whether this is feasable: Within
// the context of getAvailWidth(false) etc., getExtremes may not
// be called. We ignore the minimal width then.
- if (extremes) {
- if (useCorrected)
- minWidth = extremes->adjustmentWidth;
- else
- // UseCorrected is set to false when called for the
- // correction of extemes. This is not supported anymore,
- // so we return 0. TODO: Should be cleaned up again.
- minWidth = 0;
- } else
+ if (extremes)
+ minWidth = extremes->adjustmentWidth;
+ else
minWidth = 0;
} else
minWidth = 0;
@@ -677,7 +671,7 @@ void Widget::correctRequisition (Requisition *requisition,
DBG_OBJ_MSG ("resize", 1, "no parent, regarding viewport");
DBG_OBJ_MSG_START ();
- int limitMinWidth = getMinWidth (NULL, true, true);
+ int limitMinWidth = getMinWidth (NULL, true);
int viewportWidth =
layout->viewportWidth - (layout->canvasHeightGreater ?
layout->vScrollbarThickness : 0);
@@ -724,7 +718,7 @@ void Widget::correctRequisition (Requisition *requisition,
DBG_OBJ_LEAVE ();
}
-void Widget::correctExtremes (Extremes *extremes)
+void Widget::correctExtremes (Extremes *extremes, bool useAdjustmentWidth)
{
DBG_OBJ_ENTER ("resize", 0, "correctExtremes", "%d (%d) / %d (%d)",
extremes->minWidth, extremes->minWidthIntrinsic,
@@ -734,7 +728,8 @@ void Widget::correctExtremes (Extremes *extremes)
DBG_OBJ_MSG ("resize", 1, "no parent, regarding viewport");
DBG_OBJ_MSG_START ();
- int limitMinWidth = getMinWidth (extremes, false, false);
+ int limitMinWidth =
+ useAdjustmentWidth ? getMinWidth (extremes, false) : 0;
int viewportWidth =
layout->viewportWidth - (layout->canvasHeightGreater ?
layout->vScrollbarThickness : 0);
@@ -760,12 +755,12 @@ void Widget::correctExtremes (Extremes *extremes)
} else if (parent) {
DBG_OBJ_MSG ("resize", 1, "delegated to parent");
DBG_OBJ_MSG_START ();
- parent->correctExtremesOfChild (this, extremes);
+ parent->correctExtremesOfChild (this, extremes, useAdjustmentWidth);
DBG_OBJ_MSG_END ();
} else /* if (quasiParent) */ {
DBG_OBJ_MSG ("resize", 1, "delegated to quasiParent");
DBG_OBJ_MSG_START ();
- quasiParent->correctExtremesOfChild (this, extremes);
+ quasiParent->correctExtremesOfChild (this, extremes, useAdjustmentWidth);
DBG_OBJ_MSG_END ();
}
@@ -1603,7 +1598,7 @@ void Widget::correctReqWidthOfChild (Widget *child, Requisition *requisition)
assert (this == child->quasiParent || this == child->container);
- int limitMinWidth = child->getMinWidth (NULL, true, true);
+ int limitMinWidth = child->getMinWidth (NULL, true);
child->calcFinalWidth (child->getStyle(), -1, this, limitMinWidth, false,
&requisition->width);
@@ -1649,7 +1644,8 @@ void Widget::correctReqHeightOfChild (Widget *child, Requisition *requisition,
DBG_OBJ_LEAVE ();
}
-void Widget::correctExtremesOfChild (Widget *child, Extremes *extremes)
+void Widget::correctExtremesOfChild (Widget *child, Extremes *extremes,
+ bool useAdjustmentWidth)
{
// See comment in correctRequisitionOfChild.
@@ -1663,7 +1659,8 @@ void Widget::correctExtremesOfChild (Widget *child, Extremes *extremes)
(child->container ? child->container : child->parent);
if (effContainer == this) {
- int limitMinWidth = child->getMinWidth (extremes, false, false);
+ int limitMinWidth =
+ useAdjustmentWidth ? child->getMinWidth (extremes, false) : 0;
int width = child->calcWidth (child->getStyle()->width, -1, this,
limitMinWidth, false);
int minWidth = child->calcWidth (child->getStyle()->minWidth, -1, this,
@@ -1683,7 +1680,8 @@ void Widget::correctExtremesOfChild (Widget *child, Extremes *extremes)
} else {
DBG_OBJ_MSG ("resize", 1, "delegated to (effective) container");
DBG_OBJ_MSG_START ();
- effContainer->correctExtremesOfChild (child, extremes);
+ effContainer->correctExtremesOfChild (child, extremes,
+ useAdjustmentWidth);
DBG_OBJ_MSG_END ();
}
diff --git a/dw/widget.hh b/dw/widget.hh
index bef35715..f9d1293c 100644
--- a/dw/widget.hh
+++ b/dw/widget.hh
@@ -292,7 +292,7 @@ protected:
*/
virtual void markExtremesChange (int ref);
- int getMinWidth (Extremes *extremes, bool useCorrected, bool forceValue);
+ int getMinWidth (Extremes *extremes, bool forceValue);
virtual int getAvailWidthOfChild (Widget *child, bool forceValue);
virtual int getAvailHeightOfChild (Widget *child, bool forceValue);
@@ -303,7 +303,8 @@ protected:
void correctReqWidthOfChild (Widget *child, Requisition *requisition);
void correctReqHeightOfChild (Widget *child, Requisition *requisition,
void (*splitHeightFun) (int, int*, int*));
- virtual void correctExtremesOfChild (Widget *child, Extremes *extremes);
+ virtual void correctExtremesOfChild (Widget *child, Extremes *extremes,
+ bool useAdjustmentWidth);
virtual void containerSizeChangedForChildren ();
@@ -430,7 +431,7 @@ public:
virtual bool getAdjustMinWidth () { return Widget::adjustMinWidth; }
void correctRequisition (Requisition *requisition,
void (*splitHeightFun) (int, int*, int*));
- void correctExtremes (Extremes *extremes);
+ void correctExtremes (Extremes *extremes, bool useAdjustmentWidth);
int calcWidth (style::Length cssValue, int refWidth, Widget *refWidget,
int limitMinWidth, bool forceValue);
void calcFinalWidth (style::Style *style, int refWidth, Widget *refWidget,
diff --git a/test/dw_simple_container.cc b/test/dw_simple_container.cc
index e19511a6..7fa9bf75 100644
--- a/test/dw_simple_container.cc
+++ b/test/dw_simple_container.cc
@@ -185,9 +185,12 @@ void SimpleContainer::getExtremesImpl (Extremes *extremes)
childExtr.minWidth = childExtr.maxWidth = 0;
extremes->minWidth = childExtr.minWidth + boxDiffWidth ();
+ extremes->minWidthIntrinsic = childExtr.minWidthIntrinsic + boxDiffWidth ();
extremes->maxWidth = childExtr.maxWidth + boxDiffWidth ();
+ extremes->maxWidthIntrinsic = childExtr.maxWidthIntrinsic + boxDiffWidth ();
+ extremes->adjustmentWidth = childExtr.adjustmentWidth + boxDiffWidth ();
- correctExtremes (extremes);
+ correctExtremes (extremes, true);
}