00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef IE_EXP_RTF_H
00022 #define IE_EXP_RTF_H
00023
00024 #include "ie_exp.h"
00025 #include "ut_exception.h"
00026 #include "ut_vector.h"
00027 #include "ut_hash.h"
00028 #include "ut_misc.h"
00029 #include "pl_Listener.h"
00030 #include "fl_AutoLists.h"
00031 #include "fl_AutoNum.h"
00032
00033 class PD_Document;
00034 class PD_Style;
00035 class PP_AttrProp;
00036 class s_RTF_ListenerWriteDoc;
00037 class s_RTF_ListenerGetProps;
00038 class s_RTF_AttrPropAdapter;
00039 class s_RTF_AttrPropAdapter_Style;
00040 class ie_exp_RTF_MsWord97List;
00041 class ie_exp_RTF_MsWord97ListSimple;
00042 class ie_exp_RTF_MsWord97ListMulti;
00043 class ie_exp_RTF_ListOveride;
00044 class _rtf_font_info;
00045
00046
00047
00048 class ABI_EXPORT IE_Exp_RTF_Sniffer : public IE_ExpSniffer
00049 {
00050 friend class IE_Exp;
00051
00052 public:
00053 IE_Exp_RTF_Sniffer ();
00054 virtual ~IE_Exp_RTF_Sniffer () {}
00055
00056 UT_Confidence_t supportsMIME (const char * szMIME);
00057
00058 virtual bool recognizeSuffix (const char * szSuffix);
00059 virtual bool getDlgLabels (const char ** szDesc,
00060 const char ** szSuffixList,
00061 IEFileType * ft);
00062 virtual UT_Error constructExporter (PD_Document * pDocument,
00063 IE_Exp ** ppie);
00064 };
00065
00066
00067
00068
00069
00070 class ABI_EXPORT IE_Exp_RTF_attic_Sniffer : public IE_ExpSniffer
00071 {
00072 friend class IE_Exp;
00073
00074 public:
00075 IE_Exp_RTF_attic_Sniffer ();
00076 virtual ~IE_Exp_RTF_attic_Sniffer () {}
00077
00078 virtual bool recognizeSuffix (const char * szSuffix);
00079 virtual bool getDlgLabels (const char ** szDesc,
00080 const char ** szSuffixList,
00081 IEFileType * ft);
00082 virtual UT_Error constructExporter (PD_Document * pDocument,
00083 IE_Exp ** ppie);
00084 };
00085
00086
00087
00088 class ABI_EXPORT IE_Exp_MsWord_Hack_Sniffer : public IE_ExpSniffer
00089 {
00090 friend class IE_Exp;
00091
00092 public:
00093 IE_Exp_MsWord_Hack_Sniffer ();
00094 virtual ~IE_Exp_MsWord_Hack_Sniffer () {}
00095
00096 virtual bool recognizeSuffix (const char * szSuffix);
00097 virtual bool getDlgLabels (const char ** szDesc,
00098 const char ** szSuffixList,
00099 IEFileType * ft);
00100 virtual UT_Error constructExporter (PD_Document * pDocument,
00101 IE_Exp ** ppie);
00102 };
00103
00104 struct NumberedStyle;
00105
00106 class ABI_EXPORT IE_Exp_RTF : public IE_Exp
00107 {
00108 friend class s_RTF_ListenerWriteDoc;
00109 friend class s_RTF_ListenerGetProps;
00110
00111 public:
00112 IE_Exp_RTF(PD_Document * pDocument);
00113 IE_Exp_RTF(PD_Document * pDocument,bool atticFormat);
00114 virtual ~IE_Exp_RTF();
00115 ie_exp_RTF_MsWord97ListMulti * getNthMultiLevel(UT_uint32 i) const;
00116 ie_exp_RTF_MsWord97ListSimple * getNthSimple(UT_uint32 i) const;
00117 ie_exp_RTF_ListOveride * getNthOveride(UT_uint32 i) const;
00118 UT_uint32 getMultiLevelCount(void) const;
00119 UT_uint32 getSimpleListCount(void) const;
00120 UT_uint32 getOverideCount(void) const;
00121 UT_uint32 getMatchingOverideNum(UT_uint32 ID);
00122 void exportHdrFtr(const char * pszHdrFtr , const char * pszHdrFtrID,const char * pszKeyword);
00123 UT_BidiCharType isCharRTL() {return m_CharRTL;}
00124 void setCharRTL(UT_BidiCharType t) {m_CharRTL = t;}
00125 void setByteBuf(UT_ByteBuf * pBuf)
00126 { _setByteBuf(pBuf);}
00127 UT_ByteBuf * getByteBuf(void)
00128 { return _getByteBuf();}
00129 protected:
00130 virtual UT_Error _writeDocument(void);
00131 UT_Error _writeDocumentLocal(bool bSkipHeader);
00132 UT_sint32 _findColor(const char * szColor) const;
00133 UT_sint32 _findOrAddColor (const char * szColor);
00134 void _addColor(const char * szColor);
00135 void _rtf_open_brace(void);
00136 void _rtf_close_brace(void);
00137 bool _rtf_reopen_brace(void);
00138 void _rtf_keyword(const char * szKey);
00139 void _rtf_keyword(const char * szKey, UT_sint32 d);
00140 void _rtf_keyword_space(const char * szKey, UT_sint32 d);
00141 void _rtf_keyword(const char * szKey, const char * szValue);
00142 void _rtf_nonascii_hex2(UT_sint32 d);
00143 void _rtf_nonascii_hex2(UT_sint32 d, UT_String & pStr);
00144 void _rtf_keyword_hex2(const char * szKey, UT_sint32 d);
00145 void _rtf_keyword_ifnotdefault(const char * szKey, const char * szValue, UT_sint32 defaultValue);
00146 void _rtf_keyword_ifnotdefault_twips(const char * szKey, const char * szValue, UT_sint32 defaultValue);
00147 void _rtf_semi(void);
00148 void _rtf_fontname(const char * szFontName);
00149 void _rtf_chardata(const char * pbuf, UT_uint32 buflen);
00150 void _rtf_pcdata(UT_UTF8String &sPCData, bool bSupplyUC=false, UT_uint32 iAltChars=1);
00151 void _rtf_pcdata(const char * szPCData, bool bSupplyUC=false, UT_uint32 iAltChars=1);
00152 void _rtf_nl(void);
00153 const gchar * _getStyleProp(s_RTF_AttrPropAdapter_Style * pADStyle,
00154 const s_RTF_AttrPropAdapter * apa,
00155 const char * szProp);
00156
00157 bool _write_rtf_header(void);
00158 bool _write_rtf_trailer(void);
00159
00160 void _clearStyles();
00161 void _selectStyles();
00162 UT_uint32 _getStyleNumber(const PD_Style * pStyle);
00163 UT_uint32 _getStyleNumber(const gchar * szStyleName);
00164
00165 void _write_prop_ifnotdefault(const PD_Style * pStyle, const gchar * szPropName, const char * szRTFName);
00166 void _write_prop_ifyes(const PD_Style * pStyle, const gchar * szPropName, const char * szRTFName);
00167 void _write_tabdef(const char * szTabStops);
00168 void _write_charfmt(const s_RTF_AttrPropAdapter &);
00169
00170 void _write_parafmt(const PP_AttrProp * pSpanAP,
00171 const PP_AttrProp * pBlockAP,
00172 const PP_AttrProp * pSectionAP,
00173 bool & bStartedList, PL_StruxDocHandle sdh, UT_uint32 &iCurrID,
00174 bool &bIsListBlock, UT_sint32 iNestLevel);
00175
00176 void _write_style_fmt(const PD_Style *);
00177 void _write_stylesheets(void);
00178 void _write_listtable(void);
00179 void _output_MultiLevelRTF(ie_exp_RTF_MsWord97ListMulti * pMulti);
00180 void _output_SimpleListRTF(ie_exp_RTF_MsWord97ListSimple * pSimple);
00181 void _output_OveridesRTF(ie_exp_RTF_ListOveride * pOver, UT_uint32 i);
00182 void _output_ListRTF(fl_AutoNum * pAuto, UT_uint32 iLevel);
00183 void _output_LevelText(fl_AutoNum * pAuto, UT_uint32 iLevel,UT_UCSChar bulletsym);
00184 void _get_LeftRight_Side(UT_String & LeftSide, UT_String & RightSide);
00185 void _generate_level_Text(fl_AutoNum * pAuto,UT_String & LevelText,UT_String &LevelNumbers, UT_uint32 & lenText, UT_uint32 & ifoundLevel);
00186
00187 void _output_revision(const s_RTF_AttrPropAdapter & apa, bool bPara,PL_StruxDocHandle sdh,
00188 UT_sint32 iNestLevel, bool & bStartedList, bool &bIsListBlock,
00189 UT_uint32 &iCurrID);
00190
00191 UT_sint32 _findFont(const s_RTF_AttrPropAdapter * apa) const;
00192 UT_sint32 _findFont(const _rtf_font_info * pfi) const;
00193 void _addFont(const _rtf_font_info * pfi);
00194
00195 private:
00196 static bool s_escapeString(UT_UTF8String &sOutStr, UT_UCS4String &sInStr,
00197 UT_uint32 iAltChars);
00198 static bool s_escapeString(UT_UTF8String &sOutStr, const char * szInStr,
00199 UT_uint32 iSize, UT_uint32 iAltChars);
00200
00201 s_RTF_ListenerWriteDoc * m_pListenerWriteDoc;
00202 UT_Vector m_vecColors;
00203 UT_Vector m_vecFonts;
00204 bool m_bNeedUnicodeText;
00205 UT_sint32 m_braceLevel;
00206 bool m_bLastWasKeyword;
00207 bool m_atticFormat;
00208 UT_GenericStringMap<NumberedStyle*> m_hashStyles;
00209
00210
00211
00212 UT_Vector m_vecMultiLevel;
00213 UT_Vector m_vecSimpleList;
00214 UT_Vector m_vecOverides;
00215
00216 UT_BidiCharType m_CharRTL;
00217 };
00218
00219
00220
00221
00222
00223
00224 class ABI_EXPORT _rtf_font_info
00225 {
00226 public:
00227 _rtf_font_info();
00228 bool init(const s_RTF_AttrPropAdapter & apa, bool bDoFieldFont = false);
00229 bool init(const char * szfontName);
00230 virtual ~_rtf_font_info(void);
00231 bool _is_same(const _rtf_font_info & fi) const;
00232 const char * getFontFamily(void) const { return szFamily;}
00233 const char * getFontName(void) const { return m_szName.c_str();}
00234 int getFontCharset(void) const { return nCharset;}
00235 int getFontPitch(void) const { return nPitch;}
00236 bool isTrueType(void) const { return fTrueType;}
00237 private:
00238 const gchar * szFamily;
00239 int nCharset;
00240 int nPitch;
00241 UT_String m_szName;
00242 bool fTrueType;
00243 };
00244
00245 class ABI_EXPORT ie_exp_RTF_MsWord97List
00246 {
00247 public:
00248 ie_exp_RTF_MsWord97List(fl_AutoNum * pAuto);
00249 virtual ~ie_exp_RTF_MsWord97List(void);
00250 fl_AutoNum * getAuto(void) const { return m_pAutoNum;}
00251 UT_uint32 getID(void) const {return m_Id;}
00252 private:
00253 fl_AutoNum * m_pAutoNum;
00254 UT_uint32 m_Id;
00255 };
00256
00257 class ABI_EXPORT ie_exp_RTF_MsWord97ListSimple : public ie_exp_RTF_MsWord97List
00258 {
00259 public:
00260 ie_exp_RTF_MsWord97ListSimple(fl_AutoNum * pAuto);
00261 ~ie_exp_RTF_MsWord97ListSimple(void);
00262 bool isSimple(void) const { return true;}
00263 bool isMulti(void) const { return false;}
00264 private:
00265 };
00266
00267 class ABI_EXPORT ie_exp_RTF_MsWord97ListMulti : public ie_exp_RTF_MsWord97List
00268 {
00269 public:
00270 ie_exp_RTF_MsWord97ListMulti(fl_AutoNum * pAuto);
00271 ~ie_exp_RTF_MsWord97ListMulti(void);
00272 bool isSimple(void) const { return false;}
00273 bool isMulti(void) const { return true;}
00274 void addLevel(UT_uint32 iLevel, ie_exp_RTF_MsWord97List * pMsWord97List);
00275 ie_exp_RTF_MsWord97List * getListAtLevel(UT_uint32 iLevel, UT_uint32 nthList);
00276 UT_uint32 getMatchingID(UT_uint32 listID);
00277 private:
00278 UT_Vector * m_vLevels[9];
00279 };
00280
00281 class ABI_EXPORT ie_exp_RTF_ListOveride
00282 {
00283 public:
00284 ie_exp_RTF_ListOveride(fl_AutoNum * pAuto);
00285 ~ie_exp_RTF_ListOveride(void);
00286 void setOverideID(UT_uint32 ID) {m_OverideID = ID;}
00287 UT_uint32 getOverideID(void) const { return m_OverideID;}
00288 fl_AutoNum * getAutoNum(void) const { return m_pAutoNum;}
00289 bool doesOverideMatch(UT_uint32 ID) const { return (ID == m_AbiListID);}
00290 UT_uint32 getAbiListID(void) const { return m_AbiListID;}
00291 private:
00292 UT_uint32 m_AbiListID;
00293 UT_uint32 m_OverideID;
00294 fl_AutoNum * m_pAutoNum;
00295 };
00296 #endif
00297
00298
00299
00300
00301
00302
00303