1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * @brief Declaration file ProjectFile class
9 #include "UnicodeString.h"
10 #include "PathContext.h"
14 friend class ProjectFile;
15 friend class ProjectFileHandler;
19 bool HasMiddle() const;
20 bool HasRight() const;
21 bool HasFilter() const;
22 bool HasSubfolders() const;
23 bool HasUnpacker() const;
24 bool HasPrediffer() const;
25 bool HasIgnoreWhite() const;
26 bool HasIgnoreBlankLines() const;
27 bool HasIgnoreCase() const;
28 bool HasIgnoreEol() const;
29 bool HasIgnoreCodepage() const;
30 bool HasFilterCommentsLines() const;
31 bool HasCompareMethod() const;
33 String GetLeft(bool * pReadOnly = nullptr) const;
34 bool GetLeftReadOnly() const;
35 String GetMiddle(bool * pReadOnly = nullptr) const;
36 bool GetMiddleReadOnly() const;
37 String GetRight(bool * pReadOnly = nullptr) const;
38 bool GetRightReadOnly() const;
39 String GetFilter() const;
40 int GetSubfolders() const;
41 String GetUnpacker() const;
42 String GetPrediffer() const;
43 int GetIgnoreWhite() const;
44 bool GetIgnoreBlankLines() const;
45 bool GetIgnoreCase() const;
46 bool GetIgnoreEol() const;
47 bool GetIgnoreCodepage() const;
48 bool GetFilterCommentsLines() const;
49 int GetCompareMethod() const;
51 void SetLeft(const String& sLeft, const bool * pReadOnly = nullptr);
52 void SetMiddle(const String& sMiddle, const bool * pReadOnly = nullptr);
53 void SetRight(const String& sRight, const bool * pReadOnly = nullptr);
54 void SetFilter(const String& sFilter);
55 void SetSubfolders(bool bSubfolder);
56 void SetUnpacker(const String& sUnpacker);
57 void SetPrediffer(const String& sPrediffer);
58 void SetIgnoreWhite(int nIgnoreWhite);
59 void SetIgnoreBlankLines(bool bIgnoreBlankLines);
60 void SetIgnoreCase(bool bIgnoreCase);
61 void SetIgnoreEol(bool bIgnoreEol);
62 void SetIgnoreCodepage(bool bIgnoreCodepage);
63 void SetFilterCommentsLines(bool bFilterCommentsLines);
64 void SetCompareMethod(int nCompareMethod);
66 void GetPaths(PathContext& files, bool & bSubFolders) const;
67 void SetPaths(const PathContext& files, bool bSubFolders = false);
69 void SetSaveFilter(bool bSaveFilter);
70 void SetSaveSubfolders(bool bSaveSubfolders);
71 void SetSaveUnpacker(bool bSaveUnpacker);
72 void SetSaveIgnoreWhite(bool bSaveIgnoreWhite);
73 void SetSaveIgnoreBlankLines(bool bSaveIgnoreBlankLines);
74 void SetSaveIgnoreCase(bool bSaveIgnoreCase);
75 void SetSaveIgnoreEol(bool bSaveIgnoreEol);
76 void SetSaveIgnoreCodepage(bool bSaveIgnoreCodepage);
77 void SetSaveFilterCommentsLines(bool bSaveFilterCommentsLines);
78 void SetSaveCompareMethod(bool bSaveCompareMethod);
82 bool m_bHasLeft; /**< Has left path? */
83 bool m_bHasMiddle; /**< Has middle path? */
84 bool m_bHasRight; /**< Has right path? */
85 bool m_bHasFilter; /**< Has filter? */
86 String m_filter; /**< Filter name or mask */
87 bool m_bHasSubfolders; /**< Has subfolders? */
88 int m_subfolders; /**< Are subfolders included (recursive scan) */
89 bool m_bLeftReadOnly; /**< Is left path opened as read-only */
90 bool m_bMiddleReadOnly; /**< Is middle path opened as read-only */
91 bool m_bRightReadOnly; /**< Is right path opened as read-only */
92 bool m_bHasUnpacker; /**< Has unpacker? */
93 String m_unpacker; /**< Unpacker name or pipeline */
94 bool m_bHasPrediffer; /**< Has prediffer? */
95 String m_prediffer; /**< Prediffer name or pipeline */
96 bool m_bHasIgnoreWhite; /**< Has "Whitespaces" setting? */
97 int m_nIgnoreWhite; /**< The value of the "Whitespaces" setting */
98 bool m_bHasIgnoreBlankLines; /**< Has "Ignore blank lines" setting? */
99 bool m_bIgnoreBlankLines; /**< The value of the "Ignore blank lines" setting */
100 bool m_bHasIgnoreCase; /**< Has "Ignore case" setting? */
101 bool m_bIgnoreCase; /**< The value of the "Ignore case" setting */
102 bool m_bHasIgnoreEol; /**< Has "Ignore carriage return differences" setting? */
103 bool m_bIgnoreEol; /**< The value of the "Ignore carriage return differences" setting */
104 bool m_bHasIgnoreCodepage; /**< Has "Ignore codepage differences" setting? */
105 bool m_bIgnoreCodepage; /**< The value of the "Ignore codepage differences" setting */
106 bool m_bHasFilterCommentsLines; /**< Has "Ignore comment differences" setting? */
107 bool m_bFilterCommentsLines; /**< The value of the "Ignore comment differences" setting */
108 bool m_bHasCompareMethod; /**< Has "Compare method" setting? */
109 int m_nCompareMethod; /**< The value of the "Compare method" setting */
110 bool m_bSaveFilter; /**< Save filter? */
111 bool m_bSaveSubfolders; /**< Save subfolders? */
112 bool m_bSaveUnpacker; /**< Save unpacker? */
113 bool m_bSaveIgnoreWhite; /**< Save "Whitespaces" setting? */
114 bool m_bSaveIgnoreBlankLines; /**< Save "Ignore blank lines" setting? */
115 bool m_bSaveIgnoreCase; /**< Save "Ignore case" setting? */
116 bool m_bSaveIgnoreEol; /**< Save "Ignore carriage return differences" setting? */
117 bool m_bSaveIgnoreCodepage; /**< Save "Ignore codepage differences" setting? */
118 bool m_bSaveFilterCommentsLines; /**< Save "Ignore comment differences" setting? */
119 bool m_bSaveCompareMethod; /**< Save "Compare method" setting? */
123 * @brief Class for handling project files.
125 * This class loads and saves project files. Expat parser and SCEW wrapper for
126 * expat are used for XML parsing. We use UTF-8 encoding so Unicode paths are
132 bool Read(const String& path);
133 bool Save(const String& path) const;
134 const std::list<ProjectFileItem>& Items() const { return m_items; };
135 std::list<ProjectFileItem>& Items() { return m_items; }
136 static const String PROJECTFILE_EXT;
138 std::list<ProjectFileItem> m_items;
142 * @brief Returns if left path is defined in project file.
143 * @return true if project file has left path.
145 inline bool ProjectFileItem::HasLeft() const
151 * @brief Returns if middle path is defined.
153 inline bool ProjectFileItem::HasMiddle() const
159 * @brief Returns if right path is defined in project file.
160 * @return true if project file has right path.
162 inline bool ProjectFileItem::HasRight() const
168 * @brief Returns if filter is defined in project file.
169 * @return true if project file has filter.
171 inline bool ProjectFileItem::HasFilter() const
177 * @brief Returns if subfolder is defined in projectfile.
178 * @return true if project file has subfolder definition.
180 inline bool ProjectFileItem::HasSubfolders() const
182 return m_bHasSubfolders;
186 * @brief Returns if unpacker is defined in projectfile.
187 * @return true if project file has unpacker definition.
189 inline bool ProjectFileItem::HasUnpacker() const
191 return m_bHasUnpacker;
195 * @brief Returns if prediffer is defined in projectfile.
196 * @return true if project file has prediffer definition.
198 inline bool ProjectFileItem::HasPrediffer() const
200 return m_bHasPrediffer;
204 * @brief Returns if "Whitespaces" setting is defined in projectfile.
205 * @return true if project file has "Whitespaces" setting definition.
207 inline bool ProjectFileItem::HasIgnoreWhite() const
209 return m_bHasIgnoreWhite;
213 * @brief Returns if "Ignore blank lines" setting is defined in projectfile.
214 * @return true if project file has "Ignore blank lines" setting definition.
216 inline bool ProjectFileItem::HasIgnoreBlankLines() const
218 return m_bHasIgnoreBlankLines;
222 * @brief Returns if "Ignore case" setting is defined in projectfile.
223 * @return true if project file has "Ignore case" setting definition.
225 inline bool ProjectFileItem::HasIgnoreCase() const
227 return m_bHasIgnoreCase;
231 * @brief Returns if "Ignore carriage return differences" setting is defined in projectfile.
232 * @return true if project file has "Ignore carriage return differences" setting definition.
234 inline bool ProjectFileItem::HasIgnoreEol() const
236 return m_bHasIgnoreEol;
240 * @brief Returns if "Ignore codepage differences" setting is defined in projectfile.
241 * @return true if project file has "Ignore codepage differences" setting definition.
243 inline bool ProjectFileItem::HasIgnoreCodepage() const
245 return m_bHasIgnoreCodepage;
249 * @brief Returns if "Ignore comment differences" is defined in projectfile.
250 * @return true if project file has "Ignore comment differences" definition.
252 inline bool ProjectFileItem::HasFilterCommentsLines() const
254 return m_bHasFilterCommentsLines;
258 * @brief Returns if "Compare method" setting is defined in projectfile.
259 * @return true if project file has "Compare method" setting definition.
261 inline bool ProjectFileItem::HasCompareMethod() const
263 return m_bHasCompareMethod;
267 * @brief Returns if left path is specified read-only.
268 * @return true if left path is read-only, false otherwise.
270 inline bool ProjectFileItem::GetLeftReadOnly() const
272 return m_bLeftReadOnly;
276 * @brief Returns if middle path is specified read-only.
278 inline bool ProjectFileItem::GetMiddleReadOnly() const
280 return m_bMiddleReadOnly;
284 * @brief Returns if right path is specified read-only.
285 * @return true if right path is read-only, false otherwise.
287 inline bool ProjectFileItem::GetRightReadOnly() const
289 return m_bRightReadOnly;
293 * @brief Returns filter.
294 * @return Filter string.
296 inline String ProjectFileItem::GetFilter() const
303 * @param [in] sFilter New filter string to set.
305 inline void ProjectFileItem::SetFilter(const String& sFilter)
311 * @brief Returns subfolder included -setting.
312 * @return != 0 if subfolders are included.
314 inline int ProjectFileItem::GetSubfolders() const
320 * @brief set subfolder.
321 * @param [in] iSubfolder New value for subfolder inclusion.
323 inline void ProjectFileItem::SetSubfolders(bool bSubfolder)
325 m_subfolders = bSubfolder ? 1 : 0;
329 * @brief Returns unpacker name or pipeline
330 * @return Unpacker name or pipeline
332 inline String ProjectFileItem::GetUnpacker() const
338 * @brief Set unpacker name or pipeline.
339 * @param [in] sUnpacker New unpacker name or pipeline to set.
341 inline void ProjectFileItem::SetUnpacker(const String& sUnpacker)
343 m_unpacker = sUnpacker;
347 * @brief Returns prediffer name or pipeline
348 * @return Prediffer name or pipeline
350 inline String ProjectFileItem::GetPrediffer() const
356 * @brief Set prediffer name or pipeline.
357 * @param [in] sPrediffer New prediffer name or pipeline to set.
359 inline void ProjectFileItem::SetPrediffer(const String& sPrediffer)
361 m_prediffer = sPrediffer;
365 * @brief Returns the value of the "Whitespaces" setting.
366 * @return The value of the "Whitespaces" setting
368 inline int ProjectFileItem::GetIgnoreWhite() const
370 return m_nIgnoreWhite;
374 * @brief Set the value of the "Whitespaces" setting.
375 * @param [in] nIgnoreWhite New value of the "Whitespaces" setting to set.
377 inline void ProjectFileItem::SetIgnoreWhite(int nIgnoreWhite)
379 m_nIgnoreWhite = nIgnoreWhite;
383 * @brief Returns the value of the "Ignore blank lines" setting.
384 * @return The value of the "Ignore blank lines" setting
386 inline bool ProjectFileItem::GetIgnoreBlankLines() const
388 return m_bIgnoreBlankLines;
392 * @brief Set the value of the "Ignore blank lines" setting.
393 * @param [in] bIgnoreBlankLines New value of the "Ignore blank lines" setting to set.
395 inline void ProjectFileItem::SetIgnoreBlankLines(bool bIgnoreBlankLines)
397 m_bIgnoreBlankLines = bIgnoreBlankLines;
401 * @brief Returns the value of the "Ignore case" setting.
402 * @return Unpacker name or pipelineThe value of the "Ignore case" setting
404 inline bool ProjectFileItem::GetIgnoreCase() const
406 return m_bIgnoreCase;
410 * @brief Set the value of the "Ignore case" setting.
411 * @param [in] bIgnoreCase New value of the "Ignore case" setting to set.
413 inline void ProjectFileItem::SetIgnoreCase(bool bIgnoreCase)
415 m_bIgnoreCase = bIgnoreCase;
419 * @brief Returns the value of the "Ignore carriage return differences" setting.
420 * @return The value of the "Ignore carriage return differences" setting
422 inline bool ProjectFileItem::GetIgnoreEol() const
428 * @brief Set the value of the "Ignore carriage return differences" setting.
429 * @param [in] bIgnoreEol New value of the "Ignore carriage return differences" setting to set.
431 inline void ProjectFileItem::SetIgnoreEol(bool bIgnoreEol)
433 m_bIgnoreEol = bIgnoreEol;
437 * @brief Returns the value of the "Ignore codepage differences" setting.
438 * @return The value of the "Ignore codepage differences" setting
440 inline bool ProjectFileItem::GetIgnoreCodepage() const
442 return m_bIgnoreCodepage;
446 * @brief Set the value of the "Ignore codepage differences" setting.
447 * @param [in] bIgnoreCodepage New value of the "Ignore codepage differences" setting to set.
449 inline void ProjectFileItem::SetIgnoreCodepage(bool bIgnoreCodepage)
451 m_bIgnoreCodepage = bIgnoreCodepage;
455 * @brief Returns the value of the "Ignore comment differences" setting.
456 * @return The value of the "Ignore comment differences" setting
458 inline bool ProjectFileItem::GetFilterCommentsLines() const
460 return m_bFilterCommentsLines;
464 * @brief Set the value of the "Ignore comment differences" setting.
465 * @param [in] bFilterCommentsLines New value of the "Ignore comment differences" setting to set.
467 inline void ProjectFileItem::SetFilterCommentsLines(bool bFilterCommentsLines)
469 m_bFilterCommentsLines = bFilterCommentsLines;
473 * @brief Returns the value of the "Compare method" setting.
474 * @return The value of the "Compare method" setting
476 inline int ProjectFileItem::GetCompareMethod() const
478 return m_nCompareMethod;
482 * @brief Set the value of the "Compare method" setting.
483 * @param [in] nCompareMethod New value of the "Compare method" setting to set.
485 inline void ProjectFileItem::SetCompareMethod(int nCompareMethod)
487 m_nCompareMethod = nCompareMethod;
493 * @param [in] paths Files in project
494 * @param [in] bSubFolders If true subfolders included (recursive compare)
496 inline void ProjectFileItem::SetPaths(const PathContext& paths, bool bSubfolders)
499 m_subfolders = bSubfolders;
503 * @brief Set whether to save filter.
504 * @param [in] bSaveFilter Whether to save filter.
506 inline void ProjectFileItem::SetSaveFilter(bool bSaveFilter)
508 m_bSaveFilter = bSaveFilter;
512 * @brief Set whether to save subfolders.
513 * @param [in] bSaveSubfolders Whether to save subfolders.
515 inline void ProjectFileItem::SetSaveSubfolders(bool bSaveSubfolders)
517 m_bSaveSubfolders = bSaveSubfolders;
521 * @brief Set whether to save unpacker.
522 * @param [in] bSaveUnpacker Whether to save unpacker.
524 inline void ProjectFileItem::SetSaveUnpacker(bool bSaveUnpacker)
526 m_bSaveUnpacker = bSaveUnpacker;
530 * @brief Set whether to save "Whitespaces" setting.
531 * @param [in] bSaveIgnoreWhite Whether to save "Whitespaces" setting.
533 inline void ProjectFileItem::SetSaveIgnoreWhite(bool bSaveIgnoreWhite)
535 m_bSaveIgnoreWhite = bSaveIgnoreWhite;
539 * @brief Set whether to save "Ignore blank lines" setting.
540 * @param [in] bSaveIgnoreBlankLines Whether to save "Ignore blank lines" setting.
542 inline void ProjectFileItem::SetSaveIgnoreBlankLines(bool bSaveIgnoreBlankLines)
544 m_bSaveIgnoreBlankLines = bSaveIgnoreBlankLines;
548 * @brief Set whether to save "Ignore case" setting.
549 * @param [in] bSaveIgnoreCase Whether to save "Ignore case" setting.
551 inline void ProjectFileItem::SetSaveIgnoreCase(bool bSaveIgnoreCase)
553 m_bSaveIgnoreCase = bSaveIgnoreCase;
557 * @brief Set whether to save "Ignore carriage return differences" setting.
558 * @param [in] bSaveIgnoreEol Whether to save "Ignore carriage return differences" setting.
560 inline void ProjectFileItem::SetSaveIgnoreEol(bool bSaveIgnoreEol)
562 m_bSaveIgnoreEol = bSaveIgnoreEol;
566 * @brief Set whether to save "Ignore codepage differences" setting.
567 * @param [in] bSaveIgnoreCodepage Whether to save "Ignore codepage differences" setting.
569 inline void ProjectFileItem::SetSaveIgnoreCodepage(bool bSaveIgnoreCodepage)
571 m_bSaveIgnoreCodepage = bSaveIgnoreCodepage;
575 * @brief Set whether to save "Ignore comment differences" setting.
576 * @param [in] bSaveFilterCommentsLines Whether to save "Ignore comment differences" setting.
578 inline void ProjectFileItem::SetSaveFilterCommentsLines(bool bSaveFilterCommentsLines)
580 m_bSaveFilterCommentsLines = bSaveFilterCommentsLines;
584 * @brief Set whether to save "Compare method" setting.
585 * @param [in] bSaveCompareMethod Whether to save "Compare method" setting.
587 inline void ProjectFileItem::SetSaveCompareMethod(bool bSaveCompareMethod)
589 m_bSaveCompareMethod = bSaveCompareMethod;