1 /* -*- Mode: C++; c-default-style: "k&r"; indent-tabs-mode: nil; tab-width: 2; c-basic-offset: 2 -*- */
2 
3 /* libmwaw
4 * Version: MPL 2.0 / LGPLv2+
5 *
6 * The contents of this file are subject to the Mozilla Public License Version
7 * 2.0 (the "License"); you may not use this file except in compliance with
8 * the License or as specified alternatively below. You may obtain a copy of
9 * the License at http://www.mozilla.org/MPL/
10 *
11 * Software distributed under the License is distributed on an "AS IS" basis,
12 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 * for the specific language governing rights and limitations under the
14 * License.
15 *
16 * Major Contributor(s):
17 * Copyright (C) 2002 William Lachance (wrlach@gmail.com)
18 * Copyright (C) 2002,2004 Marc Maurer (uwog@uwog.net)
19 * Copyright (C) 2004-2006 Fridrich Strba (fridrich.strba@bluewin.ch)
20 * Copyright (C) 2006, 2007 Andrew Ziem
21 * Copyright (C) 2011, 2012 Alonso Laurent (alonso@loria.fr)
22 *
23 *
24 * All Rights Reserved.
25 *
26 * For minor contributions see the git repository.
27 *
28 * Alternatively, the contents of this file may be used under the terms of
29 * the GNU Lesser General Public License Version 2 or later (the "LGPLv2+"),
30 * in which case the provisions of the LGPLv2+ are applicable
31 * instead of those above.
32 */
33 
34 #ifndef MWAW_LISTENER_H
35 #define MWAW_LISTENER_H
36 
37 #include <vector>
38 
39 #include <librevenge/librevenge.h>
40 
41 #include "libmwaw_internal.hxx"
42 
43 #include "MWAWGraphicStyle.hxx"
44 
45 class MWAWCell;
46 class MWAWTable;
47 
48 /** This class contains a virtual interface to all listener */
49 class MWAWListener
50 {
51 public:
52   //! destructor
53   virtual ~MWAWListener();
54 
55   //! the listener type
56   enum Type { Graphic, Presentation, Spreadsheet, Text };
57   /** the different break type */
58   enum BreakType { PageBreak=0, SoftPageBreak, ColumnBreak };
59 
60   //------- generic accessor ---
61   /** returns the listener type */
62   virtual Type getType() const = 0;
63   /** returns true if we can add text data */
64   virtual bool canWriteText() const =0;
65 
66   // ------ main document -------
67   /** sets the documents metadata */
68   virtual void setDocumentMetaData(librevenge::RVNGPropertyList const &metadata) = 0;
69   /** sets the documents language */
70   virtual void setDocumentLanguage(std::string const &locale) = 0;
71   /** starts the document */
72   virtual void startDocument() = 0;
73   /** returns true if a document is opened */
74   virtual bool isDocumentStarted() const =0;
75   /** ends the document */
76   virtual void endDocument(bool sendDelayedSubDoc=true) = 0;
77 
78   // ------ page --------
79   /** returns true if a page is opened */
80   virtual bool isPageSpanOpened() const = 0;
81   /** returns the current page span
82 
83   \note this forces the opening of a new page if no page is opened.*/
84   virtual MWAWPageSpan const &getPageSpan() = 0;
85 
86   // ------ header/footer --------
87   /** insert a header (interaction with MWAWPageSpan which fills the parameters for openHeader) */
88   virtual bool insertHeader(MWAWSubDocumentPtr const &subDocument, librevenge::RVNGPropertyList const &extras) = 0;
89   /** insert a footer (interaction with MWAWPageSpan which fills the parameters for openFooter) */
90   virtual bool insertFooter(MWAWSubDocumentPtr const &subDocument, librevenge::RVNGPropertyList const &extras) = 0;
91   /** returns true if the header/footer is open */
92   virtual bool isHeaderFooterOpened() const = 0;
93 
94   // ------ text data -----------
95   //! adds a basic character, ..
96   virtual void insertChar(uint8_t character)=0;
97   /** insert a character using the font converter to find the utf8
98       character */
99   virtual void insertCharacter(unsigned char c)=0;
100   /** insert a character using the font converter to find the utf8
101       character and if needed, input to read extra character.
102 
103       \return the number of extra character read
104    */
105   virtual int insertCharacter(unsigned char c, MWAWInputStreamPtr &input, long endPos=-1)=0;
106   /** adds an unicode character.
107    *  By convention if \a character=0xfffd(undef), no character is added */
108   virtual void insertUnicode(uint32_t character)=0;
109   //! adds a unicode string
110   virtual void insertUnicodeString(librevenge::RVNGString const &str)=0;
111 
112   //! adds a tab
113   virtual void insertTab()=0;
114   //! adds an end of line ( by default an hard one)
115   virtual void insertEOL(bool softBreak=false)=0;
116 
117   // ------ text format -----------
118   //! sets the font
119   virtual void setFont(MWAWFont const &font)=0;
120   //! returns the actual font
121   virtual MWAWFont const &getFont() const=0;
122 
123   // ------ paragraph format -----------
124   //! returns true if a paragraph or a list is opened
125   virtual bool isParagraphOpened() const=0;
126   //! sets the paragraph
127   virtual void setParagraph(MWAWParagraph const &paragraph)=0;
128   //! returns the actual paragraph
129   virtual MWAWParagraph const &getParagraph() const=0;
130 
131   // ------- fields ----------------
132   //! adds a field type
133   virtual void insertField(MWAWField const &field)=0;
134 
135   // ------- link ----------------
136 
137   //! open a link
138   virtual void openLink(MWAWLink const &link)=0;
139   //! close a link
140   virtual void closeLink()=0;
141 
142   // ------- table -----------------
143   /** open a table*/
144   virtual void openTable(MWAWTable const &table) = 0;
145   /** closes this table */
146   virtual void closeTable() = 0;
147   /** open a row with given height ( if h < 0.0, set min-row-height = -h )*/
148   virtual void openTableRow(float h, librevenge::RVNGUnit unit, bool headerRow=false) = 0;
149   /** closes this row */
150   virtual void closeTableRow() = 0;
151   /** open a cell */
152   virtual void openTableCell(MWAWCell const &cell) = 0;
153   /** close a cell */
154   virtual void closeTableCell() = 0;
155   /** add empty cell */
156   virtual void addEmptyTableCell(MWAWVec2i const &pos, MWAWVec2i span=MWAWVec2i(1,1)) = 0;
157 
158   // ------- section ---------------
159   /** returns true if we can add open a section, add page break, ... */
160   virtual bool canOpenSectionAddBreak() const =0;
161   //! returns true if a section is opened
162   virtual bool isSectionOpened() const=0;
163   //! returns the actual section
164   virtual MWAWSection const &getSection() const=0;
165   //! open a section if possible
166   virtual bool openSection(MWAWSection const &section)=0;
167   //! close a section
168   virtual bool closeSection()=0;
169   //! inserts a break type: ColumBreak, PageBreak, ..
170   virtual void insertBreak(BreakType breakType)=0;
171 
172   // ------- subdocument ---------------
173   /** insert a note */
174   virtual void insertNote(MWAWNote const &note, MWAWSubDocumentPtr &subDocument)=0;
175   /** adds comment */
176   virtual void insertComment(MWAWSubDocumentPtr &subDocument) = 0;
177   /** adds a picture with various representationin given position.
178    \note by default only send the first picture*/
179   virtual void insertPicture(MWAWPosition const &pos, MWAWEmbeddedObject const &picture,
180                              MWAWGraphicStyle const &style=MWAWGraphicStyle::emptyStyle())=0;
181   /** adds a shape picture in given position */
182   virtual void insertShape(MWAWPosition const &pos, MWAWGraphicShape const &shape,
183                            MWAWGraphicStyle const &style) = 0;
184   /** adds a textbox in given position */
185   virtual void insertTextBox(MWAWPosition const &pos, MWAWSubDocumentPtr const &subDocument,
186                              MWAWGraphicStyle const &frameStyle=MWAWGraphicStyle::emptyStyle()) = 0;
187   /** adds a textbox in given position */
insertTextBoxInShape(MWAWPosition const & pos,MWAWSubDocumentPtr const & subDocument,MWAWGraphicShape const &,MWAWGraphicStyle const & frameStyle=MWAWGraphicStyle::emptyStyle ())188   virtual void insertTextBoxInShape(MWAWPosition const &pos, MWAWSubDocumentPtr const &subDocument,
189                                     MWAWGraphicShape const &/*shape*/,
190                                     MWAWGraphicStyle const &frameStyle=MWAWGraphicStyle::emptyStyle())
191   {
192     static bool first=true;
193     if (first) {
194       MWAW_DEBUG_MSG(("MWAWListener::insertTextBoxInShape: umimplemented, revert to basic insertTextBox\n"));
195       first=false;
196     }
197     insertTextBox(pos, subDocument, frameStyle);
198   }
199   /** low level: tries to open a frame */
200   virtual bool openFrame(MWAWPosition const &pos, MWAWGraphicStyle const &style=MWAWGraphicStyle::emptyStyle()) = 0;
201   /** low level: tries to close the last opened frame */
202   virtual void closeFrame() = 0;
203   /** low level: tries to open a group */
204   virtual bool openGroup(MWAWPosition const &pos) = 0;
205   /** low level: tries to close the last opened group */
206   virtual void closeGroup() = 0;
207   /** low level: function called to add a subdocument */
208   virtual void handleSubDocument(MWAWSubDocumentPtr const &subDocument, libmwaw::SubDocumentType subDocumentType) = 0;
209   /** returns true if a subdocument is open  */
210   virtual bool isSubDocumentOpened(libmwaw::SubDocumentType &subdocType) const = 0;
211 };
212 
213 #endif
214 // vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:
215