Dillo v3.1.1-14-g8f67d6e0
Loading...
Searching...
No Matches
dw::Table Class Reference

A Widget for rendering tables. More...

#include <table.hh>

Classes

struct  Child
 
class  TableIterator
 

Public Member Functions

 Table (bool limitTextWidth)
 
 ~Table ()
 
int applyPerWidth (int containerWidth, core::style::Length perWidth)
 
int applyPerHeight (int containerHeight, core::style::Length perHeight)
 
core::Iteratoriterator (core::Content::Type mask, bool atEnd)
 Return an iterator for this widget.
 
void addCell (Widget *widget, int colspan, int rowspan)
 
void addRow (core::style::Style *style)
 
AlignedTableCellgetCellRef ()
 
- Public Member Functions inherited from dw::oof::OOFAwareWidget
 OOFAwareWidget ()
 
 ~OOFAwareWidget ()
 
core::RequisitiongetRequisitionWithoutOOF ()
 
bool doesWidgetOOFInterruptDrawing (Widget *widget)
 
void draw (core::View *view, core::Rectangle *area, core::DrawingContext *context)
 Area is given in widget coordinates.
 
virtual void updateReference (int ref)
 Update content in flow, down from ref.
 
virtual void widgetRefSizeChanged (int externalIndex)
 Called by an implementation of dw::oof::OutOfFlowMgr (actually only OOFPosRelMgr) for the generator of a widget out of flow, when the reference size has changed.
 
virtual void oofSizeChanged (bool extremesChanged)
 Called by an implementation of dw::oof::OutOfFlowMgr when the size of the container has changed, typically in sizeAllocateEnd.
 
virtual int getGeneratorX (int oofmIndex)
 Return position relative to container, not regarding margin/border/padding, Called by OOFFloatsMgr to position floats.
 
virtual int getGeneratorY (int oofmIndex)
 Return position relative to container, not regarding margin/border/padding, Called by OOFFloatsMgr to position floats.
 
virtual int getGeneratorWidth ()
 Return width including margin/border/padding Called by OOFFloatsMgr to position floats.
 
virtual int getMaxGeneratorWidth ()
 
virtual bool usesMaxGeneratorWidth ()
 
virtual bool isPossibleOOFContainer (int oofmIndex)
 
virtual bool isPossibleOOFContainerParent (int oofmIndex)
 
- Public Member Functions inherited from dw::core::Widget
void setDeleteCallback (DW_Callback_t func, void *data)
 
 Widget ()
 
 ~Widget ()
 
bool resizeQueued ()
 
bool extremesQueued ()
 
bool needsResize ()
 
bool needsAllocate ()
 
bool allocateQueued ()
 
bool extremesChanged ()
 
bool wasAllocated ()
 
void setParent (Widget *parent)
 
void setQuasiParent (Widget *quasiParent)
 
void setGenerator (Widget *generator)
 
style::StylegetStyle ()
 
AllocationgetAllocation ()
 
bool inAllocation (int x, int y)
 
int boxOffsetX ()
 
int boxRestWidth ()
 
int boxDiffWidth ()
 
int boxOffsetY ()
 
int boxRestHeight ()
 
int boxDiffHeight ()
 
virtual int numSizeRequestReferences ()
 See Sizes of Dillo Widgets (or Size requisitions depending on positions).
 
virtual WidgetsizeRequestReference (int index)
 See Sizes of Dillo Widgets (or Size requisitions depending on positions).
 
virtual int numGetExtremesReferences ()
 See Sizes of Dillo Widgets (or Size requisitions depending on positions).
 
virtual WidgetgetExtremesReference (int index)
 See Sizes of Dillo Widgets (or Size requisitions depending on positions).
 
void sizeRequest (Requisition *requisition, int numPos=0, Widget **references=NULL, int *x=NULL, int *y=NULL)
 This method is a wrapper for Widget::sizeRequestImpl(); it calls the latter only when needed.
 
void getExtremes (Extremes *extremes, int numPos=0, Widget **references=NULL, int *x=NULL, int *y=NULL)
 Wrapper for Widget::getExtremesImpl().
 
void sizeAllocate (Allocation *allocation)
 Wrapper for Widget::sizeAllocateImpl, calls the latter only when needed.
 
void calcExtraSpace (int numPos, Widget **references, int *x, int *y)
 Calculates dw::core::Widget::extraSpace.
 
int getAvailWidth (bool forceValue)
 Return available width including margin/border/padding (extraSpace?), not only the content width.
 
int getAvailHeight (bool forceValue)
 Return available height including margin/border/padding (extraSpace?), not only the content height.
 
void correctRequisition (Requisition *requisition, void(*splitHeightFun)(int, int *, int *), bool allowDecreaseWidth, bool allowDecreaseHeight)
 
void correctExtremes (Extremes *extremes, bool useAdjustmentWidth)
 
int calcWidth (style::Length cssValue, int refWidth, Widget *refWidget, int limitMinWidth, bool forceValue)
 Computes a width value in pixels from cssValue.
 
void calcFinalWidth (style::Style *style, int refWidth, Widget *refWidget, int limitMinWidth, bool forceValue, int *finalWidth)
 
int calcHeight (style::Length cssValue, bool usePercentage, int refHeight, Widget *refWidget, bool forceValue)
 
int getMinWidth (Extremes *extremes, bool forceValue)
 Used to evaluate Widget::adjustMinWidth.
 
virtual bool isPossibleContainer ()
 
void containerSizeChanged ()
 
bool intersects (Widget *refWidget, Rectangle *area, Rectangle *intersection)
 Calculates the intersection of the visible allocation (i.
 
void drawInterruption (View *view, Rectangle *area, DrawingContext *context)
 See Interrupted drawing for details.
 
WidgetgetWidgetAtPointInterrupted (int x, int y, GettingWidgetAtPointContext *context)
 
bool buttonPress (EventButton *event)
 
bool buttonRelease (EventButton *event)
 
bool motionNotify (EventMotion *event)
 
void enterNotify (EventCrossing *event)
 
void leaveNotify (EventCrossing *event)
 
virtual void setStyle (style::Style *style)
 Change the style of a widget.
 
void setBgColor (style::Color *bgColor)
 Set the background "behind" the widget, if it is not the background of the parent widget, e.g.
 
style::ColorgetBgColor ()
 Get the actual background of a widget.
 
void drawBox (View *view, style::Style *style, Rectangle *area, int x, int y, int width, int height, bool inverse)
 Draw borders and background of a widget part, which allocation is given by (x, y, width, height) (widget coordinates).
 
void drawWidgetBox (View *view, Rectangle *area, bool inverse)
 Draw borders and background of a widget.
 
void drawSelected (View *view, Rectangle *area)
 
void setButtonSensitive (bool buttonSensitive)
 
bool isButtonSensitive ()
 
WidgetgetParent ()
 
WidgetgetContainer ()
 
WidgetgetTopLevel ()
 Get the widget at the root of the tree, this widget is part from.
 
int getLevel ()
 Get the level of the widget within the tree.
 
int getGeneratorLevel ()
 Get the level of the widget within the tree, regarting the generators, not the parents.
 
WidgetgetNearestCommonAncestor (Widget *otherWidget)
 Get the widget with the highest level, which is a direct ancestor of widget1 and widget2.
 
WidgetReferencegetWidgetReference ()
 
void setWidgetReference (WidgetReference *widgetReference)
 
WidgetgetGenerator ()
 
LayoutgetLayout ()
 
void scrollTo (HPosition hpos, VPosition vpos, int x, int y, int width, int height)
 
void getMarginArea (int *xMar, int *yMar, int *widthMar, int *heightMar)
 
void getBorderArea (int *xBor, int *yBor, int *widthBor, int *heightBor)
 
void getPaddingArea (int *xPad, int *yPad, int *widthPad, int *heightPad)
 Return the padding area (content plus padding).
 
virtual void removeChild (Widget *child)
 
- Public Member Functions inherited from lout::identity::IdentifiableObject
 IdentifiableObject ()
 
void intoStringBuffer (misc::StringBuffer *sb)
 Store a textual representation of the object in a misc::StringBuffer.
 
int getClassId ()
 Returns the class identifier.
 
const char * getClassName ()
 Return the name, under which the class of this object was registered.
 
bool instanceOf (int otherClassId)
 Returns, whether this class is an instance of the class, given by otherClassId, or of a sub class of this class.
 
- Public Member Functions inherited from lout::object::Object
virtual ~Object ()
 The destructor is defined as virtual (but not abstract), so that destruction of Object's works properly.
 
virtual bool equals (Object *other)
 Returns, whether two objects are equal.
 
virtual int hashValue ()
 Return a hash value for the object.
 
virtual Objectclone ()
 Return an exact copy of the object.
 
const char * toString ()
 Use object::Object::intoStringBuffer to return a textual representation of the object.
 
virtual size_t sizeOf ()
 Return the number of bytes, this object totally uses.
 

Static Public Member Functions

static void setAdjustTableMinWidth (bool adjustTableMinWidth)
 
static bool getAdjustTableMinWidth ()
 
- Static Public Member Functions inherited from dw::oof::OOFAwareWidget
static const char * stackingLevelText (int level)
 
static bool testStyleFloat (core::style::Style *style)
 
static bool testStyleAbsolutelyPositioned (core::style::Style *style)
 
static bool testStyleFixedlyPositioned (core::style::Style *style)
 
static bool testStyleRelativelyPositioned (core::style::Style *style)
 
static bool testStylePositioned (core::style::Style *style)
 
static bool testStyleOutOfFlow (core::style::Style *style)
 
static bool testWidgetFloat (Widget *widget)
 
static bool testWidgetAbsolutelyPositioned (Widget *widget)
 
static bool testWidgetFixedlyPositioned (Widget *widget)
 
static bool testWidgetRelativelyPositioned (Widget *widget)
 
static bool testWidgetPositioned (Widget *widget)
 
static bool testWidgetOutOfFlow (Widget *widget)
 
- Static Public Member Functions inherited from dw::core::Widget
static void setAdjustMinWidth (bool adjustMinWidth)
 
static void adjustHeight (int *height, bool allowDecreaseHeight, int ascent, int descent)
 

Static Public Attributes

static int CLASS_ID = -1
 
- Static Public Attributes inherited from dw::oof::OOFAwareWidget
static int CLASS_ID = -1
 
- Static Public Attributes inherited from dw::core::Widget
static int CLASS_ID = -1
 

Protected Member Functions

void sizeRequestSimpl (core::Requisition *requisition)
 Simple variant, to be implemented by widgets with sizes not depending on positions.
 
void getExtremesSimpl (core::Extremes *extremes)
 Simple variant, to be implemented by widgets with extremes not depending on positions.
 
void sizeAllocateImpl (core::Allocation *allocation)
 See Sizes of Dillo Widgets.
 
void resizeDrawImpl ()
 Called after sizeAllocateImpl() to redraw necessary areas.
 
bool getAdjustMinWidth ()
 
int getAvailWidthOfChild (Widget *child, bool forceValue)
 
void containerSizeChangedForChildren ()
 
bool affectsSizeChangeContainerChild (Widget *child)
 
bool usesAvailWidth ()
 Must be implemengted by a method returning true, when getAvailWidth() is called.
 
bool isBlockLevel ()
 
void drawLevel (core::View *view, core::Rectangle *area, int level, core::DrawingContext *context)
 
WidgetgetWidgetAtPointLevel (int x, int y, int level, core::GettingWidgetAtPointContext *context)
 
void removeChild (Widget *child)
 
- Protected Member Functions inherited from dw::oof::OOFAwareWidget
bool isParentRefOOF (int parentRef)
 
int makeParentRefInFlow (int inFlowSubRef)
 
int getParentRefInFlowSubRef (int parentRef)
 
int makeParentRefOOF (int oofmIndex, int oofmSubRef)
 
int getParentRefOOFSubRef (int parentRef)
 
int getParentRefOOFIndex (int parentRef)
 
oof::OutOfFlowMgrgetParentRefOutOfFlowMgr (int parentRef)
 
bool isWidgetOOF (Widget *widget)
 
int getWidgetInFlowSubRef (Widget *widget)
 
int getWidgetOOFSubRef (Widget *widget)
 
int getWidgetOOFIndex (Widget *widget)
 
oof::OutOfFlowMgrgetWidgetOutOfFlowMgr (Widget *widget)
 
OutOfFlowMgrsearchOutOfFlowMgr (int oofmIndex)
 
void initOutOfFlowMgrs ()
 
void correctRequisitionByOOF (core::Requisition *requisition, void(*splitHeightFun)(int, int *, int *))
 
void correctExtremesByOOF (core::Extremes *extremes)
 
void sizeAllocateStart (core::Allocation *allocation)
 
void sizeAllocateEnd ()
 
void containerSizeChangedForChildrenOOF ()
 
void drawOOF (core::View *view, core::Rectangle *area, core::DrawingContext *context)
 
WidgetgetWidgetAtPoint (int x, int y, core::GettingWidgetAtPointContext *context)
 
WidgetgetWidgetOOFAtPoint (int x, int y, core::GettingWidgetAtPointContext *context)
 
void notifySetAsTopLevel ()
 This method is called after a widget has been set as the top of a widget tree.
 
void notifySetParent ()
 This method is called after a widget has been added to a parent.
 
void removeChild (Widget *child)
 
virtual bool adjustExtraSpaceWhenCorrectingRequisitionByOOF ()
 
- Protected Member Functions inherited from dw::core::Widget
int getHeight ()
 
int getContentWidth ()
 
int getContentHeight ()
 
StackingContextMgrgetNextStackingContextMgr ()
 
void printFlag (Flags f)
 
void setFlags (Flags f)
 
void unsetFlags (Flags f)
 
void queueDraw ()
 
void queueDrawArea (int x, int y, int width, int height)
 
void queueResize (int ref, bool extremesChanged)
 
virtual void sizeRequestImpl (Requisition *requisition, int numPos, Widget **references, int *x, int *y)
 See Sizes of Dillo Widgets.
 
virtual void getExtremesImpl (Extremes *extremes, int numPos, Widget **references, int *x, int *y)
 See Sizes of Dillo Widgets.
 
virtual void calcExtraSpaceImpl (int numPos, Widget **references, int *x, int *y)
 The actual implementation for calculating dw::core::Widget::extraSpace.
 
virtual void markSizeChange (int ref)
 See Sizes of Dillo Widgets.
 
virtual void markExtremesChange (int ref)
 See Sizes of Dillo Widgets.
 
virtual int getAvailWidthOfChild (Widget *child, bool forceValue)
 Computes the content width available of a child widget.
 
virtual int getAvailHeightOfChild (Widget *child, bool forceValue)
 
virtual void correctRequisitionOfChild (Widget *child, Requisition *requisition, void(*splitHeightFun)(int, int *, int *), bool allowDecreaseWidth, bool allowDecreaseHeight)
 
void correctReqWidthOfChild (Widget *child, Requisition *requisition, bool allowDecreaseWidth)
 
void correctReqHeightOfChild (Widget *child, Requisition *requisition, void(*splitHeightFun)(int, int *, int *), bool allowDecreaseHeight)
 
virtual void correctExtremesOfChild (Widget *child, Extremes *extremes, bool useAdjustmentWidth)
 
virtual bool affectedByContainerSizeChange ()
 
virtual bool affectsSizeChangeContainerChild (Widget *child)
 
virtual bool usesAvailHeight ()
 Must be implemengted by a method returning true, when getAvailHeight() is called.
 
virtual bool buttonPressImpl (EventButton *event)
 
virtual bool buttonReleaseImpl (EventButton *event)
 
virtual bool motionNotifyImpl (EventMotion *event)
 
virtual void enterNotifyImpl (EventCrossing *event)
 
virtual void leaveNotifyImpl (EventCrossing *event)
 
char * addAnchor (const char *name)
 
char * addAnchor (const char *name, int y)
 
void changeAnchor (char *name, int y)
 
void removeAnchor (char *name)
 
void setCursor (style::Cursor cursor)
 
bool selectionHandleEvent (SelectionState::EventType eventType, Iterator *it, int charPos, int linkNo, MousePositionEvent *event)
 
- Protected Member Functions inherited from lout::identity::IdentifiableObject
void registerName (const char *className, int *classId)
 This method must be called in the constructor for the sub class.
 

Private Types

enum  ExtrMod {
  MIN , MIN_INTR , MIN_MIN , MAX_MIN ,
  MAX , MAX_INTR , DATA
}
 

Private Member Functions

const char * getExtrModName (ExtrMod mod)
 
int getExtreme (core::Extremes *extremes, ExtrMod mod)
 
void setExtreme (core::Extremes *extremes, ExtrMod mod, int value)
 
int getColExtreme (int col, ExtrMod mod, void *data)
 
void setColExtreme (int col, ExtrMod mod, void *data, int value)
 
bool childDefined (int n)
 
int calcAvailWidthForDescendant (Widget *child)
 
void reallocChildren (int newNumCols, int newNumRows)
 
void calcCellSizes (bool calcHeights)
 
void forceCalcCellSizes (bool calcHeights)
 
void actuallyCalcCellSizes (bool calcHeights)
 
void apportionRowSpan ()
 
void forceCalcColumnExtremes ()
 Fills dw::Table::colExtremes in all cases.
 
void calcExtremesSpanMultiCols (int col, int cs, core::Extremes *cellExtremes, ExtrMod minExtrMod, ExtrMod maxExtrMod, void *extrData)
 
void calcAdjustmentWidthSpanMultiCols (int col, int cs, core::Extremes *cellExtremes)
 
void apportion2 (int totalWidth, int firstCol, int lastCol, ExtrMod minExtrMod, ExtrMod maxExtrMod, void *extrData, lout::misc::SimpleVector< int > *dest, int destOffset)
 Actual apportionment function.
 
void setCumHeight (int row, int value)
 

Private Attributes

bool limitTextWidth
 
bool rowClosed
 
int numRows
 
int numCols
 
int curRow
 
int curCol
 
lout::misc::SimpleVector< Child * > * children
 
int redrawX
 
int redrawY
 
lout::misc::SimpleVector< core::Extremes > * colExtremes
 The extremes of all columns.
 
lout::misc::SimpleVector< bool > * colWidthSpecified
 Wether the column itself (in the future?) or at least one cell in this column or spanning over this column has CSS 'width' specified.
 
int numColWidthSpecified
 
lout::misc::SimpleVector< bool > * colWidthPercentage
 Wether the column itself (in the future?) or at least one cell in this column or spanning over this column has CSS 'width' specified as percentage value.
 
int numColWidthPercentage
 
lout::misc::SimpleVector< int > * colWidths
 The widths of all columns.
 
lout::misc::SimpleVector< int > * cumHeight
 Row cumulative height array: cumHeight->size() is numRows + 1, cumHeight->get(0) is 0, cumHeight->get(numRows) is the total table height.
 
lout::misc::SimpleVector< int > * rowSpanCells
 If a Cell has rowspan > 1, it goes into this array.
 
lout::misc::SimpleVector< int > * baseline
 
lout::misc::SimpleVector< core::style::Style * > * rowStyle
 
bool colWidthsUpToDateWidthColExtremes
 

Static Private Attributes

static bool adjustTableMinWidth = true
 

Friends

class TableIterator
 

Additional Inherited Members

- Public Types inherited from dw::oof::OOFAwareWidget
enum  {
  SL_START , SL_BACKGROUND , SL_SC_BOTTOM , SL_IN_FLOW ,
  SL_OOF_REF , SL_OOF_CONT , SL_SC_TOP , SL_END
}
 
- Public Attributes inherited from dw::core::Widget
int parentRef
 This value is defined by the parent widget, and used for incremential resizing.
 
- Protected Types inherited from dw::oof::OOFAwareWidget
enum  {
  OOFM_FLOATS , OOFM_ABSOLUTE , OOFM_RELATIVE , OOFM_FIXED ,
  NUM_OOFM
}
 
enum  { PARENT_REF_OOFM_BITS = 3 , PARENT_REF_OOFM_MASK = (1 << PARENT_REF_OOFM_BITS) - 1 }
 
- Protected Types inherited from dw::core::Widget
enum  Flags {
  RESIZE_QUEUED = 1 << 0 , EXTREMES_QUEUED = 1 << 1 , NEEDS_RESIZE = 1 << 2 , NEEDS_ALLOCATE = 1 << 3 ,
  ALLOCATE_QUEUED = 1 << 4 , EXTREMES_CHANGED = 1 << 5 , WAS_ALLOCATED = 1 << 6
}
 
- Static Protected Member Functions inherited from dw::oof::OOFAwareWidget
static int getOOFMIndex (Widget *widget)
 
static bool isOOFContainer (Widget *widget, int oofmIndex)
 
- Protected Attributes inherited from dw::oof::OOFAwareWidget
OOFAwareWidgetoofContainer [NUM_OOFM]
 
OutOfFlowMgroutOfFlowMgr [NUM_OOFM]
 
core::Requisition requisitionWithoutOOF
 
- Protected Attributes inherited from dw::core::Widget
WidgetImgRendererwidgetImgRenderer
 
Allocation allocation
 The current allocation: size and position, always relative to the canvas.
 
Layoutlayout
 
style::Box extraSpace
 Space around the margin box.
 
StackingContextMgrstackingContextMgr
 Set iff this widget constitutes a stacking context, as defined by CSS.
 
WidgetstackingContextWidget
 The bottom-most ancestor (or this) for which stackingContextMgr is set.
 
- Static Protected Attributes inherited from dw::oof::OOFAwareWidget
static const char * OOFM_NAME [NUM_OOFM]
 

Detailed Description

A Widget for rendering tables.

Warning: Some parts of this description are outdated since GROWS - Grand Redesign Of Widget Sizes.

Introduction

The dw::Table widget is used to render HTML tables.

Each cell is itself a separate widget. Any widget may be used, however, in dillo, only instances of dw::Textblock and dw::TableCell are used as children of dw::Table.

Sizes

General

The following diagram shows the dependencies between the different functions, which are related to size calculation. Click on the boxes for more information.

dot_inline_dotgraph_14.png

[A] In this case, the new calculation is not forced, but only done, when necessary.

[B] In this case, the new calculation is allways necessary, since [C] is the case.

[C] Whether this function is called, depends on NEEDS_RESIZE / RESIZE_QUEUED / EXTREMES_CHANGED / EXTREMES_QUEUED.

TODO:

  • Are [cC]alcCellSizes (calcHeights = *false) not necessary anymore?
  • Calculating available sizes (Table::getAvailWidthOfChild) should be documented in this diagram, too.

Apportionment

See also
How to Avoid Rounding Errors

Given two array $e_{i,\min}$ and $e_{i,\max}$, which represent the column minima and maxima, and a total width $W$, apportionment means to calculate column widths $w_{i}$, with

\[e_{i,\min} \le w_{i} \le e_{i,\max}\]

and

\[\sum w_{i} = W\]

There are different algorithms for apportionment, a simple one is recommended in the HTML 4.0.1 specification (http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.5.2.2):

\[w_{i} = e_{i,\min} +
   {e_{i,\max} - e_{i,\min}\over\sum e_{i,\max} - \sum e_{i,\min}}
   (W - \sum e_{i,\min})\]

This one is used currently, but another one will be used soon, which is described below. The rest of this chapter is independent of the exact apportionment algorithm.

When referring to the apportionment function, we will call it $a_i (W, (e_{i,\min}), (e_{i,\min}))$ and write something like this:

\[w_{i} = a_i (W, (e_{i,\min}), (e_{i,\max})) \]

It is implemented by dw::Table::apportion.

Column Extremes

See also
How to Avoid Rounding Errors

The sizes, which all other sizes depend on, are column extremes, which define, how wide a column may be at min and at max. They are calculated in the following way:

  1. First, only cells with colspan = 1 are regarded:

    \[ e_{\hbox{base},i,\min} = \max \{ e_{\hbox{cell},i,j,\min} \} \]

    \[ e_{\hbox{base},i,\max} = \max \{ e_{\hbox{cell},i,j,\max} \} \]

    only for cells $(i, j)$ with colspan = 1.

  2. Then, $e_{\hbox{span},i,\min}$ (but not $e_{\hbox{span},i,\max}$) are calculated from cells with colspan > 1. (In the following formulas, the cell at $(i_1, j)$ always span from $i_1$ to $i_2$.) If the minimal width of the column exceeds the sum of the column minima calculated in the last step:

    \[e_{\hbox{cell},i_1,j,\min} >
        \sum_{i=i_1}^{i=i_2} e_{\hbox{base},i,\min}\]

    then the minimal width of this cell is apportioned to the columns:

    • If the minimal width of this cell also exceeds the sum of the column maxima:

      \[e_{\hbox{cell},i_1,j,\min} >
          \sum_{i=i_1}^{i=i_2} e_{\hbox{base},i,\max}\]

      then $e_{\hbox{cell},i_1,j,\min}$ is apportioned in a simple way:

      \[e_{\hbox{span},i,j,\min} =
             e_{\hbox{base},i,\max}
                {e_{\hbox{span},i,j,\min} \over
                 \sum_{i=i_1}^{i=i_2} e_{\hbox{base},i,\max}}\]

    • Otherwise, the apportionment function is used:

      \[e_{\hbox{span},i,j,\min} =
          a_i (e_{\hbox{cell},i_1,j,\min},
               (e_{\hbox{cell},i_1,j,\min} \ldots
                   e_{\hbox{cell},i_2,j,\min}),
               (e_{\hbox{cell},i_1,j,\max} \ldots
                   e_{\hbox{cell},i_2,j,\max}))\]

    After this, $e_{\hbox{span},i,\min}$ is then the maximum of all $e_{\hbox{span},i,j,\min}$.

  3. Finally, the maximum of both is used.

    \[ e_{i,\min} =
        \max \{ e_{\hbox{base},i,\min}, e_{\hbox{span},i,\min} \} \]

    \[ e_{i,\max} =
        \max \{ e_{\hbox{base},i,\max}, e_{i,\min} \} \]

    For the maxima, there is no $e_{\hbox{span},i,\max}$, but it has to be assured, that the maximum is always greater than or equal to the minimum.

Generally, if absolute widths are specified, they are, instead of the results of dw::core::Widget::getExtremes, taken for the minimal and maximal width of a cell (minus the box difference, i.e. the difference between content size and widget size). If the content width specification is smaller than the minimal content width of the widget (determined by dw::core::Widget::getExtremes), the latter is used instead.

If percentage widths are specified, they are also collected, as column maxima. A similar method as for the extremes is used, for cells with colspan > 1:

\[w_{\hbox{span},i,j,\%} =
   a_i (w_{\hbox{cell},i_1,j,\%},
     (e_{\hbox{cell},i_1,j,\min} \ldots e_{\hbox{cell},i_2,j,\min}),
     (e_{\hbox{cell},i_1,j,\max} \ldots e_{\hbox{cell},i_2,j,\max}))\]

Cell Sizes

Determining the Width of the Table

The total width is

  • the specified absolute width of the table, when given, or
  • the available width (set by dw::Table::setWidth [TODO outdated]) times the specified percentage width of t(at max 100%), if the latter is given, or
  • otherwise the available width.

In any case, it is corrected, if it is less than the minimal width (but not if it is greater than the maximal width).

Bug:
The parentheses is not fully clear, look at the old code.

Details on differences because of styles are omitted. Below, this total width is called $W$.

Evaluating percentages

The following algorithms are used to solve collisions between different size specifications (absolute and percentage). Generally, inherent sizes and specified absolute sizes are preferred.

  1. First, calculate the sum of the minimal widths, for columns, where no percentage width has been specified. The difference to the total width is at max available to the columns with percentage width specifications:

    \[W_{\hbox{columns}_\%,\hbox{available}} = W - \sum e_{i,\min}\]

    with only those columns $i$ with no percentage width specification.

  2. Then, calculate the sum of the widths, which the columns with percentage width specification would allocate, when fully adhering to them:

    \[W_{\hbox{columns}_\%,\hbox{best}} = W \sum w_{i,\%}\]

    with only those columns $i$ with a percentage width specification.

  3. Two cases are distinguished:

    • $W_{\hbox{columns}_\%,\hbox{available}} \ge
            W_{\hbox{columns}_\%,\hbox{best}}$: In this case, the percentage widths can be used without any modification, by setting the extremes:

      \[e_{i,\min} = e_{i,\max} = W w_{i,\%}\]

      for only those columns $i$ with a percentage width specification.

    • $W_{\hbox{columns}_\%,\hbox{available}} <
            W_{\hbox{columns}_\%,\hbox{best}}$: In this case, the widths for these columns must be cut down:

      \[e_{i,\min} = e_{i,\max} =
             w_{i,\%}
             {W_{\hbox{columns}_\%,\hbox{available}} \over
              w_{\hbox{total},\%}}\]

      with

      \[w_{\hbox{total},\%} = \sum w_{i,\%}\]

      in both cases for only those columns $i$ with a percentage width specification.

( $e_{i,\min}$ and $e_{i,\max}$ are set temporarily here, the notation should be a bit clearer.)

Column Widths

The column widths are now simply calculated by applying the apportionment function.

Row Heights

...

Alternative Apportionment Algorithm

The algorithm described here tends to result in more homogeneous column widths.

The following rule leads to well-defined $w_{i}$: All columns $i$ have have the same width $w$, except:

  • $w < e_{i,\min}$, or
  • $w > e_{i,\max}$.

Furthermore, $w$ is

  • less than all $e_{i,\min}$ of columns not having $w$ as width, and
  • greater than all $e_{i,\min}$ of columns not having $w$ as width.

Of course, $\sum w_{i} = W$ must be the case.

Based on an initial value $w = {W\over n}$, $w$ can iteratively adjusted, based on these rules.

Borders, Paddings, Spacing

Currently, DwTable supports only the separated borders model (see CSS specification). Borders, paddings, spacing is done by creating dw::core::style::Style structures with values equivalent to following CSS:

TABLE {
  border:           outset table-border;
  border-collapse:  separate;
  border-spacing:   table-cellspacing;
  background-color: table-bgcolor;
}

TD TH {
  border:           inset table-border;
  padding:          table-cellspacing;
  background-color: td/th-bgcolor;
}

Here, foo-bar refers to the attribute bar of the tag foo foo. Look at the HTML parser for more details.

Definition at line 325 of file table.hh.

Member Enumeration Documentation

◆ ExtrMod

enum dw::Table::ExtrMod
private
Enumerator
MIN 
MIN_INTR 
MIN_MIN 
MAX_MIN 
MAX 
MAX_INTR 
DATA 

Definition at line 420 of file table.hh.

Constructor & Destructor Documentation

◆ Table()

◆ ~Table()

Member Function Documentation

◆ actuallyCalcCellSizes()

◆ addCell()

◆ addRow()

void dw::Table::addRow ( core::style::Style style)

◆ affectsSizeChangeContainerChild()

bool dw::Table::affectsSizeChangeContainerChild ( Widget child)
protected

Definition at line 347 of file table.cc.

References DBG_OBJ_ENTER, DBG_OBJ_LEAVE, and DBG_OBJ_MSGF.

◆ applyPerHeight()

int dw::Table::applyPerHeight ( int  containerHeight,
core::style::Length  perHeight 
)
virtual

Reimplemented from dw::core::Widget.

Definition at line 325 of file table.cc.

References dw::core::style::multiplyWithPerLength().

◆ applyPerWidth()

int dw::Table::applyPerWidth ( int  containerWidth,
core::style::Length  perWidth 
)
virtual

Reimplemented from dw::core::Widget.

Definition at line 320 of file table.cc.

References dw::core::style::multiplyWithPerLength().

◆ apportion2()

void dw::Table::apportion2 ( int  totalWidth,
int  firstCol,
int  lastCol,
ExtrMod  minExtrMod,
ExtrMod  maxExtrMod,
void *  extrData,
lout::misc::SimpleVector< int > *  dest,
int  destOffset 
)
private

◆ apportionRowSpan()

◆ calcAdjustmentWidthSpanMultiCols()

void dw::Table::calcAdjustmentWidthSpanMultiCols ( int  col,
int  cs,
core::Extremes cellExtremes 
)
private

◆ calcAvailWidthForDescendant()

◆ calcCellSizes()

◆ calcExtremesSpanMultiCols()

void dw::Table::calcExtremesSpanMultiCols ( int  col,
int  cs,
core::Extremes cellExtremes,
ExtrMod  minExtrMod,
ExtrMod  maxExtrMod,
void *  extrData 
)
private

◆ childDefined()

bool dw::Table::childDefined ( int  n)
inlineprivate

◆ containerSizeChangedForChildren()

void dw::Table::containerSizeChangedForChildren ( )
protectedvirtual

◆ drawLevel()

◆ forceCalcCellSizes()

◆ forceCalcColumnExtremes()

◆ getAdjustMinWidth()

bool dw::Table::getAdjustMinWidth ( )
inlineprotectedvirtual

Reimplemented from dw::core::Widget.

Definition at line 469 of file table.hh.

References adjustTableMinWidth.

◆ getAdjustTableMinWidth()

static bool dw::Table::getAdjustTableMinWidth ( )
inlinestatic

Definition at line 497 of file table.hh.

References adjustTableMinWidth.

Referenced by actuallyCalcCellSizes(), and dw::tablecell::getAdjustMinWidth().

◆ getAvailWidthOfChild()

◆ getCellRef()

◆ getColExtreme()

int dw::Table::getColExtreme ( int  col,
ExtrMod  mod,
void *  data 
)
private

Definition at line 701 of file table.cc.

References colExtremes, DATA, and getExtreme().

Referenced by apportion2(), and calcExtremesSpanMultiCols().

◆ getExtreme()

◆ getExtremesSimpl()

◆ getExtrModName()

const char * dw::Table::getExtrModName ( ExtrMod  mod)
private

Definition at line 618 of file table.cc.

References lout::misc::assertNotReached(), DATA, MAX, MAX_INTR, MAX_MIN, MIN, MIN_INTR, and MIN_MIN.

Referenced by apportion2(), and calcExtremesSpanMultiCols().

◆ getWidgetAtPointLevel()

◆ isBlockLevel()

bool dw::Table::isBlockLevel ( )
protectedvirtual

Reimplemented from dw::core::Widget.

Definition at line 374 of file table.cc.

◆ iterator()

core::Iterator * dw::Table::iterator ( core::Content::Type  mask,
bool  atEnd 
)
virtual

Return an iterator for this widget.

mask can narrow the types returned by the iterator, this can enhance performance quite much, e.g. when only searching for child widgets.

With atEnd == false, the iterator starts before the beginning, i.e. the first call of dw::core::Iterator::next will let the iterator point on the first piece of contents. Likewise, With atEnd == true, the iterator starts after the last piece of contents, call dw::core::Iterator::prev in this case.

Implements dw::core::Widget.

Definition at line 463 of file table.cc.

◆ reallocChildren()

◆ removeChild()

void dw::Table::removeChild ( Widget child)
protected
Bug:
Not implemented.

Definition at line 458 of file table.cc.

◆ resizeDrawImpl()

void dw::Table::resizeDrawImpl ( )
protectedvirtual

Called after sizeAllocateImpl() to redraw necessary areas.

By default the whole widget is redrawn.

Reimplemented from dw::core::Widget.

Definition at line 217 of file table.cc.

References dw::core::Widget::allocation, dw::core::Widget::getHeight(), dw::core::Widget::queueDrawArea(), redrawX, redrawY, and dw::core::Allocation::width.

◆ setAdjustTableMinWidth()

static void dw::Table::setAdjustTableMinWidth ( bool  adjustTableMinWidth)
inlinestatic

Definition at line 494 of file table.hh.

References adjustTableMinWidth.

Referenced by main().

◆ setColExtreme()

void dw::Table::setColExtreme ( int  col,
ExtrMod  mod,
void *  data,
int  value 
)
inlineprivate

Definition at line 712 of file table.cc.

References colExtremes, DATA, and setExtreme().

Referenced by calcExtremesSpanMultiCols().

◆ setCumHeight()

void dw::Table::setCumHeight ( int  row,
int  value 
)
inlineprivate

◆ setExtreme()

◆ sizeAllocateImpl()

◆ sizeRequestSimpl()

◆ usesAvailWidth()

bool dw::Table::usesAvailWidth ( )
protectedvirtual

Must be implemengted by a method returning true, when getAvailWidth() is called.

Reimplemented from dw::core::Widget.

Definition at line 369 of file table.cc.

Friends And Related Symbol Documentation

◆ TableIterator

friend class TableIterator
friend

Definition at line 361 of file table.hh.

Member Data Documentation

◆ adjustTableMinWidth

bool dw::Table::adjustTableMinWidth = true
staticprivate

Definition at line 363 of file table.hh.

Referenced by getAdjustMinWidth(), getAdjustTableMinWidth(), and setAdjustTableMinWidth().

◆ baseline

lout::misc::SimpleVector<int>* dw::Table::baseline
private

Definition at line 414 of file table.hh.

Referenced by actuallyCalcCellSizes(), Table(), and ~Table().

◆ children

◆ CLASS_ID

int dw::Table::CLASS_ID = -1
static

Definition at line 492 of file table.hh.

Referenced by Table().

◆ colExtremes

◆ colWidthPercentage

lout::misc::SimpleVector<bool>* dw::Table::colWidthPercentage
private

Wether the column itself (in the future?) or at least one cell in this column or spanning over this column has CSS 'width' specified as percentage value.

Filled by forceCalcColumnExtremes(), since it is needed to calculate the column widths.

Definition at line 396 of file table.hh.

Referenced by actuallyCalcCellSizes(), forceCalcColumnExtremes(), Table(), and ~Table().

◆ colWidths

lout::misc::SimpleVector<int>* dw::Table::colWidths
private

◆ colWidthSpecified

lout::misc::SimpleVector<bool>* dw::Table::colWidthSpecified
private

Wether the column itself (in the future?) or at least one cell in this column or spanning over this column has CSS 'width' specified.

Filled by forceCalcColumnExtremes(), since it is needed to calculate the column widths.

Definition at line 385 of file table.hh.

Referenced by actuallyCalcCellSizes(), forceCalcColumnExtremes(), Table(), and ~Table().

◆ colWidthsUpToDateWidthColExtremes

bool dw::Table::colWidthsUpToDateWidthColExtremes
private

Definition at line 418 of file table.hh.

Referenced by actuallyCalcCellSizes(), calcCellSizes(), forceCalcColumnExtremes(), and Table().

◆ cumHeight

lout::misc::SimpleVector<int>* dw::Table::cumHeight
private

Row cumulative height array: cumHeight->size() is numRows + 1, cumHeight->get(0) is 0, cumHeight->get(numRows) is the total table height.

Definition at line 409 of file table.hh.

Referenced by actuallyCalcCellSizes(), apportionRowSpan(), drawLevel(), setCumHeight(), sizeAllocateImpl(), sizeRequestSimpl(), Table(), and ~Table().

◆ curCol

int dw::Table::curCol
private

Definition at line 367 of file table.hh.

Referenced by addCell(), addRow(), getCellRef(), and Table().

◆ curRow

int dw::Table::curRow
private

Definition at line 367 of file table.hh.

Referenced by addCell(), addRow(), and Table().

◆ limitTextWidth

bool dw::Table::limitTextWidth
private

Definition at line 365 of file table.hh.

Referenced by Table().

◆ numCols

◆ numColWidthPercentage

int dw::Table::numColWidthPercentage
private

Definition at line 397 of file table.hh.

Referenced by actuallyCalcCellSizes(), forceCalcColumnExtremes(), and Table().

◆ numColWidthSpecified

int dw::Table::numColWidthSpecified
private

Definition at line 386 of file table.hh.

Referenced by actuallyCalcCellSizes(), forceCalcColumnExtremes(), and Table().

◆ numRows

◆ redrawX

int dw::Table::redrawX
private

Definition at line 370 of file table.hh.

Referenced by actuallyCalcCellSizes(), resizeDrawImpl(), and Table().

◆ redrawY

int dw::Table::redrawY
private

Definition at line 370 of file table.hh.

Referenced by resizeDrawImpl(), setCumHeight(), and Table().

◆ rowClosed

bool dw::Table::rowClosed
private

Definition at line 365 of file table.hh.

Referenced by addCell(), addRow(), and Table().

◆ rowSpanCells

lout::misc::SimpleVector<int>* dw::Table::rowSpanCells
private

If a Cell has rowspan > 1, it goes into this array.

Definition at line 413 of file table.hh.

Referenced by actuallyCalcCellSizes(), apportionRowSpan(), Table(), and ~Table().

◆ rowStyle

lout::misc::SimpleVector<core::style::Style*>* dw::Table::rowStyle
private

Definition at line 416 of file table.hh.

Referenced by addCell(), addRow(), drawLevel(), reallocChildren(), Table(), and ~Table().


The documentation for this class was generated from the following files: