From a463065302562deaf9bcf9d940cfca4fee1b8993 Mon Sep 17 00:00:00 2001 From: nds Date: Tue, 27 Oct 2020 19:24:59 +0300 Subject: [PATCH] 0031362: Inspectors - MessageView plugin for message alerts - OSD_Timer in message alert, - DumpJson correction, - Selection owner should be dumped in selector. Sensitive entities might be used in the same owner, that leads to lots of the same dump in the result stream. (cherry picked from commit e8bde810616e61cbe925981176681f2840234fa4) --- src/Message/Message.cxx | 4 +- src/Message/Message_Alert.cxx | 10 ++ src/Message/Message_Alert.hxx | 3 + src/Message/Message_AlertExtended.cxx | 20 ++++ src/Message/Message_AlertExtended.hxx | 4 + src/Message/Message_Attribute.cxx | 11 +++ src/Message/Message_Attribute.hxx | 3 + src/Message/Message_AttributeMeter.cxx | 30 ++++++ src/Message/Message_AttributeMeter.hxx | 4 + src/Message/Message_AttributeObject.hxx | 10 ++ src/Message/Message_AttributeStream.cxx | 13 +++ src/Message/Message_AttributeStream.hxx | 4 + src/Message/Message_CompositeAlerts.cxx | 27 ++++++ src/Message/Message_CompositeAlerts.hxx | 3 + src/Message/Message_MetricType.hxx | 1 + src/Message/Message_PrinterToReport.cxx | 22 +++++ src/Message/Message_PrinterToReport.hxx | 5 +- src/Message/Message_Report.cxx | 62 +++++++++--- src/Message/Message_Report.hxx | 11 ++- src/OSD/OSD_Timer.hxx | 3 + src/Select3D/Select3D_SensitiveEntity.cxx | 2 +- src/SelectMgr/SelectMgr_Selection.cxx | 21 ++++ src/Standard/Standard_Dump.cxx | 22 ++++- src/Standard/Standard_Dump.hxx | 30 ++++++ src/TopoDS/TopoDS_AlertAttribute.cxx | 13 +++ src/TopoDS/TopoDS_AlertAttribute.hxx | 4 + tools/DFBrowser/DFBrowser_TreeModel.cxx | 2 +- .../DFBrowserPane_TDataStdTreeNodeModel.cxx | 2 +- tools/MessageModel/MessageModel_Actions.cxx | 1 + tools/MessageModel/MessageModel_ItemAlert.cxx | 6 +- .../MessageModel/MessageModel_ItemReport.cxx | 6 +- tools/MessageModel/MessageModel_TreeModel.cxx | 12 +-- tools/MessageView/MessageView_Window.cxx | 96 ++++++++++++------- tools/MessageView/MessageView_Window.hxx | 7 +- tools/TInspectorEXE/TInspectorEXE.cxx | 4 +- tools/TreeModel/TreeModel_ContextMenu.cxx | 2 +- tools/TreeModel/TreeModel_ItemBase.cxx | 4 +- tools/TreeModel/TreeModel_ModelBase.cxx | 42 ++++---- tools/TreeModel/TreeModel_ModelBase.hxx | 12 +-- tools/TreeModel/TreeModel_Tools.cxx | 37 +++---- tools/VInspector/VInspector_ItemBase.cxx | 2 +- tools/VInspector/VInspector_ViewModel.cxx | 4 +- .../VInspector_ViewModelHistory.cxx | 14 +-- tools/VInspector/VInspector_Window.cxx | 12 +-- 44 files changed, 478 insertions(+), 129 deletions(-) diff --git a/src/Message/Message.cxx b/src/Message/Message.cxx index a6c63176e1..8b888403bc 100644 --- a/src/Message/Message.cxx +++ b/src/Message/Message.cxx @@ -27,9 +27,9 @@ static Handle(Message_Messenger) MyMessenger; namespace { - static Standard_CString Message_Table_PrintMetricTypeEnum[10] = + static Standard_CString Message_Table_PrintMetricTypeEnum[11] = { - "NONE", "UserTimeCPU", "SystemTimeInfo", "MemPrivate", "MemVirtual", + "NONE", "UserTimeCPU", "SystemTimeCPU", "WallClock", "MemPrivate", "MemVirtual", "MemWorkingSet", "MemWorkingSetPeak", "MemSwapUsage", "MemSwapUsagePeak", "MemHeapUsage" }; } diff --git a/src/Message/Message_Alert.cxx b/src/Message/Message_Alert.cxx index 5901a49a09..c9148aa973 100644 --- a/src/Message/Message_Alert.cxx +++ b/src/Message/Message_Alert.cxx @@ -14,6 +14,7 @@ // commercial license or contractual agreement. #include +#include IMPLEMENT_STANDARD_RTTIEXT(Message_Alert,Standard_Transient) @@ -48,3 +49,12 @@ Standard_Boolean Message_Alert::Merge (const Handle(Message_Alert)& /*theTarget* // by default, merge trivially return Standard_True; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_Alert::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) +} diff --git a/src/Message/Message_Alert.hxx b/src/Message/Message_Alert.hxx index a460787354..8a62457062 100644 --- a/src/Message/Message_Alert.hxx +++ b/src/Message/Message_Alert.hxx @@ -54,6 +54,9 @@ public: //! Base implementation always returns true. virtual Standard_EXPORT Standard_Boolean Merge (const Handle(Message_Alert)& theTarget); + //! Dumps the content of me into the stream + virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + DEFINE_STANDARD_RTTIEXT(Message_Alert,Standard_Transient) }; diff --git a/src/Message/Message_AlertExtended.cxx b/src/Message/Message_AlertExtended.cxx index 843c3b6d31..a203777eb7 100644 --- a/src/Message/Message_AlertExtended.cxx +++ b/src/Message/Message_AlertExtended.cxx @@ -18,6 +18,7 @@ #include #include +#include IMPLEMENT_STANDARD_RTTIEXT(Message_AlertExtended,Message_Alert) @@ -89,3 +90,22 @@ Handle(Message_Alert) Message_AlertExtended::AddAlert (const Handle(Message_Repo return anAlert; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_AlertExtended::DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + if (!myCompositAlerts.IsNull()) + { + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myCompositAlerts.get()) + } + if (!myAttribute.IsNull()) + { + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAttribute.get()) + } +} diff --git a/src/Message/Message_AlertExtended.hxx b/src/Message/Message_AlertExtended.hxx index 8c0420836d..0487dd56ea 100644 --- a/src/Message/Message_AlertExtended.hxx +++ b/src/Message/Message_AlertExtended.hxx @@ -78,6 +78,10 @@ public: const Handle(Message_Attribute)& theAttribute, const Message_Gravity theGravity); + //! Dumps the content of me into the stream + virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth = -1) const Standard_OVERRIDE; + DEFINE_STANDARD_RTTIEXT(Message_AlertExtended, Message_Alert) protected: diff --git a/src/Message/Message_Attribute.cxx b/src/Message/Message_Attribute.cxx index 6efcd0f7ba..3f0fb284e7 100644 --- a/src/Message/Message_Attribute.cxx +++ b/src/Message/Message_Attribute.cxx @@ -14,6 +14,7 @@ #include #include +#include IMPLEMENT_STANDARD_RTTIEXT(Message_Attribute, Standard_Transient) @@ -26,3 +27,13 @@ Standard_CString Message_Attribute::GetMessageKey () const { return !myName.IsEmpty() ? myName.ToCString() : ""; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_Attribute::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myName) +} diff --git a/src/Message/Message_Attribute.hxx b/src/Message/Message_Attribute.hxx index cce24fd803..773bbf2937 100644 --- a/src/Message/Message_Attribute.hxx +++ b/src/Message/Message_Attribute.hxx @@ -43,6 +43,9 @@ public: //! @param theName a name for the alert void SetName (const TCollection_AsciiString& theName) { myName = theName; } + //! Dumps the content of me into the stream + virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + DEFINE_STANDARD_RTTIEXT(Message_Attribute, Standard_Transient) private: diff --git a/src/Message/Message_AttributeMeter.cxx b/src/Message/Message_AttributeMeter.cxx index f9571b9bef..e89f11862a 100644 --- a/src/Message/Message_AttributeMeter.cxx +++ b/src/Message/Message_AttributeMeter.cxx @@ -16,8 +16,10 @@ #include #include #include +#include #include +#include IMPLEMENT_STANDARD_RTTIEXT(Message_AttributeMeter, Message_Attribute) @@ -121,6 +123,16 @@ void Message_AttributeMeter::SetAlertMetrics (const Handle(Message_AlertExtended const NCollection_Map& anActiveMetrics = aReport->ActiveMetrics(); // time metrics + if (anActiveMetrics.Contains (Message_MetricType_WallClock)) + { + OSD_Timer aTimer; + aTimer.Start(); + Standard_Real aTime = aTimer.StartTime(); + if (theStartValue) + aMeterAttribute->SetStartValue (Message_MetricType_WallClock, aTime); + else + aMeterAttribute->SetStopValue (Message_MetricType_WallClock, aTime); + } if (anActiveMetrics.Contains (Message_MetricType_UserTimeCPU) || anActiveMetrics.Contains (Message_MetricType_SystemTimeInfo)) { @@ -173,3 +185,21 @@ void Message_AttributeMeter::SetAlertMetrics (const Handle(Message_AlertExtended aMeterAttribute->SetStopValue (aMetricType, (Standard_Real)aMemInfo.ValuePreciseMiB (anIterator.Value())); } } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_AttributeMeter::DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Message_Attribute) + + for (NCollection_DataMap::Iterator anIterator (myMetrics); + anIterator.More(); anIterator.Next()) + { + OCCT_DUMP_VECTOR_CLASS (theOStream, Message::MetricToString (anIterator.Key()), + 2, anIterator.Value().first, anIterator.Value().second) + } +} diff --git a/src/Message/Message_AttributeMeter.hxx b/src/Message/Message_AttributeMeter.hxx index 72be3f6097..d322385d2e 100644 --- a/src/Message/Message_AttributeMeter.hxx +++ b/src/Message/Message_AttributeMeter.hxx @@ -80,6 +80,10 @@ public: static Standard_EXPORT void SetAlertMetrics (const Handle(Message_AlertExtended)& theAlert, const Standard_Boolean theStartValue); + //! Dumps the content of me into the stream + virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth = -1) const Standard_OVERRIDE; + DEFINE_STANDARD_RTTIEXT(Message_AttributeMeter, Message_Attribute) private: diff --git a/src/Message/Message_AttributeObject.hxx b/src/Message/Message_AttributeObject.hxx index 3775685da1..c9f5d7c2f0 100644 --- a/src/Message/Message_AttributeObject.hxx +++ b/src/Message/Message_AttributeObject.hxx @@ -15,6 +15,7 @@ #define _Message_AttributeObject_HeaderFile #include +#include class Standard_Transient; @@ -35,6 +36,15 @@ public: //! @param theObject an instance void SetObject (const Handle(Standard_Transient)& theObject) { myObject = theObject; } + //! Dumps the content of me into the stream + virtual void DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth = -1) const Standard_OVERRIDE + { + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Message_Attribute) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myObject.get()) + } + DEFINE_STANDARD_RTTI_INLINE(Message_AttributeObject, Message_Attribute) private: diff --git a/src/Message/Message_AttributeStream.cxx b/src/Message/Message_AttributeStream.cxx index f0cf931415..72abd86890 100644 --- a/src/Message/Message_AttributeStream.cxx +++ b/src/Message/Message_AttributeStream.cxx @@ -12,6 +12,7 @@ // commercial license or contractual agreement. #include +#include IMPLEMENT_STANDARD_RTTIEXT(Message_AttributeStream, Message_Attribute) @@ -39,3 +40,15 @@ void Message_AttributeStream::SetStream (const Standard_SStream& theStream) myStream << aStreamStr; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_AttributeStream::DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Message_Attribute) + + OCCT_DUMP_STREAM_VALUE_DUMPED (theOStream, myStream) +} diff --git a/src/Message/Message_AttributeStream.hxx b/src/Message/Message_AttributeStream.hxx index c4a73527fa..2f992dd486 100644 --- a/src/Message/Message_AttributeStream.hxx +++ b/src/Message/Message_AttributeStream.hxx @@ -34,6 +34,10 @@ public: //! Sets stream value Standard_EXPORT void SetStream (const Standard_SStream& theStream); + //! Dumps the content of me into the stream + virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth = -1) const Standard_OVERRIDE; + DEFINE_STANDARD_RTTIEXT(Message_AttributeStream, Message_Attribute) private: diff --git a/src/Message/Message_CompositeAlerts.cxx b/src/Message/Message_CompositeAlerts.cxx index 48d0e14be9..5d315f3e8c 100644 --- a/src/Message/Message_CompositeAlerts.cxx +++ b/src/Message/Message_CompositeAlerts.cxx @@ -14,6 +14,7 @@ #include #include #include +#include IMPLEMENT_STANDARD_RTTIEXT(Message_CompositeAlerts, Standard_Transient) @@ -153,3 +154,29 @@ void Message_CompositeAlerts::Clear (const Handle(Standard_Type)& theType) } } } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_CompositeAlerts::DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + for (unsigned int i = 0; i < sizeof(myAlerts)/sizeof(myAlerts[0]); ++i) + { + if (myAlerts[i].IsEmpty()) + continue; + + Message_Gravity aGravity = (Message_Gravity)i; + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aGravity) + + Standard_Integer anInc = 1; + for (Message_ListOfAlert::Iterator anIt (myAlerts[i]); anIt.More(); anIt.Next(), anInc++) + { + const Handle(Message_Alert)& anAlert = anIt.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED_INC (theOStream, theDepth, anAlert.get(), anInc) + } + } +} diff --git a/src/Message/Message_CompositeAlerts.hxx b/src/Message/Message_CompositeAlerts.hxx index 0864e05b6f..937eda0137 100644 --- a/src/Message/Message_CompositeAlerts.hxx +++ b/src/Message/Message_CompositeAlerts.hxx @@ -66,6 +66,9 @@ public: //! @param theType an alert type Standard_EXPORT void Clear (const Handle(Standard_Type)& theType); + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + DEFINE_STANDARD_RTTIEXT(Message_CompositeAlerts,Standard_Transient) protected: diff --git a/src/Message/Message_MetricType.hxx b/src/Message/Message_MetricType.hxx index a99db83399..62c55cff18 100644 --- a/src/Message/Message_MetricType.hxx +++ b/src/Message/Message_MetricType.hxx @@ -20,6 +20,7 @@ enum Message_MetricType Message_MetricType_None, //!< no computation Message_MetricType_UserTimeCPU, //!< the current CPU user time in seconds Message_MetricType_SystemTimeInfo, //!< the current CPU system time in seconds + Message_MetricType_WallClock, //!< OSD_Timer elapsed time Message_MetricType_MemPrivate, //!< OSD_MemInfo::MemPrivate Message_MetricType_MemVirtual, //!< OSD_MemInfo::MemVirtual Message_MetricType_MemWorkingSet, //!< OSD_MemInfo::MemWorkingSet diff --git a/src/Message/Message_PrinterToReport.cxx b/src/Message/Message_PrinterToReport.cxx index ca225ab0af..609e10c978 100644 --- a/src/Message/Message_PrinterToReport.cxx +++ b/src/Message/Message_PrinterToReport.cxx @@ -28,6 +28,18 @@ IMPLEMENT_STANDARD_RTTIEXT(Message_PrinterToReport, Message_Printer) +//======================================================================= +//function : Destructor +//purpose : +//======================================================================= +Message_PrinterToReport::~Message_PrinterToReport() +{ + if (!myReport.IsNull()) + { + myReport->UpdateActiveInMessenger(); + } +} + //======================================================================= //function : Report //purpose : @@ -40,6 +52,16 @@ const Handle(Message_Report)& Message_PrinterToReport::Report() const return Message::DefaultReport (Standard_True); } +//======================================================================= +//function : Send +//purpose : +//======================================================================= +void Message_PrinterToReport::SetReport (const Handle(Message_Report)& theReport) +{ + myReport = theReport; + myReport->UpdateActiveInMessenger(); +} + //======================================================================= //function : Send //purpose : diff --git a/src/Message/Message_PrinterToReport.hxx b/src/Message/Message_PrinterToReport.hxx index f61a5be2b0..faa95acf1a 100644 --- a/src/Message/Message_PrinterToReport.hxx +++ b/src/Message/Message_PrinterToReport.hxx @@ -35,14 +35,15 @@ public: //! Create printer for redirecting messages into report. Message_PrinterToReport() {} - ~Message_PrinterToReport() {} + //! Destructor + Standard_EXPORT ~Message_PrinterToReport(); //! Returns the current or default report Standard_EXPORT const Handle(Message_Report)& Report() const; //! Sets the printer report //! @param theReport report for messages processing, if NULL, the default report is used - Standard_EXPORT void SetReport (const Handle(Message_Report)& theReport) { myReport = theReport; } + Standard_EXPORT void SetReport (const Handle(Message_Report)& theReport); //! Send a string message with specified trace level. //! Stream is converted to string value. diff --git a/src/Message/Message_Report.cxx b/src/Message/Message_Report.cxx index 2850240119..19d9b7f111 100644 --- a/src/Message/Message_Report.cxx +++ b/src/Message/Message_Report.cxx @@ -37,7 +37,8 @@ IMPLEMENT_STANDARD_RTTIEXT(Message_Report,Standard_Transient) //======================================================================= Message_Report::Message_Report () -: myLimit (-1), myWriteFileOnEachAlert (Standard_False) +: myLimit (-1), myWriteFileOnEachAlert (Standard_False), + myIsActiveInMessenger (Standard_False) { } @@ -121,16 +122,9 @@ Standard_Boolean Message_Report::HasAlert (const Handle(Standard_Type)& theType, //purpose : //======================================================================= -Standard_Boolean Message_Report::IsActiveInMessenger (const Handle(Message_Messenger)& theMessenger) const +Standard_Boolean Message_Report::IsActiveInMessenger (const Handle(Message_Messenger)&) const { - Handle(Message_Messenger) aMessenger = theMessenger.IsNull() ? Message::DefaultMessenger() : theMessenger; - for (Message_SequenceOfPrinters::Iterator anIterator (aMessenger->Printers()); anIterator.More(); anIterator.Next()) - { - if (anIterator.Value()->IsKind(STANDARD_TYPE (Message_PrinterToReport)) && - Handle(Message_PrinterToReport)::DownCast (anIterator.Value())->Report() == this) - return Standard_True; - } - return Standard_False; + return myIsActiveInMessenger; } //======================================================================= @@ -139,11 +133,12 @@ Standard_Boolean Message_Report::IsActiveInMessenger (const Handle(Message_Messe //======================================================================= void Message_Report::ActivateInMessenger (const Standard_Boolean toActivate, - const Handle(Message_Messenger)& theMessenger) const + const Handle(Message_Messenger)& theMessenger) { if (toActivate == IsActiveInMessenger()) return; + myIsActiveInMessenger = toActivate; Handle(Message_Messenger) aMessenger = theMessenger.IsNull() ? Message::DefaultMessenger() : theMessenger; if (toActivate) { @@ -168,6 +163,25 @@ void Message_Report::ActivateInMessenger (const Standard_Boolean toActivate, } } +//======================================================================= +//function : UpdateActiveInMessenger +//purpose : +//======================================================================= +void Message_Report::UpdateActiveInMessenger (const Handle(Message_Messenger)& theMessenger) +{ + Handle(Message_Messenger) aMessenger = theMessenger.IsNull() ? Message::DefaultMessenger() : theMessenger; + for (Message_SequenceOfPrinters::Iterator anIterator (aMessenger->Printers()); anIterator.More(); anIterator.Next()) + { + if (anIterator.Value()->IsKind(STANDARD_TYPE (Message_PrinterToReport)) && + Handle(Message_PrinterToReport)::DownCast (anIterator.Value())->Report() == this) + { + myIsActiveInMessenger = Standard_True; + return; + } + } + myIsActiveInMessenger = Standard_False; +} + //======================================================================= //function : AddLevel //purpose : @@ -447,3 +461,29 @@ void Message_Report::writeReport() myReportWriter->ExportReport (this); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_Report::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + if (!myCompositAlerts.IsNull()) + { + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myCompositAlerts.get()) + } + + Standard_Integer anAlertLevels = myAlertLevels.Size(); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, anAlertLevels) + + for (NCollection_Map::Iterator anIterator (myActiveMetrics); anIterator.More(); anIterator.Next()) + { + Message_MetricType anActiveMetric = anIterator.Value(); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, anActiveMetric) + } + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLimit) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsActiveInMessenger) +} diff --git a/src/Message/Message_Report.hxx b/src/Message/Message_Report.hxx index 599b0fad7b..03ef68ffe3 100644 --- a/src/Message/Message_Report.hxx +++ b/src/Message/Message_Report.hxx @@ -82,8 +82,13 @@ public: //! Creates an instance of Message_PrinterToReport with the current report and register it in messenger //! @param toActivate if true, activated else deactivated // @param theMessenger the messenger. If it's NULL, the default messenger is used - Standard_EXPORT void ActivateInMessenger (const Standard_Boolean toActivate, const Handle(Message_Messenger)& theMessenger = NULL) const; + Standard_EXPORT void ActivateInMessenger (const Standard_Boolean toActivate, const Handle(Message_Messenger)& theMessenger = NULL); + //! Updates internal flag IsActiveInMessenger. + //! It becomes true if messenger contains at least one instance of Message_PrinterToReport. + //! @param theMessenger the messenger. If it's NULL, the default messenger is used + Standard_EXPORT void UpdateActiveInMessenger (const Handle(Message_Messenger)& theMessenger = NULL); + //! Add new level of alerts //! @param theLevel a level Standard_EXPORT void AddLevel (Message_Level* theLevel, const TCollection_AsciiString& theName); @@ -153,6 +158,9 @@ public: //! Merges alerts with specified gravity from theOther report into this Standard_EXPORT void Merge (const Handle(Message_Report)& theOther, Message_Gravity theGravity); + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + DEFINE_STANDARD_RTTIEXT(Message_Report,Standard_Transient) protected: @@ -183,6 +191,7 @@ protected: Standard_Integer myLimit; //! Maximum number of collected alerts on the top level Standard_Boolean myWriteFileOnEachAlert; //! State if output file should be written on each alert adding + Standard_Boolean myIsActiveInMessenger; //! state whether the report is activated in messenger }; #endif // _Message_Report_HeaderFile diff --git a/src/OSD/OSD_Timer.hxx b/src/OSD/OSD_Timer.hxx index 2b483283bf..897d3442c0 100644 --- a/src/OSD/OSD_Timer.hxx +++ b/src/OSD/OSD_Timer.hxx @@ -79,6 +79,9 @@ public: //! the Timer. Standard_EXPORT virtual void Start() Standard_OVERRIDE; + //! Returns start time in seconds. + Standard_Real StartTime() const { return myTimeStart; } + //! Returns elapsed time in seconds. Standard_EXPORT Standard_Real ElapsedTime() const; diff --git a/src/Select3D/Select3D_SensitiveEntity.cxx b/src/Select3D/Select3D_SensitiveEntity.cxx index 95d94d6300..97bc6a3684 100644 --- a/src/Select3D/Select3D_SensitiveEntity.cxx +++ b/src/Select3D/Select3D_SensitiveEntity.cxx @@ -39,7 +39,7 @@ void Select3D_SensitiveEntity::DumpJson (Standard_OStream& theOStream, Standard_ { OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myOwnerId.get()) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myOwnerId.get()) OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mySFactor) OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, NbSubElements()); diff --git a/src/SelectMgr/SelectMgr_Selection.cxx b/src/SelectMgr/SelectMgr_Selection.cxx index d31eeafd3b..34f60d1469 100644 --- a/src/SelectMgr/SelectMgr_Selection.cxx +++ b/src/SelectMgr/SelectMgr_Selection.cxx @@ -124,6 +124,27 @@ void SelectMgr_Selection::DumpJson (Standard_OStream& theOStream, Standard_Integ { OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + NCollection_IndexedMap anOwners; + for (NCollection_Vector::Iterator anIterator (myEntities); anIterator.More(); anIterator.Next()) + { + const Handle(SelectMgr_SensitiveEntity)& anEntity = anIterator.Value(); + if (anEntity.IsNull() || anEntity->BaseSensitive().IsNull()) + { + continue; + } + const Handle(SelectMgr_EntityOwner)& anOwner = anEntity->BaseSensitive()->OwnerId(); + if (!anOwners.Contains (anOwner)) + { + anOwners.Add (anOwner); + } + } + + for (NCollection_IndexedMap::Iterator anIterator (anOwners); anIterator.More(); anIterator.Next()) + { + const Handle(SelectMgr_EntityOwner)& anOwner = anIterator.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, anOwner.get()) + } + for (NCollection_Vector::Iterator anIterator (myEntities); anIterator.More(); anIterator.Next()) { const Handle(SelectMgr_SensitiveEntity)& anEntity = anIterator.Value(); diff --git a/src/Standard/Standard_Dump.cxx b/src/Standard/Standard_Dump.cxx index 4f030678dc..a56292f912 100644 --- a/src/Standard/Standard_Dump.cxx +++ b/src/Standard/Standard_Dump.cxx @@ -24,7 +24,7 @@ void Standard_Dump::AddValuesSeparator (Standard_OStream& theOStream) Standard_SStream aStream; aStream << theOStream.rdbuf(); TCollection_AsciiString aStreamStr = Standard_Dump::Text (aStream); - if (!aStreamStr.IsEmpty() && !aStreamStr.EndsWith ("{")) + if (!aStreamStr.IsEmpty() && !aStreamStr.EndsWith ("{") && !aStreamStr.EndsWith (", ")) theOStream << ", "; } @@ -306,9 +306,15 @@ TCollection_AsciiString Standard_Dump::FormatJson (const Standard_SStream& theSt Standard_Integer anIndentCount = 0; Standard_Boolean isMassiveValues = Standard_False; - for (Standard_Integer anIndex = 1; anIndex < aStreamStr.Length(); anIndex++) + for (Standard_Integer anIndex = 1; anIndex <= aStreamStr.Length(); anIndex++) { Standard_Character aSymbol = aStreamStr.Value (anIndex); + if (anIndex == 1 && aText.IsEmpty() && aSymbol != '{') + { + // append opening brace for json start + aSymbol = '{'; + anIndex--; + } if (aSymbol == '{') { anIndentCount++; @@ -354,6 +360,18 @@ TCollection_AsciiString Standard_Dump::FormatJson (const Standard_SStream& theSt } else aText += aSymbol; + + if (anIndex == aStreamStr.Length() && aSymbol != '}') + { + // append closing brace for json end + aSymbol = '}'; + + anIndentCount--; + aText += '\n'; + for (int anIndent = 0; anIndent < anIndentCount; anIndent++) + aText += anIndentStr; + aText += aSymbol; + } } return aText; } diff --git a/src/Standard/Standard_Dump.hxx b/src/Standard/Standard_Dump.hxx index 846c9cb001..e0333c03e4 100644 --- a/src/Standard/Standard_Dump.hxx +++ b/src/Standard/Standard_Dump.hxx @@ -155,6 +155,35 @@ } \ } +//! @def OCCT_DUMP_FIELD_VALUES_DUMPED +//! Append into output value: "Name": { field dumped values } +//! It computes Dump of the fields. The expected field is a pointer. +//! Use this macro for fields of the dumped class which has own Dump implementation. +//! The macros is recursive. Recursion is stopped when the depth value becomes equal to zero. +//! Depth = -1 is the default value, dump here is unlimited. +#define OCCT_DUMP_FIELD_VALUES_DUMPED_INC(theOStream, theDepth, theField, theIncName) \ +{ \ + if (theDepth != 0 && (void*)(theField) != NULL) \ + { \ + Standard_SStream aFieldStream; \ + (theField)->DumpJson (aFieldStream, theDepth - 1); \ + TCollection_AsciiString aName = Standard_Dump::DumpFieldToName (#theField) + theIncName; \ + Standard_Dump::DumpKeyToClass (theOStream, aName, Standard_Dump::Text (aFieldStream)); \ + } \ +} + +//! @def OCCT_DUMP_FIELD_VALUES_DUMPED +//! Append into output value: "Name": { field dumped values } +//! It computes Dump of the fields. The expected field is a pointer. +//! Use this macro for fields of the dumped class which has own Dump implementation. +//! The macros is recursive. Recursion is stopped when the depth value becomes equal to zero. +//! Depth = -1 is the default value, dump here is unlimited. +#define OCCT_DUMP_STREAM_VALUE_DUMPED(theOStream, theField) \ +{ \ + TCollection_AsciiString aName = Standard_Dump::DumpFieldToName (#theField); \ + Standard_Dump::DumpKeyToClass (theOStream, aName, Standard_Dump::Text (theField)); \ +} + //! @def OCCT_INIT_FIELD_VALUES_DUMPED //! Append into output value: "Name": { field dumped values } //! It computes Dump of the fields. The expected field is a pointer. @@ -267,6 +296,7 @@ public: //! - for '{' append after '\n' and indent to the next value, increment current indent value //! - for '}' append '\n' and current indent before it, decrement indent value //! - for ',' append after '\n' and indent to the next value. If the current symbol is in massive container [], do nothing + //! Covers result with opened and closed brackets on the top level, if it has no symbols there. //! @param theStream source value //! @param theIndent count of ' ' symbols to apply hierarchical indent of the text values //! @return text presentation diff --git a/src/TopoDS/TopoDS_AlertAttribute.cxx b/src/TopoDS/TopoDS_AlertAttribute.cxx index c4fc6127dd..3f11158964 100644 --- a/src/TopoDS/TopoDS_AlertAttribute.cxx +++ b/src/TopoDS/TopoDS_AlertAttribute.cxx @@ -53,3 +53,16 @@ void TopoDS_AlertAttribute::Send (const Handle(Message_Messenger)& theMessenger, // Message_Info); } } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void TopoDS_AlertAttribute::DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Message_Attribute) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myShape) +} diff --git a/src/TopoDS/TopoDS_AlertAttribute.hxx b/src/TopoDS/TopoDS_AlertAttribute.hxx index b7e5e95e1c..deaa193dc4 100644 --- a/src/TopoDS/TopoDS_AlertAttribute.hxx +++ b/src/TopoDS/TopoDS_AlertAttribute.hxx @@ -40,6 +40,10 @@ public: Standard_EXPORT static void Send (const Handle(Message_Messenger)& theMessenger, const TopoDS_Shape& theShape); + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth = -1) const Standard_OVERRIDE; + // OCCT RTTI DEFINE_STANDARD_RTTIEXT(TopoDS_AlertAttribute, Message_AttributeStream) diff --git a/tools/DFBrowser/DFBrowser_TreeModel.cxx b/tools/DFBrowser/DFBrowser_TreeModel.cxx index 23ab2c2aa8..70857bc046 100644 --- a/tools/DFBrowser/DFBrowser_TreeModel.cxx +++ b/tools/DFBrowser/DFBrowser_TreeModel.cxx @@ -49,7 +49,7 @@ DFBrowser_TreeModel::DFBrowser_TreeModel (QObject* theParent) // ======================================================================= void DFBrowser_TreeModel::InitColumns() { - SetHeaderItem (0, TreeModel_HeaderSection ("Name")); + setHeaderItem (0, TreeModel_HeaderSection ("Name")); } // ======================================================================= diff --git a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.cxx b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.cxx index 4f8a4847f0..0d6b98f12f 100644 --- a/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.cxx +++ b/tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.cxx @@ -37,7 +37,7 @@ DFBrowserPane_TDataStdTreeNodeModel::DFBrowserPane_TDataStdTreeNodeModel (QObjec // ======================================================================= void DFBrowserPane_TDataStdTreeNodeModel::InitColumns() { - SetHeaderItem (0, TreeModel_HeaderSection ("Name")); + setHeaderItem (0, TreeModel_HeaderSection ("Name")); } // ======================================================================= diff --git a/tools/MessageModel/MessageModel_Actions.cxx b/tools/MessageModel/MessageModel_Actions.cxx index 6308c66460..8ca4217c74 100644 --- a/tools/MessageModel/MessageModel_Actions.cxx +++ b/tools/MessageModel/MessageModel_Actions.cxx @@ -170,6 +170,7 @@ void MessageModel_Actions::OnActivateReport() Message::DefaultMessenger()->AddPrinter (MyPrinterToReport); Message::DefaultMessenger()->SetTraceLevel (1); + Message::DefaultReport()->UpdateActiveInMessenger(); myTreeModel->UpdateTreeModel(); } diff --git a/tools/MessageModel/MessageModel_ItemAlert.cxx b/tools/MessageModel/MessageModel_ItemAlert.cxx index 6aa1c7bb69..a0904ec5c1 100644 --- a/tools/MessageModel/MessageModel_ItemAlert.cxx +++ b/tools/MessageModel/MessageModel_ItemAlert.cxx @@ -119,8 +119,12 @@ QVariant MessageModel_ItemAlert::initValue (const int theRole) const if (anAttribute.IsNull() || !anAttribute->HasMetric (aMetricType)) return QVariant(); + if (!anAttribute->IsMetricValid (aMetricType)) + return QVariant ("in process"); + if (aMetricType == Message_MetricType_UserTimeCPU || - aMetricType == Message_MetricType_SystemTimeInfo) + aMetricType == Message_MetricType_SystemTimeInfo || + aMetricType == Message_MetricType_WallClock) { Standard_Real aCumulativeMetric = anAttribute->StopValue (aMetricType) - anAttribute->StartValue (aMetricType); if (fabs (aCumulativeMetric) < Precision::Confusion()) diff --git a/tools/MessageModel/MessageModel_ItemReport.cxx b/tools/MessageModel/MessageModel_ItemReport.cxx index 32ef4ff4e1..bf4fc5a7f7 100644 --- a/tools/MessageModel/MessageModel_ItemReport.cxx +++ b/tools/MessageModel/MessageModel_ItemReport.cxx @@ -67,7 +67,8 @@ QVariant MessageModel_ItemReport::initValue (const int theRole) const Message_MetricType aMetricType; int aPosition; if (MessageModel_TreeModel::IsMetricColumn (Column(), aMetricType, aPosition) && - (aMetricType == Message_MetricType_UserTimeCPU || aMetricType == Message_MetricType_SystemTimeInfo)) + (aMetricType == Message_MetricType_UserTimeCPU || aMetricType == Message_MetricType_SystemTimeInfo || + aMetricType == Message_MetricType_WallClock)) { if (aPosition == 0) return CumulativeMetric (aReport, aMetricType); else if (aPosition == 1) return "100"; @@ -210,8 +211,9 @@ Standard_Real MessageModel_ItemReport::CumulativeMetric (const Handle(Message_Re if (anAlert.IsNull()) continue; Handle(Message_AttributeMeter) anAttribute = Handle(Message_AttributeMeter)::DownCast (anAlert->Attribute()); - if (anAttribute.IsNull() || !anAttribute->HasMetric(theMetricType)) + if (anAttribute.IsNull() || !anAttribute->HasMetric (theMetricType) || !anAttribute->IsMetricValid (theMetricType)) continue; + //if (aFirstAttribute.IsNull()) // aFirstAttribute = anAttribute; //else diff --git a/tools/MessageModel/MessageModel_TreeModel.cxx b/tools/MessageModel/MessageModel_TreeModel.cxx index 7806eb35f7..b5950bd8b5 100644 --- a/tools/MessageModel/MessageModel_TreeModel.cxx +++ b/tools/MessageModel/MessageModel_TreeModel.cxx @@ -22,7 +22,7 @@ #include -const int COLUMN_NAME_WIDTH = 460; +const int COLUMN_NAME_WIDTH = 230; const int COLUMN_SIZE_WIDTH = 30; const int COLUMN_REAL_VALUE_WIDTH = 115; @@ -44,9 +44,9 @@ MessageModel_TreeModel::MessageModel_TreeModel (QObject* theParent) void MessageModel_TreeModel::InitColumns() { // 0 - Name, 1 - visibility, 2 - Row - SetHeaderItem (TreeModel_ColumnType_Name, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH)); - SetHeaderItem (TreeModel_ColumnType_Visibility, TreeModel_HeaderSection ("Visibility", TreeModel_ModelBase::ColumnVisibilityWidth())); - SetHeaderItem (TreeModel_ColumnType_Row, TreeModel_HeaderSection ("Row", COLUMN_SIZE_WIDTH, Standard_True /*hidden*/)); + setHeaderItem (TreeModel_ColumnType_Name, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH)); + setHeaderItem (TreeModel_ColumnType_Visibility, TreeModel_HeaderSection ("Visibility", TreeModel_ModelBase::ColumnVisibilityWidth())); + setHeaderItem (TreeModel_ColumnType_Row, TreeModel_HeaderSection ("Row", COLUMN_SIZE_WIDTH, Standard_True /*hidden*/)); int aNextIndex = 3; for (int aMetricId = (int)Message_MetricType_None + 1; aMetricId <= (int)Message_MetricType_MemHeapUsage; aMetricId++) @@ -55,10 +55,10 @@ void MessageModel_TreeModel::InitColumns() OSD_MemInfo::Counter aMemInfo; bool isMemInfo = Message::ToOSDMetric (aMetricType, aMemInfo); - SetHeaderItem (aNextIndex++, + setHeaderItem (aNextIndex++, TreeModel_HeaderSection (QString("%1 [%2]").arg (Message::MetricToString (aMetricType)).arg(isMemInfo ? "Mb" : "s"), COLUMN_REAL_VALUE_WIDTH)); - SetHeaderItem (aNextIndex++, TreeModel_HeaderSection (isMemInfo ? "Delta" : "%", COLUMN_PERCENT_VALUE_WIDTH)); + setHeaderItem (aNextIndex++, TreeModel_HeaderSection (isMemInfo ? "Delta" : "%", COLUMN_PERCENT_VALUE_WIDTH)); } } diff --git a/tools/MessageView/MessageView_Window.cxx b/tools/MessageView/MessageView_Window.cxx index 7e9104db2e..a2270827d1 100644 --- a/tools/MessageView/MessageView_Window.cxx +++ b/tools/MessageView/MessageView_Window.cxx @@ -80,7 +80,7 @@ #include #include -const int DEFAULT_TEXT_VIEW_WIDTH = 400;// 800; +const int DEFAULT_TEXT_VIEW_WIDTH = 800;// 800; const int DEFAULT_TEXT_VIEW_HEIGHT = 700; const int DEFAULT_TEXT_VIEW_POSITION_X = 430; const int DEFAULT_TEXT_VIEW_POSITION_Y = 30; @@ -149,6 +149,9 @@ MessageView_Window::MessageView_Window (QWidget* theParent) aModel->InitColumns(); //aModel->SetReversed (Standard_True); + connect (myTreeView->header(), SIGNAL (sectionResized (int, int, int)), + this, SLOT(onHeaderResized (int, int, int))); + myTreeView->setModel (aModel); MessageView_VisibilityState* aVisibilityState = new MessageView_VisibilityState (aModel); aModel->SetVisibilityState (aVisibilityState); @@ -171,6 +174,9 @@ MessageView_Window::MessageView_Window (QWidget* theParent) this, SLOT (onTreeViewContextMenuRequested (const QPoint&))); //new TreeModel_ContextMenu (myTreeView); + connect (myTreeView->header(), SIGNAL (sectionResized (int, int, int)), + this, SLOT(onHeaderResized (int, int, int))); + QModelIndex aParentIndex = myTreeView->model()->index (0, 0); myTreeView->setExpanded (aParentIndex, true); @@ -251,15 +257,18 @@ void MessageView_Window::GetPreferences (TInspectorAPI_PreferencesDataMap& theIt theItem.Bind ("geometry", TreeModel_Tools::ToString (myMainWindow->saveState()).toStdString().c_str()); QMap anItems; - //TreeModel_Tools::SaveState (myTreeView, anItems); - - anItems.clear(); - View_Window::SaveState(myViewWindow, anItems); + TreeModel_Tools::SaveState (myTreeView, anItems); for (QMap::const_iterator anItemsIt = anItems.begin(); anItemsIt != anItems.end(); anItemsIt++) + { theItem.Bind (anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str()); + } + anItems.clear(); + View_Window::SaveState(myViewWindow, anItems); for (QMap::const_iterator anItemsIt = anItems.begin(); anItemsIt != anItems.end(); anItemsIt++) + { theItem.Bind (anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str()); + } } // ======================================================================= @@ -272,8 +281,8 @@ void MessageView_Window::SetPreferences (const TInspectorAPI_PreferencesDataMap& { if (anItemIt.Key().IsEqual ("geometry")) myMainWindow->restoreState (TreeModel_Tools::ToByteArray (anItemIt.Value().ToCString())); - //else if (TreeModel_Tools::RestoreState (myTreeView, anItemIt.Key().ToCString(), anItemIt.Value().ToCString())) - // continue; + else if (TreeModel_Tools::RestoreState (myTreeView, anItemIt.Key().ToCString(), anItemIt.Value().ToCString())) + continue; else if (myViewWindow && View_Window::RestoreState(myViewWindow, anItemIt.Key().ToCString(), anItemIt.Value().ToCString())) continue; } @@ -305,7 +314,7 @@ void MessageView_Window::UpdateContent() myParameters->SetFileNames (aName, aNames); isUpdated = true; } - Handle(Message_Report) aDefaultReport = Message::DefaultReport (Standard_False); + Handle(Message_Report) aDefaultReport = Message::DefaultReport(); MessageModel_TreeModel* aViewModel = dynamic_cast (myTreeView->model()); if (!aDefaultReport.IsNull() && !aViewModel->HasReport (aDefaultReport)) { @@ -315,6 +324,7 @@ void MessageView_Window::UpdateContent() //onReloadReport(); updateTreeModel(); + updateVisibleColumns(); } // ======================================================================= @@ -372,7 +382,10 @@ void MessageView_Window::Init (NCollection_List& the // ======================================================================= void MessageView_Window::openFile(const TCollection_AsciiString& theFileName) { - const Handle(Message_Report)& aReport = Message::DefaultReport(); + if (theFileName.IsEmpty()) + return; + + const Handle(Message_Report)& aReport = Message::DefaultReport (Standard_True); //Handle(Message_Report) aReport = new Message_Report(); if (aReport->MessageWriter().IsNull()) @@ -407,7 +420,7 @@ void MessageView_Window::addReport (const Handle(Message_Report)& theReport, MessageModel_TreeModel* aModel = dynamic_cast (myTreeView->model()); aModel->AddReport (theReport, theReportDescription); - updateVisibleColumns(); + //updateVisibleColumns(); } // ======================================================================= @@ -466,7 +479,8 @@ void MessageView_Window::onTreeViewContextMenuRequested (const QPoint& thePositi } if (aRootItem) { - aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Import Report"), SLOT (onImportReport()), myMainWindow, this)); + aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Create Default Report"), + SLOT (onCreateDefaultReport()), myMainWindow, this)); // unite //MessageModel_TreeModel* aTreeModel = dynamic_cast (myTreeView->model()); //aMenu->addAction (ViewControl_Tools::CreateAction (aTreeModel->IsUniteAlerts() ? tr ("SetUniteAlerts - OFF") : tr ("SetUniteAlerts - ON"), @@ -545,6 +559,18 @@ void MessageView_Window::onPropertyViewDataChanged() updatePreviewPresentation(); } +// ======================================================================= +// function : onHeaderResized +// purpose : +// ======================================================================= +void MessageView_Window::onHeaderResized (int theSectionId, int, int) +{ + TreeModel_ModelBase* aViewModel = dynamic_cast (myTreeView->model()); + + TreeModel_HeaderSection* aSection = aViewModel->ChangeHeaderItem (theSectionId); + aSection->SetWidth (myTreeView->columnWidth (theSectionId)); +} + // ======================================================================= // function : onEraseAllPerformed // purpose : @@ -576,32 +602,36 @@ void MessageView_Window::onExportReport() if (!aReportItem) return; - QString aFilter (tr ("Document file (*.xml *)")); + QString aFilter (tr ("Document file (*.json *)")); QString aSelectedFilter; QString aFileName = QFileDialog::getSaveFileName (0, tr ("Export report to file"), QString(), aFilter, &aSelectedFilter); Handle(Message_Report) aReport = aReportItem->GetReport(); - if (aReport->MessageWriter().IsNull()) - aReport->SetMessageWriter (new XmlDrivers_MessageReportStorage()); + Standard_SStream aStream; + aReport->DumpJson(aStream); - aReport->MessageWriter()->SetFileName (TCollection_AsciiString (aFileName.toStdString().c_str())); - aReport->MessageWriter()->ExportReport (aReport); + QFile aLogFile(aFileName); + if (!aLogFile.open(QFile::WriteOnly | QFile::Text)) + { + return; + } + QTextStream anOut( &aLogFile ); + anOut << Standard_Dump::FormatJson (aStream).ToCString();//aStream.str().c_str(); + aLogFile.close(); } // ======================================================================= -// function : onImportReport +// function : onCreateDefaultReport // purpose : // ======================================================================= -void MessageView_Window::onImportReport() +void MessageView_Window::onCreateDefaultReport() { - QString aFilter (tr ("Document file (*.cbf *)")); - QString aSelectedFilter; - - QItemSelectionModel* aSelectionModel = myTreeView->selectionModel(); - aSelectionModel->clear(); + if (!Message::DefaultReport().IsNull()) + { + return; + } - QString aFileName = QFileDialog::getOpenFileName (0, tr("Import report"), QString(), aSelectedFilter); - openFile (TCollection_AsciiString (aFileName.toStdString().c_str())); + addReport (Message::DefaultReport (Standard_True)); } // ======================================================================= @@ -742,10 +772,13 @@ void MessageView_Window::onPreviewChildren() // ======================================================================= void MessageView_Window::addActivateMetricActions (QMenu* theMenu) { - QMenu* aSubMenu = new QMenu ("Activate metric"); - - Handle(Message_Report) aReport = Message::DefaultReport (Standard_True); + Handle(Message_Report) aReport = Message::DefaultReport(); + if (aReport.IsNull()) + { + return; + } + QMenu* aSubMenu = new QMenu ("Activate metric"); for (int aMetricId = (int)Message_MetricType_None + 1; aMetricId <= (int)Message_MetricType_MemHeapUsage; aMetricId++) { Message_MetricType aMetricType = (Message_MetricType)aMetricId; @@ -773,7 +806,7 @@ void MessageView_Window::OnActivateMetric() if (!Message::MetricFromString (anAction->text().toStdString().c_str(), aMetricType)) return; - Handle(Message_Report) aReport = Message::DefaultReport (Standard_True); + Handle(Message_Report) aReport = Message::DefaultReport(); const NCollection_Map& anActiveMetrics = aReport->ActiveMetrics(); aReport->SetActiveMetric (aMetricType, !anActiveMetrics.Contains (aMetricType)); @@ -901,9 +934,8 @@ void MessageView_Window::updateVisibleColumns() { int aColumnId = aMetricColumns[i]; myTreeView->setColumnHidden (aColumnId, isColumnHidden); - TreeModel_HeaderSection aSection = aViewModel->GetHeaderItem (aColumnId); - aSection.SetIsHidden (isColumnHidden); - aViewModel->SetHeaderItem (aColumnId, aSection); + TreeModel_HeaderSection* aSection = aViewModel->ChangeHeaderItem (aColumnId); + aSection->SetIsHidden (isColumnHidden); } } } diff --git a/tools/MessageView/MessageView_Window.hxx b/tools/MessageView/MessageView_Window.hxx index dbaf64c6af..bae2ad6fa8 100644 --- a/tools/MessageView/MessageView_Window.hxx +++ b/tools/MessageView/MessageView_Window.hxx @@ -136,14 +136,17 @@ protected slots: //! Update tree view item, preview presentation by item value change void onPropertyViewDataChanged(); + //! Update tree view header item width + void onHeaderResized (int theSectionId, int, int); + //! Updates visibility states by erase all in context void onEraseAllPerformed(); //! Export report into document void onExportReport(); - //! Import report into document - void onImportReport(); + //! Create default report into document + void onCreateDefaultReport(); //! Unite alerts in view model //void onUniteAlerts(); diff --git a/tools/TInspectorEXE/TInspectorEXE.cxx b/tools/TInspectorEXE/TInspectorEXE.cxx index 2c1aac570a..f3b29732f2 100644 --- a/tools/TInspectorEXE/TInspectorEXE.cxx +++ b/tools/TInspectorEXE/TInspectorEXE.cxx @@ -128,8 +128,8 @@ int main (int argc, char** argv) aPlugins.insert("TKShapeView"); aPlugins.insert("TKVInspector"); - Handle(Message_Report) aReport = Message::DefaultReport (Standard_True); - aReport->SetLimit (100);//30); + //Handle(Message_Report) aReport = Message::DefaultReport (Standard_True); + //aReport->SetLimit (100);//30); aPlugins.insert("TKMessageView"); //anActivatedPluginName = "TKVInspector"; diff --git a/tools/TreeModel/TreeModel_ContextMenu.cxx b/tools/TreeModel/TreeModel_ContextMenu.cxx index 9a60792c60..9cd0d07ab6 100644 --- a/tools/TreeModel/TreeModel_ContextMenu.cxx +++ b/tools/TreeModel/TreeModel_ContextMenu.cxx @@ -55,7 +55,7 @@ void TreeModel_ContextMenu::onTreeViewHeaderContextMenuRequested (const QPoint& int aNbSections = aModel->columnCount(); for (int aColumnId = 0; aColumnId < aNbSections; aColumnId++) { - QAction* anAction = ViewControl_Tools::CreateAction (aModel->GetHeaderItem (aColumnId).GetName(), + QAction* anAction = ViewControl_Tools::CreateAction (aModel->ChangeHeaderItem (aColumnId)->GetName(), SLOT (onColumnVisibilityChanged()), myTreeView, this); anAction->setCheckable (true); anAction->setChecked (!myTreeView->isColumnHidden (aColumnId)); diff --git a/tools/TreeModel/TreeModel_ItemBase.cxx b/tools/TreeModel/TreeModel_ItemBase.cxx index 1b23b909cb..359ed39018 100644 --- a/tools/TreeModel/TreeModel_ItemBase.cxx +++ b/tools/TreeModel/TreeModel_ItemBase.cxx @@ -14,6 +14,8 @@ // commercial license or contractual agreement. #include + +#include #include #include #include @@ -195,7 +197,7 @@ QVariant TreeModel_ItemBase::initValue (const int theItemRole) const switch (Column()) { - case 1: { return Row(); } + case TreeModel_ColumnType_Row: { return Row(); } } return QVariant(); diff --git a/tools/TreeModel/TreeModel_ModelBase.cxx b/tools/TreeModel/TreeModel_ModelBase.cxx index 3421439659..5dd4055b7e 100644 --- a/tools/TreeModel/TreeModel_ModelBase.cxx +++ b/tools/TreeModel/TreeModel_ModelBase.cxx @@ -47,9 +47,9 @@ TreeModel_ModelBase::TreeModel_ModelBase (QObject* theParent) // ======================================================================= void TreeModel_ModelBase::InitColumns() { - SetHeaderItem (TreeModel_ColumnType_Name, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH)); - SetHeaderItem (TreeModel_ColumnType_Visibility, TreeModel_HeaderSection ("Visibility", TreeModel_ModelBase::ColumnVisibilityWidth())); - SetHeaderItem (TreeModel_ColumnType_Row, TreeModel_HeaderSection ("Row", COLUMN_SIZE_WIDTH)); + setHeaderItem (TreeModel_ColumnType_Name, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH)); + setHeaderItem (TreeModel_ColumnType_Visibility, TreeModel_HeaderSection ("Visibility", TreeModel_ModelBase::ColumnVisibilityWidth())); + setHeaderItem (TreeModel_ColumnType_Row, TreeModel_HeaderSection ("Row", COLUMN_SIZE_WIDTH)); } // ======================================================================= @@ -178,7 +178,7 @@ QVariant TreeModel_ModelBase::headerData (int theSection, Qt::Orientation theOri if (IsUseVisibilityColumn() && theSection == TreeModel_ColumnType_Visibility) return QVariant(); - return GetHeaderItem (theSection).GetName(); + return myHeaderValues[theSection].GetName(); } // ======================================================================= @@ -232,23 +232,6 @@ void TreeModel_ModelBase::EmitDataChanged (const QModelIndex& theTopLeft, const #endif } -// ======================================================================= -// function : SetHeaderItem -// purpose : -// ======================================================================= -void TreeModel_ModelBase::SetHeaderItem (const int theColumnId, const TreeModel_HeaderSection& theSection) -{ - if (theSection.IsEmpty()) - { - // remove section - myHeaderValues.remove (theColumnId); - myRootItems.remove (theColumnId); - } - - myHeaderValues[theColumnId] = theSection; - createRoot (theColumnId); -} - // ======================================================================= // function : Selected // purpose : @@ -339,6 +322,23 @@ void TreeModel_ModelBase::createRoot (const int theColumnId) myRootItems.insert (theColumnId, createRootItem (theColumnId)); } +// ======================================================================= +// function : setHeaderItem +// purpose : +// ======================================================================= +void TreeModel_ModelBase::setHeaderItem (const int theColumnId, const TreeModel_HeaderSection& theSection) +{ + if (theSection.IsEmpty()) + { + // remove section + myHeaderValues.remove (theColumnId); + myRootItems.remove (theColumnId); + } + + myHeaderValues[theColumnId] = theSection; + createRoot (theColumnId); +} + // ======================================================================= // function : getIndexValue // purpose : diff --git a/tools/TreeModel/TreeModel_ModelBase.hxx b/tools/TreeModel/TreeModel_ModelBase.hxx index 20b17ae9b3..f616846496 100644 --- a/tools/TreeModel/TreeModel_ModelBase.hxx +++ b/tools/TreeModel/TreeModel_ModelBase.hxx @@ -141,12 +141,7 @@ public: //! Returns whether the column is hidden by default //! \param theColumnId a column index //! \return header section values container - TreeModel_HeaderSection GetHeaderItem (const int theColumnId) const { return myHeaderValues[theColumnId]; } - - //! Sets header properties item. - //! \param theColumnId a column index - //! \param theSection a section value - Standard_EXPORT void SetHeaderItem (const int theColumnId, const TreeModel_HeaderSection& theSection); + TreeModel_HeaderSection* ChangeHeaderItem (const int theColumnId) { return &myHeaderValues[theColumnId]; } //! Returns count of columns in the model //! \param theParent an index of the parent item @@ -191,6 +186,11 @@ protected: //! \param theColumnId index of a column virtual TreeModel_ItemBasePtr createRootItem (const int theColumnId) = 0; + //! Sets header properties item. + //! \param theColumnId a column index + //! \param theSection a section value + Standard_EXPORT void setHeaderItem (const int theColumnId, const TreeModel_HeaderSection& theSection); + //! Converts the item shared pointer to void* type //! \param theItem //! \return an item pointer diff --git a/tools/TreeModel/TreeModel_Tools.cxx b/tools/TreeModel/TreeModel_Tools.cxx index e3d8b2afa5..00bc92f59f 100644 --- a/tools/TreeModel/TreeModel_Tools.cxx +++ b/tools/TreeModel/TreeModel_Tools.cxx @@ -89,6 +89,7 @@ void TreeModel_Tools::SaveState (QTreeView* theTreeView, QMap& QStringList aColumnWidths, aHiddenColumns; for (int aColumnId = 0; aColumnId < theTreeView->model()->columnCount(); aColumnId++) { + int aWidth = theTreeView->columnWidth (aColumnId); if (theTreeView->isColumnHidden (aColumnId)) { aHiddenColumns.append (QString::number (aColumnId)); @@ -121,18 +122,18 @@ bool TreeModel_Tools::RestoreState (QTreeView* theTreeView, const QString& theKe } else if (theKey == thePrefix + "columns_hidden") { - int aColumnSize = theTreeView->model()->columnCount(); - QStringList aValues = theValue.split (",", QString::SkipEmptyParts); - QList aColumnIds; - for (int aValueId = 0; aValueId < aValues.size(); aValueId++) - { - if (aValueId < aColumnSize) - aColumnIds.append (aValues.at (aValueId).toInt()); - } - for (int aColumnId = 0; aColumnId < aColumnSize; aColumnId++) - { - theTreeView->setColumnHidden (aColumnId, aColumnIds.contains(aColumnId) == true); - } + //int aColumnSize = theTreeView->model()->columnCount(); + //QStringList aValues = theValue.split (",", QString::SkipEmptyParts); + //QList aColumnIds; + //for (int aValueId = 0; aValueId < aValues.size(); aValueId++) + //{ + // if (aValueId < aColumnSize) + // aColumnIds.append (aValues.at (aValueId).toInt()); + //} + //for (int aColumnId = 0; aColumnId < aColumnSize; aColumnId++) + //{ + // theTreeView->setColumnHidden (aColumnId, aColumnIds.contains(aColumnId) == true); + //} } else return false; @@ -149,9 +150,9 @@ void TreeModel_Tools::SetDefaultHeaderSections(QTreeView* theTreeView) for (int aColumnId = 0, aNbColumns = aTreeModel->columnCount(); aColumnId < aNbColumns; aColumnId++) { - TreeModel_HeaderSection aSection = aTreeModel->GetHeaderItem (aColumnId); - theTreeView->setColumnWidth (aColumnId, aSection.GetWidth()); - theTreeView->setColumnHidden (aColumnId, aSection.IsHidden()); + TreeModel_HeaderSection* aSection = aTreeModel->ChangeHeaderItem (aColumnId); + theTreeView->setColumnWidth (aColumnId, aSection->GetWidth()); + theTreeView->setColumnHidden (aColumnId, aSection->IsHidden()); } } @@ -170,8 +171,10 @@ void TreeModel_Tools::UseVisibilityColumn (QTreeView* theTreeView, const bool th aHeader->moveSection (TreeModel_ColumnType_Name, TreeModel_ColumnType_Visibility); TreeModel_ModelBase* aModel = dynamic_cast (theTreeView->model()); - aModel->SetHeaderItem (TreeModel_ColumnType_Visibility, - TreeModel_HeaderSection ("Visibility", TreeModel_ModelBase::ColumnVisibilityWidth())); + TreeModel_HeaderSection* anItem = aModel->ChangeHeaderItem ((int)TreeModel_ColumnType_Visibility); + anItem->SetIsHidden (theActive); + anItem->SetWidth (TreeModel_ModelBase::ColumnVisibilityWidth()); + aModel->SetUseVisibilityColumn (theActive); } diff --git a/tools/VInspector/VInspector_ItemBase.cxx b/tools/VInspector/VInspector_ItemBase.cxx index 591ecb0661..3ac0a4e022 100644 --- a/tools/VInspector/VInspector_ItemBase.cxx +++ b/tools/VInspector/VInspector_ItemBase.cxx @@ -43,7 +43,7 @@ QVariant VInspector_ItemBase::initValue (const int theItemRole) const case 3: return Standard_Dump::GetPointerInfo (Object(), true).ToCString(); } - return QVariant(); + return TreeModel_ItemBase::initValue (theItemRole); } // ======================================================================= diff --git a/tools/VInspector/VInspector_ViewModel.cxx b/tools/VInspector/VInspector_ViewModel.cxx index 2ca792b334..894d0a3ba3 100644 --- a/tools/VInspector/VInspector_ViewModel.cxx +++ b/tools/VInspector/VInspector_ViewModel.cxx @@ -43,8 +43,8 @@ void VInspector_ViewModel::InitColumns() { TreeModel_ModelBase::InitColumns(); - SetHeaderItem (3, TreeModel_HeaderSection ("Pointer", COLUMN_POINTER_WIDTH)); - SetHeaderItem (4, TreeModel_HeaderSection ("SelectedOwners", -1)); + setHeaderItem (3, TreeModel_HeaderSection ("Pointer", COLUMN_POINTER_WIDTH)); + setHeaderItem (4, TreeModel_HeaderSection ("SelectedOwners", -1)); } // ======================================================================= diff --git a/tools/VInspector/VInspector_ViewModelHistory.cxx b/tools/VInspector/VInspector_ViewModelHistory.cxx index 980dc1e865..0b50eca7d8 100644 --- a/tools/VInspector/VInspector_ViewModelHistory.cxx +++ b/tools/VInspector/VInspector_ViewModelHistory.cxx @@ -54,13 +54,13 @@ void VInspector_ViewModelHistory::InitColumns() { TreeModel_ModelBase::InitColumns(); - SetHeaderItem (0, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH)); - SetHeaderItem (1, TreeModel_HeaderSection ("Visibility", COLUMN_SIZE_WIDTH)); // visualization item - SetHeaderItem (2, TreeModel_HeaderSection ("Size", COLUMN_SIZE_WIDTH)); - SetHeaderItem (3, TreeModel_HeaderSection ("Pointer", COLUMN_POINTER_WIDTH)); - SetHeaderItem (4, TreeModel_HeaderSection ("Shape type", COLUMN_SHAPE_TYPE_WIDTH)); - SetHeaderItem (5, TreeModel_HeaderSection ("AIS Name", COLUMN_AIS_NAME_WIDTH)); - SetHeaderItem (6, TreeModel_HeaderSection ("Selected/Highlighted", -1)); + setHeaderItem (0, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH)); + setHeaderItem (1, TreeModel_HeaderSection ("Visibility", COLUMN_SIZE_WIDTH)); // visualization item + setHeaderItem (2, TreeModel_HeaderSection ("Size", COLUMN_SIZE_WIDTH)); + setHeaderItem (3, TreeModel_HeaderSection ("Pointer", COLUMN_POINTER_WIDTH)); + setHeaderItem (4, TreeModel_HeaderSection ("Shape type", COLUMN_SHAPE_TYPE_WIDTH)); + setHeaderItem (5, TreeModel_HeaderSection ("AIS Name", COLUMN_AIS_NAME_WIDTH)); + setHeaderItem (6, TreeModel_HeaderSection ("Selected/Highlighted", -1)); for (int aColumnId = 0, aNbColumns = columnCount(); aColumnId < aNbColumns; aColumnId++) { diff --git a/tools/VInspector/VInspector_Window.cxx b/tools/VInspector/VInspector_Window.cxx index 4e76e98113..163df690dd 100644 --- a/tools/VInspector/VInspector_Window.cxx +++ b/tools/VInspector/VInspector_Window.cxx @@ -112,9 +112,8 @@ VInspector_Window::VInspector_Window() aTreeModel->InitColumns(); myTreeView->setModel (aTreeModel); // hide Visibility column - TreeModel_HeaderSection anItem = aTreeModel->GetHeaderItem ((int)TreeModel_ColumnType_Visibility); - anItem.SetIsHidden (true); - aTreeModel->SetHeaderItem ((int)TreeModel_ColumnType_Visibility, anItem); + TreeModel_HeaderSection* anItem = aTreeModel->ChangeHeaderItem ((int)TreeModel_ColumnType_Visibility); + anItem->SetIsHidden (true); connect (myTreeView, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT (onTreeViewContextMenuRequested(const QPoint&))); @@ -157,12 +156,11 @@ VInspector_Window::VInspector_Window() connect (aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)), this, SLOT (onHistoryViewSelectionChanged (const QItemSelection&, const QItemSelection&))); - anItem = aHistoryModel->GetHeaderItem (0); + anItem = aHistoryModel->ChangeHeaderItem (0); // hide Visibility column TreeModel_Tools::UseVisibilityColumn (myHistoryView, false); - anItem = aHistoryModel->GetHeaderItem ((int)TreeModel_ColumnType_Visibility); - anItem.SetIsHidden (true); - aHistoryModel->SetHeaderItem ((int)TreeModel_ColumnType_Visibility, anItem); + anItem = aHistoryModel->ChangeHeaderItem ((int)TreeModel_ColumnType_Visibility); + anItem->SetIsHidden (true); QModelIndex aParentIndex = myHistoryView->model()->index (0, 0); myHistoryView->setExpanded (aParentIndex, true); -- 2.39.5