6#include <QtCore/QMutex>
7#include <QtCore/QString>
8#include <QtCore/QThread>
15#include <idoc/IDocumentManager.h>
16#include <idoc/IUndoManager.h>
17#include <imod/TMultiModelObserverBase.h>
18#include <imod/CMultiModelDispatcherBase.h>
21#include <imtdoc/IDocumentManager.h>
22#include <imtdoc/IDocumentManagerEventHandler.h>
29class CDocumentManagerBase:
30 protected imod::TMultiModelObserverBase<istd::IChangeable>,
31 virtual public imtdoc::IDocumentManager
34 CDocumentManagerBase();
35 virtual ~CDocumentManagerBase();
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;
57 virtual bool Serialize(iser::IArchive& archive)
override;
60 virtual void OnUpdate(imod::IModel* modelPtr,
const istd::IChangeable::ChangeSet& changeSet)
override;
63 struct WorkingDocument;
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);
82 virtual QList<imtdoc::IDocumentManagerEventHandler*> GetDocumentManagerEventHandlers()
const;
83 virtual istd::IChangeableSharedPtr CreateObject(
const QByteArray& typeId)
const = 0;
84 virtual idoc::IUndoManagerSharedPtr CreateUndoManager()
const = 0;
87 struct WorkingDocument
93 istd::IChangeableSharedPtr objectPtr;
94 idoc::IUndoManagerSharedPtr undoManagerPtr;
96 bool isLoading =
false;
97 int undoManagerModelId = -1;
100 class UndoManagerObserver :
public imod::CMultiModelDispatcherBase
103 UndoManagerObserver(CDocumentManagerBase& parent);
106 virtual void OnModelChanged(
int modelId,
const istd::IChangeable::ChangeSet& changeSet)
override;
109 CDocumentManagerBase& m_parent;
112 typedef QMap<QByteArray, WorkingDocument> WorkingDocumentList;
113 mutable QMap<QByteArray, WorkingDocumentList> m_userDocuments;
114 mutable QRecursiveMutex m_mutex;
116 UndoManagerObserver m_undoManagerObserver;
117 std::shared_ptr<std::atomic<bool>> m_isAlive;
120 DocumentNotificationPtr CreateDocumentNotification(
const QByteArray& userId,
const QByteArray& documentId)
const;