2f993f1f7ad1dfc99e3913e2a433953a89b5e35b
[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 #include "xml/dom_position.h"
24
25 using namespace khtml;
26 using DOM::Position;
27
28 RenderBR::RenderBR(DOM::NodeImpl* node)
29     : RenderText(node, new DOM::DOMStringImpl(QChar('\n'))), m_x(0), m_y(0), m_height(0),
30       m_lineHeight(-1)
31 {
32 }
33
34 RenderBR::~RenderBR()
35 {
36 }
37
38 InlineBox* RenderBR::createInlineBox(bool makePlaceholder, bool isRootLineBox, bool isOnlyRun)
39 {
40     // We only make a box for a <br> if we are on a line by ourself or in strict mode
41     // (Note the use of strict mode.  In "almost strict" mode, we don't make a box for <br>.)
42     if (isOnlyRun || document()->inStrictMode())
43         return RenderText::createInlineBox(makePlaceholder, isRootLineBox, isOnlyRun);
44     return 0;
45 }
46
47 void RenderBR::position(InlineBox* box, int from, int len, bool reverse)
48 {
49     InlineTextBox *s = static_cast<InlineTextBox*>(box);
50     
51     // We want the box to be destroyed, but get the position of it first.
52     m_x = s->xPos();
53     m_y = s->yPos();
54     m_height = s->height();
55 }
56
57 short RenderBR::lineHeight(bool firstLine, bool isRootLineBox) const
58 {
59     if (firstLine) {
60         RenderStyle* s = style(firstLine);
61         Length lh = s->lineHeight();
62         if (lh.value < 0) {
63             if (s == style()) {
64                 if (m_lineHeight == -1)
65                     m_lineHeight = RenderObject::lineHeight(false);
66                 return m_lineHeight;
67             }
68             return s->fontMetrics().lineSpacing();
69         }
70         if (lh.isPercent())
71             return lh.minWidth(s->font().pixelSize());
72         return lh.value;
73     }
74     
75     if (m_lineHeight == -1)
76         m_lineHeight = RenderObject::lineHeight(false);
77     return m_lineHeight;
78 }
79
80 void RenderBR::setStyle(RenderStyle* _style)
81 {
82     RenderText::setStyle(_style);
83     m_lineHeight = -1;
84 }
85
86 long RenderBR::caretMinOffset() const 
87
88     return 0; 
89 }
90
91 long RenderBR::caretMaxOffset() const 
92
93     return 1; 
94 }
95
96 unsigned long RenderBR::caretMaxRenderedOffset() const
97 {
98     return 1;
99 }
100
101 Position RenderBR::positionForCoordinates(int _x, int _y)
102 {
103     return Position(element(), 0);
104 }
105
106 void RenderBR::caretPos(int offset, bool override, int &_x, int &_y, int &_w, int &_h)
107 {
108     // EDIT FIXME: This does not work yet. Some other changes are need before
109     // an accurate position can be determined.
110     _h = lineHeight(false);
111     _x = xPos();
112     _y = yPos();
113
114     int absx, absy;
115     absolutePosition(absx,absy);
116     _x += absx;
117     _y += absy;
118 }
119
120 InlineBox *RenderBR::inlineBox(long offset)
121 {
122     return firstTextBox();
123 }