<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US"> <head> <title>khtml: khtml_caret.cpp Source File (khtml)</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="pics-label" content='(pics-1.1 "http://www.icra.org/ratingsv02.html" comment "ICRAonline DE v2.0" l gen true for "http://www.kde.org" r (nz 1 vz 1 lz 1 oz 1 cb 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://www.kde.org" r (n 0 s 0 v 0 l 0))' /> <meta name="trademark" content="KDE e.V." /> <meta name="description" content="K Desktop Environment Homepage, KDE.org" /> <meta name="MSSmartTagsPreventParsing" content="true" /> <meta name="robots" content="all" /> <link rel="shortcut icon" href="../../favicon.ico" /> <link rel="stylesheet" media="screen" type="text/css" title="APIDOX" href="doxygen.css" /> </head> <body> <div id="nav_header_top" align="right"> <a href="#content" class="doNotDisplay" accesskey="2">Skip to main content ::</a> <a href="../.."><img id="nav_header_logo" alt="Home" align="left" src="../../kde_gear_64.png" border="0" /></a> <span class="doNotDisplay">::</span> <div id="nav_header_title" align="left">KDE API Reference</div> </div> <div id="nav_header_bottom" align="right"> <span class="doNotDisplay">:: <a href="#navigation" accesskey="5">Skip to Link Menu</a><br/></span> <div id="nav_header_bottom_right" style="text-align: left;"> / <a href="../..">API Reference</a> / <a href=".">khtml</a> </div> </div> <table id="main" border="0" cellpadding="0" cellspacing="0" width="100%"> <tr> <td valign="top" class="menuheader" height="0"></td> <td id="contentcolumn" valign="top" rowspan="2" > <div id="content" style="padding-top: 0px;"><div style="width:100%; margin: 0px; padding: 0px;"> <a name="content"></a> <!-- Generated by Doxygen 1.5.5 --> <h1>khtml_caret.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* This file is part of the KDE project</span> <a name="l00002"></a>00002 <span class="comment"> *</span> <a name="l00003"></a>00003 <span class="comment"> * Copyright (C) 2003-2004 Leo Savernik <l.savernik@aon.at></span> <a name="l00004"></a>00004 <span class="comment"> *</span> <a name="l00005"></a>00005 <span class="comment"> * This library is free software; you can redistribute it and/or</span> <a name="l00006"></a>00006 <span class="comment"> * modify it under the terms of the GNU Library General Public</span> <a name="l00007"></a>00007 <span class="comment"> * License as published by the Free Software Foundation; either</span> <a name="l00008"></a>00008 <span class="comment"> * version 2 of the License, or (at your option) any later version.</span> <a name="l00009"></a>00009 <span class="comment"> *</span> <a name="l00010"></a>00010 <span class="comment"> * This library is distributed in the hope that it will be useful,</span> <a name="l00011"></a>00011 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span> <a name="l00012"></a>00012 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span> <a name="l00013"></a>00013 <span class="comment"> * Library General Public License for more details.</span> <a name="l00014"></a>00014 <span class="comment"> *</span> <a name="l00015"></a>00015 <span class="comment"> * You should have received a copy of the GNU Library General Public License</span> <a name="l00016"></a>00016 <span class="comment"> * along with this library; see the file COPYING.LIB. If not, write to</span> <a name="l00017"></a>00017 <span class="comment"> * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,</span> <a name="l00018"></a>00018 <span class="comment"> * Boston, MA 02110-1301, USA.</span> <a name="l00019"></a>00019 <span class="comment"> */</span> <a name="l00020"></a>00020 <a name="l00021"></a>00021 <a name="l00022"></a>00022 <span class="preprocessor">#include "khtml_caret_p.h"</span> <a name="l00023"></a>00023 <a name="l00024"></a>00024 <span class="preprocessor">#include "html/html_documentimpl.h"</span> <a name="l00025"></a>00025 <a name="l00026"></a>00026 <span class="keyword">namespace </span>khtml { <a name="l00027"></a>00027 <a name="l00035"></a>00035 <span class="keyword">enum</span> ObjectAdvanceState { <a name="l00036"></a>00036 LeftObject = 0x01, AdvancedToSibling = 0x02, EnteredObject = 0x04 <a name="l00037"></a>00037 }; <a name="l00038"></a>00038 <a name="l00047"></a>00047 <span class="keyword">enum</span> ObjectTraversalState { <a name="l00048"></a>00048 OutsideDescending, InsideDescending, InsideAscending, OutsideAscending <a name="l00049"></a>00049 }; <a name="l00050"></a>00050 <a name="l00060"></a>00060 <span class="keyword">static</span> RenderObject* traverseRenderObjects(RenderObject *obj, <a name="l00061"></a>00061 ObjectTraversalState &trav, <span class="keywordtype">bool</span> toBegin, RenderObject *base, <a name="l00062"></a>00062 <span class="keywordtype">int</span> &state) <a name="l00063"></a>00063 { <a name="l00064"></a>00064 RenderObject *r; <a name="l00065"></a>00065 <span class="keywordflow">switch</span> (trav) { <a name="l00066"></a>00066 <span class="keywordflow">case</span> OutsideDescending: <a name="l00067"></a>00067 trav = InsideDescending; <a name="l00068"></a>00068 <span class="keywordflow">break</span>; <a name="l00069"></a>00069 <span class="keywordflow">case</span> InsideDescending: <a name="l00070"></a>00070 r = toBegin ? obj->lastChild() : obj->firstChild(); <a name="l00071"></a>00071 <span class="keywordflow">if</span> (r) { <a name="l00072"></a>00072 trav = OutsideDescending; <a name="l00073"></a>00073 obj = r; <a name="l00074"></a>00074 state |= EnteredObject; <a name="l00075"></a>00075 } <span class="keywordflow">else</span> { <a name="l00076"></a>00076 trav = InsideAscending; <a name="l00077"></a>00077 } <a name="l00078"></a>00078 <span class="keywordflow">break</span>; <a name="l00079"></a>00079 <span class="keywordflow">case</span> InsideAscending: <a name="l00080"></a>00080 trav = OutsideAscending; <a name="l00081"></a>00081 <span class="keywordflow">break</span>; <a name="l00082"></a>00082 <span class="keywordflow">case</span> OutsideAscending: <a name="l00083"></a>00083 r = toBegin ? obj->previousSibling() : obj->nextSibling(); <a name="l00084"></a>00084 <span class="keywordflow">if</span> (r) { <a name="l00085"></a>00085 trav = OutsideDescending; <a name="l00086"></a>00086 state |= AdvancedToSibling; <a name="l00087"></a>00087 } <span class="keywordflow">else</span> { <a name="l00088"></a>00088 r = obj->parent(); <a name="l00089"></a>00089 <span class="keywordflow">if</span> (r == base) r = 0; <a name="l00090"></a>00090 trav = InsideAscending; <a name="l00091"></a>00091 state |= LeftObject; <a name="l00092"></a>00092 } <a name="l00093"></a>00093 obj = r; <a name="l00094"></a>00094 <span class="keywordflow">break</span>; <a name="l00095"></a>00095 }<span class="comment">/*end switch*/</span> <a name="l00096"></a>00096 <a name="l00097"></a>00097 <span class="keywordflow">return</span> obj; <a name="l00098"></a>00098 } <a name="l00099"></a>00099 <a name="l00105"></a>00105 <span class="keyword">static</span> <span class="keyword">inline</span> RenderObject *renderObjectBelow(RenderObject *obj, ObjectTraversalState &trav, RenderObject *base) <a name="l00106"></a>00106 { <a name="l00107"></a>00107 trav = InsideDescending; <a name="l00108"></a>00108 <span class="keywordtype">int</span> state; <span class="comment">// we don't need the state, so we don't initialize it</span> <a name="l00109"></a>00109 RenderObject *r = obj; <a name="l00110"></a>00110 <span class="keywordflow">while</span> (r && trav != OutsideDescending) { <a name="l00111"></a>00111 r = traverseRenderObjects(r, trav, <span class="keyword">false</span>, base, state); <a name="l00112"></a>00112 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l00113"></a>00113 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"renderObjectBelow: r "</span> << r << <span class="stringliteral">" trav "</span> << trav << <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#g313d520ed8f8f6b46eeef22cfb3b082a">endl</a>; <a name="l00114"></a>00114 <span class="preprocessor">#endif</span> <a name="l00115"></a>00115 <span class="preprocessor"></span> } <a name="l00116"></a>00116 trav = InsideDescending; <a name="l00117"></a>00117 <span class="keywordflow">return</span> r; <a name="l00118"></a>00118 } <a name="l00119"></a>00119 <a name="l00125"></a>00125 <span class="keyword">static</span> <span class="keyword">inline</span> RenderObject *renderObjectAbove(RenderObject *obj, ObjectTraversalState &trav, RenderObject *base) <a name="l00126"></a>00126 { <a name="l00127"></a>00127 trav = OutsideAscending; <a name="l00128"></a>00128 <span class="keywordtype">int</span> state; <span class="comment">// we don't need the state, so we don't initialize it</span> <a name="l00129"></a>00129 RenderObject *r = obj; <a name="l00130"></a>00130 <span class="keywordflow">while</span> (r && trav != InsideAscending) { <a name="l00131"></a>00131 r = traverseRenderObjects(r, trav, <span class="keyword">true</span>, base, state); <a name="l00132"></a>00132 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l00133"></a>00133 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"renderObjectAbove: r "</span> << r << <span class="stringliteral">" trav "</span> << trav << <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#g313d520ed8f8f6b46eeef22cfb3b082a">endl</a>; <a name="l00134"></a>00134 <span class="preprocessor">#endif</span> <a name="l00135"></a>00135 <span class="preprocessor"></span> } <a name="l00136"></a>00136 trav = InsideAscending; <a name="l00137"></a>00137 <span class="keywordflow">return</span> r; <a name="l00138"></a>00138 } <a name="l00139"></a>00139 <a name="l00144"></a>00144 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> isIndicatedInlineBox(InlineBox *box) <a name="l00145"></a>00145 { <a name="l00146"></a>00146 <span class="comment">// text boxes are never indicated.</span> <a name="l00147"></a>00147 <span class="keywordflow">if</span> (box->isInlineTextBox()) <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00148"></a>00148 RenderStyle *s = box->object()->style(); <a name="l00149"></a>00149 <span class="keywordflow">return</span> s->borderLeftWidth() || s->borderRightWidth() <a name="l00150"></a>00150 || s->borderTopWidth() || s->borderBottomWidth() <a name="l00151"></a>00151 || s->paddingLeft().value() || s->paddingRight().value() <a name="l00152"></a>00152 || s->paddingTop().value() || s->paddingBottom().value() <a name="l00153"></a>00153 <span class="comment">// ### Can inline elements have top/bottom margins? Couldn't find</span> <a name="l00154"></a>00154 <span class="comment">// it in the CSS 2 spec, but Mozilla ignores them, so we do, too.</span> <a name="l00155"></a>00155 || s->marginLeft().value() || s->marginRight().value(); <a name="l00156"></a>00156 } <a name="l00157"></a>00157 <a name="l00162"></a>00162 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> isIndicatedFlow(RenderObject *r) <a name="l00163"></a>00163 { <a name="l00164"></a>00164 RenderStyle *s = r->style(); <a name="l00165"></a>00165 <span class="keywordflow">return</span> s->borderLeftStyle() != BNONE || s->borderRightStyle() != BNONE <a name="l00166"></a>00166 || s->borderTopStyle() != BNONE || s->borderBottomStyle() != BNONE <a name="l00167"></a>00167 <span class="comment">// || s->paddingLeft().value() || s->paddingRight().value()</span> <a name="l00168"></a>00168 <span class="comment">// || s->paddingTop().value() || s->paddingBottom().value()</span> <a name="l00169"></a>00169 <span class="comment">// || s->marginLeft().value() || s->marginRight().value()</span> <a name="l00170"></a>00170 || s->hasClip() || s->hidesOverflow() <a name="l00171"></a>00171 || s->backgroundColor().isValid() || s->backgroundImage(); <a name="l00172"></a>00172 } <a name="l00173"></a>00173 <a name="l00187"></a>00187 <span class="keyword">static</span> RenderObject *advanceObject(RenderObject *r, <a name="l00188"></a>00188 ObjectTraversalState &trav, <span class="keywordtype">bool</span> toBegin, <a name="l00189"></a>00189 RenderObject *base, <span class="keywordtype">int</span> &state) <a name="l00190"></a>00190 { <a name="l00191"></a>00191 <a name="l00192"></a>00192 ObjectTraversalState origtrav = trav; <a name="l00193"></a>00193 RenderObject *a = traverseRenderObjects(r, trav, toBegin, base, state); <a name="l00194"></a>00194 <a name="l00195"></a>00195 <span class="keywordtype">bool</span> ignoreOutsideDesc = toBegin && origtrav == OutsideAscending; <a name="l00196"></a>00196 <a name="l00197"></a>00197 <span class="comment">// render object and traversal state at which look ahead has been started</span> <a name="l00198"></a>00198 RenderObject *la = 0; <a name="l00199"></a>00199 ObjectTraversalState latrav = trav; <a name="l00200"></a>00200 ObjectTraversalState lasttrav = origtrav; <a name="l00201"></a>00201 <a name="l00202"></a>00202 <span class="keywordflow">while</span> (a) { <a name="l00203"></a>00203 <span class="preprocessor">#if DEBUG_CARETMODE > 5</span> <a name="l00204"></a>00204 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"a "</span> << a << <span class="stringliteral">" trav "</span> << trav << <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#g313d520ed8f8f6b46eeef22cfb3b082a">endl</a>; <a name="l00205"></a>00205 <span class="preprocessor">#endif</span> <a name="l00206"></a>00206 <span class="preprocessor"></span> <span class="keywordflow">if</span> (a->element()) { <a name="l00207"></a>00207 <span class="preprocessor">#if DEBUG_CARETMODE > 4</span> <a name="l00208"></a>00208 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"a "</span> << a << <span class="stringliteral">" trav "</span> << trav << <span class="stringliteral">" origtrav "</span> << origtrav << <span class="stringliteral">" ignoreOD "</span> << ignoreOutsideDesc << endl; <a name="l00209"></a>00209 <span class="preprocessor">#endif</span> <a name="l00210"></a>00210 <span class="preprocessor"></span> <span class="keywordflow">if</span> (toBegin) { <a name="l00211"></a>00211 <a name="l00212"></a>00212 <span class="keywordflow">switch</span> (origtrav) { <a name="l00213"></a>00213 <span class="keywordflow">case</span> OutsideDescending: <a name="l00214"></a>00214 <span class="keywordflow">if</span> (trav == InsideAscending) <span class="keywordflow">return</span> a; <a name="l00215"></a>00215 <span class="keywordflow">if</span> (trav == OutsideDescending) <span class="keywordflow">return</span> a; <a name="l00216"></a>00216 <span class="keywordflow">break</span>; <a name="l00217"></a>00217 <span class="keywordflow">case</span> InsideDescending: <a name="l00218"></a>00218 <span class="keywordflow">if</span> (trav == OutsideDescending) <span class="keywordflow">return</span> a; <a name="l00219"></a>00219 <span class="comment">// fall through</span> <a name="l00220"></a>00220 <span class="keywordflow">case</span> InsideAscending: <a name="l00221"></a>00221 <span class="keywordflow">if</span> (trav == OutsideAscending) <span class="keywordflow">return</span> a; <a name="l00222"></a>00222 <span class="keywordflow">break</span>; <a name="l00223"></a>00223 <span class="keywordflow">case</span> OutsideAscending: <a name="l00224"></a>00224 <span class="keywordflow">if</span> (trav == OutsideAscending) <span class="keywordflow">return</span> a; <a name="l00225"></a>00225 <span class="keywordflow">if</span> (trav == InsideAscending && lasttrav == InsideDescending) <span class="keywordflow">return</span> a; <a name="l00226"></a>00226 <span class="keywordflow">if</span> (trav == OutsideDescending && !ignoreOutsideDesc) <span class="keywordflow">return</span> a; <a name="l00227"></a>00227 <span class="comment">// ignore this outside descending position, as it effectively</span> <a name="l00228"></a>00228 <span class="comment">// demarkates the same position, but remember it in case we fall off</span> <a name="l00229"></a>00229 <span class="comment">// the document.</span> <a name="l00230"></a>00230 la = a; latrav = trav; <a name="l00231"></a>00231 ignoreOutsideDesc = <span class="keyword">false</span>; <a name="l00232"></a>00232 <span class="keywordflow">break</span>; <a name="l00233"></a>00233 }<span class="comment">/*end switch*/</span> <a name="l00234"></a>00234 <a name="l00235"></a>00235 } <span class="keywordflow">else</span> { <a name="l00236"></a>00236 <a name="l00237"></a>00237 <span class="keywordflow">switch</span> (origtrav) { <a name="l00238"></a>00238 <span class="keywordflow">case</span> OutsideDescending: <a name="l00239"></a>00239 <span class="keywordflow">if</span> (trav == InsideAscending) <span class="keywordflow">return</span> a; <a name="l00240"></a>00240 <span class="keywordflow">if</span> (trav == OutsideDescending) <span class="keywordflow">return</span> a; <a name="l00241"></a>00241 <span class="keywordflow">break</span>; <a name="l00242"></a>00242 <span class="keywordflow">case</span> InsideDescending: <a name="l00243"></a>00243 <span class="comment">// if (trav == OutsideDescending) return a;</span> <a name="l00244"></a>00244 <span class="comment">// fall through</span> <a name="l00245"></a>00245 <span class="keywordflow">case</span> InsideAscending: <a name="l00246"></a>00246 <span class="comment">// if (trav == OutsideAscending) return a;</span> <a name="l00247"></a>00247 <span class="comment">// break;</span> <a name="l00248"></a>00248 <span class="keywordflow">case</span> OutsideAscending: <a name="l00249"></a>00249 <span class="comment">// ### what if origtrav == OA, and immediately afterwards trav</span> <a name="l00250"></a>00250 <span class="comment">// becomes OD? In this case the effective position hasn't changed -></span> <a name="l00251"></a>00251 <span class="comment">// the caret gets stuck. Otherwise, it apparently cannot happen in</span> <a name="l00252"></a>00252 <span class="comment">// real usage patterns.</span> <a name="l00253"></a>00253 <span class="keywordflow">if</span> (trav == OutsideDescending) <span class="keywordflow">return</span> a; <a name="l00254"></a>00254 <span class="keywordflow">if</span> (trav == OutsideAscending) { <a name="l00255"></a>00255 <span class="keywordflow">if</span> (la) <span class="keywordflow">return</span> la; <a name="l00256"></a>00256 <span class="comment">// starting lookahead here. Remember old object in case we fall off</span> <a name="l00257"></a>00257 <span class="comment">// the document.</span> <a name="l00258"></a>00258 la = a; latrav = trav; <a name="l00259"></a>00259 } <a name="l00260"></a>00260 <span class="keywordflow">break</span>; <a name="l00261"></a>00261 }<span class="comment">/*end switch*/</span> <a name="l00262"></a>00262 <a name="l00263"></a>00263 }<span class="comment">/*end if*/</span> <a name="l00264"></a>00264 }<span class="comment">/*end if*/</span> <a name="l00265"></a>00265 <a name="l00266"></a>00266 lasttrav = trav; <a name="l00267"></a>00267 a = traverseRenderObjects(a, trav, toBegin, base, state); <a name="l00268"></a>00268 }<span class="comment">/*wend*/</span> <a name="l00269"></a>00269 <a name="l00270"></a>00270 <span class="keywordflow">if</span> (la) trav = latrav, a = la; <a name="l00271"></a>00271 <span class="keywordflow">return</span> a; <a name="l00272"></a>00272 <a name="l00273"></a>00273 } <a name="l00274"></a>00274 <a name="l00283"></a>00283 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> isUnsuitable(RenderObject *r, ObjectTraversalState trav) <a name="l00284"></a>00284 { <a name="l00285"></a>00285 <span class="keywordflow">if</span> (!r) <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00286"></a>00286 <span class="keywordflow">return</span> r->isTableCol() || r->isTableSection() || r->isTableRow() <a name="l00287"></a>00287 || (r->isText() && <span class="keyword">static_cast<</span>RenderText *<span class="keyword">></span>(r)->inlineTextBoxCount() == 0); <a name="l00288"></a>00288 ; <a name="l00289"></a>00289 Q_UNUSED(trav); <a name="l00290"></a>00290 } <a name="l00291"></a>00291 <a name="l00305"></a>00305 <span class="keyword">static</span> <span class="keyword">inline</span> RenderObject *advanceSuitableObject(RenderObject *r, <a name="l00306"></a>00306 ObjectTraversalState &trav, <span class="keywordtype">bool</span> toBegin, <a name="l00307"></a>00307 RenderObject *base, <span class="keywordtype">int</span> &state) <a name="l00308"></a>00308 { <a name="l00309"></a>00309 <span class="keywordflow">do</span> { <a name="l00310"></a>00310 r = advanceObject(r, trav, toBegin, base, state); <a name="l00311"></a>00311 <span class="preprocessor">#if DEBUG_CARETMODE > 2</span> <a name="l00312"></a>00312 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"after advanceSWP: r "</span> << r << <span class="stringliteral">" trav "</span> << trav << <span class="stringliteral">" toBegin "</span> << toBegin << endl; <a name="l00313"></a>00313 <span class="preprocessor">#endif</span> <a name="l00314"></a>00314 <span class="preprocessor"></span> } <span class="keywordflow">while</span> (isUnsuitable(r, trav)); <a name="l00315"></a>00315 <span class="keywordflow">return</span> r; <a name="l00316"></a>00316 } <a name="l00317"></a>00317 <a name="l00327"></a>00327 <span class="keyword">static</span> NodeImpl *nextLeafNode(NodeImpl *r, NodeImpl *baseElem) <a name="l00328"></a>00328 { <a name="l00329"></a>00329 NodeImpl *n = r->firstChild(); <a name="l00330"></a>00330 <span class="keywordflow">if</span> (n) { <a name="l00331"></a>00331 <span class="keywordflow">while</span> (n) { r = n; n = n->firstChild(); } <a name="l00332"></a>00332 <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>NodeImpl *<span class="keyword">></span>(r); <a name="l00333"></a>00333 }<span class="comment">/*end if*/</span> <a name="l00334"></a>00334 n = r->nextSibling(); <a name="l00335"></a>00335 <span class="keywordflow">if</span> (n) { <a name="l00336"></a>00336 r = n; <a name="l00337"></a>00337 <span class="keywordflow">while</span> (n) { r = n; n = n->firstChild(); } <a name="l00338"></a>00338 <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>NodeImpl *<span class="keyword">></span>(r); <a name="l00339"></a>00339 }<span class="comment">/*end if*/</span> <a name="l00340"></a>00340 <a name="l00341"></a>00341 n = r->parentNode(); <a name="l00342"></a>00342 <span class="keywordflow">if</span> (n == baseElem) n = 0; <a name="l00343"></a>00343 <span class="keywordflow">while</span> (n) { <a name="l00344"></a>00344 r = n; <a name="l00345"></a>00345 n = r->nextSibling(); <a name="l00346"></a>00346 <span class="keywordflow">if</span> (n) { <a name="l00347"></a>00347 r = n; <a name="l00348"></a>00348 n = r->firstChild(); <a name="l00349"></a>00349 <span class="keywordflow">while</span> (n) { r = n; n = n->firstChild(); } <a name="l00350"></a>00350 <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>NodeImpl *<span class="keyword">></span>(r); <a name="l00351"></a>00351 }<span class="comment">/*end if*/</span> <a name="l00352"></a>00352 n = r->parentNode(); <a name="l00353"></a>00353 <span class="keywordflow">if</span> (n == baseElem) n = 0; <a name="l00354"></a>00354 }<span class="comment">/*wend*/</span> <a name="l00355"></a>00355 <span class="keywordflow">return</span> 0; <a name="l00356"></a>00356 } <a name="l00357"></a>00357 <a name="l00358"></a>00358 <span class="preprocessor">#if 0 // currently not used</span> <a name="l00359"></a>00359 <span class="preprocessor"></span> <a name="l00368"></a>00368 <span class="keyword">static</span> NodeImpl *prevLeafNode(NodeImpl *r, NodeImpl *baseElem) <a name="l00369"></a>00369 { <a name="l00370"></a>00370 NodeImpl *n = r->firstChild(); <a name="l00371"></a>00371 <span class="keywordflow">if</span> (n) { <a name="l00372"></a>00372 <span class="keywordflow">while</span> (n) { r = n; n = n->firstChild(); } <a name="l00373"></a>00373 <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>NodeImpl *<span class="keyword">></span>(r); <a name="l00374"></a>00374 }<span class="comment">/*end if*/</span> <a name="l00375"></a>00375 n = r->previousSibling(); <a name="l00376"></a>00376 <span class="keywordflow">if</span> (n) { <a name="l00377"></a>00377 r = n; <a name="l00378"></a>00378 <span class="keywordflow">while</span> (n) { r = n; n = n->firstChild(); } <a name="l00379"></a>00379 <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>NodeImpl *<span class="keyword">></span>(r); <a name="l00380"></a>00380 }<span class="comment">/*end if*/</span> <a name="l00381"></a>00381 <a name="l00382"></a>00382 n = r->parentNode(); <a name="l00383"></a>00383 <span class="keywordflow">if</span> (n == baseElem) n = 0; <a name="l00384"></a>00384 <span class="keywordflow">while</span> (n) { <a name="l00385"></a>00385 r = n; <a name="l00386"></a>00386 n = r->previousSibling(); <a name="l00387"></a>00387 <span class="keywordflow">if</span> (n) { <a name="l00388"></a>00388 r = n; <a name="l00389"></a>00389 n = r->lastChild(); <a name="l00390"></a>00390 <span class="keywordflow">while</span> (n) { r = n; n = n->lastChild(); } <a name="l00391"></a>00391 <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>NodeImpl *<span class="keyword">></span>(r); <a name="l00392"></a>00392 }<span class="comment">/*end if*/</span> <a name="l00393"></a>00393 n = r->parentNode(); <a name="l00394"></a>00394 <span class="keywordflow">if</span> (n == baseElem) n = 0; <a name="l00395"></a>00395 }<span class="comment">/*wend*/</span> <a name="l00396"></a>00396 <span class="keywordflow">return</span> 0; <a name="l00397"></a>00397 } <a name="l00398"></a>00398 <span class="preprocessor">#endif</span> <a name="l00399"></a>00399 <span class="preprocessor"></span> <a name="l00411"></a>00411 <span class="keywordtype">void</span> <span class="comment">/*KDE_NO_EXPORT*/</span> mapDOMPosToRenderPos(NodeImpl *node, <span class="keywordtype">long</span> offset, <a name="l00412"></a>00412 RenderObject *&r, <span class="keywordtype">long</span> &r_ofs, <span class="keywordtype">bool</span> &outside, <span class="keywordtype">bool</span> &outsideEnd) <a name="l00413"></a>00413 { <a name="l00414"></a>00414 <span class="keywordflow">if</span> (node->nodeType() == Node::TEXT_NODE) { <a name="l00415"></a>00415 outside = <span class="keyword">false</span>; <a name="l00416"></a>00416 outsideEnd = <span class="keyword">false</span>; <a name="l00417"></a>00417 r = node->renderer(); <a name="l00418"></a>00418 r_ofs = offset; <a name="l00419"></a>00419 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (node->nodeType() == Node::ELEMENT_NODE || node->nodeType() == Node::DOCUMENT_NODE) { <a name="l00420"></a>00420 <a name="l00421"></a>00421 <span class="comment">// Though offset points between two children, attach it to the visually</span> <a name="l00422"></a>00422 <span class="comment">// most suitable one (and only there, because the mapping must stay bijective)</span> <a name="l00423"></a>00423 <span class="keywordflow">if</span> (node->firstChild()) { <a name="l00424"></a>00424 outside = <span class="keyword">true</span>; <a name="l00425"></a>00425 NodeImpl *child = offset <= 0 ? node->firstChild() <a name="l00426"></a>00426 <span class="comment">// childNode is expensive</span> <a name="l00427"></a>00427 : node->childNode((<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)offset); <a name="l00428"></a>00428 <span class="comment">// index was child count or out of bounds</span> <a name="l00429"></a>00429 <span class="keywordtype">bool</span> atEnd = !child; <a name="l00430"></a>00430 <span class="preprocessor">#if DEBUG_CARETMODE > 5</span> <a name="l00431"></a>00431 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"mapDTR: child "</span> << child << <span class="stringliteral">"@"</span> << (child ? child->nodeName().string() : QString::null) << <span class="stringliteral">" atEnd "</span> << atEnd << endl; <a name="l00432"></a>00432 <span class="preprocessor">#endif</span> <a name="l00433"></a>00433 <span class="preprocessor"></span> <span class="keywordflow">if</span> (atEnd) child = node->lastChild(); <a name="l00434"></a>00434 <a name="l00435"></a>00435 r = child->renderer(); <a name="l00436"></a>00436 r_ofs = 0; <a name="l00437"></a>00437 outsideEnd = atEnd; <a name="l00438"></a>00438 <a name="l00439"></a>00439 <span class="comment">// Outside text nodes most likely stem from a continuation. Seek</span> <a name="l00440"></a>00440 <span class="comment">// the enclosing continued render object and use this one instead.</span> <a name="l00441"></a>00441 <span class="keywordflow">if</span> (r && child->nodeType() == Node::TEXT_NODE) { <a name="l00442"></a>00442 r = r->parent(); <a name="l00443"></a>00443 RenderObject *o = node->renderer(); <a name="l00444"></a>00444 <span class="keywordflow">while</span> (o->continuation() && o->continuation() != r) <a name="l00445"></a>00445 o = o->continuation(); <a name="l00446"></a>00446 <span class="keywordflow">if</span> (!r || o->continuation() != r) { <a name="l00447"></a>00447 r = child->renderer(); <a name="l00448"></a>00448 } <a name="l00449"></a>00449 }<span class="comment">/*end if*/</span> <a name="l00450"></a>00450 <a name="l00451"></a>00451 <span class="comment">// BRs cause troubles. Returns the previous render object instead,</span> <a name="l00452"></a>00452 <span class="comment">// giving it the attributes outside, outside end.</span> <a name="l00453"></a>00453 <span class="keywordflow">if</span> (r && r->isBR()) { <a name="l00454"></a>00454 r = r->objectAbove(); <a name="l00455"></a>00455 outsideEnd = <span class="keyword">true</span>; <a name="l00456"></a>00456 }<span class="comment">/*end if*/</span> <a name="l00457"></a>00457 <a name="l00458"></a>00458 } <span class="keywordflow">else</span> { <a name="l00459"></a>00459 <span class="comment">// Element has no children, treat offset to be inside the node.</span> <a name="l00460"></a>00460 outside = <span class="keyword">false</span>; <a name="l00461"></a>00461 outsideEnd = <span class="keyword">false</span>; <a name="l00462"></a>00462 r = node->renderer(); <a name="l00463"></a>00463 r_ofs = 0; <span class="comment">// only offset 0 possible</span> <a name="l00464"></a>00464 } <a name="l00465"></a>00465 <a name="l00466"></a>00466 } <span class="keywordflow">else</span> { <a name="l00467"></a>00467 r = 0; <a name="l00468"></a>00468 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#g9acd682001598171edf8ecb104fdad2b">kdWarning</a>() << <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#g634e2de2b699b31ea3a79f984e836d64">k_funcinfo</a> << <span class="stringliteral">"Mapping from nodes of type "</span> << node->nodeType() <a name="l00469"></a>00469 << <span class="stringliteral">" not supported!"</span> << endl; <a name="l00470"></a>00470 } <a name="l00471"></a>00471 } <a name="l00472"></a>00472 <a name="l00483"></a>00483 <span class="keywordtype">void</span> <span class="comment">/*KDE_NO_EXPORT*/</span> mapRenderPosToDOMPos(RenderObject *r, <span class="keywordtype">long</span> r_ofs, <a name="l00484"></a>00484 <span class="keywordtype">bool</span> outside, <span class="keywordtype">bool</span> outsideEnd, NodeImpl *&node, <span class="keywordtype">long</span> &offset) <a name="l00485"></a>00485 { <a name="l00486"></a>00486 node = r->element(); <a name="l00487"></a>00487 Q_ASSERT(node); <a name="l00488"></a>00488 <span class="preprocessor">#if DEBUG_CARETMODE > 5</span> <a name="l00489"></a>00489 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"mapRTD: r "</span> << r << <span class="stringliteral">"@"</span> << (r ? r->renderName() : QString::null) << (r && r->element() ? <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html">QString</a>(<span class="stringliteral">".node "</span>) + <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html#number">QString::number</a>((<span class="keywordtype">unsigned</span>)r->element(),16) + <span class="stringliteral">"@"</span> + r->element()->nodeName().string() : QString::null) << <span class="stringliteral">" outside "</span> << outside << <span class="stringliteral">" outsideEnd "</span> << outsideEnd << endl; <a name="l00490"></a>00490 <span class="preprocessor">#endif</span> <a name="l00491"></a>00491 <span class="preprocessor"></span> <span class="keywordflow">if</span> (node->nodeType() == Node::ELEMENT_NODE || node->nodeType() == Node::TEXT_NODE) { <a name="l00492"></a>00492 <a name="l00493"></a>00493 <span class="keywordflow">if</span> (outside) { <a name="l00494"></a>00494 NodeImpl *parent = node->parent(); <a name="l00495"></a>00495 <a name="l00496"></a>00496 <span class="comment">// If this is part of a continuation, use the actual node as the parent,</span> <a name="l00497"></a>00497 <span class="comment">// and the first render child as the node.</span> <a name="l00498"></a>00498 <span class="keywordflow">if</span> (r != node->renderer()) { <a name="l00499"></a>00499 RenderObject *o = node->renderer(); <a name="l00500"></a>00500 <span class="keywordflow">while</span> (o->continuation() && o->continuation() != r) <a name="l00501"></a>00501 o = o->continuation(); <a name="l00502"></a>00502 <span class="keywordflow">if</span> (o->continuation() == r) { <a name="l00503"></a>00503 parent = node; <a name="l00504"></a>00504 <span class="comment">// ### What if the first render child does not map to a child of</span> <a name="l00505"></a>00505 <span class="comment">// the continued node?</span> <a name="l00506"></a>00506 node = r->firstChild() ? r->firstChild()->element() : node; <a name="l00507"></a>00507 } <a name="l00508"></a>00508 }<span class="comment">/*end if*/</span> <a name="l00509"></a>00509 <a name="l00510"></a>00510 <span class="keywordflow">if</span> (!parent) <span class="keywordflow">goto</span> inside; <a name="l00511"></a>00511 <a name="l00512"></a>00512 offset = (long)node->nodeIndex() + outsideEnd; <a name="l00513"></a>00513 node = parent; <a name="l00514"></a>00514 <span class="preprocessor">#if DEBUG_CARETMODE > 5</span> <a name="l00515"></a>00515 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << node << <span class="stringliteral">"@"</span> << (node ? node->nodeName().string() : QString::null) << <span class="stringliteral">" offset "</span> << offset << endl; <a name="l00516"></a>00516 <span class="preprocessor">#endif</span> <a name="l00517"></a>00517 <span class="preprocessor"></span> } <span class="keywordflow">else</span> { <span class="comment">// !outside</span> <a name="l00518"></a>00518 inside: <a name="l00519"></a>00519 offset = r_ofs; <a name="l00520"></a>00520 } <a name="l00521"></a>00521 <a name="l00522"></a>00522 } <span class="keywordflow">else</span> { <a name="l00523"></a>00523 offset = 0; <a name="l00524"></a>00524 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#g9acd682001598171edf8ecb104fdad2b">kdWarning</a>() << <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#g634e2de2b699b31ea3a79f984e836d64">k_funcinfo</a> << <span class="stringliteral">"Mapping to nodes of type "</span> << node->nodeType() <a name="l00525"></a>00525 << <span class="stringliteral">" not supported!"</span> << endl; <a name="l00526"></a>00526 } <a name="l00527"></a>00527 } <a name="l00528"></a>00528 <a name="l00530"></a>00530 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> ensureLeafNode(NodeImpl *&node, NodeImpl *base) <a name="l00531"></a>00531 { <a name="l00532"></a>00532 <span class="keywordflow">if</span> (node && node->hasChildNodes()) node = nextLeafNode(node, base); <a name="l00533"></a>00533 } <a name="l00534"></a>00534 <a name="l00541"></a>00541 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> mapRenderPosToTraversalState(<span class="keywordtype">bool</span> outside, <span class="keywordtype">bool</span> atEnd, <a name="l00542"></a>00542 <span class="keywordtype">bool</span> toBegin, ObjectTraversalState &trav) <a name="l00543"></a>00543 { <a name="l00544"></a>00544 <span class="keywordflow">if</span> (!outside) atEnd = !toBegin; <a name="l00545"></a>00545 <span class="keywordflow">if</span> (!atEnd ^ toBegin) <a name="l00546"></a>00546 trav = outside ? OutsideDescending : InsideDescending; <a name="l00547"></a>00547 <span class="keywordflow">else</span> <a name="l00548"></a>00548 trav = outside ? OutsideAscending : InsideAscending; <a name="l00549"></a>00549 } <a name="l00550"></a>00550 <a name="l00557"></a>00557 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> mapTraversalStateToRenderPos(ObjectTraversalState trav, <a name="l00558"></a>00558 <span class="keywordtype">bool</span> toBegin, <span class="keywordtype">bool</span> &outside, <span class="keywordtype">bool</span> &atEnd) <a name="l00559"></a>00559 { <a name="l00560"></a>00560 outside = <span class="keyword">false</span>; <a name="l00561"></a>00561 <span class="keywordflow">switch</span> (trav) { <a name="l00562"></a>00562 <span class="keywordflow">case</span> OutsideDescending: outside = <span class="keyword">true</span>; <span class="comment">// fall through</span> <a name="l00563"></a>00563 <span class="keywordflow">case</span> InsideDescending: atEnd = toBegin; <span class="keywordflow">break</span>; <a name="l00564"></a>00564 <span class="keywordflow">case</span> OutsideAscending: outside = <span class="keyword">true</span>; <span class="comment">// fall through</span> <a name="l00565"></a>00565 <span class="keywordflow">case</span> InsideAscending: atEnd = !toBegin; <span class="keywordflow">break</span>; <a name="l00566"></a>00566 } <a name="l00567"></a>00567 } <a name="l00568"></a>00568 <a name="l00584"></a>00584 <span class="keyword">static</span> RenderObject* findRenderer(NodeImpl *&node, <span class="keywordtype">long</span> offset, <a name="l00585"></a>00585 RenderObject *base, <span class="keywordtype">long</span> &r_ofs, <a name="l00586"></a>00586 <span class="keywordtype">bool</span> &outside, <span class="keywordtype">bool</span> &outsideEnd) <a name="l00587"></a>00587 { <a name="l00588"></a>00588 <span class="keywordflow">if</span> (!node) <span class="keywordflow">return</span> 0; <a name="l00589"></a>00589 RenderObject *r; <a name="l00590"></a>00590 mapDOMPosToRenderPos(node, offset, r, r_ofs, outside, outsideEnd); <a name="l00591"></a>00591 <span class="preprocessor">#if DEBUG_CARETMODE > 2</span> <a name="l00592"></a>00592 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"findRenderer: node "</span> << node << <span class="stringliteral">" "</span> << (node ? node->nodeName().string() : QString::null) << <span class="stringliteral">" offset "</span> << offset << <span class="stringliteral">" r "</span> << r << <span class="stringliteral">"["</span> << (r ? r->renderName() : QString::null) << <span class="stringliteral">"] r_ofs "</span> << r_ofs << <span class="stringliteral">" outside "</span> << outside << <span class="stringliteral">" outsideEnd "</span> << outsideEnd << endl; <a name="l00593"></a>00593 <span class="preprocessor">#endif</span> <a name="l00594"></a>00594 <span class="preprocessor"></span> <span class="keywordflow">if</span> (r) <span class="keywordflow">return</span> r; <a name="l00595"></a>00595 NodeImpl *baseElem = base ? base->element() : 0; <a name="l00596"></a>00596 <span class="keywordflow">while</span> (!r) { <a name="l00597"></a>00597 node = nextLeafNode(node, baseElem); <a name="l00598"></a>00598 <span class="keywordflow">if</span> (!node) <span class="keywordflow">break</span>; <a name="l00599"></a>00599 r = node->renderer(); <a name="l00600"></a>00600 <span class="keywordflow">if</span> (r) r_ofs = offset; <a name="l00601"></a>00601 } <a name="l00602"></a>00602 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l00603"></a>00603 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"1r "</span> << r << endl; <a name="l00604"></a>00604 <span class="preprocessor">#endif</span> <a name="l00605"></a>00605 <span class="preprocessor"></span> ObjectTraversalState trav; <a name="l00606"></a>00606 <span class="keywordtype">int</span> state; <span class="comment">// not used</span> <a name="l00607"></a>00607 mapRenderPosToTraversalState(outside, outsideEnd, <span class="keyword">false</span>, trav); <a name="l00608"></a>00608 <span class="keywordflow">if</span> (r && isUnsuitable(r, trav)) { <a name="l00609"></a>00609 r = advanceSuitableObject(r, trav, <span class="keyword">false</span>, base, state); <a name="l00610"></a>00610 mapTraversalStateToRenderPos(trav, <span class="keyword">false</span>, outside, outsideEnd); <a name="l00611"></a>00611 <span class="keywordflow">if</span> (r) r_ofs = r->minOffset(); <a name="l00612"></a>00612 } <a name="l00613"></a>00613 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l00614"></a>00614 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"2r "</span> << r << endl; <a name="l00615"></a>00615 <span class="preprocessor">#endif</span> <a name="l00616"></a>00616 <span class="preprocessor"></span> <span class="keywordflow">return</span> r; <a name="l00617"></a>00617 } <a name="l00618"></a>00618 <a name="l00622"></a>00622 <span class="keyword">static</span> ElementImpl *determineBaseElement(NodeImpl *caretNode) <a name="l00623"></a>00623 { <a name="l00624"></a>00624 <span class="comment">// ### for now, only body is delivered for html documents,</span> <a name="l00625"></a>00625 <span class="comment">// and 0 for xml documents.</span> <a name="l00626"></a>00626 <a name="l00627"></a>00627 DocumentImpl *doc = caretNode->getDocument(); <a name="l00628"></a>00628 <span class="keywordflow">if</span> (!doc) <span class="keywordflow">return</span> 0; <span class="comment">// should not happen, but who knows.</span> <a name="l00629"></a>00629 <a name="l00630"></a>00630 <span class="keywordflow">if</span> (doc->isHTMLDocument()) <a name="l00631"></a>00631 <span class="keywordflow">return</span> static_cast<HTMLDocumentImpl *>(doc)->body(); <a name="l00632"></a>00632 <a name="l00633"></a>00633 <span class="keywordflow">return</span> 0; <a name="l00634"></a>00634 } <a name="l00635"></a>00635 <a name="l00636"></a>00636 <span class="comment">// == class CaretBox implementation</span> <a name="l00637"></a>00637 <a name="l00638"></a>00638 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l00639"></a>00639 <span class="preprocessor"></span><span class="keywordtype">void</span> CaretBox::dump(<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qtextstream.html">QTextStream</a> &ts, <span class="keyword">const</span> <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html">QString</a> &ind)<span class="keyword"> const</span> <a name="l00640"></a>00640 <span class="keyword"></span>{ <a name="l00641"></a>00641 ts << ind << <span class="stringliteral">"b@"</span> << _box; <a name="l00642"></a>00642 <a name="l00643"></a>00643 <span class="keywordflow">if</span> (_box) { <a name="l00644"></a>00644 ts << <span class="stringliteral">"<"</span> << _box->object() << <span class="stringliteral">":"</span> << _box->object()->renderName() << <span class="stringliteral">">"</span>; <a name="l00645"></a>00645 }<span class="comment">/*end if*/</span> <a name="l00646"></a>00646 <a name="l00647"></a>00647 ts << <span class="stringliteral">" "</span> << _x << <span class="stringliteral">"+"</span> << _y << <span class="stringliteral">"+"</span> << _w << <span class="stringliteral">"*"</span> << _h; <a name="l00648"></a>00648 <a name="l00649"></a>00649 ts << <span class="stringliteral">" cb@"</span> << cb; <a name="l00650"></a>00650 <span class="keywordflow">if</span> (cb) ts << <span class="stringliteral">":"</span> << cb->renderName(); <a name="l00651"></a>00651 <a name="l00652"></a>00652 ts << <span class="stringliteral">" "</span> << (_outside ? (outside_end ? <span class="stringliteral">"oe"</span> : <span class="stringliteral">"o-"</span>) : <span class="stringliteral">"i-"</span>); <a name="l00653"></a>00653 <span class="comment">// ts << endl;</span> <a name="l00654"></a>00654 } <a name="l00655"></a>00655 <span class="preprocessor">#endif</span> <a name="l00656"></a>00656 <span class="preprocessor"></span> <a name="l00657"></a>00657 <span class="comment">// == class CaretBoxLine implementation</span> <a name="l00658"></a>00658 <a name="l00659"></a>00659 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l00660"></a>00660 <span class="preprocessor"></span><span class="preprocessor"># define DEBUG_ACIB 1</span> <a name="l00661"></a>00661 <span class="preprocessor"></span><span class="preprocessor">#else</span> <a name="l00662"></a>00662 <span class="preprocessor"></span><span class="preprocessor"># define DEBUG_ACIB DEBUG_CARETMODE</span> <a name="l00663"></a>00663 <span class="preprocessor"></span><span class="preprocessor">#endif</span> <a name="l00664"></a>00664 <span class="preprocessor"></span><span class="keywordtype">void</span> CaretBoxLine::addConvertedInlineBox(InlineBox *box, SeekBoxParams &sbp) <span class="comment">/*KDE_NO_EXPORT*/</span> <a name="l00665"></a>00665 { <a name="l00666"></a>00666 <span class="comment">// Generate only one outside caret box between two elements. If</span> <a name="l00667"></a>00667 <span class="comment">// coalesceOutsideBoxes is true, generating left outside boxes is inhibited.</span> <a name="l00668"></a>00668 <span class="keywordtype">bool</span> coalesceOutsideBoxes = <span class="keyword">false</span>; <a name="l00669"></a>00669 CaretBoxIterator lastCoalescedBox; <a name="l00670"></a>00670 <span class="keywordflow">for</span> (; box; box = box->nextOnLine()) { <a name="l00671"></a>00671 <span class="preprocessor">#if DEBUG_ACIB</span> <a name="l00672"></a>00672 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"box "</span> << box << endl; <a name="l00673"></a>00673 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"box->object "</span> << box->object() << endl; <a name="l00674"></a>00674 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"x "</span> << box->m_x << <span class="stringliteral">" y "</span> << box->m_y << <span class="stringliteral">" w "</span> << box->m_width << <span class="stringliteral">" h "</span> << box->m_height << <span class="stringliteral">" baseline "</span> << box->m_baseline << <span class="stringliteral">" ifb "</span> << box->isInlineFlowBox() << <span class="stringliteral">" itb "</span> << box->isInlineTextBox() << <span class="stringliteral">" rlb "</span> << box->isRootInlineBox() << endl; <a name="l00675"></a>00675 <span class="preprocessor">#endif</span> <a name="l00676"></a>00676 <span class="preprocessor"></span> <span class="comment">// ### Why the hell can object() ever be 0?!</span> <a name="l00677"></a>00677 <span class="keywordflow">if</span> (!box->object()) <span class="keywordflow">continue</span>; <a name="l00678"></a>00678 <a name="l00679"></a>00679 RenderStyle *s = box->object()->style(box->m_firstLine); <a name="l00680"></a>00680 <span class="comment">// parent style for outside caret boxes</span> <a name="l00681"></a>00681 RenderStyle *ps = box->parent() && box->parent()->object() <a name="l00682"></a>00682 ? box->parent()->object()->style(box->parent()->m_firstLine) <a name="l00683"></a>00683 : s; <a name="l00684"></a>00684 <a name="l00685"></a>00685 <span class="keywordflow">if</span> (box->isInlineFlowBox()) { <a name="l00686"></a>00686 <span class="preprocessor">#if DEBUG_ACIB</span> <a name="l00687"></a>00687 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"isinlineflowbox "</span> << box << endl; <a name="l00688"></a>00688 <span class="preprocessor">#endif</span> <a name="l00689"></a>00689 <span class="preprocessor"></span> InlineFlowBox *flowBox = <span class="keyword">static_cast<</span>InlineFlowBox *<span class="keyword">></span>(box); <a name="l00690"></a>00690 <span class="keywordtype">bool</span> rtl = ps->direction() == RTL; <a name="l00691"></a>00691 <span class="keyword">const</span> <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html">QFontMetrics</a> &pfm = ps->fontMetrics(); <a name="l00692"></a>00692 <a name="l00693"></a>00693 <span class="keywordflow">if</span> (flowBox->includeLeftEdge()) { <a name="l00694"></a>00694 <span class="comment">// If this box is to be coalesced with the outside end box of its</span> <a name="l00695"></a>00695 <span class="comment">// predecessor, then check if it is the searched box. If it is, we</span> <a name="l00696"></a>00696 <span class="comment">// substitute the outside end box.</span> <a name="l00697"></a>00697 <span class="keywordflow">if</span> (coalesceOutsideBoxes) { <a name="l00698"></a>00698 <span class="keywordflow">if</span> (sbp.equalsBox(flowBox, <span class="keyword">true</span>, <span class="keyword">false</span>)) { <a name="l00699"></a>00699 sbp.it = lastCoalescedBox; <a name="l00700"></a>00700 Q_ASSERT(!sbp.found); <a name="l00701"></a>00701 sbp.found = <span class="keyword">true</span>; <a name="l00702"></a>00702 } <a name="l00703"></a>00703 } <span class="keywordflow">else</span> { <a name="l00704"></a>00704 addCreatedFlowBoxEdge(flowBox, pfm, <span class="keyword">true</span>, rtl); <a name="l00705"></a>00705 sbp.check(preEnd()); <a name="l00706"></a>00706 } <a name="l00707"></a>00707 }<span class="comment">/*end if*/</span> <a name="l00708"></a>00708 <a name="l00709"></a>00709 <span class="keywordflow">if</span> (flowBox->firstChild()) { <a name="l00710"></a>00710 <span class="preprocessor">#if DEBUG_ACIB</span> <a name="l00711"></a>00711 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"this "</span> << <span class="keyword">this</span> << <span class="stringliteral">" flowBox "</span> << flowBox << <span class="stringliteral">" firstChild "</span> << flowBox->firstChild() << endl; <a name="l00712"></a>00712 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"== recursive invocation"</span> << endl; <a name="l00713"></a>00713 <span class="preprocessor">#endif</span> <a name="l00714"></a>00714 <span class="preprocessor"></span> addConvertedInlineBox(flowBox->firstChild(), sbp); <a name="l00715"></a>00715 <span class="preprocessor">#if DEBUG_ACIB</span> <a name="l00716"></a>00716 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"== recursive invocation end"</span> << endl; <a name="l00717"></a>00717 <span class="preprocessor">#endif</span> <a name="l00718"></a>00718 <span class="preprocessor"></span>} <a name="l00719"></a>00719 <span class="keywordflow">else</span> { <a name="l00720"></a>00720 addCreatedFlowBoxInside(flowBox, s->fontMetrics()); <a name="l00721"></a>00721 sbp.check(preEnd()); <a name="l00722"></a>00722 } <a name="l00723"></a>00723 <a name="l00724"></a>00724 <span class="keywordflow">if</span> (flowBox->includeRightEdge()) { <a name="l00725"></a>00725 addCreatedFlowBoxEdge(flowBox, pfm, <span class="keyword">false</span>, rtl); <a name="l00726"></a>00726 lastCoalescedBox = preEnd(); <a name="l00727"></a>00727 sbp.check(lastCoalescedBox); <a name="l00728"></a>00728 coalesceOutsideBoxes = <span class="keyword">true</span>; <a name="l00729"></a>00729 } <a name="l00730"></a>00730 <a name="l00731"></a>00731 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (box->isInlineTextBox()) { <a name="l00732"></a>00732 <span class="preprocessor">#if DEBUG_ACIB</span> <a name="l00733"></a>00733 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"isinlinetextbox "</span> << box << (box->object() ? <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html">QString</a>(<span class="stringliteral">" contains \"%1\""</span>).arg(<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qconststring.html">QConstString</a>(static_cast<RenderText *>(box->object())->str->s+box->minOffset(), kMin(box->maxOffset() - box->minOffset(), 15L)).string()) : QString::null) << endl; <a name="l00734"></a>00734 <span class="preprocessor">#endif</span> <a name="l00735"></a>00735 <span class="preprocessor"></span> caret_boxes.append(<span class="keyword">new</span> CaretBox(box, <span class="keyword">false</span>, <span class="keyword">false</span>)); <a name="l00736"></a>00736 sbp.check(preEnd()); <a name="l00737"></a>00737 <span class="comment">// coalescing has been interrupted</span> <a name="l00738"></a>00738 coalesceOutsideBoxes = <span class="keyword">false</span>; <a name="l00739"></a>00739 <a name="l00740"></a>00740 } <span class="keywordflow">else</span> { <a name="l00741"></a>00741 <span class="preprocessor">#if DEBUG_ACIB</span> <a name="l00742"></a>00742 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"some replaced or what "</span> << box << endl; <a name="l00743"></a>00743 <span class="preprocessor">#endif</span> <a name="l00744"></a>00744 <span class="preprocessor"></span> <span class="comment">// must be an inline-block, inline-table, or any RenderReplaced</span> <a name="l00745"></a>00745 <span class="keywordtype">bool</span> rtl = ps->direction() == RTL; <a name="l00746"></a>00746 <span class="keyword">const</span> <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html">QFontMetrics</a> &pfm = ps->fontMetrics(); <a name="l00747"></a>00747 <a name="l00748"></a>00748 <span class="keywordflow">if</span> (coalesceOutsideBoxes) { <a name="l00749"></a>00749 <span class="keywordflow">if</span> (sbp.equalsBox(box, <span class="keyword">true</span>, <span class="keyword">false</span>)) { <a name="l00750"></a>00750 sbp.it = lastCoalescedBox; <a name="l00751"></a>00751 Q_ASSERT(!sbp.found); <a name="l00752"></a>00752 sbp.found = <span class="keyword">true</span>; <a name="l00753"></a>00753 } <a name="l00754"></a>00754 } <span class="keywordflow">else</span> { <a name="l00755"></a>00755 addCreatedInlineBoxEdge(box, pfm, <span class="keyword">true</span>, rtl); <a name="l00756"></a>00756 sbp.check(preEnd()); <a name="l00757"></a>00757 } <a name="l00758"></a>00758 <a name="l00759"></a>00759 caret_boxes.append(<span class="keyword">new</span> CaretBox(box, <span class="keyword">false</span>, <span class="keyword">false</span>)); <a name="l00760"></a>00760 sbp.check(preEnd()); <a name="l00761"></a>00761 <a name="l00762"></a>00762 addCreatedInlineBoxEdge(box, pfm, <span class="keyword">false</span>, rtl); <a name="l00763"></a>00763 lastCoalescedBox = preEnd(); <a name="l00764"></a>00764 sbp.check(lastCoalescedBox); <a name="l00765"></a>00765 coalesceOutsideBoxes = <span class="keyword">true</span>; <a name="l00766"></a>00766 }<span class="comment">/*end if*/</span> <a name="l00767"></a>00767 }<span class="comment">/*next box*/</span> <a name="l00768"></a>00768 } <a name="l00769"></a>00769 <span class="preprocessor">#undef DEBUG_ACIB</span> <a name="l00770"></a>00770 <span class="preprocessor"></span> <a name="l00771"></a>00771 <span class="keywordtype">void</span> CaretBoxLine::addCreatedFlowBoxInside(InlineFlowBox *flowBox, <span class="keyword">const</span> <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html">QFontMetrics</a> &fm) <span class="comment">/*KDE_NO_EXPORT*/</span> <a name="l00772"></a>00772 { <a name="l00773"></a>00773 <a name="l00774"></a>00774 CaretBox *caretBox = <span class="keyword">new</span> CaretBox(flowBox, <span class="keyword">false</span>, <span class="keyword">false</span>); <a name="l00775"></a>00775 caret_boxes.append(caretBox); <a name="l00776"></a>00776 <a name="l00777"></a>00777 <span class="comment">// afaik an inner flow box can only have the width 0, therefore we don't</span> <a name="l00778"></a>00778 <span class="comment">// have to care for rtl or alignment</span> <a name="l00779"></a>00779 <span class="comment">// ### can empty inline elements have a width? css 2 spec isn't verbose about it</span> <a name="l00780"></a>00780 <a name="l00781"></a>00781 caretBox->_y += flowBox->baseline() - fm.<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html#ascent">ascent</a>(); <a name="l00782"></a>00782 caretBox->_h = fm.<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html#height">height</a>(); <a name="l00783"></a>00783 } <a name="l00784"></a>00784 <a name="l00785"></a>00785 <span class="keywordtype">void</span> CaretBoxLine::addCreatedFlowBoxEdge(InlineFlowBox *flowBox, <span class="keyword">const</span> <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html">QFontMetrics</a> &fm, <span class="keywordtype">bool</span> left, <span class="keywordtype">bool</span> rtl) <span class="comment">/*KDE_NO_EXPORT*/</span> <a name="l00786"></a>00786 { <a name="l00787"></a>00787 CaretBox *caretBox = <span class="keyword">new</span> CaretBox(flowBox, <span class="keyword">true</span>, !left); <a name="l00788"></a>00788 caret_boxes.append(caretBox); <a name="l00789"></a>00789 <a name="l00790"></a>00790 <span class="keywordflow">if</span> (left ^ rtl) caretBox->_x -= flowBox->paddingLeft() + flowBox->borderLeft() + 1; <a name="l00791"></a>00791 <span class="keywordflow">else</span> caretBox->_x += caretBox->_w + flowBox->paddingRight() + flowBox->borderRight(); <a name="l00792"></a>00792 <a name="l00793"></a>00793 caretBox->_y += flowBox->baseline() - fm.<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html#ascent">ascent</a>(); <a name="l00794"></a>00794 caretBox->_h = fm.<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html#height">height</a>(); <a name="l00795"></a>00795 caretBox->_w = 1; <a name="l00796"></a>00796 } <a name="l00797"></a>00797 <a name="l00798"></a>00798 <span class="keywordtype">void</span> CaretBoxLine::addCreatedInlineBoxEdge(InlineBox *box, <span class="keyword">const</span> <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html">QFontMetrics</a> &fm, <span class="keywordtype">bool</span> left, <span class="keywordtype">bool</span> rtl) <span class="comment">/*KDE_NO_EXPORT*/</span> <a name="l00799"></a>00799 { <a name="l00800"></a>00800 CaretBox *caretBox = <span class="keyword">new</span> CaretBox(box, <span class="keyword">true</span>, !left); <a name="l00801"></a>00801 caret_boxes.append(caretBox); <a name="l00802"></a>00802 <a name="l00803"></a>00803 <span class="keywordflow">if</span> (left ^ rtl) caretBox->_x--; <a name="l00804"></a>00804 <span class="keywordflow">else</span> caretBox->_x += caretBox->_w; <a name="l00805"></a>00805 <a name="l00806"></a>00806 caretBox->_y += box->baseline() - fm.<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html#ascent">ascent</a>(); <a name="l00807"></a>00807 caretBox->_h = fm.<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html#height">height</a>(); <a name="l00808"></a>00808 caretBox->_w = 1; <a name="l00809"></a>00809 } <a name="l00810"></a>00810 <a name="l00811"></a>00811 CaretBoxLine *CaretBoxLine::constructCaretBoxLine(CaretBoxLineDeleter *deleter, <a name="l00812"></a>00812 InlineFlowBox *basicFlowBox, InlineBox *seekBox, <span class="keywordtype">bool</span> seekOutside, <a name="l00813"></a>00813 <span class="keywordtype">bool</span> seekOutsideEnd, CaretBoxIterator &iter, RenderObject *seekObject) <a name="l00814"></a>00814 <span class="comment">// KDE_NO_EXPORT</span> <a name="l00815"></a>00815 { <a name="l00816"></a>00816 <span class="comment">// Iterate all inline boxes within this inline flow box.</span> <a name="l00817"></a>00817 <span class="comment">// Caret boxes will be created for each</span> <a name="l00818"></a>00818 <span class="comment">// - outside begin of an inline flow box (except for the basic inline flow box)</span> <a name="l00819"></a>00819 <span class="comment">// - outside end of an inline flow box (except for the basic inline flow box)</span> <a name="l00820"></a>00820 <span class="comment">// - inside of an empty inline flow box</span> <a name="l00821"></a>00821 <span class="comment">// - outside begin of an inline box resembling a replaced element</span> <a name="l00822"></a>00822 <span class="comment">// - outside end of an inline box resembling a replaced element</span> <a name="l00823"></a>00823 <span class="comment">// - inline text box</span> <a name="l00824"></a>00824 <span class="comment">// - inline replaced box</span> <a name="l00825"></a>00825 <a name="l00826"></a>00826 CaretBoxLine *result = <span class="keyword">new</span> CaretBoxLine(basicFlowBox); <a name="l00827"></a>00827 deleter->append(result); <a name="l00828"></a>00828 <a name="l00829"></a>00829 SeekBoxParams sbp(seekBox, seekOutside, seekOutsideEnd, seekObject, iter); <a name="l00830"></a>00830 <a name="l00831"></a>00831 <span class="comment">// iterate recursively, I'm too lazy to do it iteratively</span> <a name="l00832"></a>00832 result->addConvertedInlineBox(basicFlowBox, sbp); <a name="l00833"></a>00833 <a name="l00834"></a>00834 <span class="keywordflow">if</span> (!sbp.found) sbp.it = result->end(); <a name="l00835"></a>00835 <a name="l00836"></a>00836 <span class="keywordflow">return</span> result; <a name="l00837"></a>00837 } <a name="l00838"></a>00838 <a name="l00839"></a>00839 CaretBoxLine *CaretBoxLine::constructCaretBoxLine(CaretBoxLineDeleter *deleter, <a name="l00840"></a>00840 RenderBox *cb, <span class="keywordtype">bool</span> outside, <span class="keywordtype">bool</span> outsideEnd, CaretBoxIterator &iter) <span class="comment">/*KDE_NO_EXPORT*/</span> <a name="l00841"></a>00841 { <a name="l00842"></a>00842 <span class="keywordtype">int</span> _x = cb->xPos(); <a name="l00843"></a>00843 <span class="keywordtype">int</span> _y = cb->yPos(); <a name="l00844"></a>00844 <span class="keywordtype">int</span> height; <a name="l00845"></a>00845 <span class="keywordtype">int</span> width = 1; <span class="comment">// no override is indicated in boxes</span> <a name="l00846"></a>00846 <a name="l00847"></a>00847 <span class="keywordflow">if</span> (outside) { <a name="l00848"></a>00848 <a name="l00849"></a>00849 RenderStyle *s = cb->element() && cb->element()->parent() <a name="l00850"></a>00850 && cb->element()->parent()->renderer() <a name="l00851"></a>00851 ? cb->element()->parent()->renderer()->style() <a name="l00852"></a>00852 : cb->style(); <a name="l00853"></a>00853 <span class="keywordtype">bool</span> rtl = s->direction() == RTL; <a name="l00854"></a>00854 <a name="l00855"></a>00855 <span class="keyword">const</span> <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html">QFontMetrics</a> &fm = s->fontMetrics(); <a name="l00856"></a>00856 height = fm.<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html#height">height</a>(); <a name="l00857"></a>00857 <a name="l00858"></a>00858 <span class="keywordflow">if</span> (!outsideEnd) { <a name="l00859"></a>00859 _x--; <a name="l00860"></a>00860 } <span class="keywordflow">else</span> { <a name="l00861"></a>00861 _x += cb->width(); <a name="l00862"></a>00862 } <a name="l00863"></a>00863 <a name="l00864"></a>00864 <span class="keywordtype">int</span> hl = fm.<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html#leading">leading</a>() / 2; <a name="l00865"></a>00865 <span class="keywordtype">int</span> baseline = cb->baselinePosition(<span class="keyword">false</span>); <a name="l00866"></a>00866 <span class="keywordflow">if</span> (!cb->isReplaced() || cb->style()->display() == BLOCK) { <a name="l00867"></a>00867 <span class="keywordflow">if</span> (!outsideEnd ^ rtl) <a name="l00868"></a>00868 _y -= fm.<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html#leading">leading</a>() / 2; <a name="l00869"></a>00869 <span class="keywordflow">else</span> <a name="l00870"></a>00870 _y += kMax(cb->height() - fm.<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html#ascent">ascent</a>() - hl, 0); <a name="l00871"></a>00871 } <span class="keywordflow">else</span> { <a name="l00872"></a>00872 _y += baseline - fm.<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html#ascent">ascent</a>() - hl; <a name="l00873"></a>00873 } <a name="l00874"></a>00874 <a name="l00875"></a>00875 } <span class="keywordflow">else</span> { <span class="comment">// !outside</span> <a name="l00876"></a>00876 <a name="l00877"></a>00877 RenderStyle *s = cb->style(); <a name="l00878"></a>00878 <span class="keyword">const</span> <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html">QFontMetrics</a> &fm = s->fontMetrics(); <a name="l00879"></a>00879 height = fm.<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qfontmetrics.html#height">height</a>(); <a name="l00880"></a>00880 <a name="l00881"></a>00881 _x += cb->borderLeft() + cb->paddingLeft(); <a name="l00882"></a>00882 _y += cb->borderTop() + cb->paddingTop(); <a name="l00883"></a>00883 <a name="l00884"></a>00884 <span class="comment">// ### regard direction</span> <a name="l00885"></a>00885 <span class="keywordflow">switch</span> (s->textAlign()) { <a name="l00886"></a>00886 <span class="keywordflow">case</span> LEFT: <a name="l00887"></a>00887 <span class="keywordflow">case</span> KHTML_LEFT: <a name="l00888"></a>00888 <span class="keywordflow">case</span> TAAUTO: <span class="comment">// ### find out what this does</span> <a name="l00889"></a>00889 <span class="keywordflow">case</span> JUSTIFY: <a name="l00890"></a>00890 <span class="keywordflow">break</span>; <a name="l00891"></a>00891 <span class="keywordflow">case</span> CENTER: <a name="l00892"></a>00892 <span class="keywordflow">case</span> KHTML_CENTER: <a name="l00893"></a>00893 _x += cb->contentWidth() / 2; <a name="l00894"></a>00894 <span class="keywordflow">break</span>; <a name="l00895"></a>00895 <span class="keywordflow">case</span> KHTML_RIGHT: <a name="l00896"></a>00896 <span class="keywordflow">case</span> RIGHT: <a name="l00897"></a>00897 _x += cb->contentWidth(); <a name="l00898"></a>00898 <span class="keywordflow">break</span>; <a name="l00899"></a>00899 }<span class="comment">/*end switch*/</span> <a name="l00900"></a>00900 }<span class="comment">/*end if*/</span> <a name="l00901"></a>00901 <a name="l00902"></a>00902 CaretBoxLine *result = <span class="keyword">new</span> CaretBoxLine; <a name="l00903"></a>00903 deleter->append(result); <a name="l00904"></a>00904 result->caret_boxes.append(<span class="keyword">new</span> CaretBox(_x, _y, width, height, cb, <a name="l00905"></a>00905 outside, outsideEnd)); <a name="l00906"></a>00906 iter = result->begin(); <a name="l00907"></a>00907 <span class="keywordflow">return</span> result; <a name="l00908"></a>00908 } <a name="l00909"></a>00909 <a name="l00910"></a>00910 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l00911"></a>00911 <span class="preprocessor"></span><span class="keywordtype">void</span> CaretBoxLine::dump(<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qtextstream.html">QTextStream</a> &ts, <span class="keyword">const</span> <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html">QString</a> &ind)<span class="keyword"> const</span> <a name="l00912"></a>00912 <span class="keyword"></span>{ <a name="l00913"></a>00913 ts << ind << <span class="stringliteral">"cbl: baseFlowBox@"</span> << basefb << endl; <a name="l00914"></a>00914 <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html">QString</a> ind2 = ind + <span class="stringliteral">" "</span>; <a name="l00915"></a>00915 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < caret_boxes.size(); i++) { <a name="l00916"></a>00916 <span class="keywordflow">if</span> (i > 0) ts << endl; <a name="l00917"></a>00917 caret_boxes[i]->dump(ts, ind2); <a name="l00918"></a>00918 } <a name="l00919"></a>00919 } <a name="l00920"></a>00920 <span class="preprocessor">#endif</span> <a name="l00921"></a>00921 <span class="preprocessor"></span> <a name="l00922"></a>00922 <span class="comment">// == caret mode related helper functions</span> <a name="l00923"></a>00923 <a name="l00931"></a>00931 <span class="keyword">inline</span> InlineFlowBox *seekBaseFlowBox(InlineBox *b, RenderObject *base = 0) <a name="l00932"></a>00932 { <a name="l00933"></a>00933 <span class="comment">// Seek root line box or base inline flow box, if \c base is interfering.</span> <a name="l00934"></a>00934 <span class="keywordflow">while</span> (b->parent() && b->object() != base) { <a name="l00935"></a>00935 b = b->parent(); <a name="l00936"></a>00936 }<span class="comment">/*wend*/</span> <a name="l00937"></a>00937 Q_ASSERT(b->isInlineFlowBox()); <a name="l00938"></a>00938 <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>InlineFlowBox *<span class="keyword">></span>(b); <a name="l00939"></a>00939 } <a name="l00940"></a>00940 <a name="l00943"></a>00943 <span class="keyword">inline</span> <span class="keywordtype">bool</span> isBlockRenderReplaced(RenderObject *r) <a name="l00944"></a>00944 { <a name="l00945"></a>00945 <span class="keywordflow">return</span> r->isRenderReplaced() && r->style()->display() == BLOCK; <a name="l00946"></a>00946 } <a name="l00947"></a>00947 <a name="l00964"></a>00964 <span class="keyword">static</span> CaretBoxLine* findCaretBoxLine(DOM::NodeImpl *node, <span class="keywordtype">long</span> offset, <a name="l00965"></a>00965 CaretBoxLineDeleter *cblDeleter, RenderObject *base, <a name="l00966"></a>00966 <span class="keywordtype">long</span> &r_ofs, CaretBoxIterator &caretBoxIt) <a name="l00967"></a>00967 { <a name="l00968"></a>00968 <span class="keywordtype">bool</span> outside, outsideEnd; <a name="l00969"></a>00969 RenderObject *r = findRenderer(node, offset, base, r_ofs, outside, outsideEnd); <a name="l00970"></a>00970 <span class="keywordflow">if</span> (!r) { <span class="keywordflow">return</span> 0; } <a name="l00971"></a>00971 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l00972"></a>00972 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"=================== findCaretBoxLine"</span> << endl; <a name="l00973"></a>00973 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"node "</span> << node << <span class="stringliteral">" offset: "</span> << offset << <span class="stringliteral">" r "</span> << r->renderName() << <span class="stringliteral">"["</span> << r << <span class="stringliteral">"].node "</span> << r->element()->nodeName().string() << <span class="stringliteral">"["</span> << r->element() << <span class="stringliteral">"]"</span> << <span class="stringliteral">" r_ofs "</span> << r_ofs << <span class="stringliteral">" outside "</span> << outside << <span class="stringliteral">" outsideEnd "</span> << outsideEnd << endl; <a name="l00974"></a>00974 <span class="preprocessor">#endif</span> <a name="l00975"></a>00975 <span class="preprocessor"></span> <a name="l00976"></a>00976 <span class="comment">// There are two strategies to find the correct line box. (The third is failsafe)</span> <a name="l00977"></a>00977 <span class="comment">// (A) First, if node's renderer is a RenderText, we only traverse its text</span> <a name="l00978"></a>00978 <span class="comment">// runs and return the root line box (saves much time for long blocks).</span> <a name="l00979"></a>00979 <span class="comment">// This should be the case 99% of the time.</span> <a name="l00980"></a>00980 <span class="comment">// (B) Second, we derive the inline flow box directly when the renderer is</span> <a name="l00981"></a>00981 <span class="comment">// a RenderBlock, RenderInline, or blocked RenderReplaced.</span> <a name="l00982"></a>00982 <span class="comment">// (C) Otherwise, we iterate linearly through all line boxes in order to find</span> <a name="l00983"></a>00983 <span class="comment">// the renderer.</span> <a name="l00984"></a>00984 <a name="l00985"></a>00985 <span class="comment">// (A)</span> <a name="l00986"></a>00986 <span class="keywordflow">if</span> (r->isText()) <span class="keywordflow">do</span> { <a name="l00987"></a>00987 RenderText *t = <span class="keyword">static_cast<</span>RenderText *<span class="keyword">></span>(r); <a name="l00988"></a>00988 <span class="keywordtype">int</span> dummy; <a name="l00989"></a>00989 InlineBox *b = t->findInlineTextBox(offset, dummy, <span class="keyword">true</span>); <a name="l00990"></a>00990 <span class="comment">// Actually b should never be 0, but some render texts don't have text</span> <a name="l00991"></a>00991 <span class="comment">// boxes, so we insert the last run as an error correction.</span> <a name="l00992"></a>00992 <span class="comment">// If there is no last run, we resort to (B)</span> <a name="l00993"></a>00993 <span class="keywordflow">if</span> (!b) { <a name="l00994"></a>00994 <span class="keywordflow">if</span> (t->m_lines.count() > 0) <a name="l00995"></a>00995 b = t->m_lines[t->m_lines.count() - 1]; <a name="l00996"></a>00996 <span class="keywordflow">else</span> <a name="l00997"></a>00997 <span class="keywordflow">break</span>; <a name="l00998"></a>00998 }<span class="comment">/*end if*/</span> <a name="l00999"></a>00999 Q_ASSERT(b); <a name="l01000"></a>01000 outside = <span class="keyword">false</span>; <span class="comment">// text boxes cannot have outside positions</span> <a name="l01001"></a>01001 InlineFlowBox *baseFlowBox = seekBaseFlowBox(b, base); <a name="l01002"></a>01002 <span class="preprocessor">#if DEBUG_CARETMODE > 2</span> <a name="l01003"></a>01003 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"text-box b: "</span> << b << <span class="stringliteral">" baseFlowBox: "</span> << baseFlowBox << (b && b->object() ? <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html">QString</a>(<span class="stringliteral">" contains \"%1\""</span>).arg(<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qconststring.html">QConstString</a>(static_cast<RenderText *>(b->object())->str->s+b->minOffset(), kMin(b->maxOffset() - b->minOffset(), 15L)).string()) : QString::null) << endl; <a name="l01004"></a>01004 <span class="preprocessor">#endif</span> <a name="l01005"></a>01005 <span class="preprocessor"></span><span class="preprocessor">#if 0</span> <a name="l01006"></a>01006 <span class="preprocessor"></span> <span class="keywordflow">if</span> (t->containingBlock()->isListItem()) dumpLineBoxes(static_cast<RenderFlow *>(t->containingBlock())); <a name="l01007"></a>01007 <span class="preprocessor">#endif</span> <a name="l01008"></a>01008 <span class="preprocessor"></span><span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01009"></a>01009 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"=================== end findCaretBoxLine (renderText)"</span> << endl; <a name="l01010"></a>01010 <span class="preprocessor">#endif</span> <a name="l01011"></a>01011 <span class="preprocessor"></span> <span class="keywordflow">return</span> CaretBoxLine::constructCaretBoxLine(cblDeleter, baseFlowBox, <a name="l01012"></a>01012 b, outside, outsideEnd, caretBoxIt); <a name="l01013"></a>01013 } <span class="keywordflow">while</span>(<span class="keyword">false</span>);<span class="comment">/*end if*/</span> <a name="l01014"></a>01014 <a name="l01015"></a>01015 <span class="comment">// (B)</span> <a name="l01016"></a>01016 <span class="keywordtype">bool</span> isrepl = isBlockRenderReplaced(r); <a name="l01017"></a>01017 <span class="keywordflow">if</span> (r->isRenderBlock() || r->isRenderInline() || isrepl) { <a name="l01018"></a>01018 RenderFlow *flow = <span class="keyword">static_cast<</span>RenderFlow *<span class="keyword">></span>(r); <a name="l01019"></a>01019 InlineFlowBox *firstLineBox = isrepl ? 0 : flow->firstLineBox(); <a name="l01020"></a>01020 <a name="l01021"></a>01021 <span class="comment">// On render blocks, if we are outside, or have a totally empty render</span> <a name="l01022"></a>01022 <span class="comment">// block, we simply construct a special caret box line.</span> <a name="l01023"></a>01023 <span class="comment">// The latter case happens only when the render block is a leaf object itself.</span> <a name="l01024"></a>01024 <span class="keywordflow">if</span> (isrepl || r->isRenderBlock() && (outside || !firstLineBox) <a name="l01025"></a>01025 || r->isRenderInline() && !firstLineBox) { <a name="l01026"></a>01026 <span class="preprocessor"> #if DEBUG_CARETMODE > 0</span> <a name="l01027"></a>01027 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"=================== end findCaretBoxLine (box "</span> << (outside ? (outsideEnd ? <span class="stringliteral">"outside end"</span> : <span class="stringliteral">"outside begin"</span>) : <span class="stringliteral">"inside"</span>) << <span class="stringliteral">")"</span> << endl; <a name="l01028"></a>01028 <span class="preprocessor"> #endif</span> <a name="l01029"></a>01029 <span class="preprocessor"></span> Q_ASSERT(r->isBox()); <a name="l01030"></a>01030 <span class="keywordflow">return</span> CaretBoxLine::constructCaretBoxLine(cblDeleter, <a name="l01031"></a>01031 static_cast<RenderBox *>(r), outside, outsideEnd, caretBoxIt); <a name="l01032"></a>01032 }<span class="comment">/*end if*/</span> <a name="l01033"></a>01033 <a name="l01034"></a>01034 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"firstlinebox "</span> << firstLineBox << endl; <a name="l01035"></a>01035 InlineFlowBox *baseFlowBox = seekBaseFlowBox(firstLineBox, base); <a name="l01036"></a>01036 <span class="keywordflow">return</span> CaretBoxLine::constructCaretBoxLine(cblDeleter, baseFlowBox, <a name="l01037"></a>01037 firstLineBox, outside, outsideEnd, caretBoxIt); <a name="l01038"></a>01038 }<span class="comment">/*end if*/</span> <a name="l01039"></a>01039 <a name="l01040"></a>01040 RenderBlock *cb = r->containingBlock(); <a name="l01041"></a>01041 <span class="comment">//if ( !cb ) return 0L;</span> <a name="l01042"></a>01042 Q_ASSERT(cb); <a name="l01043"></a>01043 <a name="l01044"></a>01044 <span class="comment">// ### which element doesn't have a block as its containing block?</span> <a name="l01045"></a>01045 <span class="comment">// Is it still possible after the RenderBlock/RenderInline merge?</span> <a name="l01046"></a>01046 <span class="keywordflow">if</span> (!cb->isRenderBlock()) { <a name="l01047"></a>01047 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#g9acd682001598171edf8ecb104fdad2b">kdWarning</a>() << <span class="stringliteral">"containing block is no render block!!! crash imminent"</span> << endl; <a name="l01048"></a>01048 }<span class="comment">/*end if*/</span> <a name="l01049"></a>01049 <a name="l01050"></a>01050 InlineFlowBox *flowBox = cb->firstLineBox(); <a name="l01051"></a>01051 <span class="comment">// (C)</span> <a name="l01052"></a>01052 <span class="comment">// This case strikes when the element is replaced, but neither a</span> <a name="l01053"></a>01053 <span class="comment">// RenderBlock nor a RenderInline</span> <a name="l01054"></a>01054 <span class="keywordflow">if</span> (!flowBox) { <span class="comment">// ### utter emergency (why is this possible at all?)</span> <a name="l01055"></a>01055 <span class="comment">// flowBox = generateDummyFlowBox(arena, cb, r);</span> <a name="l01056"></a>01056 <span class="comment">// if (ibox) *ibox = flowBox->firstChild();</span> <a name="l01057"></a>01057 <span class="comment">// outside = outside_end = true;</span> <a name="l01058"></a>01058 <a name="l01059"></a>01059 <span class="comment">// kdWarning() << "containing block contains no inline flow boxes!!! crash imminent" << endl;</span> <a name="l01060"></a>01060 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01061"></a>01061 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"=================== end findCaretBoxLine (2)"</span> << endl; <a name="l01062"></a>01062 <span class="preprocessor">#endif</span> <a name="l01063"></a>01063 <span class="preprocessor"></span> <span class="keywordflow">return</span> CaretBoxLine::constructCaretBoxLine(cblDeleter, cb, <a name="l01064"></a>01064 outside, outsideEnd, caretBoxIt); <a name="l01065"></a>01065 }<span class="comment">/*end if*/</span> <a name="l01066"></a>01066 <a name="l01067"></a>01067 <span class="comment">// We iterate the inline flow boxes of the containing block until</span> <a name="l01068"></a>01068 <span class="comment">// we find the given node. This has one major flaw: it is linear, and therefore</span> <a name="l01069"></a>01069 <span class="comment">// painfully slow for really large blocks.</span> <a name="l01070"></a>01070 <span class="keywordflow">for</span> (; flowBox; flowBox = <span class="keyword">static_cast<</span>InlineFlowBox *<span class="keyword">></span>(flowBox->nextLineBox())) { <a name="l01071"></a>01071 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01072"></a>01072 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"[scan line]"</span> << endl; <a name="l01073"></a>01073 <span class="preprocessor">#endif</span> <a name="l01074"></a>01074 <span class="preprocessor"></span> <a name="l01075"></a>01075 <span class="comment">// construct a caret line box and stop when the element is contained within</span> <a name="l01076"></a>01076 InlineFlowBox *baseFlowBox = seekBaseFlowBox(flowBox, base); <a name="l01077"></a>01077 CaretBoxLine *cbl = CaretBoxLine::constructCaretBoxLine(cblDeleter, <a name="l01078"></a>01078 baseFlowBox, 0, outside, outsideEnd, caretBoxIt, r); <a name="l01079"></a>01079 <span class="preprocessor">#if DEBUG_CARETMODE > 5</span> <a name="l01080"></a>01080 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << cbl->information() << endl; <a name="l01081"></a>01081 <span class="preprocessor">#endif</span> <a name="l01082"></a>01082 <span class="preprocessor"></span> <span class="keywordflow">if</span> (caretBoxIt != cbl->end()) { <a name="l01083"></a>01083 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01084"></a>01084 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"=================== end findCaretBoxLine (3)"</span> << endl; <a name="l01085"></a>01085 <span class="preprocessor">#endif</span> <a name="l01086"></a>01086 <span class="preprocessor"></span> <span class="keywordflow">return</span> cbl; <a name="l01087"></a>01087 } <a name="l01088"></a>01088 }<span class="comment">/*next flowBox*/</span> <a name="l01089"></a>01089 <a name="l01090"></a>01090 <span class="comment">// no inline flow box found, approximate to nearest following node.</span> <a name="l01091"></a>01091 <span class="comment">// Danger: this is O(n^2). It's only called to recover from</span> <a name="l01092"></a>01092 <span class="comment">// errors, that means, theoretically, never. (Practically, far too often :-( )</span> <a name="l01093"></a>01093 Q_ASSERT(!flowBox); <a name="l01094"></a>01094 CaretBoxLine *cbl = findCaretBoxLine(nextLeafNode(node, base ? base->element() : 0), 0, cblDeleter, base, r_ofs, caretBoxIt); <a name="l01095"></a>01095 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01096"></a>01096 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"=================== end findCaretBoxLine"</span> << endl; <a name="l01097"></a>01097 <span class="preprocessor">#endif</span> <a name="l01098"></a>01098 <span class="preprocessor"></span> <span class="keywordflow">return</span> cbl; <a name="l01099"></a>01099 } <a name="l01100"></a>01100 <a name="l01107"></a>01107 <span class="keyword">static</span> <span class="keyword">inline</span> RenderTable *findTableUpTo(RenderObject *r, RenderFlow *cb) <a name="l01108"></a>01108 { <a name="l01109"></a>01109 <span class="keywordflow">while</span> (r && r != cb && !r->isTable()) r = r->parent(); <a name="l01110"></a>01110 <span class="keywordflow">return</span> r && r->isTable() ? <span class="keyword">static_cast<</span>RenderTable *<span class="keyword">></span>(r) : 0; <a name="l01111"></a>01111 } <a name="l01112"></a>01112 <a name="l01115"></a>01115 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> isDescendant(RenderObject *r, RenderObject *cb) <a name="l01116"></a>01116 { <a name="l01117"></a>01117 <span class="keywordflow">while</span> (r && r != cb) r = r->parent(); <a name="l01118"></a>01118 <span class="keywordflow">return</span> r; <a name="l01119"></a>01119 } <a name="l01120"></a>01120 <a name="l01131"></a>01131 <span class="keyword">static</span> <span class="keywordtype">bool</span> containsEditableElement(<a class="code" href="classKHTMLPart.html" title="This class is khtml&#39;s main class.">KHTMLPart</a> *part, RenderBlock *cb, <a name="l01132"></a>01132 RenderTable *&table, <span class="keywordtype">bool</span> fromEnd = <span class="keyword">false</span>) <a name="l01133"></a>01133 { <a name="l01134"></a>01134 RenderObject *r = cb; <a name="l01135"></a>01135 <span class="keywordflow">if</span> (fromEnd) <a name="l01136"></a>01136 <span class="keywordflow">while</span> (r->lastChild()) r = r->lastChild(); <a name="l01137"></a>01137 <span class="keywordflow">else</span> <a name="l01138"></a>01138 <span class="keywordflow">while</span> (r->firstChild()) r = r->firstChild(); <a name="l01139"></a>01139 <a name="l01140"></a>01140 RenderTable *tempTable = 0; <a name="l01141"></a>01141 table = 0; <a name="l01142"></a>01142 <span class="keywordtype">bool</span> withinCb; <a name="l01143"></a>01143 <span class="comment">// int state; // not used</span> <a name="l01144"></a>01144 ObjectTraversalState trav = InsideDescending; <a name="l01145"></a>01145 <span class="keywordflow">do</span> { <a name="l01146"></a>01146 <span class="keywordtype">bool</span> modWithinCb = withinCb = isDescendant(r, cb); <a name="l01147"></a>01147 <a name="l01148"></a>01148 <span class="comment">// treat cb extra, it would not be considered otherwise</span> <a name="l01149"></a>01149 <span class="keywordflow">if</span> (!modWithinCb) { <a name="l01150"></a>01150 modWithinCb = <span class="keyword">true</span>; <a name="l01151"></a>01151 r = cb; <a name="l01152"></a>01152 } <span class="keywordflow">else</span> <a name="l01153"></a>01153 tempTable = findTableUpTo(r, cb); <a name="l01154"></a>01154 <a name="l01155"></a>01155 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l01156"></a>01156 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"cee: r "</span> << (r ? r->renderName() : QString::null) << <span class="stringliteral">"@"</span> << r << <span class="stringliteral">" cb "</span> << cb << <span class="stringliteral">" withinCb "</span> << withinCb << <span class="stringliteral">" modWithinCb "</span> << modWithinCb << <span class="stringliteral">" tempTable "</span> << tempTable << endl; <a name="l01157"></a>01157 <span class="preprocessor">#endif</span> <a name="l01158"></a>01158 <span class="preprocessor"></span> <span class="keywordflow">if</span> (r && modWithinCb && r->element() && !isUnsuitable(r, trav) <a name="l01159"></a>01159 && (part-><a class="code" href="classKHTMLPart.html#9dc02d048264869bf35d32be8c13ce84" title="Returns whether caret mode is on/off.">isCaretMode</a>() || part-><a class="code" href="classKHTMLPart.html#cc1cd57ab1204cc85f293c227c75251d" title="Returns true if the document is editable, false otherwise.">isEditable</a>() <a name="l01160"></a>01160 || r->style()->userInput() == UI_ENABLED)) { <a name="l01161"></a>01161 table = tempTable; <a name="l01162"></a>01162 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l01163"></a>01163 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"cee: editable"</span> << endl; <a name="l01164"></a>01164 <span class="preprocessor">#endif</span> <a name="l01165"></a>01165 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l01166"></a>01166 }<span class="comment">/*end if*/</span> <a name="l01167"></a>01167 <a name="l01168"></a>01168 <span class="comment">// RenderObject *oldr = r;</span> <a name="l01169"></a>01169 <span class="comment">// while (r && r == oldr)</span> <a name="l01170"></a>01170 <span class="comment">// r = advanceSuitableObject(r, trav, fromEnd, cb->parent(), state);</span> <a name="l01171"></a>01171 r = fromEnd ? r->objectAbove() : r->objectBelow(); <a name="l01172"></a>01172 } <span class="keywordflow">while</span> (r && withinCb); <a name="l01173"></a>01173 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l01174"></a>01174 } <a name="l01175"></a>01175 <a name="l01188"></a>01188 <span class="keyword">static</span> <span class="keywordtype">bool</span> containsEditableChildElement(<a class="code" href="classKHTMLPart.html" title="This class is khtml&#39;s main class.">KHTMLPart</a> *part, RenderBlock *cb, <a name="l01189"></a>01189 RenderTable *&table, <span class="keywordtype">bool</span> fromEnd, RenderObject *start) <a name="l01190"></a>01190 { <a name="l01191"></a>01191 <span class="keywordtype">int</span> state = 0; <a name="l01192"></a>01192 ObjectTraversalState trav = OutsideAscending; <a name="l01193"></a>01193 <span class="comment">// kdDebug(6201) << "start: " << start << endl;</span> <a name="l01194"></a>01194 RenderObject *r = start; <a name="l01195"></a>01195 <span class="keywordflow">do</span> { <a name="l01196"></a>01196 r = traverseRenderObjects(r, trav, fromEnd, cb->parent(), state); <a name="l01197"></a>01197 } <span class="keywordflow">while</span>(r && !(state & AdvancedToSibling)); <a name="l01198"></a>01198 <span class="comment">// kdDebug(6201) << "r: " << r << endl;</span> <a name="l01199"></a>01199 <span class="comment">//advanceObject(start, trav, fromEnd, cb->parent(), state);</span> <a name="l01200"></a>01200 <span class="comment">// RenderObject *oldr = r;</span> <a name="l01201"></a>01201 <span class="comment">// while (r && r == oldr)</span> <a name="l01202"></a>01202 <span class="keywordflow">if</span> (!r) <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l01203"></a>01203 <a name="l01204"></a>01204 <span class="keywordflow">if</span> (fromEnd) <a name="l01205"></a>01205 <span class="keywordflow">while</span> (r->firstChild()) r = r->firstChild(); <a name="l01206"></a>01206 <span class="keywordflow">else</span> <a name="l01207"></a>01207 <span class="keywordflow">while</span> (r->lastChild()) r = r->lastChild(); <a name="l01208"></a>01208 <span class="comment">// kdDebug(6201) << "child r: " << r << endl;</span> <a name="l01209"></a>01209 <span class="keywordflow">if</span> (!r) <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l01210"></a>01210 <a name="l01211"></a>01211 RenderTable *tempTable = 0; <a name="l01212"></a>01212 table = 0; <a name="l01213"></a>01213 <span class="keywordtype">bool</span> withinCb = <span class="keyword">false</span>; <a name="l01214"></a>01214 <span class="keywordflow">do</span> { <a name="l01215"></a>01215 <a name="l01216"></a>01216 <span class="keywordtype">bool</span> modWithinCb = withinCb = isDescendant(r, cb); <a name="l01217"></a>01217 <a name="l01218"></a>01218 <span class="comment">// treat cb extra, it would not be considered otherwise</span> <a name="l01219"></a>01219 <span class="keywordflow">if</span> (!modWithinCb) { <a name="l01220"></a>01220 modWithinCb = <span class="keyword">true</span>; <a name="l01221"></a>01221 r = cb; <a name="l01222"></a>01222 } <span class="keywordflow">else</span> <a name="l01223"></a>01223 tempTable = findTableUpTo(r, cb); <a name="l01224"></a>01224 <a name="l01225"></a>01225 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l01226"></a>01226 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"cece: r "</span> << (r ? r->renderName() : QString::null) << <span class="stringliteral">"@"</span> << r << <span class="stringliteral">" cb "</span> << cb << <span class="stringliteral">" withinCb "</span> << withinCb << <span class="stringliteral">" modWithinCb "</span> << modWithinCb << <span class="stringliteral">" tempTable "</span> << tempTable << endl; <a name="l01227"></a>01227 <span class="preprocessor">#endif</span> <a name="l01228"></a>01228 <span class="preprocessor"></span> <span class="keywordflow">if</span> (r && withinCb && r->element() && !isUnsuitable(r, trav) <a name="l01229"></a>01229 && (part-><a class="code" href="classKHTMLPart.html#9dc02d048264869bf35d32be8c13ce84" title="Returns whether caret mode is on/off.">isCaretMode</a>() || part-><a class="code" href="classKHTMLPart.html#cc1cd57ab1204cc85f293c227c75251d" title="Returns true if the document is editable, false otherwise.">isEditable</a>() <a name="l01230"></a>01230 || r->style()->userInput() == UI_ENABLED)) { <a name="l01231"></a>01231 table = tempTable; <a name="l01232"></a>01232 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l01233"></a>01233 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"cece: editable"</span> << endl; <a name="l01234"></a>01234 <span class="preprocessor">#endif</span> <a name="l01235"></a>01235 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l01236"></a>01236 }<span class="comment">/*end if*/</span> <a name="l01237"></a>01237 <a name="l01238"></a>01238 r = fromEnd ? r->objectAbove() : r->objectBelow(); <a name="l01239"></a>01239 } <span class="keywordflow">while</span> (withinCb); <a name="l01240"></a>01240 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l01241"></a>01241 } <a name="l01242"></a>01242 <a name="l01243"></a>01243 <span class="comment">// == class LinearDocument implementation</span> <a name="l01244"></a>01244 <a name="l01245"></a>01245 LinearDocument::LinearDocument(<a class="code" href="classKHTMLPart.html" title="This class is khtml&#39;s main class.">KHTMLPart</a> *part, NodeImpl *node, <span class="keywordtype">long</span> offset, <a name="l01246"></a>01246 CaretAdvancePolicy advancePolicy, ElementImpl *baseElem) <a name="l01247"></a>01247 : node(node), offset(offset), m_part(part), <a name="l01248"></a>01248 advPol(advancePolicy), base(0) <a name="l01249"></a>01249 { <a name="l01250"></a>01250 <span class="keywordflow">if</span> (node == 0) <span class="keywordflow">return</span>; <a name="l01251"></a>01251 <a name="l01252"></a>01252 <span class="keywordflow">if</span> (baseElem) { <a name="l01253"></a>01253 RenderObject *b = baseElem->renderer(); <a name="l01254"></a>01254 <span class="keywordflow">if</span> (b && (b->isRenderBlock() || b->isRenderInline())) <a name="l01255"></a>01255 base = b; <a name="l01256"></a>01256 } <a name="l01257"></a>01257 <a name="l01258"></a>01258 initPreBeginIterator(); <a name="l01259"></a>01259 initEndIterator(); <a name="l01260"></a>01260 } <a name="l01261"></a>01261 <a name="l01262"></a>01262 LinearDocument::~LinearDocument() <a name="l01263"></a>01263 { <a name="l01264"></a>01264 } <a name="l01265"></a>01265 <a name="l01266"></a>01266 <span class="keywordtype">int</span> LinearDocument::count()<span class="keyword"> const</span> <a name="l01267"></a>01267 <span class="keyword"></span>{ <a name="l01268"></a>01268 <span class="comment">// FIXME: not implemented</span> <a name="l01269"></a>01269 <span class="keywordflow">return</span> 1; <a name="l01270"></a>01270 } <a name="l01271"></a>01271 <a name="l01272"></a>01272 LinearDocument::Iterator LinearDocument::current() <a name="l01273"></a>01273 { <a name="l01274"></a>01274 <span class="keywordflow">return</span> LineIterator(<span class="keyword">this</span>, node, offset); <a name="l01275"></a>01275 } <a name="l01276"></a>01276 <a name="l01277"></a>01277 LinearDocument::Iterator LinearDocument::begin() <a name="l01278"></a>01278 { <a name="l01279"></a>01279 NodeImpl *n = base ? base->element() : 0; <a name="l01280"></a>01280 <span class="keywordflow">if</span> (!base) n = node ? node->getDocument() : 0; <a name="l01281"></a>01281 <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/namespaceKStdAccel.html#8407902cbc74699e1a95168fee54c827">end</a>(); <a name="l01282"></a>01282 <a name="l01283"></a>01283 n = n->firstChild(); <a name="l01284"></a>01284 <span class="keywordflow">if</span> (advPol == LeafsOnly) <a name="l01285"></a>01285 <span class="keywordflow">while</span> (n->firstChild()) n = n->firstChild(); <a name="l01286"></a>01286 <a name="l01287"></a>01287 <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/namespaceKStdAccel.html#8407902cbc74699e1a95168fee54c827">end</a>(); <span class="comment">// must be empty document or empty base element</span> <a name="l01288"></a>01288 <span class="keywordflow">return</span> LineIterator(<span class="keyword">this</span>, n, n->minOffset()); <a name="l01289"></a>01289 } <a name="l01290"></a>01290 <a name="l01291"></a>01291 LinearDocument::Iterator LinearDocument::preEnd() <a name="l01292"></a>01292 { <a name="l01293"></a>01293 NodeImpl *n = base ? base->element() : 0; <a name="l01294"></a>01294 <span class="keywordflow">if</span> (!base) n = node ? node->getDocument() : 0; <a name="l01295"></a>01295 <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> preBegin(); <a name="l01296"></a>01296 <a name="l01297"></a>01297 n = n->lastChild(); <a name="l01298"></a>01298 <span class="keywordflow">if</span> (advPol == LeafsOnly) <a name="l01299"></a>01299 <span class="keywordflow">while</span> (n->lastChild()) n = n->lastChild(); <a name="l01300"></a>01300 <a name="l01301"></a>01301 <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> preBegin(); <span class="comment">// must be empty document or empty base element</span> <a name="l01302"></a>01302 <span class="keywordflow">return</span> LineIterator(<span class="keyword">this</span>, n, n->maxOffset()); <a name="l01303"></a>01303 } <a name="l01304"></a>01304 <a name="l01305"></a>01305 <span class="keywordtype">void</span> LinearDocument::initPreBeginIterator() <a name="l01306"></a>01306 { <a name="l01307"></a>01307 _preBegin = LineIterator(<span class="keyword">this</span>, 0, 0); <a name="l01308"></a>01308 } <a name="l01309"></a>01309 <a name="l01310"></a>01310 <span class="keywordtype">void</span> LinearDocument::initEndIterator() <a name="l01311"></a>01311 { <a name="l01312"></a>01312 _end = LineIterator(<span class="keyword">this</span>, 0, 1); <a name="l01313"></a>01313 } <a name="l01314"></a>01314 <a name="l01315"></a>01315 <span class="comment">// == class LineIterator implementation</span> <a name="l01316"></a>01316 <a name="l01317"></a>01317 CaretBoxIterator LineIterator::currentBox <span class="comment">/*KDE_NO_EXPORT*/</span>; <a name="l01318"></a>01318 <span class="keywordtype">long</span> LineIterator::currentOffset <span class="comment">/*KDE_NO_EXPORT*/</span>; <a name="l01319"></a>01319 <a name="l01320"></a>01320 LineIterator::LineIterator(LinearDocument *l, DOM::NodeImpl *node, <span class="keywordtype">long</span> offset) <a name="l01321"></a>01321 : lines(l) <a name="l01322"></a>01322 { <a name="l01323"></a>01323 <span class="comment">// kdDebug(6200) << "LineIterator: node " << node << " offset " << offset << endl;</span> <a name="l01324"></a>01324 <span class="keywordflow">if</span> (!node) { cbl = 0; <span class="keywordflow">return</span>; } <a name="l01325"></a>01325 cbl = findCaretBoxLine(node, offset, &lines->cblDeleter, <a name="l01326"></a>01326 l->baseObject(), currentOffset, currentBox); <a name="l01327"></a>01327 <span class="comment">// can happen on partially loaded documents</span> <a name="l01328"></a>01328 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01329"></a>01329 <span class="preprocessor"></span> <span class="keywordflow">if</span> (!cbl) <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"no render object found!"</span> << endl; <a name="l01330"></a>01330 <span class="preprocessor">#endif</span> <a name="l01331"></a>01331 <span class="preprocessor"></span> <span class="keywordflow">if</span> (!cbl) <span class="keywordflow">return</span>; <a name="l01332"></a>01332 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l01333"></a>01333 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"LineIterator: offset "</span> << offset << <span class="stringliteral">" outside "</span> << cbl->isOutside() << endl; <a name="l01334"></a>01334 <span class="preprocessor">#endif</span> <a name="l01335"></a>01335 <span class="preprocessor"></span><span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l01336"></a>01336 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << cbl->information() << endl; <a name="l01337"></a>01337 <span class="preprocessor">#endif</span> <a name="l01338"></a>01338 <span class="preprocessor"></span> <span class="keywordflow">if</span> (currentBox == cbl->end()) { <a name="l01339"></a>01339 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01340"></a>01340 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"LineIterator: findCaretBoxLine failed"</span> << endl; <a name="l01341"></a>01341 <span class="preprocessor">#endif</span> <a name="l01342"></a>01342 <span class="preprocessor"></span> cbl = 0; <a name="l01343"></a>01343 }<span class="comment">/*end if*/</span> <a name="l01344"></a>01344 } <a name="l01345"></a>01345 <a name="l01346"></a>01346 <span class="keywordtype">void</span> LineIterator::nextBlock() <a name="l01347"></a>01347 { <a name="l01348"></a>01348 RenderObject *base = lines->baseObject(); <a name="l01349"></a>01349 <a name="l01350"></a>01350 <span class="keywordtype">bool</span> cb_outside = cbl->isOutside(); <a name="l01351"></a>01351 <span class="keywordtype">bool</span> cb_outside_end = cbl->isOutsideEnd(); <a name="l01352"></a>01352 <a name="l01353"></a>01353 { <a name="l01354"></a>01354 RenderObject *r = cbl->enclosingObject(); <a name="l01355"></a>01355 <a name="l01356"></a>01356 ObjectTraversalState trav; <a name="l01357"></a>01357 <span class="keywordtype">int</span> state; <span class="comment">// not used</span> <a name="l01358"></a>01358 mapRenderPosToTraversalState(cb_outside, cb_outside_end, <span class="keyword">false</span>, trav); <a name="l01359"></a>01359 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l01360"></a>01360 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"nextBlock: before adv r"</span> << r << <span class="stringliteral">" "</span> << (r ? r->renderName() : QString::null) << (r && r->isText() ? <span class="stringliteral">" contains \""</span> + <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html">QString</a>(((RenderText *)r)->str->s, QMIN(((RenderText *)r)->str->l,15)) + <span class="stringliteral">"\""</span> : QString::null) << <span class="stringliteral">" trav "</span> << trav << <span class="stringliteral">" cb_outside "</span> << cb_outside << <span class="stringliteral">" cb_outside_end "</span> << cb_outside_end << endl; <a name="l01361"></a>01361 <span class="preprocessor">#endif</span> <a name="l01362"></a>01362 <span class="preprocessor"></span> r = advanceSuitableObject(r, trav, <span class="keyword">false</span>, base, state); <a name="l01363"></a>01363 <span class="keywordflow">if</span> (!r) { <a name="l01364"></a>01364 cbl = 0; <a name="l01365"></a>01365 <span class="keywordflow">return</span>; <a name="l01366"></a>01366 }<span class="comment">/*end if*/</span> <a name="l01367"></a>01367 <a name="l01368"></a>01368 mapTraversalStateToRenderPos(trav, <span class="keyword">false</span>, cb_outside, cb_outside_end); <a name="l01369"></a>01369 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l01370"></a>01370 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"nextBlock: after r"</span> << r << <span class="stringliteral">" trav "</span> << trav << <span class="stringliteral">" cb_outside "</span> << cb_outside << <span class="stringliteral">" cb_outside_end "</span> << cb_outside_end << endl; <a name="l01371"></a>01371 <span class="preprocessor">#endif</span> <a name="l01372"></a>01372 <span class="preprocessor"></span><span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01373"></a>01373 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"++: r "</span> << r << <span class="stringliteral">"["</span> << (r?r->renderName():QString::null) << <span class="stringliteral">"]"</span> << endl; <a name="l01374"></a>01374 <span class="preprocessor">#endif</span> <a name="l01375"></a>01375 <span class="preprocessor"></span> <a name="l01376"></a>01376 RenderBlock *cb; <a name="l01377"></a>01377 <a name="l01378"></a>01378 <span class="comment">// If we hit a block or replaced object, use this as its enclosing object</span> <a name="l01379"></a>01379 <span class="keywordtype">bool</span> isrepl = isBlockRenderReplaced(r); <a name="l01380"></a>01380 <span class="keywordflow">if</span> (r->isRenderBlock() || isrepl) { <a name="l01381"></a>01381 RenderBox *cb = <span class="keyword">static_cast<</span>RenderBox *<span class="keyword">></span>(r); <a name="l01382"></a>01382 <a name="l01383"></a>01383 cbl = CaretBoxLine::constructCaretBoxLine(&lines->cblDeleter, cb, <a name="l01384"></a>01384 cb_outside, cb_outside_end, currentBox); <a name="l01385"></a>01385 <a name="l01386"></a>01386 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01387"></a>01387 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"r->isFlow is cb. continuation @"</span> << cb->continuation() << endl; <a name="l01388"></a>01388 <span class="preprocessor">#endif</span> <a name="l01389"></a>01389 <span class="preprocessor"></span> <span class="keywordflow">return</span>; <a name="l01390"></a>01390 } <span class="keywordflow">else</span> { <a name="l01391"></a>01391 cb = r->containingBlock(); <a name="l01392"></a>01392 Q_ASSERT(cb->isRenderBlock()); <a name="l01393"></a>01393 }<span class="comment">/*end if*/</span> <a name="l01394"></a>01394 InlineFlowBox *flowBox = cb->firstLineBox(); <a name="l01395"></a>01395 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01396"></a>01396 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"++: flowBox "</span> << flowBox << <span class="stringliteral">" cb "</span> << cb << <span class="stringliteral">"["</span> << (cb?cb->renderName()+<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html">QString</a>(<span class="stringliteral">".node "</span>)+<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html#number">QString::number</a>((<span class="keywordtype">unsigned</span>)cb->element(),16)+(cb->element()?<span class="stringliteral">"@"</span>+cb->element()->nodeName().string():QString::null):QString::null) << <span class="stringliteral">"]"</span> << endl; <a name="l01397"></a>01397 <span class="preprocessor">#endif</span> <a name="l01398"></a>01398 <span class="preprocessor"></span> Q_ASSERT(flowBox); <a name="l01399"></a>01399 <span class="keywordflow">if</span> (!flowBox) { <span class="comment">// ### utter emergency (why is this possible at all?)</span> <a name="l01400"></a>01400 cb_outside = cb_outside_end = <span class="keyword">true</span>; <a name="l01401"></a>01401 cbl = CaretBoxLine::constructCaretBoxLine(&lines->cblDeleter, cb, <a name="l01402"></a>01402 cb_outside, cb_outside_end, currentBox); <a name="l01403"></a>01403 <span class="keywordflow">return</span>; <a name="l01404"></a>01404 } <a name="l01405"></a>01405 <a name="l01406"></a>01406 <span class="keywordtype">bool</span> seekOutside = <span class="keyword">false</span>, seekOutsideEnd = <span class="keyword">false</span>; <span class="comment">// silence gcc uninit warning</span> <a name="l01407"></a>01407 CaretBoxIterator it; <a name="l01408"></a>01408 cbl = CaretBoxLine::constructCaretBoxLine(&lines->cblDeleter, <a name="l01409"></a>01409 flowBox, flowBox->firstChild(), seekOutside, seekOutsideEnd, it); <a name="l01410"></a>01410 } <a name="l01411"></a>01411 } <a name="l01412"></a>01412 <a name="l01413"></a>01413 <span class="keywordtype">void</span> LineIterator::prevBlock() <a name="l01414"></a>01414 { <a name="l01415"></a>01415 RenderObject *base = lines->baseObject(); <a name="l01416"></a>01416 <a name="l01417"></a>01417 <span class="keywordtype">bool</span> cb_outside = cbl->isOutside(); <a name="l01418"></a>01418 <span class="keywordtype">bool</span> cb_outside_end = cbl->isOutsideEnd(); <a name="l01419"></a>01419 <a name="l01420"></a>01420 { <a name="l01421"></a>01421 RenderObject *r = cbl->enclosingObject(); <a name="l01422"></a>01422 <span class="keywordflow">if</span> (r->isAnonymous() && !cb_outside) <a name="l01423"></a>01423 cb_outside = <span class="keyword">true</span>, cb_outside_end = <span class="keyword">false</span>; <a name="l01424"></a>01424 <a name="l01425"></a>01425 ObjectTraversalState trav; <a name="l01426"></a>01426 <span class="keywordtype">int</span> state; <span class="comment">// not used</span> <a name="l01427"></a>01427 mapRenderPosToTraversalState(cb_outside, cb_outside_end, <span class="keyword">true</span>, trav); <a name="l01428"></a>01428 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l01429"></a>01429 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"prevBlock: before adv r"</span> << r << <span class="stringliteral">" "</span> << (r ? r->renderName() : QString::null) << (r && r->isText() ? <span class="stringliteral">" contains \""</span> + <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html">QString</a>(((RenderText *)r)->str->s, QMIN(((RenderText *)r)->str->l,15)) + <span class="stringliteral">"\""</span> : QString::null) << <span class="stringliteral">" trav "</span> << trav << <span class="stringliteral">" cb_outside "</span> << cb_outside << <span class="stringliteral">" cb_outside_end "</span> << cb_outside_end << endl; <a name="l01430"></a>01430 <span class="preprocessor">#endif</span> <a name="l01431"></a>01431 <span class="preprocessor"></span> r = advanceSuitableObject(r, trav, <span class="keyword">true</span>, base, state); <a name="l01432"></a>01432 <span class="keywordflow">if</span> (!r) { <a name="l01433"></a>01433 cbl = 0; <a name="l01434"></a>01434 <span class="keywordflow">return</span>; <a name="l01435"></a>01435 }<span class="comment">/*end if*/</span> <a name="l01436"></a>01436 <a name="l01437"></a>01437 mapTraversalStateToRenderPos(trav, <span class="keyword">true</span>, cb_outside, cb_outside_end); <a name="l01438"></a>01438 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l01439"></a>01439 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"prevBlock: after r"</span> << r << <span class="stringliteral">" trav "</span> << trav << <span class="stringliteral">" cb_outside "</span> << cb_outside << <span class="stringliteral">" cb_outside_end "</span> << cb_outside_end << endl; <a name="l01440"></a>01440 <span class="preprocessor">#endif</span> <a name="l01441"></a>01441 <span class="preprocessor"></span><span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01442"></a>01442 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"--: r "</span> << r << <span class="stringliteral">"["</span> << (r?r->renderName():QString::null) << <span class="stringliteral">"]"</span> << endl; <a name="l01443"></a>01443 <span class="preprocessor">#endif</span> <a name="l01444"></a>01444 <span class="preprocessor"></span> <a name="l01445"></a>01445 RenderBlock *cb; <a name="l01446"></a>01446 <a name="l01447"></a>01447 <span class="comment">// If we hit a block, use this as its enclosing object</span> <a name="l01448"></a>01448 <span class="keywordtype">bool</span> isrepl = isBlockRenderReplaced(r); <a name="l01449"></a>01449 <span class="comment">// kdDebug(6200) << "isrepl " << isrepl << " isblock " << r->isRenderBlock() << endl;</span> <a name="l01450"></a>01450 <span class="keywordflow">if</span> (r->isRenderBlock() || isrepl) { <a name="l01451"></a>01451 RenderBox *cb = <span class="keyword">static_cast<</span>RenderBox *<span class="keyword">></span>(r); <a name="l01452"></a>01452 <a name="l01453"></a>01453 cbl = CaretBoxLine::constructCaretBoxLine(&lines->cblDeleter, cb, <a name="l01454"></a>01454 cb_outside, cb_outside_end, currentBox); <a name="l01455"></a>01455 <a name="l01456"></a>01456 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01457"></a>01457 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"r->isFlow is cb. continuation @"</span> << cb->continuation() << endl; <a name="l01458"></a>01458 <span class="preprocessor">#endif</span> <a name="l01459"></a>01459 <span class="preprocessor"></span> <span class="keywordflow">return</span>; <a name="l01460"></a>01460 } <span class="keywordflow">else</span> { <a name="l01461"></a>01461 cb = r->containingBlock(); <a name="l01462"></a>01462 Q_ASSERT(cb->isRenderBlock()); <a name="l01463"></a>01463 }<span class="comment">/*end if*/</span> <a name="l01464"></a>01464 InlineFlowBox *flowBox = cb->lastLineBox(); <a name="l01465"></a>01465 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01466"></a>01466 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"--: flowBox "</span> << flowBox << <span class="stringliteral">" cb "</span> << cb << <span class="stringliteral">"["</span> << (cb?cb->renderName()+<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html">QString</a>(<span class="stringliteral">".node "</span>)+<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html#number">QString::number</a>((<span class="keywordtype">unsigned</span>)cb->element(),16)+(cb->element()?<span class="stringliteral">"@"</span>+cb->element()->nodeName().string():QString::null):QString::null) << <span class="stringliteral">"]"</span> << endl; <a name="l01467"></a>01467 <span class="preprocessor">#endif</span> <a name="l01468"></a>01468 <span class="preprocessor"></span> Q_ASSERT(flowBox); <a name="l01469"></a>01469 <span class="keywordflow">if</span> (!flowBox) { <span class="comment">// ### utter emergency (why is this possible at all?)</span> <a name="l01470"></a>01470 cb_outside = <span class="keyword">true</span>; cb_outside_end = <span class="keyword">false</span>; <a name="l01471"></a>01471 cbl = CaretBoxLine::constructCaretBoxLine(&lines->cblDeleter, cb, <a name="l01472"></a>01472 cb_outside, cb_outside_end, currentBox); <a name="l01473"></a>01473 <span class="keywordflow">return</span>; <a name="l01474"></a>01474 } <a name="l01475"></a>01475 <a name="l01476"></a>01476 <span class="keywordtype">bool</span> seekOutside = <span class="keyword">false</span>, seekOutsideEnd = <span class="keyword">false</span>; <span class="comment">// silence gcc uninit warning</span> <a name="l01477"></a>01477 CaretBoxIterator it; <a name="l01478"></a>01478 cbl = CaretBoxLine::constructCaretBoxLine(&lines->cblDeleter, <a name="l01479"></a>01479 flowBox, flowBox->firstChild(), seekOutside, seekOutsideEnd, it); <a name="l01480"></a>01480 } <a name="l01481"></a>01481 } <a name="l01482"></a>01482 <a name="l01483"></a>01483 <span class="keywordtype">void</span> LineIterator::advance(<span class="keywordtype">bool</span> toBegin) <a name="l01484"></a>01484 { <a name="l01485"></a>01485 InlineFlowBox *flowBox = cbl->baseFlowBox(); <a name="l01486"></a>01486 <span class="keywordflow">if</span> (flowBox) { <a name="l01487"></a>01487 flowBox = <span class="keyword">static_cast<</span>InlineFlowBox *<span class="keyword">></span>(toBegin ? flowBox->prevLineBox() : flowBox->nextLineBox()); <a name="l01488"></a>01488 <span class="keywordflow">if</span> (flowBox) { <a name="l01489"></a>01489 <span class="keywordtype">bool</span> seekOutside = <span class="keyword">false</span>, seekOutsideEnd = <span class="keyword">false</span>; <span class="comment">// silence gcc uninit warning</span> <a name="l01490"></a>01490 CaretBoxIterator it; <a name="l01491"></a>01491 cbl = CaretBoxLine::constructCaretBoxLine(&lines->cblDeleter, <a name="l01492"></a>01492 flowBox, flowBox->firstChild(), seekOutside, seekOutsideEnd, it); <a name="l01493"></a>01493 }<span class="comment">/*end if*/</span> <a name="l01494"></a>01494 }<span class="comment">/*end if*/</span> <a name="l01495"></a>01495 <a name="l01496"></a>01496 <span class="comment">// if there are no more lines in this block, move towards block to come</span> <a name="l01497"></a>01497 <span class="keywordflow">if</span> (!flowBox) { <span class="keywordflow">if</span> (toBegin) prevBlock(); <span class="keywordflow">else</span> nextBlock(); } <a name="l01498"></a>01498 <a name="l01499"></a>01499 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l01500"></a>01500 <span class="preprocessor"></span> <span class="keywordflow">if</span> (cbl) <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << cbl->information() << endl; <a name="l01501"></a>01501 <span class="preprocessor">#endif</span> <a name="l01502"></a>01502 <span class="preprocessor"></span>} <a name="l01503"></a>01503 <a name="l01504"></a>01504 <span class="comment">// == class EditableCaretBoxIterator implementation</span> <a name="l01505"></a>01505 <a name="l01506"></a>01506 <span class="keywordtype">void</span> EditableCaretBoxIterator::advance(<span class="keywordtype">bool</span> toBegin) <a name="l01507"></a>01507 { <a name="l01508"></a>01508 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l01509"></a>01509 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"---------------"</span> << <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#g634e2de2b699b31ea3a79f984e836d64">k_funcinfo</a> << <span class="stringliteral">"toBegin "</span> << toBegin << endl; <a name="l01510"></a>01510 <span class="preprocessor">#endif</span> <a name="l01511"></a>01511 <span class="preprocessor"></span> <span class="keyword">const</span> CaretBoxIterator preBegin = cbl->preBegin(); <a name="l01512"></a>01512 <span class="keyword">const</span> CaretBoxIterator <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/namespaceKStdAccel.html#8407902cbc74699e1a95168fee54c827">end</a> = cbl->end(); <a name="l01513"></a>01513 <a name="l01514"></a>01514 CaretBoxIterator lastbox = *<span class="keyword">this</span>, curbox; <a name="l01515"></a>01515 <span class="keywordtype">bool</span> islastuseable = <span class="keyword">true</span>; <span class="comment">// silence gcc</span> <a name="l01516"></a>01516 <span class="keywordtype">bool</span> iscuruseable; <a name="l01517"></a>01517 <span class="comment">// Assume adjacency of caret boxes. Will be falsified later if applicable.</span> <a name="l01518"></a>01518 adjacent = <span class="keyword">true</span>; <a name="l01519"></a>01519 <a name="l01520"></a>01520 <span class="preprocessor">#if DEBUG_CARETMODE > 4</span> <a name="l01521"></a>01521 <span class="preprocessor"></span><span class="comment">// kdDebug(6200) << "ebit::advance: before: " << (**this)->object() << "@" << (**this)->object()->renderName() << ".node " << (**this)->object()->element() << "[" << ((**this)->object()->element() ? (**this)->object()->element()->nodeName().string() : QString::null) << "] inline " << (**this)->isInline() << " outside " << (**this)->isOutside() << " outsideEnd " << (**this)->isOutsideEnd() << endl;</span> <a name="l01522"></a>01522 <span class="preprocessor">#endif</span> <a name="l01523"></a>01523 <span class="preprocessor"></span> <a name="l01524"></a>01524 <span class="keywordflow">if</span> (toBegin) CaretBoxIterator::operator --(); <span class="keywordflow">else</span> CaretBoxIterator::operator ++(); <a name="l01525"></a>01525 <span class="keywordtype">bool</span> curAtEnd = *<span class="keyword">this</span> == preBegin || *<span class="keyword">this</span> == end; <a name="l01526"></a>01526 curbox = *<span class="keyword">this</span>; <a name="l01527"></a>01527 <span class="keywordtype">bool</span> atEnd = <span class="keyword">true</span>; <a name="l01528"></a>01528 <span class="keywordflow">if</span> (!curAtEnd) { <a name="l01529"></a>01529 iscuruseable = isEditable(curbox, toBegin); <a name="l01530"></a>01530 <span class="keywordflow">if</span> (toBegin) CaretBoxIterator::operator --(); <span class="keywordflow">else</span> CaretBoxIterator::operator ++(); <a name="l01531"></a>01531 atEnd = *<span class="keyword">this</span> == preBegin || *<span class="keyword">this</span> == end; <a name="l01532"></a>01532 } <a name="l01533"></a>01533 <span class="keywordflow">while</span> (!curAtEnd) { <a name="l01534"></a>01534 <span class="keywordtype">bool</span> haslast = lastbox != end && lastbox != preBegin; <a name="l01535"></a>01535 <span class="keywordtype">bool</span> hascoming = !atEnd; <a name="l01536"></a>01536 <span class="keywordtype">bool</span> iscominguseable = <span class="keyword">true</span>; <span class="comment">// silence gcc</span> <a name="l01537"></a>01537 <a name="l01538"></a>01538 <span class="keywordflow">if</span> (!atEnd) iscominguseable = isEditable(*<span class="keyword">this</span>, toBegin); <a name="l01539"></a>01539 <span class="keywordflow">if</span> (iscuruseable) { <a name="l01540"></a>01540 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l01541"></a>01541 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"ebit::advance: "</span> << (*curbox)->object() << <span class="stringliteral">"@"</span> << (*curbox)->object()->renderName() << <span class="stringliteral">".node "</span> << (*curbox)->object()->element() << <span class="stringliteral">"["</span> << ((*curbox)->object()->element() ? (*curbox)->object()->element()->nodeName().string() : QString::null) << <span class="stringliteral">"] inline "</span> << (*curbox)->isInline() << <span class="stringliteral">" outside "</span> << (*curbox)->isOutside() << <span class="stringliteral">" outsideEnd "</span> << (*curbox)->isOutsideEnd() << endl; <a name="l01542"></a>01542 <span class="preprocessor">#endif</span> <a name="l01543"></a>01543 <span class="preprocessor"></span> <a name="l01544"></a>01544 CaretBox *box = *curbox; <a name="l01545"></a>01545 <span class="keywordflow">if</span> (box->isOutside()) { <a name="l01546"></a>01546 <span class="comment">// if this caret box represents no inline box, it is an outside box</span> <a name="l01547"></a>01547 <span class="comment">// which has to be considered unconditionally</span> <a name="l01548"></a>01548 <span class="keywordflow">if</span> (!box->isInline()) <span class="keywordflow">break</span>; <a name="l01549"></a>01549 <a name="l01550"></a>01550 <span class="keywordflow">if</span> (advpol == VisibleFlows) <span class="keywordflow">break</span>; <a name="l01551"></a>01551 <a name="l01552"></a>01552 <span class="comment">// IndicatedFlows and LeafsOnly are treated equally in caret box lines</span> <a name="l01553"></a>01553 <a name="l01554"></a>01554 InlineBox *ibox = box->inlineBox(); <a name="l01555"></a>01555 <span class="comment">// get previous inline box</span> <a name="l01556"></a>01556 InlineBox *prev = box->isOutsideEnd() ? ibox : ibox->prevOnLine(); <a name="l01557"></a>01557 <span class="comment">// get next inline box</span> <a name="l01558"></a>01558 InlineBox *<a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/namespaceKStdAccel.html#3c93cec83afd9c54d443fe78a9899502">next</a> = box->isOutsideEnd() ? ibox->nextOnLine() : ibox; <a name="l01559"></a>01559 <a name="l01560"></a>01560 <span class="keyword">const</span> <span class="keywordtype">bool</span> isprevindicated = !prev || isIndicatedInlineBox(prev); <a name="l01561"></a>01561 <span class="keyword">const</span> <span class="keywordtype">bool</span> isnextindicated = !next || isIndicatedInlineBox(next); <a name="l01562"></a>01562 <span class="keyword">const</span> <span class="keywordtype">bool</span> last = haslast && !islastuseable; <a name="l01563"></a>01563 <span class="keyword">const</span> <span class="keywordtype">bool</span> coming = hascoming && !iscominguseable; <a name="l01564"></a>01564 <span class="keyword">const</span> <span class="keywordtype">bool</span> left = !prev || prev->isInlineFlowBox() && isprevindicated <a name="l01565"></a>01565 || (toBegin && coming || !toBegin && last); <a name="l01566"></a>01566 <span class="keyword">const</span> <span class="keywordtype">bool</span> right = !next || next->isInlineFlowBox() && isnextindicated <a name="l01567"></a>01567 || (!toBegin && coming || toBegin && last); <a name="l01568"></a>01568 <span class="keyword">const</span> <span class="keywordtype">bool</span> text2indicated = toBegin && next && next->isInlineTextBox() <a name="l01569"></a>01569 && isprevindicated <a name="l01570"></a>01570 || !toBegin && prev && prev->isInlineTextBox() && isnextindicated; <a name="l01571"></a>01571 <span class="keyword">const</span> <span class="keywordtype">bool</span> indicated2text = !toBegin && next && next->isInlineTextBox() <a name="l01572"></a>01572 && prev && isprevindicated <a name="l01573"></a>01573 <span class="comment">// ### this code is so broken.</span> <a name="l01574"></a>01574 <span class="comment">/*|| toBegin && prev && prev->isInlineTextBox() && isnextindicated*/</span>; <a name="l01575"></a>01575 <span class="preprocessor">#if DEBUG_CARETMODE > 5</span> <a name="l01576"></a>01576 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"prev "</span> << prev << <span class="stringliteral">" haslast "</span> << haslast << <span class="stringliteral">" islastuseable "</span> << islastuseable << <span class="stringliteral">" left "</span> << left << <span class="stringliteral">" next "</span> << next << <span class="stringliteral">" hascoming "</span> << hascoming << <span class="stringliteral">" iscominguseable "</span> << iscominguseable << <span class="stringliteral">" right "</span> << right << <span class="stringliteral">" text2indicated "</span> << text2indicated << <span class="stringliteral">" indicated2text "</span> << indicated2text << endl; <a name="l01577"></a>01577 <span class="preprocessor">#endif</span> <a name="l01578"></a>01578 <span class="preprocessor"></span> <a name="l01579"></a>01579 <span class="keywordflow">if</span> (left && right && !text2indicated || indicated2text) { <a name="l01580"></a>01580 adjacent = <span class="keyword">false</span>; <a name="l01581"></a>01581 <span class="preprocessor">#if DEBUG_CARETMODE > 4</span> <a name="l01582"></a>01582 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"left && right && !text2indicated || indicated2text"</span> << endl; <a name="l01583"></a>01583 <span class="preprocessor">#endif</span> <a name="l01584"></a>01584 <span class="preprocessor"></span> <span class="keywordflow">break</span>; <a name="l01585"></a>01585 } <a name="l01586"></a>01586 <a name="l01587"></a>01587 } <span class="keywordflow">else</span> { <a name="l01588"></a>01588 <span class="comment">// inside boxes are *always* valid</span> <a name="l01589"></a>01589 <span class="preprocessor">#if DEBUG_CARETMODE > 4</span> <a name="l01590"></a>01590 <span class="preprocessor"></span><span class="keywordflow">if</span> (box->isInline()) { <a name="l01591"></a>01591 InlineBox *ibox = box->inlineBox(); <a name="l01592"></a>01592 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"inside "</span> << (!ibox->isInlineFlowBox() || <span class="keyword">static_cast<</span>InlineFlowBox *<span class="keyword">></span>(ibox)-><a class="code" href="classDOM_1_1Node.html#b221c0f56ec53c962850827aa156871e" title="The first child of this node.">firstChild</a>() ? <span class="stringliteral">"non-empty"</span> : <span class="stringliteral">"empty"</span>) << (isIndicatedInlineBox(ibox) ? <span class="stringliteral">" indicated"</span> : <span class="stringliteral">""</span>) << <span class="stringliteral">" adjacent="</span> << adjacent << endl; <a name="l01593"></a>01593 } <a name="l01594"></a>01594 <span class="preprocessor">#if 0</span> <a name="l01595"></a>01595 <span class="preprocessor"></span> RenderStyle *s = ibox->object()->style(); <a name="l01596"></a>01596 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"bordls "</span> << s->borderLeftStyle() <a name="l01597"></a>01597 << <span class="stringliteral">" bordl "</span> << (s->borderLeftStyle() != BNONE) <a name="l01598"></a>01598 << <span class="stringliteral">" bordr "</span> << (s->borderRightStyle() != BNONE) <a name="l01599"></a>01599 << <span class="stringliteral">" bordt "</span> << (s->borderTopStyle() != BNONE) <a name="l01600"></a>01600 << <span class="stringliteral">" bordb "</span> << (s->borderBottomStyle() != BNONE) <a name="l01601"></a>01601 << <span class="stringliteral">" padl "</span> << s->paddingLeft().value() <a name="l01602"></a>01602 << <span class="stringliteral">" padr "</span> << s->paddingRight().value() <a name="l01603"></a>01603 << <span class="stringliteral">" padt "</span> << s->paddingTop().value() <a name="l01604"></a>01604 << <span class="stringliteral">" padb "</span> << s->paddingBottom().value() <a name="l01605"></a>01605 <span class="comment">// ### Can inline elements have top/bottom margins? Couldn't find</span> <a name="l01606"></a>01606 <span class="comment">// it in the CSS 2 spec, but Mozilla ignores them, so we do, too.</span> <a name="l01607"></a>01607 << <span class="stringliteral">" marl "</span> << s->marginLeft().value() <a name="l01608"></a>01608 << <span class="stringliteral">" marr "</span> << s->marginRight().value() <a name="l01609"></a>01609 << endl; <a name="l01610"></a>01610 <span class="preprocessor">#endif</span> <a name="l01611"></a>01611 <span class="preprocessor"></span><span class="preprocessor">#endif</span> <a name="l01612"></a>01612 <span class="preprocessor"></span> <span class="keywordflow">break</span>; <a name="l01613"></a>01613 }<span class="comment">/*end if*/</span> <a name="l01614"></a>01614 <a name="l01615"></a>01615 } <span class="keywordflow">else</span> { <a name="l01616"></a>01616 <a name="l01617"></a>01617 <span class="keywordflow">if</span> (!(*curbox)->isOutside()) { <a name="l01618"></a>01618 <span class="comment">// cannot be adjacent anymore</span> <a name="l01619"></a>01619 adjacent = <span class="keyword">false</span>; <a name="l01620"></a>01620 } <a name="l01621"></a>01621 <a name="l01622"></a>01622 }<span class="comment">/*end if*/</span> <a name="l01623"></a>01623 lastbox = curbox; <a name="l01624"></a>01624 islastuseable = iscuruseable; <a name="l01625"></a>01625 curbox = *<span class="keyword">this</span>; <a name="l01626"></a>01626 iscuruseable = iscominguseable; <a name="l01627"></a>01627 curAtEnd = atEnd; <a name="l01628"></a>01628 <span class="keywordflow">if</span> (!atEnd) { <a name="l01629"></a>01629 <span class="keywordflow">if</span> (toBegin) CaretBoxIterator::operator --(); <span class="keywordflow">else</span> CaretBoxIterator::operator ++(); <a name="l01630"></a>01630 atEnd = *<span class="keyword">this</span> == preBegin || *<span class="keyword">this</span> == end; <a name="l01631"></a>01631 }<span class="comment">/*end if*/</span> <a name="l01632"></a>01632 }<span class="comment">/*wend*/</span> <a name="l01633"></a>01633 <a name="l01634"></a>01634 *<span class="keyword">static_cast<</span>CaretBoxIterator *<span class="keyword">></span>(<span class="keyword">this</span>) = curbox; <a name="l01635"></a>01635 <span class="preprocessor">#if DEBUG_CARETMODE > 4</span> <a name="l01636"></a>01636 <span class="preprocessor"></span><span class="comment">// kdDebug(6200) << "still valid? " << (*this != preBegin && *this != end) << endl;</span> <a name="l01637"></a>01637 <span class="preprocessor">#endif</span> <a name="l01638"></a>01638 <span class="preprocessor"></span><span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l01639"></a>01639 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"---------------"</span> << <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#g634e2de2b699b31ea3a79f984e836d64">k_funcinfo</a> << <span class="stringliteral">"end "</span> << endl; <a name="l01640"></a>01640 <span class="preprocessor">#endif</span> <a name="l01641"></a>01641 <span class="preprocessor"></span>} <a name="l01642"></a>01642 <a name="l01643"></a>01643 <span class="keywordtype">bool</span> EditableCaretBoxIterator::isEditable(<span class="keyword">const</span> CaretBoxIterator &boxit, <span class="keywordtype">bool</span> fromEnd) <a name="l01644"></a>01644 { <a name="l01645"></a>01645 Q_ASSERT(boxit != cbl->end() && boxit != cbl->preBegin()); <a name="l01646"></a>01646 CaretBox *b = *boxit; <a name="l01647"></a>01647 RenderObject *r = b->object(); <a name="l01648"></a>01648 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01649"></a>01649 <span class="preprocessor"></span><span class="comment">// if (b->isInlineFlowBox()) kdDebug(6200) << "b is inline flow box" << (outside ? " (outside)" : "") << endl;</span> <a name="l01650"></a>01650 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"isEditable r"</span> << r << <span class="stringliteral">": "</span> << (r ? r->renderName() : QString::null) << (r && r->isText() ? <span class="stringliteral">" contains \""</span> + <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html">QString</a>(((RenderText *)r)->str->s, QMIN(((RenderText *)r)->str->l,15)) + <span class="stringliteral">"\""</span> : QString::null) << endl; <a name="l01651"></a>01651 <span class="preprocessor">#endif</span> <a name="l01652"></a>01652 <span class="preprocessor"></span> <span class="comment">// Must check caret mode or design mode *after* r->element(), otherwise</span> <a name="l01653"></a>01653 <span class="comment">// lines without a backing DOM node get regarded, leading to a crash.</span> <a name="l01654"></a>01654 <span class="comment">// ### check should actually be in InlineBoxIterator</span> <a name="l01655"></a>01655 NodeImpl *node = r->element(); <a name="l01656"></a>01656 ObjectTraversalState trav; <a name="l01657"></a>01657 mapRenderPosToTraversalState(b->isOutside(), b->isOutsideEnd(), fromEnd, trav); <a name="l01658"></a>01658 <span class="keywordflow">if</span> (isUnsuitable(r, trav) || !node) { <a name="l01659"></a>01659 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l01660"></a>01660 } <a name="l01661"></a>01661 <a name="l01662"></a>01662 <span class="comment">// generally exclude replaced elements with no children from navigation</span> <a name="l01663"></a>01663 <span class="keywordflow">if</span> (!b->isOutside() && r->isRenderReplaced() && !r->firstChild()) <a name="l01664"></a>01664 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l01665"></a>01665 <a name="l01666"></a>01666 RenderObject *eff_r = r; <a name="l01667"></a>01667 <span class="keywordtype">bool</span> globallyNavigable = m_part->isCaretMode() || m_part->isEditable(); <a name="l01668"></a>01668 <a name="l01669"></a>01669 <span class="comment">// calculate the parent element's editability if this inline box is outside.</span> <a name="l01670"></a>01670 <span class="keywordflow">if</span> (b->isOutside() && !globallyNavigable) { <a name="l01671"></a>01671 NodeImpl *par = node->parent(); <a name="l01672"></a>01672 <span class="comment">// I wonder whether par can be 0. It shouldn't be possible if the</span> <a name="l01673"></a>01673 <span class="comment">// algorithm contained no bugs.</span> <a name="l01674"></a>01674 Q_ASSERT(par); <a name="l01675"></a>01675 <span class="keywordflow">if</span> (par) node = par; <a name="l01676"></a>01676 eff_r = node->renderer(); <a name="l01677"></a>01677 Q_ASSERT(eff_r); <span class="comment">// this is a hard requirement</span> <a name="l01678"></a>01678 } <a name="l01679"></a>01679 <a name="l01680"></a>01680 <span class="keywordtype">bool</span> result = globallyNavigable || eff_r->style()->userInput() == UI_ENABLED; <a name="l01681"></a>01681 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01682"></a>01682 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << result << endl; <a name="l01683"></a>01683 <span class="preprocessor">#endif</span> <a name="l01684"></a>01684 <span class="preprocessor"></span> <span class="keywordflow">return</span> result; <a name="l01685"></a>01685 } <a name="l01686"></a>01686 <a name="l01687"></a>01687 <span class="comment">// == class EditableLineIterator implementation</span> <a name="l01688"></a>01688 <a name="l01689"></a>01689 <span class="keywordtype">void</span> EditableLineIterator::advance(<span class="keywordtype">bool</span> toBegin) <a name="l01690"></a>01690 { <a name="l01691"></a>01691 CaretAdvancePolicy advpol = lines->advancePolicy(); <a name="l01692"></a>01692 LineIterator lasteditable, lastindicated; <a name="l01693"></a>01693 <span class="keywordtype">bool</span> haslasteditable = <span class="keyword">false</span>; <a name="l01694"></a>01694 <span class="keywordtype">bool</span> haslastindicated = <span class="keyword">false</span>; <a name="l01695"></a>01695 <span class="keywordtype">bool</span> uselasteditable = <span class="keyword">false</span>; <a name="l01696"></a>01696 <a name="l01697"></a>01697 LineIterator::advance(toBegin); <a name="l01698"></a>01698 <span class="keywordflow">while</span> (cbl) { <a name="l01699"></a>01699 <span class="keywordflow">if</span> (isEditable(*<span class="keyword">this</span>)) { <a name="l01700"></a>01700 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l01701"></a>01701 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"advance: "</span> << cbl->enclosingObject() << <span class="stringliteral">"@"</span> << cbl->enclosingObject()->renderName() << <span class="stringliteral">".node "</span> << cbl->enclosingObject()->element() << <span class="stringliteral">"["</span> << (cbl->enclosingObject()->element() ? cbl->enclosingObject()->element()->nodeName().string() : QString::null) << <span class="stringliteral">"]"</span> << endl; <a name="l01702"></a>01702 <span class="preprocessor">#endif</span> <a name="l01703"></a>01703 <span class="preprocessor"></span> <a name="l01704"></a>01704 <span class="keywordtype">bool</span> hasindicated = isIndicatedFlow(cbl->enclosingObject()); <a name="l01705"></a>01705 <span class="keywordflow">if</span> (hasindicated) { <a name="l01706"></a>01706 haslastindicated = <span class="keyword">true</span>; <a name="l01707"></a>01707 lastindicated = *<span class="keyword">this</span>; <a name="l01708"></a>01708 } <a name="l01709"></a>01709 <a name="l01710"></a>01710 <span class="keywordflow">switch</span> (advpol) { <a name="l01711"></a>01711 <span class="keywordflow">case</span> IndicatedFlows: <a name="l01712"></a>01712 <span class="keywordflow">if</span> (hasindicated) <span class="keywordflow">goto</span> wend; <a name="l01713"></a>01713 <span class="comment">// fall through</span> <a name="l01714"></a>01714 <span class="keywordflow">case</span> LeafsOnly: <a name="l01715"></a>01715 <span class="keywordflow">if</span> (cbl->isOutside()) <span class="keywordflow">break</span>; <a name="l01716"></a>01716 <span class="comment">// fall through</span> <a name="l01717"></a>01717 <span class="keywordflow">case</span> VisibleFlows: <span class="keywordflow">goto</span> wend; <a name="l01718"></a>01718 }<span class="comment">/*end switch*/</span> <a name="l01719"></a>01719 <a name="l01720"></a>01720 <span class="comment">// remember rejected editable element</span> <a name="l01721"></a>01721 lasteditable = *<span class="keyword">this</span>; <a name="l01722"></a>01722 haslasteditable = <span class="keyword">true</span>; <a name="l01723"></a>01723 <span class="preprocessor">#if DEBUG_CARETMODE > 4</span> <a name="l01724"></a>01724 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"remembered lasteditable "</span> << *lasteditable << endl; <a name="l01725"></a>01725 <span class="preprocessor">#endif</span> <a name="l01726"></a>01726 <span class="preprocessor"></span> } <span class="keywordflow">else</span> { <a name="l01727"></a>01727 <a name="l01728"></a>01728 <span class="comment">// If this element isn't editable, but the last one was, and it was only</span> <a name="l01729"></a>01729 <span class="comment">// rejected because it didn't match the caret advance policy, force it.</span> <a name="l01730"></a>01730 <span class="comment">// Otherwise certain combinations of editable and uneditable elements</span> <a name="l01731"></a>01731 <span class="comment">// could never be reached with some policies.</span> <a name="l01732"></a>01732 <span class="keywordflow">if</span> (haslasteditable) { uselasteditable = <span class="keyword">true</span>; <span class="keywordflow">break</span>; } <a name="l01733"></a>01733 <a name="l01734"></a>01734 } <a name="l01735"></a>01735 LineIterator::advance(toBegin); <a name="l01736"></a>01736 }<span class="comment">/*wend*/</span> <a name="l01737"></a>01737 wend: <a name="l01738"></a>01738 <a name="l01739"></a>01739 <span class="keywordflow">if</span> (uselasteditable) *<span class="keyword">this</span> = haslastindicated ? lastindicated : lasteditable; <a name="l01740"></a>01740 <span class="keywordflow">if</span> (!cbl && haslastindicated) *<span class="keyword">this</span> = lastindicated; <a name="l01741"></a>01741 } <a name="l01742"></a>01742 <a name="l01743"></a>01743 <span class="comment">// == class EditableCharacterIterator implementation</span> <a name="l01744"></a>01744 <a name="l01745"></a>01745 <span class="keywordtype">void</span> EditableCharacterIterator::initFirstChar() <a name="l01746"></a>01746 { <a name="l01747"></a>01747 CaretBox *box = *ebit; <a name="l01748"></a>01748 InlineBox *b = box->inlineBox(); <a name="l01749"></a>01749 <span class="keywordflow">if</span> (_offset == box->maxOffset()) <a name="l01750"></a>01750 peekNext(); <a name="l01751"></a>01751 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (b && !box->isOutside() && b->isInlineTextBox()) <a name="l01752"></a>01752 _char = static_cast<RenderText *>(b->object())->str->s[_offset].unicode(); <a name="l01753"></a>01753 <span class="keywordflow">else</span> <a name="l01754"></a>01754 _char = -1; <a name="l01755"></a>01755 } <a name="l01756"></a>01756 <a name="l01760"></a>01760 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> isCaretBoxEmpty(CaretBox *box) { <a name="l01761"></a>01761 <span class="keywordflow">if</span> (!box->isInline()) <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l01762"></a>01762 InlineBox *ibox = box->inlineBox(); <a name="l01763"></a>01763 <span class="keywordflow">return</span> ibox->isInlineFlowBox() <a name="l01764"></a>01764 && !<span class="keyword">static_cast<</span>InlineFlowBox *<span class="keyword">></span>(ibox)-><a class="code" href="classDOM_1_1Node.html#b221c0f56ec53c962850827aa156871e" title="The first child of this node.">firstChild</a>() <a name="l01765"></a>01765 && !isIndicatedInlineBox(ibox); <a name="l01766"></a>01766 } <a name="l01767"></a>01767 <a name="l01768"></a>01768 EditableCharacterIterator &EditableCharacterIterator::operator ++() <a name="l01769"></a>01769 { <a name="l01770"></a>01770 _offset++; <a name="l01771"></a>01771 <a name="l01772"></a>01772 CaretBox *box = *ebit; <a name="l01773"></a>01773 InlineBox *b = box->inlineBox(); <a name="l01774"></a>01774 <span class="keywordtype">long</span> maxofs = box->maxOffset(); <a name="l01775"></a>01775 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01776"></a>01776 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"box->maxOffset() "</span> << box->maxOffset() << <span class="stringliteral">" box->minOffset() "</span> << box->minOffset() << endl; <a name="l01777"></a>01777 <span class="preprocessor">#endif</span> <a name="l01778"></a>01778 <span class="preprocessor"></span> <span class="keywordflow">if</span> (_offset == maxofs) { <a name="l01779"></a>01779 <span class="preprocessor">#if DEBUG_CARETMODE > 2</span> <a name="l01780"></a>01780 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"_offset == maxofs: "</span> << _offset << <span class="stringliteral">" == "</span> << maxofs << endl; <a name="l01781"></a>01781 <span class="preprocessor">#endif</span> <a name="l01782"></a>01782 <span class="preprocessor"></span> peekNext(); <a name="l01783"></a>01783 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (_offset > maxofs) { <a name="l01784"></a>01784 <span class="preprocessor">#if DEBUG_CARETMODE > 2</span> <a name="l01785"></a>01785 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"_offset > maxofs: "</span> << _offset << <span class="stringliteral">" > "</span> << maxofs <span class="comment">/*<< " _peekNext: " << _peekNext*/</span> << endl; <a name="l01786"></a>01786 <span class="preprocessor">#endif</span> <a name="l01787"></a>01787 <span class="preprocessor"></span> <span class="keywordflow">if</span> (<span class="keyword">true</span>) { <a name="l01788"></a>01788 ++ebit; <a name="l01789"></a>01789 <span class="keywordflow">if</span> (ebit == (*_it)->end()) { <span class="comment">// end of line reached, go to next line</span> <a name="l01790"></a>01790 ++_it; <a name="l01791"></a>01791 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l01792"></a>01792 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"++_it"</span> << endl; <a name="l01793"></a>01793 <span class="preprocessor">#endif</span> <a name="l01794"></a>01794 <span class="preprocessor"></span> <span class="keywordflow">if</span> (_it != _it.lines->end()) { <a name="l01795"></a>01795 ebit = _it; <a name="l01796"></a>01796 box = *ebit; <a name="l01797"></a>01797 b = box->inlineBox(); <a name="l01798"></a>01798 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l01799"></a>01799 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"box "</span> << box << <span class="stringliteral">" b "</span> << b << <span class="stringliteral">" isText "</span> << box->isInlineTextBox() << endl; <a name="l01800"></a>01800 <span class="preprocessor">#endif</span> <a name="l01801"></a>01801 <span class="preprocessor"></span> <a name="l01802"></a>01802 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l01803"></a>01803 <span class="preprocessor"></span> RenderObject *_r = box->object(); <a name="l01804"></a>01804 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"_r "</span> << _r << <span class="stringliteral">":"</span> << _r->element()->nodeName().string() << endl; <a name="l01805"></a>01805 <span class="preprocessor">#endif</span> <a name="l01806"></a>01806 <span class="preprocessor"></span> _offset = box->minOffset(); <a name="l01807"></a>01807 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l01808"></a>01808 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"_offset "</span> << _offset << endl; <a name="l01809"></a>01809 <span class="preprocessor">#endif</span> <a name="l01810"></a>01810 <span class="preprocessor"></span> } <span class="keywordflow">else</span> { <a name="l01811"></a>01811 b = 0; <a name="l01812"></a>01812 _end = <span class="keyword">true</span>; <a name="l01813"></a>01813 }<span class="comment">/*end if*/</span> <a name="l01814"></a>01814 <span class="keywordflow">goto</span> readchar; <a name="l01815"></a>01815 }<span class="comment">/*end if*/</span> <a name="l01816"></a>01816 }<span class="comment">/*end if*/</span> <a name="l01817"></a>01817 <a name="l01818"></a>01818 <span class="keywordtype">bool</span> adjacent = ebit.isAdjacent(); <a name="l01819"></a>01819 <span class="preprocessor">#if 0</span> <a name="l01820"></a>01820 <span class="preprocessor"></span> <span class="comment">// Jump over element if this one is not a text node.</span> <a name="l01821"></a>01821 <span class="keywordflow">if</span> (adjacent && !(*ebit)->isInlineTextBox()) { <a name="l01822"></a>01822 EditableCaretBoxIterator <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/namespaceKStdAccel.html#b28b820eb56ff87f06351029249f994c">copy</a> = ebit; <a name="l01823"></a>01823 ++ebit; <a name="l01824"></a>01824 <span class="keywordflow">if</span> (ebit != (*_it)->end() && (*ebit)->isInlineTextBox() <a name="l01825"></a>01825 <span class="comment">/*&& (!(*ebit)->isInlineFlowBox()</span> <a name="l01826"></a>01826 <span class="comment"> || static_cast<InlineFlowBox *>(*ebit)->)*/</span>) <a name="l01827"></a>01827 adjacent = <span class="keyword">false</span>; <a name="l01828"></a>01828 <span class="keywordflow">else</span> ebit = copy; <a name="l01829"></a>01829 }<span class="comment">/*end if*/</span> <a name="l01830"></a>01830 <span class="preprocessor">#endif</span> <a name="l01831"></a>01831 <span class="preprocessor"></span> <span class="comment">// Jump over empty elements.</span> <a name="l01832"></a>01832 <span class="keywordflow">if</span> (adjacent && !(*ebit)->isInlineTextBox()) { <a name="l01833"></a>01833 <span class="keywordtype">bool</span> noemptybox = <span class="keyword">true</span>; <a name="l01834"></a>01834 <span class="keywordflow">while</span> (isCaretBoxEmpty(*ebit)) { <a name="l01835"></a>01835 noemptybox = <span class="keyword">false</span>; <a name="l01836"></a>01836 EditableCaretBoxIterator copy = ebit; <a name="l01837"></a>01837 ++ebit; <a name="l01838"></a>01838 <span class="keywordflow">if</span> (ebit == (*_it)->end()) { ebit = copy; <span class="keywordflow">break</span>; } <a name="l01839"></a>01839 } <a name="l01840"></a>01840 <span class="keywordflow">if</span> (noemptybox) adjacent = <span class="keyword">false</span>; <a name="l01841"></a>01841 }<span class="comment">/*end if*/</span> <a name="l01842"></a>01842 <span class="comment">// _r = (*ebit)->object();</span> <a name="l01843"></a>01843 <span class="comment">/*if (!_it.outside) */</span>_offset = (*ebit)->minOffset() + adjacent; <a name="l01844"></a>01844 <span class="comment">//_peekNext = 0;</span> <a name="l01845"></a>01845 box = *ebit; <a name="l01846"></a>01846 b = box->inlineBox(); <a name="l01847"></a>01847 <span class="keywordflow">goto</span> readchar; <a name="l01848"></a>01848 } <span class="keywordflow">else</span> { <a name="l01849"></a>01849 readchar: <a name="l01850"></a>01850 <span class="comment">// get character</span> <a name="l01851"></a>01851 <span class="keywordflow">if</span> (b && !box->isOutside() && b->isInlineTextBox() && _offset < b->maxOffset()) <a name="l01852"></a>01852 _char = static_cast<RenderText *>(b->object())->str->s[_offset].unicode(); <a name="l01853"></a>01853 <span class="keywordflow">else</span> <a name="l01854"></a>01854 _char = -1; <a name="l01855"></a>01855 }<span class="comment">/*end if*/</span> <a name="l01856"></a>01856 <span class="preprocessor">#if DEBUG_CARETMODE > 2</span> <a name="l01857"></a>01857 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"_offset: "</span> << _offset <span class="comment">/*<< " _peekNext: " << _peekNext*/</span> << <span class="stringliteral">" char '"</span> << (char)_char << <span class="stringliteral">"'"</span> << endl; <a name="l01858"></a>01858 <span class="preprocessor">#endif</span> <a name="l01859"></a>01859 <span class="preprocessor"></span> <a name="l01860"></a>01860 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01861"></a>01861 <span class="preprocessor"></span> <span class="keywordflow">if</span> (!_end && ebit != (*_it)->end()) { <a name="l01862"></a>01862 CaretBox *box = *ebit; <a name="l01863"></a>01863 RenderObject *_r = box->object(); <a name="l01864"></a>01864 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"echit++(1): box "</span> << box << (box && box->isInlineTextBox() ? <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html">QString</a>(<span class="stringliteral">" contains \"%1\""</span>).arg(<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qconststring.html">QConstString</a>(static_cast<RenderText *>(box->object())->str->s+box->minOffset(), box->maxOffset() - box->minOffset()).<span class="keywordtype">string</span>()) : QString::null) << <span class="stringliteral">" _r "</span> << (_r ? _r->element()->nodeName().string() : <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html">QString</a>(<span class="stringliteral">"<nil>"</span>)) << endl; <a name="l01865"></a>01865 } <a name="l01866"></a>01866 <span class="preprocessor">#endif</span> <a name="l01867"></a>01867 <span class="preprocessor"></span> <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l01868"></a>01868 } <a name="l01869"></a>01869 <a name="l01870"></a>01870 EditableCharacterIterator &EditableCharacterIterator::operator --() <a name="l01871"></a>01871 { <a name="l01872"></a>01872 _offset--; <a name="l01873"></a>01873 <span class="comment">//kdDebug(6200) << "--: _offset=" << _offset << endl;</span> <a name="l01874"></a>01874 <a name="l01875"></a>01875 CaretBox *box = *ebit; <a name="l01876"></a>01876 CaretBox *_peekPrev = 0; <a name="l01877"></a>01877 CaretBox *_peekNext = 0; <a name="l01878"></a>01878 InlineBox *b = box->inlineBox(); <a name="l01879"></a>01879 <span class="keywordtype">long</span> minofs = box->minOffset(); <a name="l01880"></a>01880 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01881"></a>01881 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"box->maxOffset() "</span> << box->maxOffset() << <span class="stringliteral">" box->minOffset() "</span> << box->minOffset() << endl; <a name="l01882"></a>01882 <span class="preprocessor">#endif</span> <a name="l01883"></a>01883 <span class="preprocessor"></span> <span class="keywordflow">if</span> (_offset == minofs) { <a name="l01884"></a>01884 <span class="preprocessor">#if DEBUG_CARETMODE > 2</span> <a name="l01885"></a>01885 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"_offset == minofs: "</span> << _offset << <span class="stringliteral">" == "</span> << minofs << endl; <a name="l01886"></a>01886 <span class="preprocessor">#endif</span> <a name="l01887"></a>01887 <span class="preprocessor"></span><span class="comment">// _peekNext = b;</span> <a name="l01888"></a>01888 <span class="comment">// get character</span> <a name="l01889"></a>01889 <span class="keywordflow">if</span> (b && !box->isOutside() && b->isInlineTextBox()) <a name="l01890"></a>01890 _char = static_cast<RenderText *>(b->object())->text()[_offset].unicode(); <a name="l01891"></a>01891 <span class="keywordflow">else</span> <a name="l01892"></a>01892 _char = -1; <a name="l01893"></a>01893 <a name="l01894"></a>01894 <span class="comment">//peekPrev();</span> <a name="l01895"></a>01895 <span class="keywordtype">bool</span> do_prev = <span class="keyword">false</span>; <a name="l01896"></a>01896 { <a name="l01897"></a>01897 EditableCaretBoxIterator copy; <a name="l01898"></a>01898 _peekPrev = 0; <a name="l01899"></a>01899 <span class="keywordflow">do</span> { <a name="l01900"></a>01900 copy = ebit; <a name="l01901"></a>01901 --ebit; <a name="l01902"></a>01902 <span class="keywordflow">if</span> (ebit == (*_it)->preBegin()) { ebit = copy; <span class="keywordflow">break</span>; } <a name="l01903"></a>01903 } <span class="keywordflow">while</span> (isCaretBoxEmpty(*ebit)); <a name="l01904"></a>01904 <span class="comment">// Jump to end of previous element if it's adjacent, and a text box</span> <a name="l01905"></a>01905 <span class="keywordflow">if</span> (ebit.isAdjacent() && ebit != (*_it)->preBegin() && (*ebit)->isInlineTextBox()) { <a name="l01906"></a>01906 _peekPrev = *ebit; <a name="l01907"></a>01907 do_prev = <span class="keyword">true</span>; <a name="l01908"></a>01908 } <span class="keywordflow">else</span> <a name="l01909"></a>01909 ebit = copy; <a name="l01910"></a>01910 } <a name="l01911"></a>01911 <span class="keywordflow">if</span> (do_prev) <span class="keywordflow">goto</span> prev; <a name="l01912"></a>01912 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (_offset < minofs) { <a name="l01913"></a>01913 prev: <a name="l01914"></a>01914 <span class="preprocessor">#if DEBUG_CARETMODE > 2</span> <a name="l01915"></a>01915 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"_offset < minofs: "</span> << _offset << <span class="stringliteral">" < "</span> << minofs <span class="comment">/*<< " _peekNext: " << _peekNext*/</span> << endl; <a name="l01916"></a>01916 <span class="preprocessor">#endif</span> <a name="l01917"></a>01917 <span class="preprocessor"></span> <span class="keywordflow">if</span> (!_peekPrev) { <a name="l01918"></a>01918 _peekNext = *ebit; <a name="l01919"></a>01919 --ebit; <a name="l01920"></a>01920 <span class="keywordflow">if</span> (ebit == (*_it)->preBegin()) { <span class="comment">// end of line reached, go to previous line</span> <a name="l01921"></a>01921 --_it; <a name="l01922"></a>01922 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l01923"></a>01923 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"--_it"</span> << endl; <a name="l01924"></a>01924 <span class="preprocessor">#endif</span> <a name="l01925"></a>01925 <span class="preprocessor"></span> <span class="keywordflow">if</span> (_it != _it.lines->preBegin()) { <a name="l01926"></a>01926 <span class="comment">// kdDebug(6200) << "begin from end!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;</span> <a name="l01927"></a>01927 ebit = EditableCaretBoxIterator(_it, <span class="keyword">true</span>); <a name="l01928"></a>01928 box = *ebit; <a name="l01929"></a>01929 <span class="comment">// RenderObject *r = box->object();</span> <a name="l01930"></a>01930 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l01931"></a>01931 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"box "</span> << box << <span class="stringliteral">" b "</span> << box->inlineBox() << <span class="stringliteral">" isText "</span> << box->isInlineTextBox() << endl; <a name="l01932"></a>01932 <span class="preprocessor">#endif</span> <a name="l01933"></a>01933 <span class="preprocessor"></span> _offset = box->maxOffset(); <a name="l01934"></a>01934 <span class="comment">// if (!_it.outside) _offset = r->isBR() ? (*ebit)->minOffset() : (*ebit)->maxOffset();</span> <a name="l01935"></a>01935 _char = -1; <a name="l01936"></a>01936 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01937"></a>01937 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"echit--(2): box "</span> << box << <span class="stringliteral">" b "</span> << box->inlineBox() << (box->isInlineTextBox() ? <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html">QString</a>(<span class="stringliteral">" contains \"%1\""</span>).arg(<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qconststring.html">QConstString</a>(static_cast<RenderText *>(box->object())->str->s+box->minOffset(), box->maxOffset() - box->minOffset()).<span class="keywordtype">string</span>()) : QString::null) << endl; <a name="l01938"></a>01938 <span class="preprocessor">#endif</span> <a name="l01939"></a>01939 <span class="preprocessor"></span> } <span class="keywordflow">else</span> <a name="l01940"></a>01940 _end = <span class="keyword">true</span>; <a name="l01941"></a>01941 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l01942"></a>01942 }<span class="comment">/*end if*/</span> <a name="l01943"></a>01943 }<span class="comment">/*end if*/</span> <a name="l01944"></a>01944 <a name="l01945"></a>01945 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01946"></a>01946 <span class="preprocessor"></span> <span class="keywordtype">bool</span> adjacent = ebit.isAdjacent(); <a name="l01947"></a>01947 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"adjacent "</span> << adjacent << <span class="stringliteral">" _peekNext "</span> << _peekNext << <span class="stringliteral">" _peekNext->isInlineTextBox: "</span> << (_peekNext ? _peekNext->isInlineTextBox() : <span class="keyword">false</span>) << <span class="stringliteral">" !((*ebit)->isInlineTextBox): "</span> << (*ebit ? !(*ebit)->isInlineTextBox() : <span class="keyword">true</span>) << endl; <a name="l01948"></a>01948 <span class="preprocessor">#endif</span> <a name="l01949"></a>01949 <span class="preprocessor"></span><span class="preprocessor">#if 0</span> <a name="l01950"></a>01950 <span class="preprocessor"></span> <span class="comment">// Ignore this box if it isn't a text box, but the previous box was</span> <a name="l01951"></a>01951 <span class="keywordflow">if</span> (adjacent && _peekNext && _peekNext->isInlineTextBox() <a name="l01952"></a>01952 && !(*ebit)->isInlineTextBox()) { <a name="l01953"></a>01953 EditableCaretBoxIterator copy = ebit; <a name="l01954"></a>01954 --ebit; <a name="l01955"></a>01955 <span class="keywordflow">if</span> (ebit == (*_it)->preBegin()) <span class="comment">/*adjacent = false;</span> <a name="l01956"></a>01956 <span class="comment"> else */</span>ebit = copy; <a name="l01957"></a>01957 }<span class="comment">/*end if*/</span> <a name="l01958"></a>01958 <span class="preprocessor">#endif</span> <a name="l01959"></a>01959 <span class="preprocessor"></span><span class="preprocessor">#if 0</span> <a name="l01960"></a>01960 <span class="preprocessor"></span> <span class="comment">// Jump over empty elements.</span> <a name="l01961"></a>01961 <span class="keywordflow">if</span> (adjacent <span class="comment">//&& _peekNext && _peekNext->isInlineTextBox()</span> <a name="l01962"></a>01962 && !(*ebit)->isInlineTextBox()) { <a name="l01963"></a>01963 <span class="keywordtype">bool</span> noemptybox = <span class="keyword">true</span>; <a name="l01964"></a>01964 <span class="keywordflow">while</span> (isCaretBoxEmpty(*ebit)) { <a name="l01965"></a>01965 noemptybox = <span class="keyword">false</span>; <a name="l01966"></a>01966 EditableCaretBoxIterator copy = ebit; <a name="l01967"></a>01967 --ebit; <a name="l01968"></a>01968 <span class="keywordflow">if</span> (ebit == (*_it)->preBegin()) { ebit = copy; <span class="keywordflow">break</span>; } <a name="l01969"></a>01969 <span class="keywordflow">else</span> _peekNext = *copy; <a name="l01970"></a>01970 } <a name="l01971"></a>01971 <span class="keywordflow">if</span> (noemptybox) adjacent = <span class="keyword">false</span>; <a name="l01972"></a>01972 }<span class="comment">/*end if*/</span> <a name="l01973"></a>01973 <span class="preprocessor">#endif</span> <a name="l01974"></a>01974 <span class="preprocessor"></span><span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01975"></a>01975 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"(*ebit)->obj "</span> << (*ebit)->object()->renderName() << <span class="stringliteral">"["</span> << (*ebit)->object() << <span class="stringliteral">"]"</span> << <span class="stringliteral">" minOffset: "</span> << (*ebit)->minOffset() << <span class="stringliteral">" maxOffset: "</span> << (*ebit)->maxOffset() << endl; <a name="l01976"></a>01976 <span class="preprocessor">#endif</span> <a name="l01977"></a>01977 <span class="preprocessor"></span><span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l01978"></a>01978 <span class="preprocessor"></span> RenderObject *_r = (*ebit)->object(); <a name="l01979"></a>01979 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"_r "</span> << _r << <span class="stringliteral">":"</span> << _r->element()->nodeName().string() << endl; <a name="l01980"></a>01980 <span class="preprocessor">#endif</span> <a name="l01981"></a>01981 <span class="preprocessor"></span> _offset = (*ebit)->maxOffset(); <a name="l01982"></a>01982 <span class="comment">// if (!_it.outside) _offset = (*ebit)->maxOffset()/* - adjacent*/;</span> <a name="l01983"></a>01983 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l01984"></a>01984 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"_offset "</span> << _offset << endl; <a name="l01985"></a>01985 <span class="preprocessor">#endif</span> <a name="l01986"></a>01986 <span class="preprocessor"></span> _peekPrev = 0; <a name="l01987"></a>01987 } <span class="keywordflow">else</span> { <a name="l01988"></a>01988 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l01989"></a>01989 <span class="preprocessor"></span><a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"_offset: "</span> << _offset << <span class="stringliteral">" _peekNext: "</span> << _peekNext << endl; <a name="l01990"></a>01990 <span class="preprocessor">#endif</span> <a name="l01991"></a>01991 <span class="preprocessor"></span> <span class="comment">// get character</span> <a name="l01992"></a>01992 <span class="keywordflow">if</span> (_peekNext && _offset >= box->maxOffset() && _peekNext->isInlineTextBox()) <a name="l01993"></a>01993 _char = static_cast<RenderText *>(_peekNext->object())->text()[_peekNext->minOffset()].unicode(); <a name="l01994"></a>01994 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (b && _offset < b->maxOffset() && b->isInlineTextBox()) <a name="l01995"></a>01995 _char = static_cast<RenderText *>(b->object())->text()[_offset].unicode(); <a name="l01996"></a>01996 <span class="keywordflow">else</span> <a name="l01997"></a>01997 _char = -1; <a name="l01998"></a>01998 }<span class="comment">/*end if*/</span> <a name="l01999"></a>01999 <a name="l02000"></a>02000 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l02001"></a>02001 <span class="preprocessor"></span> <span class="keywordflow">if</span> (!_end && ebit != (*_it)->preBegin()) { <a name="l02002"></a>02002 CaretBox *box = *ebit; <a name="l02003"></a>02003 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"echit--(1): box "</span> << box << <span class="stringliteral">" b "</span> << box->inlineBox() << (box->isInlineTextBox() ? <a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qstring.html">QString</a>(<span class="stringliteral">" contains \"%1\""</span>).arg(<a class="codeRef" doxygen="qt.tag:/usr/lib/qt3/doc/html/" href="/usr/lib/qt3/doc/html/qconststring.html">QConstString</a>(static_cast<RenderText *>(box->object())->str->s+box->minOffset(), box->maxOffset() - box->minOffset()).<span class="keywordtype">string</span>()) : QString::null) << endl; <a name="l02004"></a>02004 } <a name="l02005"></a>02005 <span class="preprocessor">#endif</span> <a name="l02006"></a>02006 <span class="preprocessor"></span> <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l02007"></a>02007 } <a name="l02008"></a>02008 <a name="l02009"></a>02009 <span class="comment">// == class TableRowIterator implementation</span> <a name="l02010"></a>02010 <a name="l02011"></a>02011 TableRowIterator::TableRowIterator(RenderTable *table, <span class="keywordtype">bool</span> fromEnd, <a name="l02012"></a>02012 RenderTableSection::RowStruct *row) <a name="l02013"></a>02013 : sec(table, fromEnd) <a name="l02014"></a>02014 { <a name="l02015"></a>02015 <span class="comment">// set index</span> <a name="l02016"></a>02016 <span class="keywordflow">if</span> (*sec) { <a name="l02017"></a>02017 <span class="keywordflow">if</span> (fromEnd) index = (*sec)->grid.size() - 1; <a name="l02018"></a>02018 <span class="keywordflow">else</span> index = 0; <a name="l02019"></a>02019 }<span class="comment">/*end if*/</span> <a name="l02020"></a>02020 <a name="l02021"></a>02021 <span class="comment">// initialize with given row</span> <a name="l02022"></a>02022 <span class="keywordflow">if</span> (row && *sec) { <a name="l02023"></a>02023 <span class="keywordflow">while</span> (<span class="keyword">operator</span> *() != row) <a name="l02024"></a>02024 <span class="keywordflow">if</span> (fromEnd) operator --(); <span class="keywordflow">else</span> operator ++(); <a name="l02025"></a>02025 }<span class="comment">/*end if*/</span> <a name="l02026"></a>02026 } <a name="l02027"></a>02027 <a name="l02028"></a>02028 TableRowIterator &TableRowIterator::operator ++() <a name="l02029"></a>02029 { <a name="l02030"></a>02030 index++; <a name="l02031"></a>02031 <a name="l02032"></a>02032 <span class="keywordflow">if</span> (index >= (<span class="keywordtype">int</span>)(*sec)->grid.size()) { <a name="l02033"></a>02033 ++sec; <a name="l02034"></a>02034 <a name="l02035"></a>02035 <span class="keywordflow">if</span> (*sec) index = 0; <a name="l02036"></a>02036 }<span class="comment">/*end if*/</span> <a name="l02037"></a>02037 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l02038"></a>02038 } <a name="l02039"></a>02039 <a name="l02040"></a>02040 TableRowIterator &TableRowIterator::operator --() <a name="l02041"></a>02041 { <a name="l02042"></a>02042 index--; <a name="l02043"></a>02043 <a name="l02044"></a>02044 <span class="keywordflow">if</span> (index < 0) { <a name="l02045"></a>02045 --sec; <a name="l02046"></a>02046 <a name="l02047"></a>02047 <span class="keywordflow">if</span> (*sec) index = (*sec)->grid.size() - 1; <a name="l02048"></a>02048 }<span class="comment">/*end if*/</span> <a name="l02049"></a>02049 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l02050"></a>02050 } <a name="l02051"></a>02051 <a name="l02052"></a>02052 <span class="comment">// == class ErgonomicEditableLineIterator implementation</span> <a name="l02053"></a>02053 <a name="l02054"></a>02054 <span class="comment">// some decls</span> <a name="l02055"></a>02055 <span class="keyword">static</span> RenderTableCell *findNearestTableCellInRow(<a class="code" href="classKHTMLPart.html" title="This class is khtml&#39;s main class.">KHTMLPart</a> *part, <span class="keywordtype">int</span> x, <a name="l02056"></a>02056 RenderTableSection::RowStruct *row, <span class="keywordtype">bool</span> fromEnd); <a name="l02057"></a>02057 <a name="l02071"></a>02071 <span class="keyword">static</span> <span class="keyword">inline</span> RenderTableCell *findNearestTableCell(<a class="code" href="classKHTMLPart.html" title="This class is khtml&#39;s main class.">KHTMLPart</a> *part, <span class="keywordtype">int</span> x, <a name="l02072"></a>02072 TableRowIterator &it, <span class="keywordtype">bool</span> fromEnd) <a name="l02073"></a>02073 { <a name="l02074"></a>02074 RenderTableCell *result = 0; <a name="l02075"></a>02075 <a name="l02076"></a>02076 <span class="keywordflow">while</span> (*it) { <a name="l02077"></a>02077 result = findNearestTableCellInRow(part, x, *it, fromEnd); <a name="l02078"></a>02078 <span class="keywordflow">if</span> (result) <span class="keywordflow">break</span>; <a name="l02079"></a>02079 <a name="l02080"></a>02080 <span class="keywordflow">if</span> (fromEnd) --it; <span class="keywordflow">else</span> ++it; <a name="l02081"></a>02081 }<span class="comment">/*wend*/</span> <a name="l02082"></a>02082 <a name="l02083"></a>02083 <span class="keywordflow">return</span> result; <a name="l02084"></a>02084 } <a name="l02085"></a>02085 <a name="l02099"></a>02099 <span class="keyword">static</span> RenderTableCell *findNearestTableCellInRow(<a class="code" href="classKHTMLPart.html" title="This class is khtml&#39;s main class.">KHTMLPart</a> *part, <span class="keywordtype">int</span> x, <a name="l02100"></a>02100 RenderTableSection::RowStruct *row, <span class="keywordtype">bool</span> fromEnd) <a name="l02101"></a>02101 { <a name="l02102"></a>02102 <span class="comment">// First pass. Find spatially nearest cell.</span> <a name="l02103"></a>02103 <span class="keywordtype">int</span> n = (int)row->row->size(); <a name="l02104"></a>02104 <span class="keywordtype">int</span> i; <a name="l02105"></a>02105 <span class="keywordflow">for</span> (i = 0; i < n; i++) { <a name="l02106"></a>02106 RenderTableCell *cell = row->row->at(i); <a name="l02107"></a>02107 <span class="keywordflow">if</span> (!cell || (<span class="keywordtype">long</span>)cell == -1) <span class="keywordflow">continue</span>; <a name="l02108"></a>02108 <a name="l02109"></a>02109 <span class="keywordtype">int</span> absx, absy; <a name="l02110"></a>02110 cell->absolutePosition(absx, absy, <span class="keyword">false</span>); <span class="comment">// ### position: fixed?</span> <a name="l02111"></a>02111 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l02112"></a>02112 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"i/n "</span> << i << <span class="stringliteral">"/"</span> << n << <span class="stringliteral">" absx "</span> << absx << <span class="stringliteral">" absy "</span> << absy << endl; <a name="l02113"></a>02113 <span class="preprocessor">#endif</span> <a name="l02114"></a>02114 <span class="preprocessor"></span> <a name="l02115"></a>02115 <span class="comment">// I rely on the assumption that all cells are in ascending visual order</span> <a name="l02116"></a>02116 <span class="comment">// ### maybe this assumption is wrong for bidi?</span> <a name="l02117"></a>02117 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l02118"></a>02118 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"x "</span> << x << <span class="stringliteral">" < "</span> << (absx + cell->width()) << <span class="stringliteral">"?"</span> << endl; <a name="l02119"></a>02119 <span class="preprocessor">#endif</span> <a name="l02120"></a>02120 <span class="preprocessor"></span> <span class="keywordflow">if</span> (x < absx + cell->width()) <span class="keywordflow">break</span>; <a name="l02121"></a>02121 }<span class="comment">/*next i*/</span> <a name="l02122"></a>02122 <span class="keywordflow">if</span> (i >= n) i = n - 1; <a name="l02123"></a>02123 <a name="l02124"></a>02124 <span class="comment">// Second pass. Find editable cell, beginning with the currently found,</span> <a name="l02125"></a>02125 <span class="comment">// extending to the left, and to the right, alternating.</span> <a name="l02126"></a>02126 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> cnt = 0; cnt < 2*n; cnt++) { <a name="l02127"></a>02127 <span class="keywordtype">int</span> index = i - ((cnt >> 1) + 1)*(cnt & 1) + (cnt >> 1)*!(cnt & 1); <a name="l02128"></a>02128 <span class="keywordflow">if</span> (index < 0 || index >= n) <span class="keywordflow">continue</span>; <a name="l02129"></a>02129 <a name="l02130"></a>02130 RenderTableCell *cell = row->row->at(index); <a name="l02131"></a>02131 <span class="keywordflow">if</span> (!cell || (<span class="keywordtype">long</span>)cell == -1) <span class="keywordflow">continue</span>; <a name="l02132"></a>02132 <a name="l02133"></a>02133 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l02134"></a>02134 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"index "</span> << index << <span class="stringliteral">" cell "</span> << cell << endl; <a name="l02135"></a>02135 <span class="preprocessor">#endif</span> <a name="l02136"></a>02136 <span class="preprocessor"></span> RenderTable *nestedTable; <a name="l02137"></a>02137 <span class="keywordflow">if</span> (containsEditableElement(part, cell, nestedTable, fromEnd)) { <a name="l02138"></a>02138 <a name="l02139"></a>02139 <span class="keywordflow">if</span> (nestedTable) { <a name="l02140"></a>02140 TableRowIterator it(nestedTable, fromEnd); <a name="l02141"></a>02141 <span class="keywordflow">while</span> (*it) { <a name="l02142"></a>02142 <span class="comment">// kdDebug(6201) << "=== recursive invocation" << endl;</span> <a name="l02143"></a>02143 cell = findNearestTableCell(part, x, it, fromEnd); <a name="l02144"></a>02144 <span class="keywordflow">if</span> (cell) <span class="keywordflow">break</span>; <a name="l02145"></a>02145 <span class="keywordflow">if</span> (fromEnd) --it; <span class="keywordflow">else</span> ++it; <a name="l02146"></a>02146 }<span class="comment">/*wend*/</span> <a name="l02147"></a>02147 }<span class="comment">/*end if*/</span> <a name="l02148"></a>02148 <a name="l02149"></a>02149 <span class="keywordflow">return</span> cell; <a name="l02150"></a>02150 }<span class="comment">/*end if*/</span> <a name="l02151"></a>02151 }<span class="comment">/*next i*/</span> <a name="l02152"></a>02152 <span class="keywordflow">return</span> 0; <a name="l02153"></a>02153 } <a name="l02154"></a>02154 <a name="l02161"></a>02161 <span class="keyword">static</span> RenderObject *commonAncestorTableSectionOrCell(RenderObject *r1, <a name="l02162"></a>02162 RenderObject *r2) <a name="l02163"></a>02163 { <a name="l02164"></a>02164 <span class="keywordflow">if</span> (!r1 || !r2) <span class="keywordflow">return</span> 0; <a name="l02165"></a>02165 RenderTableSection *sec = 0; <a name="l02166"></a>02166 <span class="keywordtype">int</span> start_depth=0, end_depth=0; <a name="l02167"></a>02167 <span class="comment">// First we find the depths of the two objects in the tree (start_depth, end_depth)</span> <a name="l02168"></a>02168 RenderObject *n = r1; <a name="l02169"></a>02169 <span class="keywordflow">while</span> (n->parent()) { <a name="l02170"></a>02170 n = n->parent(); <a name="l02171"></a>02171 start_depth++; <a name="l02172"></a>02172 }<span class="comment">/*wend*/</span> <a name="l02173"></a>02173 n = r2; <a name="l02174"></a>02174 <span class="keywordflow">while</span>( n->parent()) { <a name="l02175"></a>02175 n = n->parent(); <a name="l02176"></a>02176 end_depth++; <a name="l02177"></a>02177 }<span class="comment">/*wend*/</span> <a name="l02178"></a>02178 <span class="comment">// here we climb up the tree with the deeper object, until both objects have equal depth</span> <a name="l02179"></a>02179 <span class="keywordflow">while</span> (end_depth > start_depth) { <a name="l02180"></a>02180 r2 = r2->parent(); <a name="l02181"></a>02181 end_depth--; <a name="l02182"></a>02182 }<span class="comment">/*wend*/</span> <a name="l02183"></a>02183 <span class="keywordflow">while</span> (start_depth > end_depth) { <a name="l02184"></a>02184 r1 = r1->parent(); <a name="l02185"></a>02185 <span class="comment">// if (r1->isTableSection()) sec = static_cast<RenderTableSection *>(r1);</span> <a name="l02186"></a>02186 start_depth--; <a name="l02187"></a>02187 }<span class="comment">/*wend*/</span> <a name="l02188"></a>02188 <span class="comment">// Climb the tree with both r1 and r2 until they are the same</span> <a name="l02189"></a>02189 <span class="keywordflow">while</span> (r1 != r2){ <a name="l02190"></a>02190 r1 = r1->parent(); <a name="l02191"></a>02191 <span class="keywordflow">if</span> (r1->isTableSection()) sec = static_cast<RenderTableSection *>(r1); <a name="l02192"></a>02192 r2 = r2->parent(); <a name="l02193"></a>02193 }<span class="comment">/*wend*/</span> <a name="l02194"></a>02194 <a name="l02195"></a>02195 <span class="comment">// At this point, we found the most approximate common ancestor. Now climb</span> <a name="l02196"></a>02196 <span class="comment">// up until the condition of the function return value is satisfied.</span> <a name="l02197"></a>02197 <span class="keywordflow">while</span> (r1 && !r1->isTableCell() && !r1->isTableSection() && !r1->isTable()) <a name="l02198"></a>02198 r1 = r1->parent(); <a name="l02199"></a>02199 <a name="l02200"></a>02200 <span class="keywordflow">return</span> r1 && r1->isTable() ? sec : r1; <a name="l02201"></a>02201 } <a name="l02202"></a>02202 <a name="l02210"></a>02210 <span class="keyword">static</span> <span class="keywordtype">int</span> findRowInSection(RenderTableSection *section, RenderTableCell *cell, <a name="l02211"></a>02211 RenderTableSection::RowStruct *&row, RenderTableCell *&directCell) <a name="l02212"></a>02212 { <a name="l02213"></a>02213 <span class="comment">// Seek direct cell</span> <a name="l02214"></a>02214 RenderObject *r = cell; <a name="l02215"></a>02215 <span class="keywordflow">while</span> (r != section) { <a name="l02216"></a>02216 <span class="keywordflow">if</span> (r->isTableCell()) directCell = static_cast<RenderTableCell *>(r); <a name="l02217"></a>02217 r = r->parent(); <a name="l02218"></a>02218 }<span class="comment">/*wend*/</span> <a name="l02219"></a>02219 <a name="l02220"></a>02220 <span class="comment">// So, and this is really nasty: As we have no indices, we have to do a</span> <a name="l02221"></a>02221 <span class="comment">// linear comparison. Oh, that sucks so much for long tables, you can't</span> <a name="l02222"></a>02222 <span class="comment">// imagine.</span> <a name="l02223"></a>02223 <span class="keywordtype">int</span> n = section->numRows(); <a name="l02224"></a>02224 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; i++) { <a name="l02225"></a>02225 row = &section->grid[i]; <a name="l02226"></a>02226 <a name="l02227"></a>02227 <span class="comment">// check for cell</span> <a name="l02228"></a>02228 <span class="keywordtype">int</span> m = row->row->size(); <a name="l02229"></a>02229 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < m; j++) { <a name="l02230"></a>02230 RenderTableCell *c = row->row->at(j); <a name="l02231"></a>02231 <span class="keywordflow">if</span> (c == directCell) <span class="keywordflow">return</span> i; <a name="l02232"></a>02232 }<span class="comment">/*next j*/</span> <a name="l02233"></a>02233 <a name="l02234"></a>02234 }<span class="comment">/*next i*/</span> <a name="l02235"></a>02235 Q_ASSERT(<span class="keyword">false</span>); <a name="l02236"></a>02236 <span class="keywordflow">return</span> -1; <a name="l02237"></a>02237 } <a name="l02238"></a>02238 <a name="l02244"></a>02244 <span class="keyword">static</span> <span class="keyword">inline</span> RenderTable *findFirstDescendantTable(RenderObject *leaf, RenderBlock *block) <a name="l02245"></a>02245 { <a name="l02246"></a>02246 RenderTable *result = 0; <a name="l02247"></a>02247 <span class="keywordflow">while</span> (leaf && leaf != block) { <a name="l02248"></a>02248 <span class="keywordflow">if</span> (leaf->isTable()) result = static_cast<RenderTable *>(leaf); <a name="l02249"></a>02249 leaf = leaf->parent(); <a name="l02250"></a>02250 }<span class="comment">/*wend*/</span> <a name="l02251"></a>02251 <span class="keywordflow">return</span> result; <a name="l02252"></a>02252 } <a name="l02253"></a>02253 <a name="l02257"></a>02257 <span class="keyword">static</span> <span class="keyword">inline</span> RenderTableCell *containingTableCell(RenderObject *r) <a name="l02258"></a>02258 { <a name="l02259"></a>02259 <span class="keywordflow">while</span> (r && !r->isTableCell()) r = r->parent(); <a name="l02260"></a>02260 <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>RenderTableCell *<span class="keyword">></span>(r); <a name="l02261"></a>02261 } <a name="l02262"></a>02262 <a name="l02263"></a>02263 <span class="keyword">inline</span> <span class="keywordtype">void</span> ErgonomicEditableLineIterator::calcAndStoreNewLine( <a name="l02264"></a>02264 RenderBlock *newBlock, <span class="keywordtype">bool</span> toBegin) <a name="l02265"></a>02265 { <a name="l02266"></a>02266 <span class="comment">// take the first/last editable element in the found cell as the new</span> <a name="l02267"></a>02267 <span class="comment">// value for the iterator</span> <a name="l02268"></a>02268 CaretBoxIterator it; <a name="l02269"></a>02269 cbl = CaretBoxLine::constructCaretBoxLine(&lines->cblDeleter, <a name="l02270"></a>02270 newBlock, <span class="keyword">true</span>, toBegin, it); <a name="l02271"></a>02271 <span class="preprocessor">#if DEBUG_CARETMODE > 3</span> <a name="l02272"></a>02272 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << cbl->information() << endl; <a name="l02273"></a>02273 <span class="preprocessor">#endif</span> <a name="l02274"></a>02274 <span class="preprocessor"></span><span class="comment">// if (toBegin) prevBlock(); else nextBlock();</span> <a name="l02275"></a>02275 <a name="l02276"></a>02276 <span class="keywordflow">if</span> (!cbl) { <a name="l02277"></a>02277 <span class="keywordflow">return</span>; <a name="l02278"></a>02278 }<span class="comment">/*end if*/</span> <a name="l02279"></a>02279 <a name="l02280"></a>02280 EditableLineIterator::advance(toBegin); <a name="l02281"></a>02281 } <a name="l02282"></a>02282 <a name="l02283"></a>02283 <span class="keywordtype">void</span> ErgonomicEditableLineIterator::determineTopologicalElement( <a name="l02284"></a>02284 RenderTableCell *oldCell, RenderObject *newObject, <span class="keywordtype">bool</span> toBegin) <a name="l02285"></a>02285 { <a name="l02286"></a>02286 <span class="comment">// When we arrive here, a transition between cells has happened.</span> <a name="l02287"></a>02287 <span class="comment">// Now determine the type of the transition. This can be</span> <a name="l02288"></a>02288 <span class="comment">// (1) a transition from this cell into a table inside this cell.</span> <a name="l02289"></a>02289 <span class="comment">// (2) a transition from this cell into another cell of this table</span> <a name="l02290"></a>02290 <a name="l02291"></a>02291 TableRowIterator it; <a name="l02292"></a>02292 <a name="l02293"></a>02293 RenderObject *commonAncestor = commonAncestorTableSectionOrCell(oldCell, newObject); <a name="l02294"></a>02294 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l02295"></a>02295 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">" ancestor "</span> << commonAncestor << endl; <a name="l02296"></a>02296 <span class="preprocessor">#endif</span> <a name="l02297"></a>02297 <span class="preprocessor"></span> <a name="l02298"></a>02298 <span class="comment">// The whole document is treated as a table cell.</span> <a name="l02299"></a>02299 <span class="keywordflow">if</span> (!commonAncestor || commonAncestor->isTableCell()) { <span class="comment">// (1)</span> <a name="l02300"></a>02300 <a name="l02301"></a>02301 RenderTableCell *cell = <span class="keyword">static_cast<</span>RenderTableCell *<span class="keyword">></span>(commonAncestor); <a name="l02302"></a>02302 RenderTable *table = findFirstDescendantTable(newObject, cell); <a name="l02303"></a>02303 <a name="l02304"></a>02304 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l02305"></a>02305 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"table cell: "</span> << cell << endl; <a name="l02306"></a>02306 <span class="preprocessor">#endif</span> <a name="l02307"></a>02307 <span class="preprocessor"></span> <a name="l02308"></a>02308 <span class="comment">// if there is no table, we fell out of the previous table, and are now</span> <a name="l02309"></a>02309 <span class="comment">// in some table-less block. Therefore, done.</span> <a name="l02310"></a>02310 <span class="keywordflow">if</span> (!table) <span class="keywordflow">return</span>; <a name="l02311"></a>02311 <a name="l02312"></a>02312 it = TableRowIterator(table, toBegin); <a name="l02313"></a>02313 <a name="l02314"></a>02314 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (commonAncestor->isTableSection()) { <span class="comment">// (2)</span> <a name="l02315"></a>02315 <a name="l02316"></a>02316 RenderTableSection *section = <span class="keyword">static_cast<</span>RenderTableSection *<span class="keyword">></span>(commonAncestor); <a name="l02317"></a>02317 RenderTableSection::RowStruct *row; <a name="l02318"></a>02318 <span class="keywordtype">int</span> idx = findRowInSection(section, oldCell, row, oldCell); <a name="l02319"></a>02319 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l02320"></a>02320 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"table section: row idx "</span> << idx << endl; <a name="l02321"></a>02321 <span class="preprocessor">#endif</span> <a name="l02322"></a>02322 <span class="preprocessor"></span> <a name="l02323"></a>02323 it = TableRowIterator(section, idx); <a name="l02324"></a>02324 <a name="l02325"></a>02325 <span class="comment">// advance rowspan rows</span> <a name="l02326"></a>02326 <span class="keywordtype">int</span> rowspan = oldCell->rowSpan(); <a name="l02327"></a>02327 <span class="keywordflow">while</span> (*it && rowspan--) { <a name="l02328"></a>02328 <span class="keywordflow">if</span> (toBegin) --it; <span class="keywordflow">else</span> ++it; <a name="l02329"></a>02329 }<span class="comment">/*wend*/</span> <a name="l02330"></a>02330 <a name="l02331"></a>02331 } <span class="keywordflow">else</span> { <a name="l02332"></a>02332 <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gccea93cfede4acb090a88609fb3a2563">kdError</a>(6201) << <span class="stringliteral">"Neither common cell nor section! "</span> << commonAncestor->renderName() << endl; <a name="l02333"></a>02333 <span class="comment">// will crash on uninitialized table row iterator</span> <a name="l02334"></a>02334 }<span class="comment">/*end if*/</span> <a name="l02335"></a>02335 <a name="l02336"></a>02336 RenderTableCell *cell = findNearestTableCell(lines->m_part, xCoor, it, toBegin); <a name="l02337"></a>02337 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l02338"></a>02338 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"findNearestTableCell result: "</span> << cell << endl; <a name="l02339"></a>02339 <span class="preprocessor">#endif</span> <a name="l02340"></a>02340 <span class="preprocessor"></span> <a name="l02341"></a>02341 RenderBlock *newBlock = cell; <a name="l02342"></a>02342 <span class="keywordflow">if</span> (!cell) { <a name="l02343"></a>02343 Q_ASSERT(commonAncestor->isTableSection()); <a name="l02344"></a>02344 RenderTableSection *section = <span class="keyword">static_cast<</span>RenderTableSection *<span class="keyword">></span>(commonAncestor); <a name="l02345"></a>02345 cell = containingTableCell(section); <a name="l02346"></a>02346 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l02347"></a>02347 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"containing cell: "</span> << cell << endl; <a name="l02348"></a>02348 <span class="preprocessor">#endif</span> <a name="l02349"></a>02349 <span class="preprocessor"></span> <a name="l02350"></a>02350 RenderTable *nestedTable; <a name="l02351"></a>02351 <span class="keywordtype">bool</span> editableChild = cell && containsEditableChildElement(lines->m_part, <a name="l02352"></a>02352 cell, nestedTable, toBegin, section->table()); <a name="l02353"></a>02353 <a name="l02354"></a>02354 <span class="keywordflow">if</span> (cell && !editableChild) { <a name="l02355"></a>02355 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l02356"></a>02356 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"========= recursive invocation outer ========="</span> << endl; <a name="l02357"></a>02357 <span class="preprocessor">#endif</span> <a name="l02358"></a>02358 <span class="preprocessor"></span> determineTopologicalElement(cell, cell->section(), toBegin); <a name="l02359"></a>02359 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l02360"></a>02360 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"========= end recursive invocation outer ========="</span> << endl; <a name="l02361"></a>02361 <span class="preprocessor">#endif</span> <a name="l02362"></a>02362 <span class="preprocessor"></span> <span class="keywordflow">return</span>; <a name="l02363"></a>02363 <a name="l02364"></a>02364 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cell && nestedTable) { <a name="l02365"></a>02365 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l02366"></a>02366 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"========= recursive invocation inner ========="</span> << endl; <a name="l02367"></a>02367 <span class="preprocessor">#endif</span> <a name="l02368"></a>02368 <span class="preprocessor"></span> determineTopologicalElement(cell, nestedTable, toBegin); <a name="l02369"></a>02369 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l02370"></a>02370 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"========= end recursive invocation inner ========="</span> << endl; <a name="l02371"></a>02371 <span class="preprocessor">#endif</span> <a name="l02372"></a>02372 <span class="preprocessor"></span> <span class="keywordflow">return</span>; <a name="l02373"></a>02373 <a name="l02374"></a>02374 } <span class="keywordflow">else</span> { <a name="l02375"></a>02375 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l02376"></a>02376 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6201) << <span class="stringliteral">"newBlock is table: "</span> << section->table() << endl; <a name="l02377"></a>02377 <span class="preprocessor">#endif</span> <a name="l02378"></a>02378 <span class="preprocessor"></span> RenderObject *r = section->table(); <a name="l02379"></a>02379 <span class="keywordtype">int</span> state; <span class="comment">// not used</span> <a name="l02380"></a>02380 ObjectTraversalState trav = OutsideAscending; <a name="l02381"></a>02381 r = advanceSuitableObject(r, trav, toBegin, lines->baseObject(), state); <a name="l02382"></a>02382 <span class="keywordflow">if</span> (!r) { cbl = 0; <span class="keywordflow">return</span>; } <a name="l02383"></a>02383 <span class="comment">// if (toBegin) prevBlock(); else nextBlock();</span> <a name="l02384"></a>02384 newBlock = <span class="keyword">static_cast<</span>RenderBlock *<span class="keyword">></span>(!r || r->isRenderBlock() ? r : r->containingBlock()); <a name="l02385"></a>02385 }<span class="comment">/*end if*/</span> <a name="l02386"></a>02386 <span class="preprocessor">#if 0</span> <a name="l02387"></a>02387 <span class="preprocessor"></span> } <span class="keywordflow">else</span> { <a name="l02388"></a>02388 <span class="comment">// adapt cell so that prevBlock/nextBlock works as expected</span> <a name="l02389"></a>02389 newBlock = cell; <a name="l02390"></a>02390 <span class="comment">// on forward advancing, we must start from the outside end of the</span> <a name="l02391"></a>02391 <span class="comment">// previous object</span> <a name="l02392"></a>02392 <span class="keywordflow">if</span> (!toBegin) { <a name="l02393"></a>02393 RenderObject *r = newBlock; <a name="l02394"></a>02394 <span class="keywordtype">int</span> state; <span class="comment">// not used</span> <a name="l02395"></a>02395 ObjectTraversalState trav = OutsideAscending; <a name="l02396"></a>02396 r = advanceSuitableObject(r, trav, <span class="keyword">true</span>, lines->advancePolicy(), lines->baseObject(), state); <a name="l02397"></a>02397 newBlock = <span class="keyword">static_cast<</span>RenderBlock *<span class="keyword">></span>(!r || r->isRenderBlock() ? r : r->containingBlock()); <a name="l02398"></a>02398 }<span class="comment">/*end if*/</span> <a name="l02399"></a>02399 <span class="preprocessor">#endif</span> <a name="l02400"></a>02400 <span class="preprocessor"></span> }<span class="comment">/*end if*/</span> <a name="l02401"></a>02401 <a name="l02402"></a>02402 calcAndStoreNewLine(newBlock, toBegin); <a name="l02403"></a>02403 } <a name="l02404"></a>02404 <a name="l02405"></a>02405 ErgonomicEditableLineIterator &ErgonomicEditableLineIterator::operator ++() <a name="l02406"></a>02406 { <a name="l02407"></a>02407 RenderTableCell *oldCell = containingTableCell(cbl->enclosingObject()); <a name="l02408"></a>02408 <a name="l02409"></a>02409 EditableLineIterator::operator ++(); <a name="l02410"></a>02410 <span class="keywordflow">if</span> (*<span class="keyword">this</span> == lines->end() || *<span class="keyword">this</span> == lines->preBegin()) <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l02411"></a>02411 <a name="l02412"></a>02412 RenderTableCell *newCell = containingTableCell(cbl->enclosingObject()); <a name="l02413"></a>02413 <a name="l02414"></a>02414 <span class="keywordflow">if</span> (!newCell || newCell == oldCell) <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l02415"></a>02415 <a name="l02416"></a>02416 determineTopologicalElement(oldCell, newCell, <span class="keyword">false</span>); <a name="l02417"></a>02417 <a name="l02418"></a>02418 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l02419"></a>02419 } <a name="l02420"></a>02420 <a name="l02421"></a>02421 ErgonomicEditableLineIterator &ErgonomicEditableLineIterator::operator --() <a name="l02422"></a>02422 { <a name="l02423"></a>02423 RenderTableCell *oldCell = containingTableCell(cbl->enclosingObject()); <a name="l02424"></a>02424 <a name="l02425"></a>02425 EditableLineIterator::operator --(); <a name="l02426"></a>02426 <span class="keywordflow">if</span> (*<span class="keyword">this</span> == lines->end() || *<span class="keyword">this</span> == lines->preBegin()) <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l02427"></a>02427 <a name="l02428"></a>02428 RenderTableCell *newCell = containingTableCell(cbl->enclosingObject()); <a name="l02429"></a>02429 <a name="l02430"></a>02430 <span class="keywordflow">if</span> (!newCell || newCell == oldCell) <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l02431"></a>02431 <a name="l02432"></a>02432 determineTopologicalElement(oldCell, newCell, <span class="keyword">true</span>); <a name="l02433"></a>02433 <a name="l02434"></a>02434 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l02435"></a>02435 } <a name="l02436"></a>02436 <a name="l02437"></a>02437 <span class="comment">// == Navigational helper functions ==</span> <a name="l02438"></a>02438 <a name="l02448"></a>02448 <span class="keyword">static</span> CaretBox *nearestCaretBox(LineIterator &it, CaretViewContext *cv, <a name="l02449"></a>02449 <span class="keywordtype">int</span> &x, <span class="keywordtype">int</span> &absx, <span class="keywordtype">int</span> &absy) <a name="l02450"></a>02450 { <a name="l02451"></a>02451 <span class="comment">// Find containing block</span> <a name="l02452"></a>02452 RenderObject *cb = (*it)->containingBlock(); <a name="l02453"></a>02453 <span class="preprocessor">#if DEBUG_CARETMODE > 4</span> <a name="l02454"></a>02454 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"nearestCB: cb "</span> << cb << <span class="stringliteral">"@"</span> << (cb ? cb->renderName() : <span class="stringliteral">""</span>) << endl; <a name="l02455"></a>02455 <span class="preprocessor">#endif</span> <a name="l02456"></a>02456 <span class="preprocessor"></span> <a name="l02457"></a>02457 <span class="keywordflow">if</span> (cb) cb->absolutePosition(absx, absy); <a name="l02458"></a>02458 <span class="keywordflow">else</span> absx = absy = 0; <a name="l02459"></a>02459 <a name="l02460"></a>02460 <span class="comment">// Otherwise find out in which inline box the caret is to be placed.</span> <a name="l02461"></a>02461 <a name="l02462"></a>02462 <span class="comment">// this horizontal position is to be approximated</span> <a name="l02463"></a>02463 x = cv->origX - absx; <a name="l02464"></a>02464 CaretBox *caretBox = 0; <span class="comment">// Inline box containing the caret</span> <a name="l02465"></a>02465 <span class="comment">// NodeImpl *lastnode = 0; // node of previously checked render object.</span> <a name="l02466"></a>02466 <span class="keywordtype">int</span> xPos; <span class="comment">// x-coordinate of current inline box</span> <a name="l02467"></a>02467 <span class="keywordtype">int</span> oldXPos = -1; <span class="comment">// x-coordinate of last inline box</span> <a name="l02468"></a>02468 EditableCaretBoxIterator fbit = it; <a name="l02469"></a>02469 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l02470"></a>02470 <span class="preprocessor"></span><span class="comment">/* if (it.linearDocument()->advancePolicy() != LeafsOnly)</span> <a name="l02471"></a>02471 <span class="comment"> kdWarning() << "nearestInlineBox is only prepared to handle the LeafsOnly advance policy" << endl;*/</span> <a name="l02472"></a>02472 <span class="comment">// kdDebug(6200) << "*fbit = " << *fbit << endl;</span> <a name="l02473"></a>02473 <span class="preprocessor">#endif</span> <a name="l02474"></a>02474 <span class="preprocessor"></span> <span class="comment">// Iterate through all children</span> <a name="l02475"></a>02475 <span class="keywordflow">for</span> (CaretBox *b; fbit != (*it)->end(); ++fbit) { <a name="l02476"></a>02476 b = *fbit; <a name="l02477"></a>02477 <a name="l02478"></a>02478 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l02479"></a>02479 <span class="preprocessor"></span><span class="comment">// RenderObject *r = b->object();</span> <a name="l02480"></a>02480 <span class="comment">// if (b->isInlineFlowBox()) kdDebug(6200) << "b is inline flow box" << endl;</span> <a name="l02481"></a>02481 <span class="comment">// kdDebug(6200) << "approximate r" << r << ": " << (r ? r->renderName() : QString::null) << (r && r->isText() ? " contains \"" + QString(((RenderText *)r)->str->s, ((RenderText *)r)->str->l) + "\"" : QString::null) << endl;</span> <a name="l02482"></a>02482 <span class="preprocessor">#endif</span> <a name="l02483"></a>02483 <span class="preprocessor"></span> xPos = b->xPos(); <a name="l02484"></a>02484 <a name="l02485"></a>02485 <span class="comment">// the caret is before this box</span> <a name="l02486"></a>02486 <span class="keywordflow">if</span> (x < xPos) { <a name="l02487"></a>02487 <span class="comment">// snap to nearest box</span> <a name="l02488"></a>02488 <span class="keywordflow">if</span> (oldXPos < 0 || x - (oldXPos + caretBox->width()) > xPos - x) { <a name="l02489"></a>02489 caretBox = b; <span class="comment">// current box is nearer</span> <a name="l02490"></a>02490 }<span class="comment">/*end if*/</span> <a name="l02491"></a>02491 <span class="keywordflow">break</span>; <span class="comment">// Otherwise, preceding box is implicitly used</span> <a name="l02492"></a>02492 } <a name="l02493"></a>02493 <a name="l02494"></a>02494 caretBox = b; <a name="l02495"></a>02495 <a name="l02496"></a>02496 <span class="comment">// the caret is within this box</span> <a name="l02497"></a>02497 <span class="keywordflow">if</span> (x >= xPos && x < xPos + caretBox->width()) <a name="l02498"></a>02498 <span class="keywordflow">break</span>; <a name="l02499"></a>02499 oldXPos = xPos; <a name="l02500"></a>02500 <a name="l02501"></a>02501 <span class="comment">// the caret can only be after the last box which is automatically</span> <a name="l02502"></a>02502 <span class="comment">// contained in caretBox when we fall out of the loop.</span> <a name="l02503"></a>02503 }<span class="comment">/*next fbit*/</span> <a name="l02504"></a>02504 <a name="l02505"></a>02505 <span class="keywordflow">return</span> caretBox; <a name="l02506"></a>02506 } <a name="l02507"></a>02507 <a name="l02513"></a>02513 <span class="keyword">static</span> <span class="keywordtype">void</span> moveItToNextWord(EditableCharacterIterator &it) <a name="l02514"></a>02514 { <a name="l02515"></a>02515 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l02516"></a>02516 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"%%%%%%%%%%%%%%%%%%%%% moveItToNextWord"</span> << endl; <a name="l02517"></a>02517 <span class="preprocessor">#endif</span> <a name="l02518"></a>02518 <span class="preprocessor"></span> EditableCharacterIterator copy; <a name="l02519"></a>02519 <span class="keywordflow">while</span> (!it.isEnd() && !(*it).isSpace() && !(*it).isPunct()) { <a name="l02520"></a>02520 <span class="preprocessor">#if DEBUG_CARETMODE > 2</span> <a name="l02521"></a>02521 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"reading1 '"</span> << (*it).latin1() << <span class="stringliteral">"'"</span> << endl; <a name="l02522"></a>02522 <span class="preprocessor">#endif</span> <a name="l02523"></a>02523 <span class="preprocessor"></span> copy = it; <a name="l02524"></a>02524 ++it; <a name="l02525"></a>02525 } <a name="l02526"></a>02526 <a name="l02527"></a>02527 <span class="keywordflow">if</span> (it.isEnd()) { <a name="l02528"></a>02528 it = copy; <a name="l02529"></a>02529 <span class="keywordflow">return</span>; <a name="l02530"></a>02530 }<span class="comment">/*end if*/</span> <a name="l02531"></a>02531 <a name="l02532"></a>02532 <span class="keywordflow">while</span> (!it.isEnd() && ((*it).isSpace() || (*it).isPunct())) { <a name="l02533"></a>02533 <span class="preprocessor">#if DEBUG_CARETMODE > 2</span> <a name="l02534"></a>02534 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"reading2 '"</span> << (*it).latin1() << <span class="stringliteral">"'"</span> << endl; <a name="l02535"></a>02535 <span class="preprocessor">#endif</span> <a name="l02536"></a>02536 <span class="preprocessor"></span> copy = it; <a name="l02537"></a>02537 ++it; <a name="l02538"></a>02538 } <a name="l02539"></a>02539 <a name="l02540"></a>02540 <span class="keywordflow">if</span> (it.isEnd()) it = copy; <a name="l02541"></a>02541 } <a name="l02542"></a>02542 <a name="l02548"></a>02548 <span class="keyword">static</span> <span class="keywordtype">void</span> moveItToPrevWord(EditableCharacterIterator &it) <a name="l02549"></a>02549 { <a name="l02550"></a>02550 <span class="keywordflow">if</span> (it.isEnd()) <span class="keywordflow">return</span>; <a name="l02551"></a>02551 <a name="l02552"></a>02552 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l02553"></a>02553 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"%%%%%%%%%%%%%%%%%%%%% moveItToPrevWord"</span> << endl; <a name="l02554"></a>02554 <span class="preprocessor">#endif</span> <a name="l02555"></a>02555 <span class="preprocessor"></span> EditableCharacterIterator copy; <a name="l02556"></a>02556 <a name="l02557"></a>02557 <span class="comment">// Jump over all space and punctuation characters first</span> <a name="l02558"></a>02558 <span class="keywordflow">do</span> { <a name="l02559"></a>02559 copy = it; <a name="l02560"></a>02560 --it; <a name="l02561"></a>02561 <span class="preprocessor">#if DEBUG_CARETMODE > 2</span> <a name="l02562"></a>02562 <span class="preprocessor"></span> <span class="keywordflow">if</span> (!it.isEnd()) <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"reading1 '"</span> << (*it).latin1() << <span class="stringliteral">"'"</span> << endl; <a name="l02563"></a>02563 <span class="preprocessor">#endif</span> <a name="l02564"></a>02564 <span class="preprocessor"></span> } <span class="keywordflow">while</span> (!it.isEnd() && ((*it).isSpace() || (*it).isPunct())); <a name="l02565"></a>02565 <a name="l02566"></a>02566 <span class="keywordflow">if</span> (it.isEnd()) { <a name="l02567"></a>02567 it = copy; <a name="l02568"></a>02568 <span class="keywordflow">return</span>; <a name="l02569"></a>02569 }<span class="comment">/*end if*/</span> <a name="l02570"></a>02570 <a name="l02571"></a>02571 <span class="keywordflow">do</span> { <a name="l02572"></a>02572 copy = it; <a name="l02573"></a>02573 --it; <a name="l02574"></a>02574 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l02575"></a>02575 <span class="preprocessor"></span> <span class="keywordflow">if</span> (!it.isEnd()) <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"reading2 '"</span> << (*it).latin1() << <span class="stringliteral">"' ("</span> << (int)(*it).latin1() << <span class="stringliteral">") box "</span> << it.caretBox() << endl; <a name="l02576"></a>02576 <span class="preprocessor">#endif</span> <a name="l02577"></a>02577 <span class="preprocessor"></span> } <span class="keywordflow">while</span> (!it.isEnd() && !(*it).isSpace() && !(*it).isPunct()); <a name="l02578"></a>02578 <a name="l02579"></a>02579 it = copy; <a name="l02580"></a>02580 <span class="preprocessor">#if DEBUG_CARETMODE > 1</span> <a name="l02581"></a>02581 <span class="preprocessor"></span> <span class="keywordflow">if</span> (!it.isEnd()) <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"effective '"</span> << (*it).latin1() << <span class="stringliteral">"' ("</span> << (int)(*it).latin1() << <span class="stringliteral">") box "</span> << it.caretBox() << endl; <a name="l02582"></a>02582 <span class="preprocessor">#endif</span> <a name="l02583"></a>02583 <span class="preprocessor"></span>} <a name="l02584"></a>02584 <a name="l02592"></a>02592 <span class="keyword">static</span> <span class="keywordtype">void</span> moveIteratorByPage(LinearDocument &ld, <a name="l02593"></a>02593 ErgonomicEditableLineIterator &it, <span class="keywordtype">int</span> mindist, <span class="keywordtype">bool</span> next) <a name="l02594"></a>02594 { <a name="l02595"></a>02595 <span class="comment">// ### This whole routine plainly sucks. Use an inverse strategie for pgup/pgdn.</span> <a name="l02596"></a>02596 <a name="l02597"></a>02597 <span class="keywordflow">if</span> (it == ld.end() || it == ld.preBegin()) <span class="keywordflow">return</span>; <a name="l02598"></a>02598 <a name="l02599"></a>02599 ErgonomicEditableLineIterator copy = it; <a name="l02600"></a>02600 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l02601"></a>02601 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">" mindist: "</span> << mindist << endl; <a name="l02602"></a>02602 <span class="preprocessor">#endif</span> <a name="l02603"></a>02603 <span class="preprocessor"></span> <a name="l02604"></a>02604 CaretBoxLine *cbl = *copy; <a name="l02605"></a>02605 <span class="keywordtype">int</span> absx = 0, absy = 0; <a name="l02606"></a>02606 <a name="l02607"></a>02607 RenderBlock *lastcb = cbl->containingBlock(); <a name="l02608"></a>02608 Q_ASSERT(lastcb->isRenderBlock()); <a name="l02609"></a>02609 lastcb->absolutePosition(absx, absy, <span class="keyword">false</span>); <span class="comment">// ### what about fixed?</span> <a name="l02610"></a>02610 <a name="l02611"></a>02611 <span class="keywordtype">int</span> lastfby = cbl->begin().data()->yPos(); <a name="l02612"></a>02612 <span class="keywordtype">int</span> lastheight = 0; <a name="l02613"></a>02613 <span class="keywordtype">int</span> rescue = 1000; <span class="comment">// ### this is a hack to keep stuck carets from hanging the ua</span> <a name="l02614"></a>02614 <span class="keywordflow">do</span> { <a name="l02615"></a>02615 <span class="keywordflow">if</span> (next) ++copy; <span class="keywordflow">else</span> --copy; <a name="l02616"></a>02616 <span class="keywordflow">if</span> (copy == ld.end() || copy == ld.preBegin()) <span class="keywordflow">break</span>; <a name="l02617"></a>02617 <a name="l02618"></a>02618 cbl = *copy; <a name="l02619"></a>02619 RenderBlock *cb = cbl->containingBlock(); <a name="l02620"></a>02620 <a name="l02621"></a>02621 <span class="keywordtype">int</span> diff = 0; <a name="l02622"></a>02622 <span class="comment">// ### actually flowBox->yPos() should suffice, but this is not ported</span> <a name="l02623"></a>02623 <span class="comment">// over yet from WebCore</span> <a name="l02624"></a>02624 <span class="keywordtype">int</span> fby = cbl->begin().data()->yPos(); <a name="l02625"></a>02625 <span class="keywordflow">if</span> (cb != lastcb) { <a name="l02626"></a>02626 <span class="keywordflow">if</span> (next) { <a name="l02627"></a>02627 diff = absy + lastfby + lastheight; <a name="l02628"></a>02628 cb->absolutePosition(absx, absy, <span class="keyword">false</span>); <span class="comment">// ### what about fixed?</span> <a name="l02629"></a>02629 diff = absy - diff + fby; <a name="l02630"></a>02630 lastfby = 0; <a name="l02631"></a>02631 } <span class="keywordflow">else</span> { <a name="l02632"></a>02632 diff = absy; <a name="l02633"></a>02633 cb->absolutePosition(absx, absy, <span class="keyword">false</span>); <span class="comment">// ### what about fixed?</span> <a name="l02634"></a>02634 diff -= absy + fby + lastheight; <a name="l02635"></a>02635 lastfby = fby - lastheight; <a name="l02636"></a>02636 }<span class="comment">/*end if*/</span> <a name="l02637"></a>02637 <span class="preprocessor">#if DEBUG_CARETMODE > 2</span> <a name="l02638"></a>02638 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"absdiff "</span> << diff << endl; <a name="l02639"></a>02639 <span class="preprocessor">#endif</span> <a name="l02640"></a>02640 <span class="preprocessor"></span> } <span class="keywordflow">else</span> { <a name="l02641"></a>02641 diff = kAbs(fby - lastfby); <a name="l02642"></a>02642 }<span class="comment">/*end if*/</span> <a name="l02643"></a>02643 <span class="preprocessor">#if DEBUG_CARETMODE > 2</span> <a name="l02644"></a>02644 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">"cbl->begin().data()->yPos(): "</span> << fby << <span class="stringliteral">" diff "</span> << diff << endl; <a name="l02645"></a>02645 <span class="preprocessor">#endif</span> <a name="l02646"></a>02646 <span class="preprocessor"></span> <a name="l02647"></a>02647 mindist -= diff; <a name="l02648"></a>02648 <a name="l02649"></a>02649 lastheight = kAbs(fby - lastfby); <a name="l02650"></a>02650 lastfby = fby; <a name="l02651"></a>02651 lastcb = cb; <a name="l02652"></a>02652 it = copy; <a name="l02653"></a>02653 <span class="preprocessor">#if DEBUG_CARETMODE > 0</span> <a name="l02654"></a>02654 <span class="preprocessor"></span> <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gfbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>(6200) << <span class="stringliteral">" mindist: "</span> << mindist << endl; <a name="l02655"></a>02655 <span class="preprocessor">#endif</span> <a name="l02656"></a>02656 <span class="preprocessor"></span> <span class="comment">// trick: actually the distance is always one line short, but we cannot</span> <a name="l02657"></a>02657 <span class="comment">// calculate the height of the first line (### WebCore will make it better)</span> <a name="l02658"></a>02658 <span class="comment">// Therefore, we simply approximate that excess line by using the last</span> <a name="l02659"></a>02659 <span class="comment">// caluculated line height.</span> <a name="l02660"></a>02660 } <span class="keywordflow">while</span> (mindist - lastheight > 0 && --rescue); <a name="l02661"></a>02661 } <a name="l02662"></a>02662 <a name="l02663"></a>02663 <a name="l02664"></a>02664 }<span class="comment">/*end namespace*/</span> </pre></div></div> </div></div> </td> </tr> <tr> <td valign="top" id="leftmenu" width="25%"> <a name="navigation"></a> <div class="menu_box"><h2>khtml</h2> <div class="nav_list"> <ul><li><a href="index.html">Main Page</a></li><li><a href="namespaces.html">Namespace List</a></li><li><a href="hierarchy.html">Class Hierarchy</a></li><li><a href="classes.html">Alphabetical List</a></li><li><a href="annotated.html">Class List</a></li><li><a href="files.html">File List</a></li><li><a href="namespacemembers.html">Namespace Members</a></li><li><a href="functions.html">Class Members</a></li><li><a href="pages.html">Related Pages</a></li></ul> <!-- <h2>Class Picker</h2> <div style="text-align: center;"> <form name="guideform"> <select name="guidelinks" style="width:100%;" onChange="window.location=document.guideform.guidelinks.options[document.guideform.guidelinks.selectedIndex].value"> <option value="annotated.html">-- Choose --</option> <option value="classDOM_1_1AbstractView.html">dom::abstractview</option>, <option value="classDOM_1_1Attr.html">dom::attr</option>, <option value="classDOM_1_1CDATASection.html">dom::cdatasection</option>, <option value="classDOM_1_1CharacterData.html">dom::characterdata</option>, <option value="classDOM_1_1Comment.html">dom::comment</option>, <option value="classDOM_1_1Counter.html">dom::counter</option>, <option value="classDOM_1_1CSS2Azimuth.html">dom::css2azimuth</option>, <option value="classDOM_1_1CSS2BackgroundPosition.html">dom::css2backgroundposition</option>, <option value="classDOM_1_1CSS2BorderSpacing.html">dom::css2borderspacing</option>, <option value="classDOM_1_1CSS2CounterIncrement.html">dom::css2counterincrement</option>, <option value="classDOM_1_1CSS2CounterReset.html">dom::css2counterreset</option>, <option value="classDOM_1_1CSS2Cursor.html">dom::css2cursor</option>, <option value="classDOM_1_1CSS2FontFaceSrc.html">dom::css2fontfacesrc</option>, <option value="classDOM_1_1CSS2FontFaceWidths.html">dom::css2fontfacewidths</option>, <option value="classDOM_1_1CSS2PageSize.html">dom::css2pagesize</option>, <option value="classDOM_1_1CSS2PlayDuring.html">dom::css2playduring</option>, <option value="classDOM_1_1CSS2Properties.html">dom::css2properties</option>, <option value="classDOM_1_1CSS2TextShadow.html">dom::css2textshadow</option>, <option value="classDOM_1_1CSSCharsetRule.html">dom::csscharsetrule</option>, <option value="classDOM_1_1CSSException.html">dom::cssexception</option>, <option value="classDOM_1_1CSSFontFaceRule.html">dom::cssfontfacerule</option>, <option value="classDOM_1_1CSSImportRule.html">dom::cssimportrule</option>, <option value="classDOM_1_1CSSMediaRule.html">dom::cssmediarule</option>, <option value="classDOM_1_1CSSPrimitiveValue.html">dom::cssprimitivevalue</option>, <option value="classDOM_1_1CSSRule.html">dom::cssrule</option>, <option value="classDOM_1_1CSSRuleList.html">dom::cssrulelist</option>, <option value="classDOM_1_1CSSStyleDeclaration.html">dom::cssstyledeclaration</option>, <option value="classDOM_1_1CSSStyleRule.html">dom::cssstylerule</option>, <option value="classDOM_1_1CSSStyleSheet.html">dom::cssstylesheet</option>, <option value="classDOM_1_1CSSUnknownRule.html">dom::cssunknownrule</option>, <option value="classDOM_1_1CSSValue.html">dom::cssvalue</option>, <option value="classDOM_1_1CSSValueList.html">dom::cssvaluelist</option>, <option value="classDOM_1_1CustomNodeFilter.html">dom::customnodefilter</option>, <option value="classDOM_1_1Document.html">dom::document</option>, <option value="classDOM_1_1DocumentFragment.html">dom::documentfragment</option>, <option value="classDOM_1_1DocumentType.html">dom::documenttype</option>, <option value="classDOM_1_1DOMException.html">dom::domexception</option>, <option value="classDOM_1_1DOMImplementation.html">dom::domimplementation</option>, <option value="classDOM_1_1DOMString.html">dom::domstring</option>, <option value="classDOM_1_1Element.html">dom::element</option>, <option value="classDOM_1_1Entity.html">dom::entity</option>, <option value="classDOM_1_1EntityReference.html">dom::entityreference</option>, <option value="classDOM_1_1Event.html">dom::event</option>, <option value="classDOM_1_1EventException.html">dom::eventexception</option>, <option value="classDOM_1_1EventListener.html">dom::eventlistener</option>, <option value="classDOM_1_1HTMLAnchorElement.html">dom::htmlanchorelement</option>, <option value="classDOM_1_1HTMLAppletElement.html">dom::htmlappletelement</option>, <option value="classDOM_1_1HTMLAreaElement.html">dom::htmlareaelement</option>, <option value="classDOM_1_1HTMLBaseElement.html">dom::htmlbaseelement</option>, <option value="classDOM_1_1HTMLBaseFontElement.html">dom::htmlbasefontelement</option>, <option value="classDOM_1_1HTMLBlockquoteElement.html">dom::htmlblockquoteelement</option>, <option value="classDOM_1_1HTMLBodyElement.html">dom::htmlbodyelement</option>, <option value="classDOM_1_1HTMLBRElement.html">dom::htmlbrelement</option>, <option value="classDOM_1_1HTMLButtonElement.html">dom::htmlbuttonelement</option>, <option value="classDOM_1_1HTMLCollection.html">dom::htmlcollection</option>, <option value="classDOM_1_1HTMLDirectoryElement.html">dom::htmldirectoryelement</option>, <option value="classDOM_1_1HTMLDivElement.html">dom::htmldivelement</option>, <option value="classDOM_1_1HTMLDListElement.html">dom::htmldlistelement</option>, <option value="classDOM_1_1HTMLDocument.html">dom::htmldocument</option>, <option value="classDOM_1_1HTMLElement.html">dom::htmlelement</option>, <option value="classDOM_1_1HTMLFieldSetElement.html">dom::htmlfieldsetelement</option>, <option value="classDOM_1_1HTMLFontElement.html">dom::htmlfontelement</option>, <option value="classDOM_1_1HTMLFormElement.html">dom::htmlformelement</option>, <option value="classDOM_1_1HTMLFrameElement.html">dom::htmlframeelement</option>, <option value="classDOM_1_1HTMLFrameSetElement.html">dom::htmlframesetelement</option>, <option value="classDOM_1_1HTMLHeadElement.html">dom::htmlheadelement</option>, <option value="classDOM_1_1HTMLHeadingElement.html">dom::htmlheadingelement</option>, <option value="classDOM_1_1HTMLHRElement.html">dom::htmlhrelement</option>, <option value="classDOM_1_1HTMLHtmlElement.html">dom::htmlhtmlelement</option>, <option value="classDOM_1_1HTMLIFrameElement.html">dom::htmliframeelement</option>, <option value="classDOM_1_1HTMLImageElement.html">dom::htmlimageelement</option>, <option value="classDOM_1_1HTMLInputElement.html">dom::htmlinputelement</option>, <option value="classDOM_1_1HTMLIsIndexElement.html">dom::htmlisindexelement</option>, <option value="classDOM_1_1HTMLLabelElement.html">dom::htmllabelelement</option>, <option value="classDOM_1_1HTMLLayerElement.html">dom::htmllayerelement</option>, <option value="classDOM_1_1HTMLLegendElement.html">dom::htmllegendelement</option>, <option value="classDOM_1_1HTMLLIElement.html">dom::htmllielement</option>, <option value="classDOM_1_1HTMLLinkElement.html">dom::htmllinkelement</option>, <option value="classDOM_1_1HTMLMapElement.html">dom::htmlmapelement</option>, <option value="classDOM_1_1HTMLMenuElement.html">dom::htmlmenuelement</option>, <option value="classDOM_1_1HTMLMetaElement.html">dom::htmlmetaelement</option>, <option value="classDOM_1_1HTMLModElement.html">dom::htmlmodelement</option>, <option value="classDOM_1_1HTMLObjectElement.html">dom::htmlobjectelement</option>, <option value="classDOM_1_1HTMLOListElement.html">dom::htmlolistelement</option>, <option value="classDOM_1_1HTMLOptGroupElement.html">dom::htmloptgroupelement</option>, <option value="classDOM_1_1HTMLOptionElement.html">dom::htmloptionelement</option>, <option value="classDOM_1_1HTMLParagraphElement.html">dom::htmlparagraphelement</option>, <option value="classDOM_1_1HTMLParamElement.html">dom::htmlparamelement</option>, <option value="classDOM_1_1HTMLPreElement.html">dom::htmlpreelement</option>, <option value="classDOM_1_1HTMLQuoteElement.html">dom::htmlquoteelement</option>, <option value="classDOM_1_1HTMLScriptElement.html">dom::htmlscriptelement</option>, <option value="classDOM_1_1HTMLSelectElement.html">dom::htmlselectelement</option>, <option value="classDOM_1_1HTMLStyleElement.html">dom::htmlstyleelement</option>, <option value="classDOM_1_1HTMLTableCaptionElement.html">dom::htmltablecaptionelement</option>, <option value="classDOM_1_1HTMLTableCellElement.html">dom::htmltablecellelement</option>, <option value="classDOM_1_1HTMLTableColElement.html">dom::htmltablecolelement</option>, <option value="classDOM_1_1HTMLTableElement.html">dom::htmltableelement</option>, <option value="classDOM_1_1HTMLTableRowElement.html">dom::htmltablerowelement</option>, <option value="classDOM_1_1HTMLTableSectionElement.html">dom::htmltablesectionelement</option>, <option value="classDOM_1_1HTMLTextAreaElement.html">dom::htmltextareaelement</option>, <option value="classDOM_1_1HTMLTitleElement.html">dom::htmltitleelement</option>, <option value="classDOM_1_1HTMLUListElement.html">dom::htmlulistelement</option>, <option value="classDOM_1_1MediaList.html">dom::medialist</option>, <option value="classDOM_1_1MouseEvent.html">dom::mouseevent</option>, <option value="classDOM_1_1MutationEvent.html">dom::mutationevent</option>, <option value="classDOM_1_1NamedNodeMap.html">dom::namednodemap</option>, <option value="classDOM_1_1Node.html">dom::node</option>, <option value="classDOM_1_1NodeFilter.html">dom::nodefilter</option>, <option value="classDOM_1_1NodeIterator.html">dom::nodeiterator</option>, <option value="classDOM_1_1NodeList.html">dom::nodelist</option>, <option value="classDOM_1_1Notation.html">dom::notation</option>, <option value="classDOM_1_1ProcessingInstruction.html">dom::processinginstruction</option>, <option value="classDOM_1_1Rect.html">dom::rect</option>, <option value="classDOM_1_1RGBColor.html">dom::rgbcolor</option>, <option value="classDOM_1_1StyleSheet.html">dom::stylesheet</option>, <option value="classDOM_1_1StyleSheetList.html">dom::stylesheetlist</option>, <option value="classDOM_1_1Text.html">dom::text</option>, <option value="classDOM_1_1TextEvent.html">dom::textevent</option>, <option value="classDOM_1_1TreeWalker.html">dom::treewalker</option>, <option value="classDOM_1_1UIEvent.html">dom::uievent</option>, <option value="classKHTMLPageCache.html">khtmlpagecache</option>, <option value="classKHTMLPart.html">khtmlpart</option>, <option value="classKHTMLPartBrowserExtension.html">khtmlpartbrowserextension</option>, <option value="classKHTMLPartIface.html">khtmlpartiface</option>, <option value="classKHTMLSettings.html">khtmlsettings</option>, <option value="classKHTMLView.html">khtmlview</option>, </select> </form> </div> --> </div></div> <div class="menu_box"><h2>API Dox</h2> <div class="nav_list"> <ul> <li><a href="../../arts/html/index.html">arts</a></li><li><a href="../../dcop/html/index.html">dcop</a></li><li><a href="../../dnssd/html/index.html">dnssd</a></li><li><a href="../../interfaces/html/index.html">interfaces</a></li><li> <a href="../../interfaces/kimproxy/interface/html/index.html">interface</a></li><li> <a href="../../interfaces/kimproxy/library/html/index.html">library</a></li><li> <a href="../../interfaces/kspeech/html/index.html">kspeech</a></li><li> <a href="../../interfaces/ktexteditor/html/index.html">ktexteditor</a></li><li><a href="../../kabc/html/index.html">kabc</a></li><li><a href="../../kate/html/index.html">kate</a></li><li><a href="../../kcmshell/html/index.html">kcmshell</a></li><li><a href="../../kdecore/html/index.html">kdecore</a></li><li><a href="../../kded/html/index.html">kded</a></li><li><a href="../../kdefx/html/index.html">kdefx</a></li><li><a href="../../kdeprint/html/index.html">kdeprint</a></li><li><a href="../../kdesu/html/index.html">kdesu</a></li><li><a href="../../kdeui/html/index.html">kdeui</a></li><li><a href="../../kdoctools/html/index.html">kdoctools</a></li><li><a href="../../khtml/html/index.html">khtml</a></li><li><a href="../../kimgio/html/index.html">kimgio</a></li><li><a href="../../kinit/html/index.html">kinit</a></li><li><a href="../../kio/html/index.html">kio</a></li><li> <a href="../../kio/bookmarks/html/index.html">bookmarks</a></li><li> <a href="../../kio/httpfilter/html/index.html">httpfilter</a></li><li> <a href="../../kio/kfile/html/index.html">kfile</a></li><li> <a href="../../kio/kio/html/index.html">kio</a></li><li> <a href="../../kio/kioexec/html/index.html">kioexec</a></li><li> <a href="../../kio/kpasswdserver/html/index.html">kpasswdserver</a></li><li> <a href="../../kio/kssl/html/index.html">kssl</a></li><li><a href="../../kioslave/html/index.html">kioslave</a></li><li> <a href="../../kioslave/http/html/index.html">http</a></li><li><a href="../../kjs/html/index.html">kjs</a></li><li><a href="../../kmdi/html/index.html">kmdi</a></li><li> <a href="../../kmdi/kmdi/html/index.html">kmdi</a></li><li><a href="../../knewstuff/html/index.html">knewstuff</a></li><li><a href="../../kparts/html/index.html">kparts</a></li><li><a href="../../kresources/html/index.html">kresources</a></li><li><a href="../../kspell2/html/index.html">kspell2</a></li><li><a href="../../kunittest/html/index.html">kunittest</a></li><li><a href="../../kutils/html/index.html">kutils</a></li><li><a href="../../kwallet/html/index.html">kwallet</a></li><li><a href="../../libkmid/html/index.html">libkmid</a></li><li><a href="../../libkscreensaver/html/index.html">libkscreensaver</a></li> </ul></div></div> </td> </tr> </table> <span class="doNotDisplay"> <a href="http://www.kde.org/" accesskey="8">KDE Home</a> | <a href="http://accessibility.kde.org/" accesskey="9">KDE Accessibility Home</a> | <a href="http://www.kde.org/media/accesskeys.php" accesskey="0">Description of Access Keys</a> </span> <div style="height: 8px"></div> <div id="footer"> <div id="footer_left"> Maintained by <a href="mailto:groot@kde.org">Adriaan de Groot</a> and <a href="mailto:winter@kde.org">Allen Winter</a>. <br/> KDE and K Desktop Environment are trademarks of <a href="http://www.kde.org/areas/kde-ev/" title="Homepage of the KDE non-profit Organization">KDE e.V.</a> | <a href="http://www.kde.org/contact/impressum.php">Legal</a> </div> <div id="footer_right"><img src="/media/images/footer_right.png" style="margin: 0px" alt="" /></div> </div> <!-- WARNING: DO NOT SEND MAIL TO THE FOLLOWING EMAIL ADDRESS! YOU WILL BE BLOCKED INSTANTLY AND PERMANENTLY! <a href="mailto:aaaatrap-425acc3b5374943f@kde.org">Block me</a> WARNING END --> </body> </html>