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"
};
}
// commercial license or contractual agreement.
#include <Message_Alert.hxx>
+#include <Standard_Dump.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Message_Alert,Standard_Transient)
// 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)
+}
//! 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)
};
#include <Precision.hxx>
#include <Standard_Assert.hxx>
+#include <Standard_Dump.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Message_AlertExtended,Message_Alert)
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())
+ }
+}
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:
#include <Message_Attribute.hxx>
#include <Standard_Assert.hxx>
+#include <Standard_Dump.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Message_Attribute, Standard_Transient)
{
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)
+}
//! @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:
#include <Message.hxx>
#include <Message_Report.hxx>
#include <OSD_Chronometer.hxx>
+#include <OSD_Timer.hxx>
#include <Precision.hxx>
+#include <Standard_Dump.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Message_AttributeMeter, Message_Attribute)
const NCollection_Map<Message_MetricType>& 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))
{
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<Message_MetricType, StartToStopValue>::Iterator anIterator (myMetrics);
+ anIterator.More(); anIterator.Next())
+ {
+ OCCT_DUMP_VECTOR_CLASS (theOStream, Message::MetricToString (anIterator.Key()),
+ 2, anIterator.Value().first, anIterator.Value().second)
+ }
+}
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:
#define _Message_AttributeObject_HeaderFile
#include <Message_Attribute.hxx>
+#include <Standard_Dump.hxx>
class Standard_Transient;
//! @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:
// commercial license or contractual agreement.
#include <Message_AttributeStream.hxx>
+#include <Standard_Dump.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Message_AttributeStream, Message_Attribute)
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)
+}
//! 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:
#include <Message_CompositeAlerts.hxx>
#include <Message_AlertExtended.hxx>
#include <Standard_Assert.hxx>
+#include <Standard_Dump.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Message_CompositeAlerts, Standard_Transient)
}
}
}
+
+//=======================================================================
+//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)
+ }
+ }
+}
//! @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:
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
IMPLEMENT_STANDARD_RTTIEXT(Message_PrinterToReport, Message_Printer)
+//=======================================================================
+//function : Destructor
+//purpose :
+//=======================================================================
+Message_PrinterToReport::~Message_PrinterToReport()
+{
+ if (!myReport.IsNull())
+ {
+ myReport->UpdateActiveInMessenger();
+ }
+}
+
//=======================================================================
//function : Report
//purpose :
return Message::DefaultReport (Standard_True);
}
+//=======================================================================
+//function : Send
+//purpose :
+//=======================================================================
+void Message_PrinterToReport::SetReport (const Handle(Message_Report)& theReport)
+{
+ myReport = theReport;
+ myReport->UpdateActiveInMessenger();
+}
+
//=======================================================================
//function : Send
//purpose :
//! 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.
//=======================================================================
Message_Report::Message_Report ()
-: myLimit (-1), myWriteFileOnEachAlert (Standard_False)
+: myLimit (-1), myWriteFileOnEachAlert (Standard_False),
+ myIsActiveInMessenger (Standard_False)
{
}
//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;
}
//=======================================================================
//=======================================================================
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)
{
}
}
+//=======================================================================
+//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 :
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<Message_MetricType>::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)
+}
//! 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);
//! 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:
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
//! 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;
{
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());
{
OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
+ NCollection_IndexedMap<Handle(SelectMgr_EntityOwner)> anOwners;
+ for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::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<Handle(SelectMgr_EntityOwner)>::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<Handle(SelectMgr_SensitiveEntity)>::Iterator anIterator (myEntities); anIterator.More(); anIterator.Next())
{
const Handle(SelectMgr_SensitiveEntity)& anEntity = anIterator.Value();
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 << ", ";
}
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++;
}
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;
}
} \
}
+//! @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.
//! - 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
// 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)
+}
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)
// =======================================================================
void DFBrowser_TreeModel::InitColumns()
{
- SetHeaderItem (0, TreeModel_HeaderSection ("Name"));
+ setHeaderItem (0, TreeModel_HeaderSection ("Name"));
}
// =======================================================================
// =======================================================================
void DFBrowserPane_TDataStdTreeNodeModel::InitColumns()
{
- SetHeaderItem (0, TreeModel_HeaderSection ("Name"));
+ setHeaderItem (0, TreeModel_HeaderSection ("Name"));
}
// =======================================================================
Message::DefaultMessenger()->AddPrinter (MyPrinterToReport);
Message::DefaultMessenger()->SetTraceLevel (1);
+ Message::DefaultReport()->UpdateActiveInMessenger();
myTreeModel->UpdateTreeModel();
}
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())
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";
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
#include <Message.hxx>
-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;
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++)
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));
}
}
#include <QWidget>
#include <QVBoxLayout>
-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;
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);
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);
theItem.Bind ("geometry", TreeModel_Tools::ToString (myMainWindow->saveState()).toStdString().c_str());
QMap<QString, QString> anItems;
- //TreeModel_Tools::SaveState (myTreeView, anItems);
-
- anItems.clear();
- View_Window::SaveState(myViewWindow, anItems);
+ TreeModel_Tools::SaveState (myTreeView, anItems);
for (QMap<QString, QString>::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<QString, QString>::const_iterator anItemsIt = anItems.begin(); anItemsIt != anItems.end(); anItemsIt++)
+ {
theItem.Bind (anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str());
+ }
}
// =======================================================================
{
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;
}
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<MessageModel_TreeModel*> (myTreeView->model());
if (!aDefaultReport.IsNull() && !aViewModel->HasReport (aDefaultReport))
{
//onReloadReport();
updateTreeModel();
+ updateVisibleColumns();
}
// =======================================================================
// =======================================================================
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())
MessageModel_TreeModel* aModel = dynamic_cast<MessageModel_TreeModel*> (myTreeView->model());
aModel->AddReport (theReport, theReportDescription);
- updateVisibleColumns();
+ //updateVisibleColumns();
}
// =======================================================================
}
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<MessageModel_TreeModel*> (myTreeView->model());
//aMenu->addAction (ViewControl_Tools::CreateAction (aTreeModel->IsUniteAlerts() ? tr ("SetUniteAlerts - OFF") : tr ("SetUniteAlerts - ON"),
updatePreviewPresentation();
}
+// =======================================================================
+// function : onHeaderResized
+// purpose :
+// =======================================================================
+void MessageView_Window::onHeaderResized (int theSectionId, int, int)
+{
+ TreeModel_ModelBase* aViewModel = dynamic_cast<TreeModel_ModelBase*> (myTreeView->model());
+
+ TreeModel_HeaderSection* aSection = aViewModel->ChangeHeaderItem (theSectionId);
+ aSection->SetWidth (myTreeView->columnWidth (theSectionId));
+}
+
// =======================================================================
// function : onEraseAllPerformed
// purpose :
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));
}
// =======================================================================
// =======================================================================
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;
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<Message_MetricType>& anActiveMetrics = aReport->ActiveMetrics();
aReport->SetActiveMetric (aMetricType, !anActiveMetrics.Contains (aMetricType));
{
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);
}
}
}
//! 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();
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";
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));
// commercial license or contractual agreement.
#include <inspector/TreeModel_ItemBase.hxx>
+
+#include <inspector/TreeModel_ColumnType.hxx>
#include <inspector/TreeModel_ItemProperties.hxx>
#include <inspector/TreeModel_ItemRole.hxx>
#include <inspector/TreeModel_ItemStream.hxx>
switch (Column())
{
- case 1: { return Row(); }
+ case TreeModel_ColumnType_Row: { return Row(); }
}
return QVariant();
// =======================================================================
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));
}
// =======================================================================
if (IsUseVisibilityColumn() && theSection == TreeModel_ColumnType_Visibility)
return QVariant();
- return GetHeaderItem (theSection).GetName();
+ return myHeaderValues[theSection].GetName();
}
// =======================================================================
#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 :
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 :
//! 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
//! \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
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));
}
else if (theKey == thePrefix + "columns_hidden")
{
- int aColumnSize = theTreeView->model()->columnCount();
- QStringList aValues = theValue.split (",", QString::SkipEmptyParts);
- QList<int> 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<int> 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;
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());
}
}
aHeader->moveSection (TreeModel_ColumnType_Name, TreeModel_ColumnType_Visibility);
TreeModel_ModelBase* aModel = dynamic_cast<TreeModel_ModelBase*> (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);
}
case 3: return Standard_Dump::GetPointerInfo (Object(), true).ToCString();
}
- return QVariant();
+ return TreeModel_ItemBase::initValue (theItemRole);
}
// =======================================================================
{
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));
}
// =======================================================================
{
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++)
{
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&)));
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);