/* * Copyright (c) 2004, Nate Nielsen * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above * copyright notice, this list of conditions and the * following disclaimer. * * Redistributions in binary form must reproduce the * above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or * other materials provided with the distribution. * * The names of contributors to this software may not be * used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * * CONTRIBUTORS * Nate Nielsen * */ #ifndef __XMLCOMPOSEHELPERS_H__ #define __XMLCOMPOSEHELPERS_H__ #include "usuals.h" #include "reference.h" #include "sablo.h" #include "rtfformatting.h" class XmlComposer; /* * Destination * * A destination is a small class that handles the character data found * in the RTF document. Depending on the current context in the RTF * different destinations are used. */ class Destination : public Instance { public: // This is called when the Destination is first used virtual void initialize() {}; // Called when data arrives at destination virtual void charData(wstring data) {}; // Called when the Destination goes out of scope virtual void done() {}; protected: XmlComposer* m_composer; friend class XmlComposer; }; /* * Analyser * * An analyser is a small class that handles the RTF control words. * Depending on the current context in the RTF different analysers * are used. */ class Analyser : public Instance { public: // This is called when the Analyser is first used virtual void initialize() {}; // Called when a control word is seen virtual void controlWord(const string& cw, int flags, int param) {}; // Called when a group is seen within this scope virtual void groupStart() {}; // Called when a group ends within this scope virtual void groupEnd() {}; // Called when when this analyser goes out of scope virtual void done() {}; protected: XmlComposer* m_composer; friend class XmlComposer; }; class Level; // Reference counted pointers typedef Reference DestinationPtr; typedef Reference AnalyserPtr; typedef Reference LevelPtr; /* * Level * * A level is a combination of a Destination, Analyser, XML Element and * some other options. They're used in a stack to push and pop these as * RTF groups are found. * * About the stack: * Not each level has it's own options. If a certain option isn't found * in the current level the previous one is looked up. That's what all * the 'deep' stuff is about below: * * get* methods: * When 'deep' is set look to previous levels for the given object if not * found at the current level. When not set returns object in current level * or null when none exists here. * * set* methods: * When 'deep' is set then replace the object currently being used at it's * own level. So if get* would return an object from a previous level, with * deep set to true it would replace that object in the given level. When * not set, then the object is set in the current level. */ class Level : public Instance { public: Level(); virtual ~Level(); LevelPtr getPrevious(); LevelPtr pushLevel(); // The current XML Element // TODO: Add deep semantics here DOM::Element getElement(bool deep = true); void setElement(DOM::Element element, bool deep = false); // The current Analyser AnalyserPtr getAnalyser(bool deep = true); void setAnalyser(AnalyserPtr analyser, bool deep = false); // The current Destination DestinationPtr getDestination(bool deep = true); void setDestination(DestinationPtr destination, bool deep = false); // The current formatting options RtfFormatting& getFormatting(); void setTextProperties(RtfFormatting& textProperties); protected: // Constructor for stacking levels Level(const Level& level); LevelPtr m_previous; // The previous level DOM::Element m_element; // XML Element for this level RtfFormatting m_text; // Formatting options for this level DestinationPtr m_destination; // Destination for this level AnalyserPtr m_analyser; // Analyser for this level }; #endif //__XMLCOMPOSEHELPERS_H__