ed34ddcd054e5fddd7fcaa6c3d5ecc6452dca48b
[WebKit-https.git] / WebCore / khtml / rendering / render_br.cpp
1 /**
2  * This file is part of the DOM implementation for KDE.
3  *
4  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public License
17  * along with this library; see the file COPYING.LIB.  If not, write to
18  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  *
21  */
22 #include "render_br.h"
23
24 #include "dom_position.h"
25 #include "render_block.h"
26 #include "render_line.h"
27
28 using namespace khtml;
29 using DOM::Position;
30
31 RenderBR::RenderBR(DOM::NodeImpl* node)
32     : RenderText(node, new DOM::DOMStringImpl(QChar('\n'))),
33       m_lineHeight(-1)
34 {
35 }
36
37 RenderBR::~RenderBR()
38 {
39 }
40
41 InlineBox* RenderBR::createInlineBox(bool makePlaceholder, bool isRootLineBox, bool isOnlyRun)
42 {
43     // We only treat a box as text for a <br> if we are on a line by ourself or in strict mode
44     // (Note the use of strict mode.  In "almost strict" mode, we don't treat the box for <br> as text.)
45     InlineTextBox* box = static_cast<InlineTextBox*>(RenderText::createInlineBox(makePlaceholder, isRootLineBox, isOnlyRun));
46     box->setIsText(isOnlyRun || document()->inStrictMode());
47     return box;
48 }
49
50 short RenderBR::baselinePosition( bool firstLine, bool isRootLineBox) const
51 {
52     if (firstTextBox() && !firstTextBox()->isText())
53         return 0;
54     return RenderText::baselinePosition(firstLine, isRootLineBox);
55 }
56
57 short RenderBR::lineHeight(bool firstLine, bool isRootLineBox) const
58 {
59     if (firstTextBox() && !firstTextBox()->isText())
60         return 0;
61
62     if (firstLine) {
63         RenderStyle* s = style(firstLine);
64         Length lh = s->lineHeight();
65         if (lh.value < 0) {
66             if (s == style()) {
67                 if (m_lineHeight == -1)
68                     m_lineHeight = RenderObject::lineHeight(false);
69                 return m_lineHeight;
70             }
71             return s->fontMetrics().lineSpacing();
72         }
73         if (lh.isPercent())
74             return lh.minWidth(s->font().pixelSize());
75         return lh.value;
76     }
77     
78     if (m_lineHeight == -1)
79         m_lineHeight = RenderObject::lineHeight(false);
80     return m_lineHeight;
81 }
82
83 void RenderBR::setStyle(RenderStyle* _style)
84 {
85     RenderText::setStyle(_style);
86     m_lineHeight = -1;
87 }
88
89 long RenderBR::caretMinOffset() const 
90
91     return 0; 
92 }
93
94 long RenderBR::caretMaxOffset() const 
95
96     return 1; 
97 }
98
99 unsigned long RenderBR::caretMaxRenderedOffset() const
100 {
101     return 1;
102 }
103
104 Position RenderBR::positionForCoordinates(int _x, int _y, EAffinity *affinity)
105 {
106     if (affinity)
107         *affinity = UPSTREAM;
108     return Position(element(), 0);
109 }
110
111 QRect RenderBR::caretRect(int offset, EAffinity affinity)
112 {
113     // EDIT FIXME: This does not work yet. Some other changes are need before
114     // an accurate position can be determined.
115
116     int absx, absy;
117     absolutePosition(absx,absy);
118
119     // FIXME: an older version of this code wasn't setting width at
120     // all, using the default of 1...
121     return QRect(xPos() + absx, yPos() + absy, 1, lineHeight(false));
122 }
123
124 InlineBox *RenderBR::inlineBox(long offset, EAffinity affinity)
125 {
126     return firstTextBox();
127 }