[doc_tool] Moved Doxygen and Sourcecode chapter generation implementation to own...
[hsd_doku_tool.git] / src / Model.h
1 ///////////////////////////////////////////////////////////////////////////
2 // Workfile: Model.h
3 // Author: Daniel Giritzer <daniel@giritzer.eu>
4 // Date: 25.03.2018
5 // Description: Diese Klasse stellt die Daten und Programmlogik dieses
6 //              Programmes dar.
7 // Remarks:
8 ///////////////////////////////////////////////////////////////////////////
9 #ifndef MODEL_H
10 #define MODEL_H
11
12 #include "ModelIF.h"
13 #include "tinyxml2.h"
14 #include "ChapterIF.h"
15 #include "ChapterFactory.h"
16 #include "Author.h"
17 #include "FSHelper.h"
18 #include <vector>
19 #include <list>
20
21 /////////////////////////////////////////////////
22 /// \brief Implementierung des Model
23 ///        Interfaces. Implementiert alle
24 ///        im Interface definierten funktionen.
25 ///        Diese Klasse stellt die Daten und Programmlogik dieses
26 ///        Programmes dar und stellt neben den Interface Funktionen
27 ///        auch Funktionen zum erhalt von Daten und Befehlen von
28 ///        einem Controller zur verfügung.
29 /////////////////////////////////////////////////
30 class Model : public ModelIF
31 {
32 public:
33
34
35     /////////////////////////////////////////////////
36     /// \brief Konstruktor für ein Model Objekt
37     /// \param confDir Ordner der die Konfigurationen beinhlatet.
38     /// \param help ein configuriertes FSHelper Objekt
39     /// \param log Name der logging Datei (Ohne Pfad!)
40     ///        Wird im Ausgabeordner gespeichert.
41     ///        (siehe getOutPath)
42     /////////////////////////////////////////////////
43     Model(std::string confDir, FSHelper help, std::string log);
44
45     // Destruktor
46     virtual ~Model() = default;
47
48     /////////////////////////////////////////////////
49     /// \brief Öffne template Datei und Lade die einstellungen
50     ///        in die Internen Strukturen.
51     /// \param templFile gewähltes Template Datei.
52     /////////////////////////////////////////////////
53     void setTemplFile(std::string templFile);
54
55     /////////////////////////////////////////////////
56     /// \brief Wähle Ausgabeordner.
57     /// \param outPath Ausgabeordner
58     /////////////////////////////////////////////////
59     void setOutPath(std::string outPath);
60
61     /////////////////////////////////////////////////
62     /// \brief Erzeuge Latex Dateien und .pdf im
63     ///        Ausgabeordner.
64     /////////////////////////////////////////////////
65     void generateDocument();
66
67     /////////////////////////////////////////////////
68     /// \brief Lade Kapitel aus interner Struktur.
69     /// \param chapterNum Kapitelnummer.
70     /////////////////////////////////////////////////
71     void loadChapter(int num);
72
73     /////////////////////////////////////////////////
74     /// \brief Lade Author aus interner Struktur.
75     /// \param chapterNum Kapitelnummer.
76     /////////////////////////////////////////////////
77     void loadAuthor(int num);
78
79     /////////////////////////////////////////////////
80     /// \brief Konfiguriere den Namen der Dokumentgruppe
81     /// \param name Dokumentgruppenname
82     /////////////////////////////////////////////////
83     void setSubjectName(std::string name);
84
85     /////////////////////////////////////////////////
86     /// \brief Sortiere ausgewähltes Kapitel eine
87     ///        Stelle nach oben.
88     /////////////////////////////////////////////////
89     void chapterUp();
90
91     /////////////////////////////////////////////////
92     /// \brief Sortiere ausgewähltes Kapitel eine
93     ///        Stelle nach unten.
94     /////////////////////////////////////////////////
95     void chapterDown();
96
97     /////////////////////////////////////////////////
98     /// \brief Füge ein neues Kapitel am Ende der
99     ///        Kapitelliste hinzu.
100     /// \param chaptName Name des Kapitels
101     /// \param outFileName name der Ausgabedatei.
102     /// \param type String der Kapiteltyp beschreibt.
103     /// \param hierachy Kapitelhierachietyp
104     /////////////////////////////////////////////////
105     void chapterInsertBack(std::string chaptName, std::string outFileName, std::string type, int hierachy = 0);
106
107     /////////////////////////////////////////////////
108     /// \brief Füge ein neues Kapitel am Ende der
109     ///        Kapitelliste hinzu.
110     /// \param chaptName Name des Kapitels
111     /// \param outFileName name der Ausgabedatei.
112     /// \param type Enum Konstante die Kapiteltyp beschreibt.
113     /// \param hierachy Kapitelhierachietyp
114     /////////////////////////////////////////////////
115     void chapterInsertBack(std::string chaptName, std::string outFileName, int type, int hierachy = 0);
116
117     /////////////////////////////////////////////////
118     /// \brief Lösche intern ausgewähltes Kapitel.
119     /////////////////////////////////////////////////
120     void chapterRemove();
121
122     /////////////////////////////////////////////////
123     /// \brief Lösche intern ausgewählten Authoren.
124     /////////////////////////////////////////////////
125     void authorRemove();
126
127     /////////////////////////////////////////////////
128     /// \brief Füge einen Authoren am Ende der
129     ///        internen Liste hinzu.
130     /////////////////////////////////////////////////
131     void authorInsertBack();
132
133     /////////////////////////////////////////////////
134     /// \brief Speichere einstellungen, Kapitel und
135     ///        Authoren als .xml template in den
136     ///        Ausgabeordner.
137     /////////////////////////////////////////////////
138     void saveTemplFile();
139
140     /////////////////////////////////////////////////
141     /// \brief Konfiguriere ob Dokument ein .pdf Angabeblatt
142     ///        als Deckblatt besitzt.
143     /// \param bool true -> ja, false -> nein
144     /////////////////////////////////////////////////
145     void setAddCoverSheet(bool val);
146
147     /////////////////////////////////////////////////
148     /// \brief Konfiguriere ob Dokument eine Titelseite
149     ///        besitzt.
150     /// \param bool true -> ja, false -> nein
151     /////////////////////////////////////////////////
152     void setAddTitlePage(bool val);
153
154     /////////////////////////////////////////////////
155     /// \brief Konfiguriere ob Dokument ein Inhaltsverzeichnis
156     ///        besitzt.
157     /// \param bool true -> ja, false -> nein
158     /////////////////////////////////////////////////
159     void setAddTableOfContent(bool val);
160
161     /////////////////////////////////////////////////
162     /// \brief Configuriert die Nummerierungstiefe
163     ///        des Inhaltsverzeichnis.
164     /// \param depth Nummerierungstiefe
165     /////////////////////////////////////////////////
166     void setTableOfContentDepth(int depth);
167
168     /////////////////////////////////////////////////
169     /// \brief Setzte die X Deckblattkoordinaten für
170     ///        die Arbeitsgruppe
171     /// \param x X Koordinate
172     /////////////////////////////////////////////////
173     void setDepartmentX(unsigned int x);
174
175     /////////////////////////////////////////////////
176     /// \brief Setzte die Y Deckblattkoordinaten für
177     ///        die Arbeitsgruppe
178     /// \param y Y Koordinate
179     /////////////////////////////////////////////////
180     void setDepartmentY(unsigned int y);
181
182     /////////////////////////////////////////////////
183     /// \brief Wähle Quellcode Ordner.
184     /// \param path Quellcode Ordner.
185     /////////////////////////////////////////////////
186     void setSourceDir(std::string path);
187
188     /////////////////////////////////////////////////
189     /// \brief Wähle Angabeblatt.
190     /// \param file Angabeblatt
191     /////////////////////////////////////////////////
192     void setCovSheet(std::string file);
193
194     /////////////////////////////////////////////////
195     /// \brief Konfiguriere dan Namen des Verfassungsortes.
196     /// \param location name Ortsname
197     /////////////////////////////////////////////////
198     void setLocation(std::string location);
199
200     /////////////////////////////////////////////////
201     /// \brief Konfiguriere dan Namen der Arbeitsgruppe.
202     /// \param department name Arbeitsgruppenname
203     /////////////////////////////////////////////////
204     void setDepartment(std::string department);
205
206     /////////////////////////////////////////////////
207     /// \brief Speichere Alle Kapiteltexte in die
208     ///        Jeweiligen Dateien.
209     /////////////////////////////////////////////////
210     void saveChaptersToFiles();
211
212     /////////////////////////////////////////////////
213     /// \brief Konfiguriere den Namen des Dokuments
214     /// \param name Dokumentname
215     /////////////////////////////////////////////////
216     void setDocName(std::string name);
217
218     /////////////////////////////////////////////////
219     /// \brief Wähle Dateiendungen der Header Quellcode Dateien
220     /// \param fileExt Dateiendung für Header Dateien (z.B. .h)
221     /////////////////////////////////////////////////
222     void setHeaderFileExtension(std::string fileExt);
223
224     /////////////////////////////////////////////////
225     /// \brief Wähle Dateiendungen der Source Quellcode Dateien
226     /// \param fileExt Dateiendung für Source Dateien (z.B. .cpp)
227     /////////////////////////////////////////////////
228     void setSourceFileExtension(std::string fileExt);
229
230     /////////////////////////////////////////////////
231     /// \brief Setzt dateinamen (Ohne Pfad!) für loggng Datei.
232     /// \param log Dateiname der Logging Datei.
233     /////////////////////////////////////////////////
234     void setLogFile(std::string log);
235
236     /////////////////////////////////////////////////
237     /// \brief Starte neues Document ohne eine Tamplate
238     ///        datei zu laden.
239     /// \param name Subject Name des Dokuments.
240     /////////////////////////////////////////////////
241     void newTemplate(std::string name);
242     // ---------- Implementierung Interface ---------------
243     std::list<std::string> getChapterNames() override;
244     std::list<std::string> getAuthorNames() override;
245     std::string getLocation() override;
246     std::string getDepartment() override;
247     std::string getConfDir() override;
248     bool getGenerateEnable() override;
249     std::string getDocName() override;
250     std::string getHeaderFileExtension() override;
251     std::string getSourceFileExtension() override;
252     int getDepartmentX() override;
253     int getDepartmentY() override;
254     std::string getOutPath() override;
255     int getChapterNum() override;
256     int getAuthorNum() override;
257     int getNumChapters() override;
258     int getNumFinishedChapters() override;
259     std::string getSubjectName() override;
260     bool shouldAddCoverSheet() override;
261     std::string getCovSheet() override;
262     Author::SPtr getSelAuthor() override;
263     ChapterIF::SPtr getSelChapter() override;
264     std::string getLogFile() override;
265     bool shouldAddTitlePage() override;
266     bool shouldAddTableOfContent() override;
267     int getTableOfContentDepth() override;
268     std::vector<std::string> getChapterTypes() override;
269
270 private:
271     std::string mTemplFileString;
272     std::string mOutPath;
273     std::string mLogFile;
274     std::string mCoverSheet;
275     std::string mConfDir;
276     std::string mDocName;
277     std::string mSubject;
278     std::string mLocation;
279
280
281     std::string mDepartment;
282     unsigned int mDepartmentX;
283     unsigned int mDepartmentY;
284
285     std::string mHeaderExtension;
286     std::string mSourceExtension;
287
288     bool mHasCoverSheet;
289     bool mHasTitlePage;
290     bool mHasTableOfContent;
291     unsigned int mTableOfContentDepth;
292
293     // Geladenes Kapitel
294     int mChapterNum;
295
296     // Geladener Author
297     int mAuthorNum;
298
299     std::vector<Author::SPtr> mAuthors;
300     std::vector<ChapterIF::SPtr> mChapters;
301     ChapterFactory mChaptFactory;
302
303     tinyxml2::XMLDocument mTemplFile;
304
305     /////////////////////////////////////////////////
306     /// \brief Diese funktion überprüft den Rückgabewert
307     ///        Wert des XML parsers und wirft bei
308     ///        einem erkannten Fehler einen passenden
309     ///        exception string.
310     /// \param error Rückgabewert des XML Parsers.
311     /////////////////////////////////////////////////
312     void throwXmlError(tinyxml2::XMLError err);
313
314     void clearMembers();
315
316     FSHelper mFSHelp;
317
318 };
319
320 #endif // MODEL_H