summaryrefslogtreecommitdiff
path: root/writerfilter/source/doctok/WW8CpAndFc.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter/source/doctok/WW8CpAndFc.hxx')
-rw-r--r--writerfilter/source/doctok/WW8CpAndFc.hxx360
1 files changed, 360 insertions, 0 deletions
diff --git a/writerfilter/source/doctok/WW8CpAndFc.hxx b/writerfilter/source/doctok/WW8CpAndFc.hxx
new file mode 100644
index 000000000000..86a8b971a7d6
--- /dev/null
+++ b/writerfilter/source/doctok/WW8CpAndFc.hxx
@@ -0,0 +1,360 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_WW8_CP_AND_FC_HXX
+#define INCLUDED_WW8_CP_AND_FC_HXX
+
+#include <sal/types.h>
+#ifndef INCLUDED_DOCUMENT_HXX
+#include <doctok/WW8Document.hxx>
+#endif
+#include <set>
+#include <hash_map>
+#include <iostream>
+
+namespace writerfilter {
+namespace doctok
+{
+using namespace ::std;
+
+template <class T>
+bool operator <= (const T & rA, const T & rB)
+{
+ return ! ( rB < rA );
+}
+
+/**
+ A character position.
+
+ This is a wrapper to make the type for WW8 character position (CP)
+ distinct from WW8 file character positions (FC).
+*/
+struct Cp
+{
+ sal_uInt32 nCp; // the WW8 character position
+
+ Cp() : nCp(0) {}
+
+ Cp(sal_uInt32 nCp_) : nCp(nCp_) {}
+
+ /**
+ Returns the WW8 character position.
+
+ @return the WW8 character position
+ */
+ sal_uInt32 get() const { return nCp; }
+
+ /**
+ Sets the WW8 character position.
+
+ @param nCp_ the WW8 character position to set
+ */
+ void set(sal_uInt32 nCp_) { nCp = nCp_; }
+
+ /**
+ Calculate CP moved backward.
+
+ None of the involved CPs is changed.
+
+ @param n amount of movement
+
+ @return CP moved @n steps backward
+ */
+ sal_uInt32 operator - (const Cp & rCp) const
+ { return nCp - rCp.nCp; }
+
+ /**
+ Calculate CP moved forward.
+
+ None of the involved CPs is changed.
+
+ @param n amount of movement
+
+ @return CP moved @n steps forward
+ */
+ Cp operator + (sal_uInt32 n) const
+ { return Cp(nCp + n); }
+
+ /**
+ Advance CP forward.
+
+ @attention The CP is altered.
+
+ @param n amount of movement
+
+ @return CP moved @n steps forward
+ */
+ Cp & operator += (sal_uInt32 n)
+ {
+ nCp += n;
+
+ return *this;
+ }
+
+ /**
+ Return string representation of CP.
+ */
+ string toString() const;
+
+ friend bool operator < (const Cp & rA, const Cp & rB);
+ friend bool operator == (const Cp & rA, const Cp & rB);
+ friend ostream & operator << (ostream & o, const Cp & rCp);
+};
+
+/**
+ A file character position.
+
+ This is a wrapper to make the type for WW8 character position (CP)
+ distinct from WW8 file character positions (FC).
+
+ \see{Cp}
+*/
+struct Fc
+{
+ sal_uInt32 mnFc; // the WW8 character position
+ bool mbComplex;
+
+ Fc() : mnFc(0), mbComplex(false) {}
+
+ Fc(sal_uInt32 nFc, bool bComplex = true)
+ : mnFc(nFc), mbComplex(bComplex)
+ {}
+
+ sal_uInt32 complexFactor() const { return mbComplex ? 1 : 2; }
+
+ /**
+ Returns the WW8 character position.
+
+ @return the WW8 character position
+ */
+ sal_uInt32 get() const { return mnFc; }
+
+ /**
+ Sets the WW8 file character position.
+
+ @param nFc the WW8 file character position to set
+ */
+ void set(sal_uInt32 nFc) { mnFc = nFc; }
+
+ /**
+ Set if the FC is complex.
+
+ @param bComplex true if FC is set to be complex
+ */
+ void setComplex(bool bComplex) { mbComplex = bComplex; }
+
+ /**
+ Return if FC is complex.
+
+ @retval true FC is complex
+ @retval false else
+ */
+ bool isComplex() const { return mbComplex; }
+
+ /**
+ Distance of FCs.
+
+ None of the involved FCs is changed.
+
+ @param rFc FC to calculate distance to
+
+ @return Distance from @a rFc to this FC
+ */
+ sal_uInt32 operator - (const Fc & rFc) const
+ { return (mnFc - rFc.mnFc) / complexFactor(); }
+
+ /**
+ Calculate FC moved backward.
+
+ None of the involved FCs is changed.
+
+ @param n amount of movement
+
+ @return FC moved @n steps backward
+ */
+ Fc operator - (sal_uInt32 n) const
+ { return Fc(mnFc - n * complexFactor(), mbComplex); }
+
+ /**
+ Calculate FC moved forward.
+
+ None of the involved FCs is changed.
+
+ @param n amount of movement
+
+ @return FC moved @n steps Forward
+ */
+ Fc operator + (sal_uInt32 n) const
+ { return Fc(mnFc + n * complexFactor(), mbComplex); }
+
+ /**
+ Return string representation of FC.
+ */
+ string toString() const;
+
+ friend bool operator < (const Fc & rA, const Fc & rB);
+ friend bool operator == (const Fc & rA, const Fc & rB);
+ friend ostream & operator << (ostream & o, const Fc & rFc);
+};
+
+/**
+ A character position and a corresponding file character position
+ paired.
+ */
+class CpAndFc
+{
+private:
+ /**
+ character position
+ */
+ Cp mCp;
+
+ /**
+ file character position
+ */
+ Fc mFc;
+
+ /**
+ property type
+ */
+ PropertyType mType;
+
+public:
+ CpAndFc() {}
+ CpAndFc(const Cp & rCp, const Fc & rFc, PropertyType eType_);
+
+ /**
+ Return character position.
+ */
+ const Cp & getCp() const { return mCp; }
+
+ /**
+ Return file character position.
+ */
+ const Fc & getFc() const { return mFc; }
+
+ /**
+ Return property type.
+ */
+ PropertyType getType() const { return mType; }
+
+ /**
+ Return if FC is complex.
+
+ @retval true FC is complex
+ @retval false else
+ */
+ bool isComplex() const { return mFc.isComplex(); }
+
+ /**
+ Return the distance to other CpAndFc.
+
+ @param rCpAndFc the other CpAndFc
+
+ @return the distance from the CP in @a rCpAndFc to the CP in
+ CpAndFc.
+ */
+ sal_uInt32 operator-(const CpAndFc & rCpAndFc) const
+ { return mCp - rCpAndFc.mCp; }
+
+ /**
+ Return string representation of the CpAndFc.
+ */
+ string toString() const;
+
+ friend bool operator < (const CpAndFc & rA, const CpAndFc & rB);
+ friend bool operator == (const CpAndFc & rA, const CpAndFc & rB);
+ friend ostream & operator << (ostream & o, const CpAndFc & rCpAndFc);
+};
+
+struct CpAndFcLess
+{
+ CpAndFcLess()
+ {
+ }
+
+ bool operator()(const CpAndFc & rA, const CpAndFc & rB) const
+ {
+ return rA < rB;
+ }
+
+ bool operator()(const CpAndFc & rA, const Cp & rB) const
+ {
+ return rA.getCp() < rB;
+ }
+
+ bool operator()(const Cp & rA, const CpAndFc & rB) const
+ {
+ return rA < rB.getCp();
+ }
+};
+
+
+typedef set<CpAndFc, CpAndFcLess> CpAndFcs;
+
+ostream & operator << (ostream & o, const CpAndFcs & rCpAndFcs);
+
+struct CpHash
+{
+ size_t operator()(const Cp & rCp) const
+ {
+ return rCp.get();
+ }
+};
+
+struct FcHash
+{
+ size_t operator()(const Fc & rFc) const
+ {
+ return rFc.get();
+ }
+};
+
+struct CpEq
+{
+ bool operator() (const Cp & rA, const Cp &rB) const
+ {
+ return rA == rB;
+ }
+};
+
+struct CpAndFcHash
+{
+ size_t operator()(const CpAndFc & rCpAndFc) const
+ {
+ CpHash aHash;
+
+ return aHash(rCpAndFc.getCp());
+ }
+};
+
+typedef hash_map<Cp, Fc, CpHash, CpEq> Cp2FcHashMap_t;
+
+} // namespace doctok
+} // namespace writerfilter
+
+#endif // INCLUDED_WW8_CP_AND_FC_HXX