From: nds Date: Tue, 27 Oct 2020 16:24:59 +0000 (+0300) Subject: 0031362: Inspectors - MessageView plugin for message alerts X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=e8bde810616e61cbe925981176681f2840234fa4;p=occt-copy.git 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. --- 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);