diff options
author | Sebastian Geerken <devnull@localhost> | 2014-09-12 23:32:32 +0200 |
---|---|---|
committer | Sebastian Geerken <devnull@localhost> | 2014-09-12 23:32:32 +0200 |
commit | f543038f3b597c34f67a4ca63efc2bbe59a78b05 (patch) | |
tree | beb923c5231cb67cb7e9d57348e7dc0bd212757b | |
parent | 5c0abff7a414c2bd3501b4ac1721b4fad7b8bd47 (diff) |
OOFAwareWidgetIterator.
-rw-r--r-- | dw/Makefile.am | 1 | ||||
-rw-r--r-- | dw/oofawarewidget.hh | 29 | ||||
-rw-r--r-- | dw/oofawarewidget_iterator.cc | 154 |
3 files changed, 184 insertions, 0 deletions
diff --git a/dw/Makefile.am b/dw/Makefile.am index 6383fc74..deab7bf9 100644 --- a/dw/Makefile.am +++ b/dw/Makefile.am @@ -70,6 +70,7 @@ libDw_widgets_a_SOURCES = \ listitem.cc \ listitem.hh \ oofawarewidget.cc \ + oofawarewidget_iterator.cc \ oofawarewidget.hh \ ooffloatsmgr.cc \ ooffloatsmgr.hh \ diff --git a/dw/oofawarewidget.hh b/dw/oofawarewidget.hh index 32de4868..50332487 100644 --- a/dw/oofawarewidget.hh +++ b/dw/oofawarewidget.hh @@ -52,6 +52,35 @@ protected: enum { PARENT_REF_OOFM_BITS = 2, PARENT_REF_OOFM_MASK = (1 << PARENT_REF_OOFM_BITS) - 1 }; + class OOFAwareWidgetIterator: public core::Iterator + { + private: + enum { NUM_SECTIONS = NUM_OOFM + 1 }; + int sectionIndex; // 0 means in flow, otherwise OOFM index + 1 + int index; + + int numParts (int sectionIndex); + void getPart (int sectionIndex, int index, core::Content *content); + + protected: + virtual int numContentsInFlow () = 0; + virtual void getContentInFlow (int index, core::Content *content) = 0; + + void highlightOOF (int start, int end, core::HighlightLayer layer); + void unhighlightOOF (int direction, core::HighlightLayer layer); + void getAllocationOOF (int start, int end, core::Allocation *allocation); + + public: + OOFAwareWidgetIterator (OOFAwareWidget *widget, core::Content::Type mask, + bool atEnd); + + int compareTo(lout::object::Comparable *other); + + bool next (); + bool prev (); + void print (); + }; + inline bool isParentRefOOF (int parentRef) { return parentRef != -1 && (parentRef & PARENT_REF_OOFM_MASK); } diff --git a/dw/oofawarewidget_iterator.cc b/dw/oofawarewidget_iterator.cc new file mode 100644 index 00000000..f3e68af9 --- /dev/null +++ b/dw/oofawarewidget_iterator.cc @@ -0,0 +1,154 @@ +/* + * Dillo Widget + * + * Copyright 2014 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 "oofawarewidget.hh" +#include "ooffloatsmgr.hh" +#include "oofposabsmgr.hh" +#include "oofposfixedmgr.hh" + +using namespace dw; +using namespace dw::core; +using namespace lout::misc; +using namespace lout::object; + +namespace dw { + +namespace oof { + +int OOFAwareWidget::OOFAwareWidgetIterator::numParts (int sectionIndex) +{ + OOFAwareWidget *widget = (OOFAwareWidget*)getWidget(); + + if (sectionIndex == 0) + return numContentsInFlow (); + else + return widget->outOfFlowMgr[sectionIndex - 1] ? + widget->outOfFlowMgr[sectionIndex - 1]->getNumWidgets () : 0; +} + +void OOFAwareWidget::OOFAwareWidgetIterator::getPart (int sectionIndex, + int index, + core::Content *content) +{ + OOFAwareWidget *widget = (OOFAwareWidget*)getWidget(); + + if (sectionIndex == 0) + getContentInFlow (index, content); + else { + content->type = core::Content::WIDGET_OOF_CONT; + content->widget = + widget->outOfFlowMgr[sectionIndex - 1]->getWidget (index); + } +} + +int OOFAwareWidget::OOFAwareWidgetIterator::compareTo (Comparable *other) +{ + OOFAwareWidgetIterator *otherTI = (OOFAwareWidgetIterator*)other; + + if (sectionIndex != otherTI->sectionIndex) + return sectionIndex - otherTI->sectionIndex; + else + return index - otherTI->index; +} + +bool OOFAwareWidget::OOFAwareWidgetIterator::next () +{ + if (content.type == core::Content::END) + return false; + + do { + index++; + + if (index >= numParts(sectionIndex)) { + sectionIndex++; + while (sectionIndex < NUM_SECTIONS && numParts(sectionIndex) == 0) + sectionIndex++; + + if (sectionIndex == NUM_SECTIONS) { + content.type = core::Content::END; + return false; + } else + index = 0; + } + + getPart (sectionIndex, index, &content); + } while ((content.type & getMask()) == 0); + + return true; +} + +bool OOFAwareWidget::OOFAwareWidgetIterator::prev () +{ + if (content.type == core::Content::START) + return false; + + do { + index--; + + if (index < 0) { + sectionIndex--; + while (sectionIndex >= 0 && numParts(sectionIndex) == 0) + sectionIndex--; + + if (sectionIndex < 0) { + content.type = core::Content::START; + return false; + } else + index = numParts(sectionIndex) - 1; + } + + getPart (sectionIndex, index, &content); + } while ((content.type & getMask()) == 0); + + return true; +} + +void OOFAwareWidget::OOFAwareWidgetIterator::highlightOOF (int start, int end, + core::HighlightLayer + layer) +{ + // TODO What about OOF widgets? +} + +void OOFAwareWidget::OOFAwareWidgetIterator::unhighlightOOF + (int direction, core::HighlightLayer layer) +{ + // TODO What about OOF widgets? +} + +void OOFAwareWidget::OOFAwareWidgetIterator::getAllocationOOF (int start, + int end, + core::Allocation + *allocation) +{ + // TODO Consider start and end? + OOFAwareWidget *widget = (OOFAwareWidget*)getWidget(); + *allocation = *(widget->outOfFlowMgr[sectionIndex - 1] + ->getWidget(index)->getAllocation()); +} + +void OOFAwareWidget::OOFAwareWidgetIterator::print () +{ + Iterator::print (); + printf (", sectionIndex = %d, index = %d", sectionIndex, index); +} + +} // namespace oof + +} // namespace dw |