6#include <QtCore/QFileInfo>
8#include <QtCore/QMimeData>
9#include <QtGui/QDragEnterEvent>
10#include <QtGui/QDropEvent>
11#include <QtWidgets/QMessageBox>
14#include <imod/TModelWrap.h>
15#include <iprm/CNameParam.h>
16#include <idoc/IDocumentTemplate.h>
17#include <iqtgui/TDesignerGuiCompBase.h>
18#include <iqtgui/TRestorableGuiWrap.h>
19#include <iqtdoc/TQtDocumentManagerWrap.h>
22#include <imtbase/IObjectCollectionInfo.h>
23#include <imtgui/IDocumentViewDecorator.h>
30template <
class DocumentManagerBase,
class UI>
31class TDocumentWorkspaceGuiCompBase:
32 public iqtdoc::TQtDocumentManagerWrap<DocumentManagerBase, UI>
34 Q_DECLARE_TR_FUNCTIONS(TDocumentWorkspaceGuiCompBase)
36 typedef iqtdoc::TQtDocumentManagerWrap<DocumentManagerBase, UI> BaseClass;
37 typedef typename DocumentManagerBase::SingleDocumentData SingleDocumentData;
38 typedef typename DocumentManagerBase::Views Views;
39 typedef typename Views::ConstIterator ConstIterator;
40 typedef typename DocumentManagerBase::ViewInfo ViewInfo;
42 I_BEGIN_BASE_COMPONENT(TDocumentWorkspaceGuiCompBase);
43 I_REGISTER_INTERFACE(idoc::IDocumentManager);
44 I_REGISTER_INTERFACE(idoc::IDocumentTypesInfo);
45 I_REGISTER_SUBELEMENT(CurrentDocumentName);
46 I_REGISTER_SUBELEMENT_INTERFACE(CurrentDocumentName, iprm::INameParam, ExtractCurrentDocumentName);
47 I_REGISTER_SUBELEMENT_INTERFACE(CurrentDocumentName, imod::IModel, ExtractCurrentDocumentName);
48 I_ASSIGN(m_documentTemplateCompPtr,
"DocumentTemplate",
"Document template",
true,
"DocumentTemplate");
49 I_ASSIGN(m_iconSizeAttrPtr,
"IconSize",
"Size of the icon used in the document command tool bar",
true, 16);
50 I_ASSIGN(m_undoButtonsStyleAttrPtr,
"UndoButtonsStyle",
"Style of the command buttons for undo manager (See Qt::QToolButtonStyle for reference)",
true, Qt::ToolButtonFollowStyle);
51 I_ASSIGN(m_fileButtonsStyleAttrPtr,
"FileButtonsStyle",
"Style of the command buttons for file operations (See Qt::QToolButtonStyle for reference)",
true, Qt::ToolButtonFollowStyle);
52 I_ASSIGN(m_documentButtonsStyleAttrPtr,
"DocumentButtonsStyle",
"Style of the command buttons for document operations (See Qt::QToolButtonStyle for reference)",
true, Qt::ToolButtonFollowStyle);
55 TDocumentWorkspaceGuiCompBase();
58 virtual void OnTryClose(
bool* ignoredPtr =
nullptr)
override;
61 virtual void UpdateAllTitles() = 0;
62 virtual int GetDocumentIndexFromWidget(
const QWidget& widget)
const;
63 virtual void InitializeDocumentView(IDocumentViewDecorator* pageViewPtr,
const SingleDocumentData& documentData) = 0;
66 virtual void OnDragEnterEvent(QDragEnterEvent* dragEnterEventPtr);
67 virtual void OnDropEvent(QDropEvent* dropEventPtr);
70 virtual istd::IChangeableSharedPtr OpenSingleDocument(
71 const QString& filePath,
73 const QByteArray& viewTypeId,
74 QByteArray& documentTypeId,
77 ibase::IProgressManager* progressManagerPtr)
override;
80 virtual bool InsertNewDocument(
81 const QByteArray& documentTypeId,
82 bool createView =
true,
83 const QByteArray& viewTypeId =
"",
84 istd::IChangeableSharedPtr* newDocumentPtr =
nullptr,
86 bool* ignoredPtr =
nullptr)
override;
89 virtual QStringList GetOpenFilePaths(
const QByteArray* documentTypeIdPtr =
nullptr)
const override;
90 virtual bool QueryDocumentSave(
const SingleDocumentData& info,
bool* ignoredPtr)
override;
93 virtual void OnGuiCreated()
override;
94 virtual void OnGuiDestroyed()
override;
95 virtual void OnGuiRetranslate()
override;
98 virtual void OnComponentCreated()
override;
101 virtual void OnEndChanges(
const istd::IChangeable::ChangeSet& changeSet)
override;
104 virtual bool eventFilter(QObject* sourcePtr, QEvent* eventPtr)
override;
107 virtual IDocumentViewDecorator* CreateDocumentViewDecorator(
108 istd::IPolymorphic* viewPtr,
109 QWidget* parentWidgetPtr,
110 const ifile::IFilePersistence* persistencePtr) = 0;
113 virtual void DoUndo();
114 virtual void DoRedo();
115 virtual void OpenDocumentForType(
const QByteArray& documentTypeId);
119 template <
class InterfaceType>
120 static InterfaceType* ExtractCurrentDocumentName(TDocumentWorkspaceGuiCompBase& component)
122 return &component.m_currentDocumentName;
126 imod::TModelWrap<iprm::CNameParam> m_currentDocumentName;
128 I_REF(idoc::IDocumentTemplate, m_documentTemplateCompPtr);
129 I_ATTR(
int, m_iconSizeAttrPtr);
130 I_ATTR(
int, m_undoButtonsStyleAttrPtr);
131 I_ATTR(
int, m_fileButtonsStyleAttrPtr);
132 I_ATTR(
int, m_documentButtonsStyleAttrPtr);
138template <
class DocumentManagerBase,
class UI>
139TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::TDocumentWorkspaceGuiCompBase()
146template <
class DocumentManagerBase,
class UI>
147void TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::OnTryClose(
bool* ignoredPtr)
149 if (BaseClass::SaveDirtyDocuments(
false, ignoredPtr)){
150 int documentInfosCount = BaseClass::GetDocumentsCount();
151 for (
int documentIndex = 0; documentIndex < documentInfosCount; ++documentIndex){
152 SingleDocumentData& documentData = BaseClass::GetSingleDocumentData(documentIndex);
154 documentData.isDirty =
false;
157 this->CloseAllDocuments();
160 if (ignoredPtr !=
nullptr){
161 *ignoredPtr = (BaseClass::GetDocumentsCount() > 0);
168template <
class DocumentManagerBase,
class UI>
169int TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::GetDocumentIndexFromWidget(
const QWidget& widget)
const
171 int documentInfosCount = BaseClass::GetDocumentsCount();
172 for (
int documentIndex = 0; documentIndex < documentInfosCount; ++documentIndex){
173 const SingleDocumentData& documentData = BaseClass::GetSingleDocumentData(documentIndex);
175 for ( ConstIterator viewIter = documentData.views.begin();
176 viewIter != documentData.views.end();
178 const ViewInfo& viewInfo = *viewIter;
180 iqtgui::IGuiObject* guiObjectPtr = CompCastPtr<iqtgui::IGuiObject>(
const_cast<istd::IPolymorphic*
>(viewInfo.viewPtr.GetPtr()));
181 if (guiObjectPtr !=
nullptr){
182 if (guiObjectPtr->GetWidget() == &widget){
183 return documentIndex;
195template <
class DocumentManagerBase,
class UI>
196void TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::OnDragEnterEvent(QDragEnterEvent* dragEnterEventPtr)
198 if (dragEnterEventPtr->mimeData()->hasFormat(
"text/uri-list")){
199 dragEnterEventPtr->acceptProposedAction();
204template <
class DocumentManagerBase,
class UI>
205void TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::OnDropEvent(QDropEvent* dropEventPtr)
207 const QMimeData* mimeData = dropEventPtr->mimeData();
208 if (mimeData->hasUrls()){
209 QList<QUrl> files = mimeData->urls();
211 for (
int fileIndex = 0; fileIndex < files.count(); fileIndex++){
212 QString filePath = files.at(fileIndex).toLocalFile();
214 if (BaseClass::OpenDocument(
nullptr, &filePath)){
215 dropEventPtr->setAccepted(
true);
222 dropEventPtr->setAccepted(
false);
228template <
class DocumentManagerBase,
class UI>
229istd::IChangeableSharedPtr TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::OpenSingleDocument(
230 const QString& filePath,
232 const QByteArray& viewTypeId,
233 QByteArray& documentTypeId,
236 ibase::IProgressManager* progressManagerPtr)
238 SingleDocumentData* documentInfoPtr = BaseClass::GetDocumentInfoFromPath(filePath);
239 bool isNewViewType =
true;
240 if (documentInfoPtr !=
nullptr){
241 for (
int i = 0; i < documentInfoPtr->views.count(); ++i){
242 if (documentInfoPtr->views[i].viewTypeId == viewTypeId){
243 isNewViewType =
false;
249 if (documentInfoPtr !=
nullptr && !isNewViewType){
253 return BaseClass::OpenSingleDocument(filePath, createView, viewTypeId, documentTypeId, beQuiet, ignoredPtr, progressManagerPtr);
259template <
class DocumentManagerBase,
class UI>
260bool TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::InsertNewDocument(
261 const QByteArray& documentTypeId,
263 const QByteArray& viewTypeId,
264 istd::IChangeableSharedPtr* newDocumentPtr,
268 bool retVal = BaseClass::InsertNewDocument(documentTypeId, createView, viewTypeId, newDocumentPtr, beQuiet, ignoredPtr);
270 if (retVal && (newDocumentPtr !=
nullptr) && newDocumentPtr->IsValid() && createView){
271 int documentsCount = BaseClass::GetDocumentsCount();
272 for (
int i = 0; i < documentsCount; ++i){
273 if (&BaseClass::GetDocumentFromIndex(i) == newDocumentPtr->GetPtr()){
274 istd::IPolymorphic* viewPtr = BaseClass::GetViewFromIndex(i, 0);
275 if (viewPtr !=
nullptr){
276 BaseClass::SetActiveView(viewPtr);
290template <
class DocumentManagerBase,
class UI>
291QStringList TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::GetOpenFilePaths(
const QByteArray* documentTypeIdPtr)
const
293 QStringList files = BaseClass::GetOpenFilePathesFromDialog(documentTypeIdPtr);
295 if (!files.isEmpty()){
296 BaseClass::UpdateLastDirectory(files.at(0));
303template <
class DocumentManagerBase,
class UI>
304bool TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::QueryDocumentSave(
const SingleDocumentData& info,
bool* ignoredPtr)
306 QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No;
308 if (ignoredPtr !=
nullptr){
311 buttons |= QMessageBox::Cancel;
314 QFileInfo fileInfo(info.filePath);
316 int dialogResult = QMessageBox::information(
317 BaseClass::GetQtWidget(),
318 tr(
"Close document"),
319 tr(
"Do you want to save your changes made in document\n%1").arg(QDir::toNativeSeparators(fileInfo.completeBaseName())),
323 if (dialogResult == QMessageBox::Yes){
326 else if ((ignoredPtr !=
nullptr) && (dialogResult == QMessageBox::Cancel)){
336template <
class DocumentManagerBase,
class UI>
337void TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::OnGuiCreated()
339 BaseClass::OnGuiCreated();
341 QWidget* mainWindowPtr = BaseClass::GetQtWidget();
342 if (mainWindowPtr !=
nullptr){
343 mainWindowPtr->setAcceptDrops(
true);
348template <
class DocumentManagerBase,
class UI>
349void TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::OnGuiDestroyed()
351 this->CloseAllDocuments();
353 BaseClass::OnGuiDestroyed();
357template <
class DocumentManagerBase,
class UI>
358void TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::OnGuiRetranslate()
360 BaseClass::OnGuiRetranslate();
368template <
class DocumentManagerBase,
class UI>
369void TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::OnComponentCreated()
371 BaseClass::OnComponentCreated();
373 BaseClass::SetDocumentTemplate(m_documentTemplateCompPtr.GetPtr());
379template <
class DocumentManagerBase,
class UI>
380void TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::OnEndChanges(
const istd::IChangeable::ChangeSet& changeSet)
382 BaseClass::OnEndChanges(changeSet);
384 if (BaseClass::IsGuiCreated()){
392template <
class DocumentManagerBase,
class UI>
393bool TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::eventFilter(QObject* sourcePtr, QEvent* eventPtr)
395 if (eventPtr->type() == QEvent::DragEnter){
396 QDragEnterEvent* dragEnterEventPtr =
dynamic_cast<QDragEnterEvent*
>(eventPtr);
397 Q_ASSERT(dragEnterEventPtr !=
nullptr);
399 OnDragEnterEvent(dragEnterEventPtr);
403 else if (eventPtr->type() == QEvent::Drop){
404 QDropEvent* dropEventPtr =
dynamic_cast<QDropEvent*
>(eventPtr);
405 Q_ASSERT(dropEventPtr !=
nullptr);
407 OnDropEvent(dropEventPtr);
412 return BaseClass::eventFilter(sourcePtr, eventPtr);
418template <
class DocumentManagerBase,
class UI>
419void TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::DoUndo()
421 SingleDocumentData* documentDataPtr = BaseClass::GetActiveDocumentInfo();
422 if ((documentDataPtr !=
nullptr) && documentDataPtr->undoManagerPtr.IsValid() && documentDataPtr->undoManagerPtr->GetAvailableUndoSteps() > 0){
423 documentDataPtr->undoManagerPtr->DoUndo();
428template <
class DocumentManagerBase,
class UI>
429void TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::DoRedo()
431 SingleDocumentData* documentDataPtr = BaseClass::GetActiveDocumentInfo();
432 if ((documentDataPtr !=
nullptr) && documentDataPtr->undoManagerPtr.IsValid() && documentDataPtr->undoManagerPtr->GetAvailableRedoSteps() > 0){
433 documentDataPtr->undoManagerPtr->DoRedo();
438template <
class DocumentManagerBase,
class UI>
439void TDocumentWorkspaceGuiCompBase<DocumentManagerBase, UI>::OpenDocumentForType(
const QByteArray& documentTypeId)
441 bool ignoredFlag =
false;
442 if (!BaseClass::OpenDocument(&documentTypeId,
nullptr,
true,
"",
nullptr,
nullptr,
false, &ignoredFlag)){
444 QMessageBox::warning(
nullptr,
"", tr(
"Document could not be opened"));