6#include <QtWidgets/QToolButton>
9#include <imod/IModelEditor.h>
10#include <imod/IModel.h>
11#include <imod/CMultiModelDispatcherBase.h>
12#include <ilog/IMessageConsumer.h>
13#include <icomp/CComponentBase.h>
14#include <ibase/ICommandsProvider.h>
15#include <ifile/IFilePersistence.h>
16#include <idoc/IDocumentMetaInfo.h>
17#include <iqtgui/TMakeIconProviderCompWrap.h>
18#include <iqtgui/TDesignSchemaHandlerWrap.h>
19#include <iqtgui/CHierarchicalCommand.h>
20#include <iqtgui/CCommandTools.h>
21#include <iwidgets/iwidgets.h>
22#include <idoc/IDocumentManager.h>
25#include <imtgui/IDocumentViewConstraints.h>
26#include <imtgui/IDocumentViewDecorator.h>
33template <
class WorkspaceImpl,
class UI>
34class TStandardDocumentViewDecorator:
37 virtual public IDocumentViewDecorator,
38 virtual public ibase::ICommandsProvider,
39 protected imod::CMultiModelDispatcherBase
56 CO_SHOW_ALL = CO_SHOW_NEW | CO_SHOW_OPEN | CO_SHOW_SAVE | CO_SHOW_SAVE_AS
59 typedef WorkspaceImpl Workspace;
61 struct DecoratorConfiguration
63 DecoratorConfiguration()
65 fileButtonsStyle(Qt::ToolButtonFollowStyle),
66 documentButtonsStyle(Qt::ToolButtonFollowStyle),
67 undoButtonsStyle(Qt::ToolButtonFollowStyle),
68 showDocumentTitle(true),
69 showDocumentControlFrame(false)
74 Qt::ToolButtonStyle fileButtonsStyle;
75 Qt::ToolButtonStyle documentButtonsStyle;
76 Qt::ToolButtonStyle undoButtonsStyle;
77 int commandOptions = CO_SHOW_SAVE;
78 bool showDocumentTitle;
79 bool showDocumentControlFrame;
80 QVector<int> includedCommandGroups;
81 QVector<int> excludedCommandGroups;
84 TStandardDocumentViewDecorator(
85 WorkspaceImpl* parentPtr,
86 istd::IPolymorphic* viewPtr,
87 QWidget* parentWidgetPtr,
88 const ifile::IFilePersistence* persistencePtr,
89 const DecoratorConfiguration& configuration);
91 virtual void UpdateButtonsStatus();
92 virtual void UpdateAppearance();
95 virtual QWidget* GetDecoratorWidget()
override;
96 virtual QWidget* GetViewFrame()
override;
97 virtual istd::IPolymorphic* GetView()
const override;
98 virtual void SetViewEnabled(
bool isEnabled)
override;
99 virtual QString GetTitle()
override;
100 virtual void SetTitle(
const QString& title)
override;
101 virtual void SetDocumentTypeName(
const QString& name)
override;
104 virtual const ibase::IHierarchicalCommand* GetCommands()
const override;
107 virtual void OnViewContraintsChanged();
110 virtual void OnModelChanged(
int modelId,
const istd::IChangeable::ChangeSet& changeSet);
113 istd::IPolymorphic* m_viewObjectPtr;
114 const ifile::IFilePersistence* m_filePersistencePtr;
115 idoc::IDocumentManager* m_parentPtr;
116 bool m_isInitialized;
117 QString m_documentName;
120 bool m_isUndoEnabled;
121 bool m_isRedoEnabled;
123 DecoratorConfiguration m_configuration;
125 iqtgui::CHierarchicalCommand m_commands;
127 iqtgui::CHierarchicalCommand m_newCommand;
128 iqtgui::CHierarchicalCommand m_openCommand;
129 iqtgui::CHierarchicalCommand m_saveCommand;
130 iqtgui::CHierarchicalCommand m_saveAsCommand;
131 iqtgui::CHierarchicalCommand m_undoCommand;
132 iqtgui::CHierarchicalCommand m_redoCommand;
133 iqtgui::CHierarchicalCommand m_closeCommand;
135 class UiResourcesManager:
public iqtgui::TMakeIconProviderCompWrap<QObject>
138 typedef iqtgui::TMakeIconProviderCompWrap<QObject> BaseClass;
140 UiResourcesManager(TStandardDocumentViewDecorator& parent)
146 virtual void OnDesignSchemaChanged(
const QByteArray& themeId)
override
148 BaseClass::OnDesignSchemaChanged(themeId);
150 m_parent.UpdateAppearance();
153 TStandardDocumentViewDecorator& m_parent;
157 UiResourcesManager m_uiResourcesManager;
162template <
class WorkspaceImpl,
class UI>
163TStandardDocumentViewDecorator<WorkspaceImpl, UI>::TStandardDocumentViewDecorator(
164 WorkspaceImpl* parentPtr,
165 istd::IPolymorphic* viewPtr,
166 QWidget* parentWidgetPtr,
167 const ifile::IFilePersistence* persistencePtr,
168 const DecoratorConfiguration& configuration)
169 :QWidget(parentWidgetPtr),
170 m_viewObjectPtr(viewPtr),
171 m_filePersistencePtr(persistencePtr),
172 m_parentPtr(parentPtr),
173 m_isInitialized(false),
174 m_configuration(configuration),
175 m_newCommand(
"New", 110, ibase::ICommand::CF_GLOBAL_MENU | ibase::ICommand::CF_TOOLBAR, 20000),
176 m_openCommand(
"Open", 109, ibase::ICommand::CF_GLOBAL_MENU | ibase::ICommand::CF_TOOLBAR, 20000),
177 m_saveCommand(
"Save", 108, ibase::ICommand::CF_GLOBAL_MENU | ibase::ICommand::CF_TOOLBAR, 20000),
178 m_saveAsCommand(
"SaveAs", 100, ibase::ICommand::CF_GLOBAL_MENU, 20000),
179 m_undoCommand(
"Undo", 99, ibase::ICommand::CF_GLOBAL_MENU | ibase::ICommand::CF_TOOLBAR, 20000),
180 m_redoCommand(
"Redo", 99, ibase::ICommand::CF_GLOBAL_MENU | ibase::ICommand::CF_TOOLBAR, 20000),
181 m_closeCommand(
"Close", 99, ibase::ICommand::CF_GLOBAL_MENU | ibase::ICommand::CF_TOOLBAR, 20001),
182 m_uiResourcesManager(*this)
184 m_uiResourcesManager.EnableDesignHandler();
186 Q_ASSERT(parentPtr !=
nullptr);
187 Q_ASSERT(viewPtr !=
nullptr);
191 setObjectName(
"DocumentView");
193 UI::DocumentTitleFrame->setVisible(configuration.showDocumentTitle);
195 istd::IChangeable* documentPtr = m_parentPtr->GetDocumentFromView(*viewPtr);
196 Q_ASSERT(documentPtr !=
nullptr);
198 if (configuration.commandOptions & CO_SHOW_NEW){
199 m_commands.InsertChild(&m_newCommand);
202 if (configuration.commandOptions & CO_SHOW_OPEN){
203 m_commands.InsertChild(&m_openCommand);
206 m_commands.InsertChild(&m_undoCommand);
207 m_commands.InsertChild(&m_redoCommand);
209 if (configuration.commandOptions & CO_SHOW_SAVE){
210 m_commands.InsertChild(&m_saveCommand);
213 if (configuration.commandOptions & CO_SHOW_SAVE_AS){
214 m_commands.InsertChild(&m_saveAsCommand);
217 m_commands.InsertChild(&m_closeCommand);
219 m_isUndoEnabled =
false;
220 m_isRedoEnabled =
false;
222 idoc::IUndoManager* undoManagerPtr = m_parentPtr->GetUndoManagerForDocument(documentPtr);
224 UI::UndoButton->setVisible(undoManagerPtr !=
nullptr);
225 UI::RedoButton->setVisible(undoManagerPtr !=
nullptr);
226 UI::UndoButton->setIconSize(QSize(configuration.iconSize, configuration.iconSize));
227 UI::RedoButton->setIconSize(QSize(configuration.iconSize, configuration.iconSize));
228 m_undoCommand.setVisible(undoManagerPtr !=
nullptr);
229 m_redoCommand.setVisible(undoManagerPtr !=
nullptr);
231 m_newCommand.setShortcut(Qt::CTRL | Qt::Key_N);
232 m_openCommand.setShortcut(Qt::CTRL | Qt::Key_O);
233 m_saveCommand.setShortcut(Qt::CTRL | Qt::Key_S);
234 m_undoCommand.setShortcut(Qt::CTRL | Qt::Key_Z);
235 m_redoCommand.setShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_Z);
237 idoc::IDocumentMetaInfo* metaInfoPtr = CompCastPtr<idoc::IDocumentMetaInfo>(documentPtr);
238 if (metaInfoPtr !=
nullptr){
239 m_documentName = metaInfoPtr->GetMetaInfo(idoc::IDocumentMetaInfo::MIT_TITLE).toString();
241 m_comment = metaInfoPtr->GetMetaInfo(idoc::IDocumentMetaInfo::MIT_DESCRIPTION).toString();
244 UI::NewButton->setToolButtonStyle(configuration.fileButtonsStyle);
245 UI::NewButton->setDefaultAction(&m_newCommand);
246 UI::NewButton->setVisible(configuration.commandOptions & CO_SHOW_NEW);
247 UI::NewButton->setIconSize(QSize(configuration.iconSize, configuration.iconSize));
249 UI::OpenButton->setToolButtonStyle(configuration.fileButtonsStyle);
250 UI::OpenButton->setDefaultAction(&m_openCommand);
251 UI::OpenButton->setVisible(configuration.commandOptions & CO_SHOW_OPEN);
252 UI::OpenButton->setIconSize(QSize(configuration.iconSize, configuration.iconSize));
254 UI::UndoButton->setToolButtonStyle(configuration.undoButtonsStyle);
255 UI::UndoButton->setDefaultAction(&m_undoCommand);
257 UI::RedoButton->setToolButtonStyle(configuration.undoButtonsStyle);
258 UI::RedoButton->setDefaultAction(&m_redoCommand);
260 UI::CloseButton->setDefaultAction(&m_closeCommand);
262 UI::SaveButton->setToolButtonStyle(configuration.fileButtonsStyle);
263 UI::SaveButton->setDefaultAction(&m_saveCommand);
264 UI::SaveButton->setVisible(configuration.commandOptions & CO_SHOW_SAVE);
265 UI::SaveButton->setIconSize(QSize(configuration.iconSize, configuration.iconSize));
267 UI::SaveAsButton->setToolButtonStyle(configuration.fileButtonsStyle);
268 UI::SaveAsButton->setDefaultAction(&m_saveAsCommand);
269 UI::SaveAsButton->setVisible(configuration.commandOptions & CO_SHOW_SAVE_AS);
271 connect(&m_newCommand, &QAction::triggered, parentPtr, &WorkspaceImpl::OnNew);
272 connect(&m_openCommand, &QAction::triggered, parentPtr, &WorkspaceImpl::OnOpen);
273 connect(&m_undoCommand, &QAction::triggered, parentPtr, &WorkspaceImpl::OnUndo);
274 connect(&m_redoCommand, &QAction::triggered, parentPtr, &WorkspaceImpl::OnRedo);
275 connect(&m_closeCommand, &QAction::triggered, parentPtr, &WorkspaceImpl::OnCloseDocument);
276 connect(&m_saveCommand, &QAction::triggered, parentPtr, &WorkspaceImpl::OnSaveDocument);
277 connect(&m_saveAsCommand, &QAction::triggered, parentPtr, &WorkspaceImpl::OnSaveDocumentAs);
279 UpdateButtonsStatus();
283 m_isInitialized =
true;
286 if (viewConstraintsPtr !=
nullptr){
287 imod::IModel* viewModelPtr =
const_cast<imod::IModel*
>(
dynamic_cast<const imod::IModel*
>(viewConstraintsPtr));
288 if (viewModelPtr !=
nullptr){
289 RegisterModel(viewModelPtr, MI_VIEW_CONSTRAINTS);
293 imod::IModel* modelPtr =
dynamic_cast<imod::IModel*
>(undoManagerPtr);
294 if (modelPtr !=
nullptr){
295 RegisterModel(modelPtr, MI_UNDO_MANAGER);
298 imod::IModel* documentMetaInfoModelPtr =
dynamic_cast<imod::IModel*
>(metaInfoPtr);
299 if (documentMetaInfoModelPtr !=
nullptr){
300 RegisterModel(documentMetaInfoModelPtr, MI_DOCUMENT_META_INFO);
303 ibase::ICommandsProvider* commandsProviderPtr = CompCastPtr<ibase::ICommandsProvider>(viewPtr);
304 if (commandsProviderPtr !=
nullptr){
305 imod::IModel* commandsModelPtr =
dynamic_cast<imod::IModel*
>(commandsProviderPtr);
306 if (commandsModelPtr !=
nullptr){
307 RegisterModel(commandsModelPtr, MI_VIEW_COMMANDS);
310 OnModelChanged(MI_VIEW_COMMANDS, istd::IChangeable::GetAllChanges());
314 UI::HeaderFrame->setVisible(configuration.showDocumentControlFrame);
318template <
class WorkspaceImpl,
class UI>
319void TStandardDocumentViewDecorator<WorkspaceImpl, UI>::UpdateButtonsStatus()
321 bool isSaveActive =
true;
323 idoc::IUndoManager* undoManagerPtr = this->
template GetObjectAt<idoc::IUndoManager>(MI_UNDO_MANAGER);
324 if (undoManagerPtr !=
nullptr){
325 isSaveActive = isSaveActive && (undoManagerPtr->GetDocumentChangeFlag() != idoc::IDocumentStateComparator::DCF_EQUAL);
328 idoc::IDocumentManager::DocumentInfo documentInfo = {};
329 m_parentPtr->GetDocumentFromView(*m_viewObjectPtr, &documentInfo);
331 isSaveActive = isSaveActive || documentInfo.isDirty;
333 if (m_filePersistencePtr ==
nullptr){
334 isSaveActive =
false;
337 m_saveCommand.setEnabled(isSaveActive);
338 UI::SaveButton->setEnabled(isSaveActive);
340 m_saveAsCommand.setEnabled(m_filePersistencePtr !=
nullptr);
341 UI::SaveAsButton->setEnabled(m_filePersistencePtr !=
nullptr);
344 if (viewConstraintsPtr !=
nullptr){
345 bool isSaveEnabled = viewConstraintsPtr->
GetViewConstraints() & imtgui::IDocumentViewConstraints::CF_SAVE_DOCUMENT;
347 m_saveCommand.setVisible(isSaveEnabled);
348 UI::SaveButton->setVisible(isSaveEnabled);
350 m_saveAsCommand.setVisible(isSaveEnabled);
351 UI::SaveAsButton->setVisible(isSaveEnabled);
354 UI::UndoButton->setEnabled(m_isUndoEnabled);
355 UI::RedoButton->setEnabled(m_isRedoEnabled);
356 m_undoCommand.setEnabled(m_isUndoEnabled);
357 m_redoCommand.setEnabled(m_isRedoEnabled);
359 UI::CloseButton->setEnabled(
true);
363template<
class WorkspaceImpl,
class UI>
364inline void TStandardDocumentViewDecorator<WorkspaceImpl, UI>::UpdateAppearance()
366 m_newCommand.SetVisuals(QObject::tr(
"&New"), QObject::tr(
"New"), QObject::tr(
"Create new document"), m_uiResourcesManager.GetIcon(
":/Icons/New"));
367 m_openCommand.SetVisuals(QObject::tr(
"&Open..."), QObject::tr(
"Open..."), QObject::tr(
"Open an existing document"), m_uiResourcesManager.GetIcon(
":/Icons/Open"));
368 m_undoCommand.SetVisuals(QObject::tr(
"&Undo"), QObject::tr(
"Undo"), QObject::tr(
"Undo last document changes"), m_uiResourcesManager.GetIcon(
":/Icons/Undo"));
369 m_redoCommand.SetVisuals(QObject::tr(
"&Redo"), QObject::tr(
"Redo"), QObject::tr(
"Redo last document changes"), m_uiResourcesManager.GetIcon(
":/Icons/Redo"));
370 m_closeCommand.SetVisuals(QObject::tr(
"&Close"), QObject::tr(
"Close"), QObject::tr(
"Close the document"), m_uiResourcesManager.GetIcon(
":/Icons/Close"));
371 m_saveCommand.SetVisuals(QObject::tr(
"&Save"), QObject::tr(
"Save"), QObject::tr(
"Save the document changes"), m_uiResourcesManager.GetIcon(
":/Icons/Save"));
372 m_saveAsCommand.SetVisuals(QObject::tr(
"Save As"), QObject::tr(
"Save As"), QObject::tr(
"Save the document as..."), QIcon());
376template <
class WorkspaceImpl,
class UI>
377void TStandardDocumentViewDecorator<WorkspaceImpl, UI>::OnViewContraintsChanged()
380 if (viewConstraintsPtr !=
nullptr){
383 imod::IModelEditor* modelEditorPtr = CompCastPtr<imod::IModelEditor>(m_viewObjectPtr);
384 if (modelEditorPtr !=
nullptr){
385 modelEditorPtr->SetReadOnly(!(viewFlags & imtgui::IDocumentViewConstraints::CF_EDIT_DOCUMENT));
388 UI::SaveButton->setVisible((viewFlags & imtgui::IDocumentViewConstraints::CF_SAVE_DOCUMENT));
389 UI::SaveAsButton->setVisible((viewFlags & imtgui::IDocumentViewConstraints::CF_SAVE_DOCUMENT));
390 UI::UndoButton->setVisible((viewFlags & imtgui::IDocumentViewConstraints::CF_UNDO_SUPPORT));
391 UI::RedoButton->setVisible((viewFlags & imtgui::IDocumentViewConstraints::CF_UNDO_SUPPORT));
392 UI::CloseButton->setVisible((viewFlags & imtgui::IDocumentViewConstraints::CF_CLOSE_SUPPORT));
393 m_saveCommand.setVisible((viewFlags & imtgui::IDocumentViewConstraints::CF_SAVE_DOCUMENT));
394 m_saveAsCommand.setVisible((viewFlags & imtgui::IDocumentViewConstraints::CF_SAVE_DOCUMENT));
395 m_undoCommand.setVisible((viewFlags & imtgui::IDocumentViewConstraints::CF_UNDO_SUPPORT));
396 m_redoCommand.setVisible((viewFlags & imtgui::IDocumentViewConstraints::CF_UNDO_SUPPORT));
397 m_closeCommand.setVisible((viewFlags & imtgui::IDocumentViewConstraints::CF_CLOSE_SUPPORT));
404template <
class WorkspaceImpl,
class UI>
405QWidget* TStandardDocumentViewDecorator<WorkspaceImpl, UI>::GetDecoratorWidget()
411template <
class WorkspaceImpl,
class UI>
412QWidget* TStandardDocumentViewDecorator<WorkspaceImpl, UI>::GetViewFrame()
414 return UI::DocumentFrame;
418template <
class WorkspaceImpl,
class UI>
419istd::IPolymorphic* TStandardDocumentViewDecorator<WorkspaceImpl, UI>::GetView()
const
421 return m_viewObjectPtr;
425template <
class WorkspaceImpl,
class UI>
426void TStandardDocumentViewDecorator<WorkspaceImpl, UI>::SetViewEnabled(
bool isEnabled)
428 setEnabled(isEnabled);
432template <
class WorkspaceImpl,
class UI>
433QString TStandardDocumentViewDecorator<WorkspaceImpl, UI>::GetTitle()
439template <
class WorkspaceImpl,
class UI>
440void TStandardDocumentViewDecorator<WorkspaceImpl, UI>::SetTitle(
const QString& title)
442 UI::DocumentTitle->setText(title);
444 UI::DocumentTitle->setVisible(!title.isEmpty() && m_configuration.showDocumentTitle);
448template <
class WorkspaceImpl,
class UI>
449void TStandardDocumentViewDecorator<WorkspaceImpl, UI>::SetDocumentTypeName(
const QString& )
456template <
class WorkspaceImpl,
class UI>
457const ibase::IHierarchicalCommand * TStandardDocumentViewDecorator<WorkspaceImpl, UI>::GetCommands()
const
467template <
class WorkspaceImpl,
class UI>
468void TStandardDocumentViewDecorator<WorkspaceImpl, UI>::OnModelChanged(
int modelId,
const istd::IChangeable::ChangeSet& )
470 Q_ASSERT(m_parentPtr !=
nullptr);
472 if (!m_isInitialized){
477 case MI_UNDO_MANAGER:
479 idoc::IUndoManager* undoManagerPtr = this->
template GetObjectAt<idoc::IUndoManager>(MI_UNDO_MANAGER);
480 Q_ASSERT(undoManagerPtr !=
nullptr);
482 m_isUndoEnabled = undoManagerPtr->GetAvailableUndoSteps() > 0;
483 m_isRedoEnabled = undoManagerPtr->GetAvailableRedoSteps() > 0;
487 case MI_VIEW_COMMANDS:{
488 ibase::ICommandsProvider* commandsProviderPtr = CompCastPtr<ibase::ICommandsProvider>(m_viewObjectPtr);
489 m_commands.ResetChilds();
491 if (commandsProviderPtr !=
nullptr){
492 iwidgets::ClearLayout(UI::CommandToolBarFrame->layout());
493 const iqtgui::CHierarchicalCommand* guiCommandPtr =
dynamic_cast<const iqtgui::CHierarchicalCommand*
>(commandsProviderPtr->GetCommands());
494 if (guiCommandPtr !=
nullptr){
495 QToolBar* toolBarPtr =
new QToolBar(UI::CommandToolBarFrame);
496 toolBarPtr->setToolButtonStyle(m_configuration.documentButtonsStyle);
497 UI::CommandToolBarFrame->layout()->addWidget(toolBarPtr);
498 iqtgui::CCommandTools::SetupToolbar(*guiCommandPtr, *toolBarPtr, -1, m_configuration.includedCommandGroups, m_configuration.excludedCommandGroups);
499 toolBarPtr->setIconSize(QSize(m_configuration.iconSize, m_configuration.iconSize));
502 const ibase::IHierarchicalCommand* viewCommandsPtr = commandsProviderPtr->GetCommands();
503 if (viewCommandsPtr !=
nullptr){
504 m_commands.JoinLinkFrom(viewCommandsPtr);
507 m_commands.InsertChild(&m_undoCommand);
508 m_commands.InsertChild(&m_redoCommand);
509 m_commands.InsertChild(&m_saveCommand);
510 m_commands.InsertChild(&m_closeCommand);
515 case MI_VIEW_CONSTRAINTS:
516 OnViewContraintsChanged();
523 UpdateButtonsStatus();
virtual int GetViewConstraints() const =0