diff options
author | Sebastian Geerken <devnull@localhost> | 2014-05-28 00:58:21 +0200 |
---|---|---|
committer | Sebastian Geerken <devnull@localhost> | 2014-05-28 00:58:21 +0200 |
commit | 4c47a19af4349ba45833ff37406f78bba1fde5ef (patch) | |
tree | cb22f4a523f4ff883c525378fb68c50e31c3d536 /dw/alignedtablecell.cc | |
parent | c0135425bdb0bdaeed57c99638e8bbeb94a5c17d (diff) |
Split up dw::TableCell in dw::AlignedTableCell (was: dw::TableCell) and dw::SimpleTableCell (derived from dw::Textblock). The HTML parser now uses only one of these two classes for table cells, not dw::Textblock anymore.
Diffstat (limited to 'dw/alignedtablecell.cc')
-rw-r--r-- | dw/alignedtablecell.cc | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/dw/alignedtablecell.cc b/dw/alignedtablecell.cc new file mode 100644 index 00000000..2b81645d --- /dev/null +++ b/dw/alignedtablecell.cc @@ -0,0 +1,113 @@ +/* + * Dillo Widget + * + * Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + + + +#include "alignedtablecell.hh" +#include "../lout/debug.hh" +#include <stdio.h> + +namespace dw { + +int AlignedTableCell::CLASS_ID = -1; + +AlignedTableCell::AlignedTableCell (AlignedTableCell *ref, bool limitTextWidth): + AlignedTextblock (limitTextWidth) +{ + DBG_OBJ_CREATE ("dw::AlignedTableCell"); + registerName ("dw::AlignedTableCell", &CLASS_ID); + + /** \bug ignoreLine1OffsetSometimes does not work? */ + //ignoreLine1OffsetSometimes = true; + charWordIndex = -1; + setRefTextblock (ref); + setButtonSensitive(true); +} + +AlignedTableCell::~AlignedTableCell() +{ + DBG_OBJ_DELETE (); +} + +int AlignedTableCell::wordWrap(int wordIndex, bool wrapAll) +{ + Textblock::Word *word; + const char *p; + + int ret = Textblock::wordWrap (wordIndex, wrapAll); + + if (charWordIndex == -1) { + word = words->getRef (wordIndex); + if (word->content.type == core::Content::TEXT) { + if ((p = strchr (word->content.text, + word->style->textAlignChar))) { + charWordIndex = wordIndex; + charWordPos = p - word->content.text + 1; + } else if (word->style->textAlignChar == ' ' && + word->content.space) { + charWordIndex = wordIndex + 1; + charWordPos = 0; + } + } + } + + if (wordIndex == charWordIndex) + updateValue (); + + return ret; +} + +int AlignedTableCell::getValue () +{ + Textblock::Word *word; + int i, wordIndex; + int w; + + if (charWordIndex == -1) + wordIndex = words->size () -1; + else + wordIndex = charWordIndex; + + w = 0; + for (i = 0; i < wordIndex; i++) { + word = words->getRef (i); + w += word->size.width + word->origSpace; + } + + if (charWordIndex == -1) { + if (words->size () > 0) { + word = words->getRef (words->size () - 1); + w += word->size.width; + } + } else { + word = words->getRef (charWordIndex); + w += layout->textWidth (word->style->font, word->content.text, + charWordPos); + } + + return w; +} + +void AlignedTableCell::setMaxValue (int maxValue, int value) +{ + line1Offset = maxValue - value; + queueResize (OutOfFlowMgr::createRefNormalFlow (0), true); +} + +} // namespace dw |