From: Martin Sevior (msevior@mccubbin.ph.unimelb.edu.au)
Date: Sun Apr 21 2002 - 10:55:01 EDT
Hi Folks,
Now is the time to start discussing the next generation layout
code. The idea of course is to rewrite as little as possible of our
current code. AbiWord 1.2 will support tables and footnotes but I thiunk
we should design our next gen code to easily handle other advanced layout
objects like text frames, positioned images and to allow text to flow
around images and other embedded objects.
Here is one suggestion on how to acheive that.
To start with I'll recap how text is layed out on fp_Page.
===================================================================
| |
| Fixed size header |
| |
-------------------------------------------------------------------
| |
| ============================ ============================= |
| | -------Line 1----------- | | ----------Line 1----------| |
| | ------ Line 2 ---------- | | --------- Line 2 ---------| |
| | ----Column 1 --------- | | ------- Column 2 ---------| |
| | -------Line 4----------- | | ----------Line 4----------| |
| | ------ Line 5 ---------- | | --------- Line 5 ---------| |
| | -------Line 6----------- | | ----------Line 6 ---------| |
| | ------ Line 7 ---------- | | --------- Line 7 ---------| |
| ============================ ============================= |
| ============================ ============================= |
| | -------Line 1----------- | | ----------Line 1----------| |
| | ------ Line 2 ---------- | | --------- Line 2 ---------| |
| | ----Column 3 --------- | | ------- Column 4 ---------| |
| | -------Line 4----------- | | ----------Line 4----------| |
| | ------ Line 5 ---------- | | --------- Line 5 ---------| |
| | -------Line 6----------- | | ----------Line 6 ---------| |
| | ------ Line 7 ---------- | | --------- Line 7 ---------| |
| ============================ ============================= |
-------------------------------------------------------------------
| |
| Fixed size Footer |
| |
===================================================================
Images are embedded in lines. If an image is large it expands the height
of a line.
The lines are contained as a vector in the class fp_Column which derives
from the base class fp_Container.
Here is what we like to layout on a page.
===================================================================
| |
| Fixed size header |
| |
-------------------------------------------------------------------
| |
| ============================ ============================= |
| | -------Line 1----------- | | ----------Line 1----------| |
| | ---Column 1 ------------ | | ----------Line 2----------| |
| | ======================= | | ------- Column 2 ---------| |
| | | | | | ----------Line 4----------| |
| | | embedded container | | | --------- Line 5 ---------| |
| | | | | | ----------Line 6 ---------| |
| | ======================| | | --------- Line 7 ---------| |
| ============================ ============================= |
| ============================================================= |
| | | |
| | Fill width column containing a table or frame | |
| | | |
| |===========================================================| |
| ============================ ============================= |
| | -------Line 1----------- | | ----------Line 1----------| |
| | ------ Line 2 ---------- | | --------- Line 2 ---------| |
| | ----Column 3 --------- | | ------- Column 4 ---------| |
| | -------Line 4----------- | | ----------Line 4----------| |
| ||========================|| | --------- Line 5 ---------| |
| || Footnote container || |----------Line 6 --------- | |
| ||========================|| |--------- Line 7 --------- | |
| ============================ ============================= |
-------------------------------------------------------------------
| |
| Fixed size Footer |
| |
===================================================================
OK so under the new scheme we continue to have a fp_Page class whose
job it is to layout out fp_Columns on a page and place headers/footers in
the margins.
Now however fp_Columns can contain containers other than fp_Lines.
fp_Columns can contain lines, other containers or footnote containers.
In order to be able to continue to use a vector of void * pointers as the
content of the column, this means that fp_line should become a subclass of
a general container class. If we have getType() method in this class we
can dynamically determine what sort of container is returned from a
fp_ContainerObject * pCO = (fp_ContainerObject *) m_pLines.getNthItem(i);
assignment.
At present we have the following fp_* class heiracy.
fp_Run --> lots of run subclasses.
fp_Line --> no Line subclasses
fp_Container ----|
|-----> fp_Column
|-----> fp_HdrFtrContainer
|-----> fp_ShadowContainer
|-----> fp_EndNoteContainer
I propose this:
fp_Run --> lots of run subclasses.
fp_ContainerObject----|
|-----> fp_Line
|-----> fp_Container ----|
|---> fp_Column
|->fp_ShadowColumn
|->fp_PositionedColumn
|-----> fp_HdrFtrContainer
|-----> fp_EndNoteContainer
|-----> fp_FootnoteContainer
|-----> fp_TableContainer
|-----> fp_CellContainer
|-----> fp_RowContainer
fp_RowContainer is a container that lays out containers horizonally not
vertically.
fp_TableContainer is a collection of row containers.
The following methods would be available to all container classes:
getContainerType(void)
draw( drawArgs)
clearScreen()
getX(void)
getY(void)
getWidth(void)
getHeight(void)
getXLayoutUnits(void)
getYLayoutUnits(void)
getWidthLayoutUnits(void)
getHeightUnits(void)
getNext(void)
getPrev(void)
getSectionLayout(void)
setX(UT_sint32 )
setY(UT_sint32 )
setWidth(UT_uint32)
setHeight(UT_uint32 )
setXLayoutUnits(UT_uint32 )
setYLayoutUnits(UT_uint32 )
setWidthLayoutUnits(UT_uint32)
setHeightUnits(UT_uint32)
setNext(fp_ContainerObject *)
setPrev(fp_ContainerObject *)
These would all be declared pure abstract in the fp_ContainerObject base
class.
All positions are relative to the container containing them, be it a
column or a page.
Of the containers, only columns get placed ona page. Other container types
are placed in either other containers or in a column.
Thus all containers not columns need:
getColumn(void)
getContainer(void) methods
The getColumn would work by just recursively calling getColumn until a
column was obtained.
The getContainer() would just return the holding container.
fp_Column classes have:
getPage()
getColumnLeader()
getFollower()
methods.
The advantage of this aproach is that it makes it possible to nest
containers inside each other while preserving the distinction of
fp_Columns which get layed out right on a page.
I believe it is straight forward to evolve our current layout classes to
this more general method rather quickly.
Opinions folks? I think that this can be implemented relatively quickly
with little disruption to our current code base.
If people agree to this scheme I will immediately move are current code
base to this new version in the 1.2 tree. It should not take more than
couple of days.
I have other ideas on what is needed in the fl_Layout Classes and the
piecetable classes in order to fill these physical classes but I'll save
them for another email.
Cheers
Martin
This archive was generated by hypermail 2.1.4 : Sun Apr 21 2002 - 10:56:05 EDT