[prev in list] [next in list] [prev in thread] [next in thread]
List: kfm-devel
Subject: Re: khtml, kbackpage stuff
From: Lars Knoll <Lars.Knoll () mpi-hd ! mpg ! de>
Date: 2000-03-27 18:36:40
[Download RAW message or body]
On Mon, 27 Mar 2000, Frederik Holljen wrote:
> Hi,
>
> I'm having some trouble positioning the cursor in our editor. Positioning
> within the text node seems to work fine, so the problem is getting the correct
> x, y position of the surrounding block.(cursor inside a <p> seems to work, but
> in lists and tables it misses the text completely) So, I have a couple of
> questions (to try and sort this out in my head :)
>
> 1. How does a <P> get rendered. (what sort of rendering object)
Allmost all regular elements (including <p>) get mapped to a RenderFlow in
the rendering tree.
> 2. The x, y position of the texts containingBlock() are they absolute, or
> relative to something else? (another more toplevel containgBlock perhaps)
The x and y positions are always relative to the objects parent, except
for the root object (RenderRoot). This makes it possible to move a subtree
around in the scrollview, without needing a relayout.
If you need the absolute position, there's a method
absolutePosition(int &x, int&y) in RenderObject.
> 3. Any special treatments that have to be done for text inside tables?
No.
> I've included the current code (at least on my computer) in case you wanted to
> look at it. And for those who are interested: the kbackpage code can now be
> found in kdenonbeta (it should even compile :D )
>
> Cheers,
> Frederik
>
>
> void RenderText::cursorPos(int offset, int &_x, int &_y, int &height)
> {
> //FIXME! This is possibly incorrect....
- _x = ( (RenderBox*)containingBlock() )->xPos();
- _y = ( (RenderBox*)containingBlock() )->yPos();
+ absolutePosition(x, y);
... and things should be working ;-)
Lars
>
> TextSlave *s = m_first;
> int off = s->len;
> int y = s->y;
>
> while(offset > off)
> {
> s=s->next();
> off += s->len;
> if( s->y != y ) // ugly hack to fix problem with space removal on line wrap
> {
> y = s->y;
> offset--;
> }
> } // we are now in the correct text slave
>
> int pos = s->len - (off - offset );
> _y += s->y;
> height = s->m_height;
>
> QString tekst(s->m_text, s->len);
> _x += s->x + (fm->boundingRect(tekst, pos)).right();
> if(pos)
> _x += fm->rightBearing( *(s->m_text + pos - 1 ) );
> }
>
>
--
Lars Knoll knoll@mpi-hd.mpg.de
PGP pub key [6DADF3D5]: finger knoll@pluto.mpi-hd.mpg.de
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic