ImagingTools Core SDK
CDocumentManagerBase.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtCore/QMutex>
7#include <QtCore/QString>
8#include <QtCore/QThread>
9
10// STL includes
11#include <atomic>
12#include <memory>
13
14// ACF includes
15#include <idoc/IDocumentManager.h>
16#include <idoc/IUndoManager.h>
17#include <imod/TMultiModelObserverBase.h>
18#include <imod/CMultiModelDispatcherBase.h>
19
20// ImtCore includes
21#include <imtdoc/IDocumentManager.h>
22#include <imtdoc/IDocumentManagerEventHandler.h>
23
24
25namespace imtdoc
26{
27
28
29class CDocumentManagerBase:
30 protected imod::TMultiModelObserverBase<istd::IChangeable>,
31 virtual public imtdoc::IDocumentManager
32{
33public:
34 CDocumentManagerBase();
35 virtual ~CDocumentManagerBase();
36
37 // reimplemented (imtdoc::IDocumentManager)
38 virtual DocumentList GetOpenedDocumentList(const QByteArray& userId) const override;
39 virtual QByteArray CreateNewDocument(const QByteArray& userId, const QByteArray& documentTypeId) override;
40 virtual QByteArray OpenDocument(const QByteArray& userId, const QUrl& url) override;
41 virtual OperationStatus GetDocumentName(const QByteArray& userId, const QByteArray& documentId, QString& documentName) const override;
42 virtual OperationStatus SetDocumentName(const QByteArray& userId, const QByteArray& documentId, const QString& documentName) override;
43 virtual const istd::IChangeable* GetDocumentPtr(const QByteArray& userId, const QByteArray& documentId) const override;
44 virtual OperationStatus GetDocumentData(const QByteArray& userId, const QByteArray& documentId, istd::IChangeableSharedPtr& documentPtr) const override;
45 virtual OperationStatus SetDocumentData(const QByteArray& userId, const QByteArray& documentId, const istd::IChangeable& document) override;
46 virtual OperationStatus SaveDocument(
47 const QByteArray& userId,
48 const QByteArray& documentId,
49 const QString& documentName = QString(),
50 QString* errorMessage = nullptr) override;
51 virtual OperationStatus CloseDocument(const QByteArray& userId, const QByteArray& documentId) override;
52 virtual OperationStatus GetDocumentUndoManager(
53 const QByteArray& userId, const QByteArray& documentId, idoc::IUndoManager*& undoManagerPtr) const override;
54 virtual OperationStatus RegisterDocumentObserver(const QByteArray& userId, const QByteArray& documentId, imod::IObserver& observer) override;
55 virtual OperationStatus UnregisterDocumentObserver(const QByteArray& userId, const QByteArray& documentId, imod::IObserver& observer) override;
56 // reimplemented (iser::ISerializable)
57 virtual bool Serialize(iser::IArchive& archive) override;
58
59 // reimplemented (imod::CMultiModelObserverBase)
60 virtual void OnUpdate(imod::IModel* modelPtr, const istd::IChangeable::ChangeSet& changeSet) override;
61
62protected:
63 struct WorkingDocument;
64
65 bool ValidateInputParams(const QByteArray& userId, const QByteArray& documentId, OperationStatus& status) const;
66 virtual QString GetDefaultDocumentName(const WorkingDocument& document) const;
67 virtual bool HasDocumentNameProvider(const QByteArray& typeId) const;
68 virtual bool ValidateDocumentData(
69 const WorkingDocument& document,
70 OperationStatus& status,
71 QString* errorMessage = nullptr) const;
72 static QString GetInvalidDocumentMessage();
73 void OnUndoManagerChanged(int modelId);
74 int GetUndoManagerNextModelId(const QByteArray& userId);
75 WorkingDocument* FindDocument(const QByteArray& userId, const QByteArray& documentId);
76 const WorkingDocument* FindDocument(const QByteArray& userId, const QByteArray& documentId) const;
77 bool FindDocument(int undoManagerModelId, QByteArray& outUserId, QByteArray& outDocumentId);
78 void InitializeDocumentObservers(WorkingDocument& document, const QByteArray& userId);
79 void OnDocumentDataLoaded(const QByteArray& userId, const QByteArray& documentId);
80 QUrl ObjectIdToUrl(const QByteArray& objectId);
81
82 virtual QList<imtdoc::IDocumentManagerEventHandler*> GetDocumentManagerEventHandlers() const;
83 virtual istd::IChangeableSharedPtr CreateObject(const QByteArray& typeId) const = 0;
84 virtual idoc::IUndoManagerSharedPtr CreateUndoManager() const = 0;
85
86protected:
87 struct WorkingDocument
88 {
89 QByteArray objectId;
90 QByteArray typeId;
91 QUrl url;
92 QString name;
93 istd::IChangeableSharedPtr objectPtr;
94 idoc::IUndoManagerSharedPtr undoManagerPtr;
95 bool isDirty;
96 bool isLoading = false;
97 int undoManagerModelId = -1;
98 };
99
100 class UndoManagerObserver : public imod::CMultiModelDispatcherBase
101 {
102 public:
103 UndoManagerObserver(CDocumentManagerBase& parent);
104
105 protected:
106 virtual void OnModelChanged(int modelId, const istd::IChangeable::ChangeSet& changeSet) override;
107
108 private:
109 CDocumentManagerBase& m_parent;
110 };
111
112 typedef QMap<QByteArray, WorkingDocument> WorkingDocumentList;
113 mutable QMap<QByteArray, WorkingDocumentList> m_userDocuments;
114 mutable QRecursiveMutex m_mutex;
115
116 UndoManagerObserver m_undoManagerObserver;
117 std::shared_ptr<std::atomic<bool>> m_isAlive;
118
119protected:
120 DocumentNotificationPtr CreateDocumentNotification(const QByteArray& userId, const QByteArray& documentId) const;
121};
122
123
124} // namespace imtdoc