aboutsummaryrefslogtreecommitdiff
path: root/dw
diff options
context:
space:
mode:
authorSebastian Geerken <devnull@localhost>2014-09-12 23:32:32 +0200
committerSebastian Geerken <devnull@localhost>2014-09-12 23:32:32 +0200
commitf543038f3b597c34f67a4ca63efc2bbe59a78b05 (patch)
treebeb923c5231cb67cb7e9d57348e7dc0bd212757b /dw
parent5c0abff7a414c2bd3501b4ac1721b4fad7b8bd47 (diff)
OOFAwareWidgetIterator.
Diffstat (limited to 'dw')
-rw-r--r--dw/Makefile.am1
-rw-r--r--dw/oofawarewidget.hh29
-rw-r--r--dw/oofawarewidget_iterator.cc154
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