From 63c6a88ba07aa8fe99102491fa381f1fed1880cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 3 Jan 2005 10:10:46 +0000 Subject: [PATCH] Added a simple RTF::Worker class that can be subclassed in order to work with the RTF document step by step. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10568 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/translators/rtftranslator/RTF.cpp | 89 +++++++++++++++++++ src/add-ons/translators/rtftranslator/RTF.h | 24 +++++ 2 files changed, 113 insertions(+) diff --git a/src/add-ons/translators/rtftranslator/RTF.cpp b/src/add-ons/translators/rtftranslator/RTF.cpp index f280628971..25e9c438a7 100644 --- a/src/add-ons/translators/rtftranslator/RTF.cpp +++ b/src/add-ons/translators/rtftranslator/RTF.cpp @@ -746,3 +746,92 @@ Iterator::Next() return element; } + +// #pragma mark - + + +Worker::Worker(RTF::Header &start) + : + fStart(start) +{ +} + + +Worker::~Worker() +{ +} + + +void +Worker::Dispatch(Element *element) +{ + if (RTF::Group *group = dynamic_cast(element)) { + fSkip = false; + Group(group); + + if (fSkip) + return; + + for (int32 i = 0; (element = group->ElementAt(i)) != NULL; i++) + Dispatch(element); + + GroupEnd(group); + } else if (RTF::Command *command = dynamic_cast(element)) { + Command(command); + } else if (RTF::Text *text = dynamic_cast(element)) { + Text(text); + } +} + + +void +Worker::Work() throw (status_t) +{ + Dispatch(&fStart); +} + + +void +Worker::Group(RTF::Group *group) +{ +} + + +void +Worker::GroupEnd(RTF::Group *group) +{ +} + + +void +Worker::Command(RTF::Command *command) +{ +} + + +void +Worker::Text(RTF::Text *text) +{ +} + + +RTF::Header & +Worker::Start() +{ + return fStart; +} + + +void +Worker::Skip() +{ + fSkip = true; +} + + +void +Worker::Abort(status_t status) +{ + throw status; +} + diff --git a/src/add-ons/translators/rtftranslator/RTF.h b/src/add-ons/translators/rtftranslator/RTF.h index c27078db5d..504f2295ab 100644 --- a/src/add-ons/translators/rtftranslator/RTF.h +++ b/src/add-ons/translators/rtftranslator/RTF.h @@ -158,6 +158,30 @@ class Iterator { group_destination fDestination; }; +class Worker { + public: + Worker(RTF::Header &start); + virtual ~Worker(); + + void Work() throw (status_t); + + protected: + virtual void Group(RTF::Group *group); + virtual void GroupEnd(RTF::Group *group); + virtual void Command(RTF::Command *command); + virtual void Text(RTF::Text *text); + + RTF::Header &Start(); + void Skip(); + void Abort(status_t status); + + private: + void Dispatch(RTF::Element *element); + + RTF::Header &fStart; + bool fSkip; +}; + } // namespace RTF #endif /* RTF_H */