hrev48206 adds 2 changesets to branch 'master' old head: 2bbd623a48b94ceae55afdc6ee1696b2ee43e5a1 new head: b6c4fc962c6b0d6a0f071069fd0e90053e58f135 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=b6c4fc9+%5E2bbd623 ---------------------------------------------------------------------------- f40556a: Debugger: Cleanups, no functional change. b6c4fc9: Debugger: Implement #9946. TableCellValueRenderer{Utils}: - The rendering calls now take a boolean indicating if the value being rendered differs from its previous state. This is taken into account by rendering it in a different color to indicate the change. Adjust all implementing subclasses accordingly. VariablesView::ModelNode: - Now stores the previous value of the corresponding value node, and can be queried if its value has changed. Used by renderers. VariablesView::_{Add,Apply}ViewStateDescendentInfos(): - When walking the model, also store/restore the values of nodes in the history. In summation of all the above changes, when stepping through a function, we now display values that have changed since the last step, or that have appeared for the first time in a different color. [ Rene Gollent <rene@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- 17 files changed, 131 insertions(+), 72 deletions(-) .../CLanguageExpressionEvaluator.cpp | 35 +-------- .../CLanguageExpressionEvaluator.h | 1 - .../gui/team_window/VariablesView.cpp | 82 +++++++++++++++++--- .../gui/team_window/VariablesView.h | 7 +- .../gui/value/TableCellBoolRenderer.cpp | 6 +- .../gui/value/TableCellBoolRenderer.h | 5 +- .../gui/value/TableCellEnumerationRenderer.cpp | 10 ++- .../gui/value/TableCellEnumerationRenderer.h | 5 +- .../gui/value/TableCellFloatRenderer.cpp | 6 +- .../gui/value/TableCellFloatRenderer.h | 5 +- .../gui/value/TableCellIntegerRenderer.cpp | 7 +- .../gui/value/TableCellIntegerRenderer.h | 5 +- .../gui/value/TableCellStringRenderer.cpp | 7 +- .../gui/value/TableCellStringRenderer.h | 5 +- .../gui/value/TableCellValueRenderer.h | 5 +- .../gui/value/TableCellValueRendererUtils.cpp | 11 ++- .../gui/value/TableCellValueRendererUtils.h | 1 + ############################################################################ Commit: f40556afabbb393cede9f81576b6765c350683c2 URL: http://cgit.haiku-os.org/haiku/commit/?id=f40556a Author: Rene Gollent <rene@xxxxxxxxxxx> Date: Sat Nov 1 20:42:49 2014 UTC Debugger: Cleanups, no functional change. ---------------------------------------------------------------------------- diff --git a/src/apps/debugger/source_language/expression_evaluators/CLanguageExpressionEvaluator.cpp b/src/apps/debugger/source_language/expression_evaluators/CLanguageExpressionEvaluator.cpp index 8d4305a..4d6574e 100644 --- a/src/apps/debugger/source_language/expression_evaluators/CLanguageExpressionEvaluator.cpp +++ b/src/apps/debugger/source_language/expression_evaluators/CLanguageExpressionEvaluator.cpp @@ -363,7 +363,6 @@ class CLanguageExpressionEvaluator::Tokenizer { } } -//printf("next token: '%s'\n", fCurrentToken.string.String()); return fCurrentToken; } @@ -569,7 +568,7 @@ CLanguageExpressionEvaluator::Evaluate(const char* expressionString, fTokenizer->SetType(type); fTokenizer->SetTo(expressionString); - Number value = _ParseBinary(); + Number value = _ParseSum(); Token token = fTokenizer->NextToken(); if (token.type != TOKEN_END_OF_LINE) throw ParseException("parse error", token.position); @@ -579,36 +578,8 @@ CLanguageExpressionEvaluator::Evaluate(const char* expressionString, Number -CLanguageExpressionEvaluator::_ParseBinary() -{ - return _ParseSum(); - // binary operation appearantly not supported by m_apm library, - // should not be too hard to implement though.... - -// double value = _ParseSum(); -// -// while (true) { -// Token token = fTokenizer->NextToken(); -// switch (token.type) { -// case TOKEN_AND: -// value = (uint64)value & (uint64)_ParseSum(); -// break; -// case TOKEN_OR: -// value = (uint64)value | (uint64)_ParseSum(); -// break; -// -// default: -// fTokenizer->RewindToken(); -// return value; -// } -// } -} - - -Number CLanguageExpressionEvaluator::_ParseSum() { - // TODO: check isnan()... Number value = _ParseProduct(); while (true) { @@ -896,7 +867,7 @@ CLanguageExpressionEvaluator::_ParseAtom() _EatToken(TOKEN_OPENING_BRACKET); - Number value = _ParseBinary(); + Number value = _ParseSum(); _EatToken(TOKEN_CLOSING_BRACKET); @@ -1069,5 +1040,3 @@ CLanguageExpressionEvaluator::_CoerceTypeIfNeeded(const Token& token, _number.SetTo(value); } - - diff --git a/src/apps/debugger/source_language/expression_evaluators/CLanguageExpressionEvaluator.h b/src/apps/debugger/source_language/expression_evaluators/CLanguageExpressionEvaluator.h index 14e22e5..bd5f414 100644 --- a/src/apps/debugger/source_language/expression_evaluators/CLanguageExpressionEvaluator.h +++ b/src/apps/debugger/source_language/expression_evaluators/CLanguageExpressionEvaluator.h @@ -67,7 +67,6 @@ class CLanguageExpressionEvaluator { class Tokenizer; private: - Number _ParseBinary(); Number _ParseSum(); Number _ParseProduct(); Number _ParsePower(); ############################################################################ Revision: hrev48206 Commit: b6c4fc962c6b0d6a0f071069fd0e90053e58f135 URL: http://cgit.haiku-os.org/haiku/commit/?id=b6c4fc9 Author: Rene Gollent <rene@xxxxxxxxxxx> Date: Sat Nov 1 22:42:59 2014 UTC Ticket: https://dev.haiku-os.org/ticket/9946 Debugger: Implement #9946. TableCellValueRenderer{Utils}: - The rendering calls now take a boolean indicating if the value being rendered differs from its previous state. This is taken into account by rendering it in a different color to indicate the change. Adjust all implementing subclasses accordingly. VariablesView::ModelNode: - Now stores the previous value of the corresponding value node, and can be queried if its value has changed. Used by renderers. VariablesView::_{Add,Apply}ViewStateDescendentInfos(): - When walking the model, also store/restore the values of nodes in the history. In summation of all the above changes, when stepping through a function, we now display values that have changed since the last step, or that have appeared for the first time in a different color. ---------------------------------------------------------------------------- diff --git a/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp b/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp index 0f62ede..1c8455c 100644 --- a/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp @@ -108,13 +108,15 @@ public: fNodeChild(nodeChild), fVariable(variable), fValue(NULL), + fPreviousValue(), fValueHandler(NULL), fTableCellRenderer(NULL), fLastRendererSettings(), fCastedType(NULL), fComponentPath(NULL), fIsPresentationNode(isPresentationNode), - fHidden(false) + fHidden(false), + fValueChanged(false) { fNodeChild->AcquireReference(); } @@ -202,6 +204,18 @@ public: if (fValue != NULL) fValue->AcquireReference(); + + _CompareValues(); + } + + const BVariant& PreviousValue() const + { + return fPreviousValue; + } + + void SetPreviousValue(const BVariant& value) + { + fPreviousValue = value; } Type* GetCastedType() const @@ -288,6 +302,11 @@ public: fHidden = hidden; } + bool ValueChanged() const + { + return fValueChanged; + } + int32 CountChildren() const { return fChildren.CountItems(); @@ -333,10 +352,23 @@ private: typedef BObjectList<ModelNode> ChildList; private: + void _CompareValues() + { + if (fValue == NULL) + fValueChanged = false; + else { + BVariant newValue; + fValue->ToVariant(newValue); + fValueChanged = (fPreviousValue != newValue); + } + } + +private: ModelNode* fParent; ValueNodeChild* fNodeChild; Variable* fVariable; Value* fValue; + BVariant fPreviousValue; ValueHandler* fValueHandler; TableCellValueRenderer* fTableCellRenderer; BMessage fLastRendererSettings; @@ -345,6 +377,7 @@ private: TypeComponentPath* fComponentPath; bool fIsPresentationNode; bool fHidden; + bool fValueChanged; public: ModelNode* fNext; @@ -373,8 +406,8 @@ protected: ModelNode* node = dynamic_cast<ModelNode*>(value.ToReferenceable()); if (node != NULL && node->GetValue() != NULL && node->TableCellRenderer() != NULL) { - node->TableCellRenderer()->RenderValue(node->GetValue(), rect, - targetView); + node->TableCellRenderer()->RenderValue(node->GetValue(), + node->ValueChanged(), rect, targetView); return; } } else if (value.Type() == B_STRING_TYPE) { @@ -1102,6 +1135,8 @@ VariablesView::VariableTableModel::ValueNodeValueChanged(ValueNode* valueNode) settings->RestoreValues(modelNode->GetLastRendererSettings()); } + + // notify table model listeners NotifyNodeChanged(modelNode); } @@ -2168,6 +2203,14 @@ VariablesView::_SaveViewState() const return; BReference<FunctionID> functionIDReference(functionID, true); + StackFrameValues* values = new(std::nothrow) StackFrameValues; + if (values == NULL) + return; + BReference<StackFrameValues> valuesReference(values, true); + + if (values->Init() != B_OK) + return; + // create an empty view state VariablesViewState* viewState = new(std::nothrow) VariablesViewState; if (viewState == NULL) @@ -2177,13 +2220,14 @@ VariablesView::_SaveViewState() const if (viewState->Init() != B_OK) return; + viewState->SetValues(values); + // populate it TreeTablePath path; - if (_AddViewStateDescendentNodeInfos(viewState, fVariableTableModel->Root(), - path) != B_OK) { + if (_AddViewStateDescendentNodeInfos(viewState, + fVariableTableModel->Root(), path) != B_OK) { return; } -// TODO: Add values! // add the view state to the history fViewStateHistory->SetState(fThread->ID(), functionID, viewState); @@ -2243,11 +2287,23 @@ VariablesView::_AddViewStateDescendentNodeInfos(VariablesViewState* viewState, nodeInfo.SetRendererSettings(settings->Message()); } - status_t error = viewState->SetNodeInfo(node->GetVariable()->ID(), - node->GetPath(), nodeInfo); + ObjectID* id = node->GetVariable()->ID(); + TypeComponentPath* componentPath = node->GetPath(); + + status_t error = viewState->SetNodeInfo(id, componentPath, nodeInfo); if (error != B_OK) return error; + Value* value = node->GetValue(); + if (value != NULL) { + BVariant variableValueData; + if (value->ToVariant(variableValueData)) + error = viewState->Values()->SetValue(id, componentPath, + variableValueData); + if (error != B_OK) + return error; + } + // recurse error = _AddViewStateDescendentNodeInfos(viewState, node, path); if (error != B_OK) @@ -2271,8 +2327,10 @@ VariablesView::_ApplyViewStateDescendentNodeInfos(VariablesViewState* viewState, return B_NO_MEMORY; // apply the node's info, if any + ObjectID* objectID = node->GetVariable()->ID(); + TypeComponentPath* componentPath = node->GetPath(); const VariablesViewNodeInfo* nodeInfo = viewState->GetNodeInfo( - node->GetVariable()->ID(), node->GetPath()); + objectID, componentPath); if (nodeInfo != NULL) { // NB: if the node info indicates that the node in question // was being cast to a different type, this *must* be applied @@ -2295,6 +2353,12 @@ VariablesView::_ApplyViewStateDescendentNodeInfos(VariablesViewState* viewState, fVariableTable->SetNodeExpanded(path, nodeInfo->IsNodeExpanded()); + BVariant previousValue; + if (viewState->Values()->GetValue(objectID, componentPath, + previousValue)) { + node->SetPreviousValue(previousValue); + } + // recurse status_t error = _ApplyViewStateDescendentNodeInfos(viewState, node, path); diff --git a/src/apps/debugger/user_interface/gui/team_window/VariablesView.h b/src/apps/debugger/user_interface/gui/team_window/VariablesView.h index 83583f4..c07a868 100644 --- a/src/apps/debugger/user_interface/gui/team_window/VariablesView.h +++ b/src/apps/debugger/user_interface/gui/team_window/VariablesView.h @@ -16,6 +16,7 @@ class ActionMenuItem; class CpuState; class SettingsMenu; class StackFrame; +class StackFrameValues; class Thread; class Type; class TypeComponentPath; @@ -81,10 +82,12 @@ private: void _SaveViewState() const; void _RestoreViewState(); status_t _AddViewStateDescendentNodeInfos( - VariablesViewState* viewState, void* parent, + VariablesViewState* viewState, + void* parent, TreeTablePath& path) const; status_t _ApplyViewStateDescendentNodeInfos( - VariablesViewState* viewState, void* parent, + VariablesViewState* viewState, + void* parent, TreeTablePath& path); void _CopyVariableValueToClipboard(); diff --git a/src/apps/debugger/user_interface/gui/value/TableCellBoolRenderer.cpp b/src/apps/debugger/user_interface/gui/value/TableCellBoolRenderer.cpp index d7c1995..ac1cb79 100644 --- a/src/apps/debugger/user_interface/gui/value/TableCellBoolRenderer.cpp +++ b/src/apps/debugger/user_interface/gui/value/TableCellBoolRenderer.cpp @@ -1,4 +1,5 @@ /* + * Copyright 2014, Rene Gollent, rene@xxxxxxxxxxx. * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. * Distributed under the terms of the MIT License. */ @@ -18,14 +19,15 @@ bool_value_string(BoolValue* value) void -TableCellBoolRenderer::RenderValue(Value* _value, BRect rect, BView* targetView) +TableCellBoolRenderer::RenderValue(Value* _value, bool valueChanged, + BRect rect, BView* targetView) { BoolValue* value = dynamic_cast<BoolValue*>(_value); if (value == NULL) return; TableCellValueRendererUtils::DrawString(targetView, rect, - bool_value_string(value), B_ALIGN_RIGHT, true); + bool_value_string(value), valueChanged, B_ALIGN_RIGHT, true); } diff --git a/src/apps/debugger/user_interface/gui/value/TableCellBoolRenderer.h b/src/apps/debugger/user_interface/gui/value/TableCellBoolRenderer.h index d3f4246..bae90e8 100644 --- a/src/apps/debugger/user_interface/gui/value/TableCellBoolRenderer.h +++ b/src/apps/debugger/user_interface/gui/value/TableCellBoolRenderer.h @@ -1,4 +1,5 @@ /* + * Copyright 2014, Rene Gollent, rene@xxxxxxxxxxx. * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. * Distributed under the terms of the MIT License. */ @@ -13,8 +14,8 @@ class TableCellBoolRenderer : public TableCellValueRenderer { public: - virtual void RenderValue(Value* value, BRect rect, - BView* targetView); + virtual void RenderValue(Value* value, bool valueChanged, + BRect rect, BView* targetView); virtual float PreferredValueWidth(Value* value, BView* targetView); }; diff --git a/src/apps/debugger/user_interface/gui/value/TableCellEnumerationRenderer.cpp b/src/apps/debugger/user_interface/gui/value/TableCellEnumerationRenderer.cpp index 1852e5e..461db6c 100644 --- a/src/apps/debugger/user_interface/gui/value/TableCellEnumerationRenderer.cpp +++ b/src/apps/debugger/user_interface/gui/value/TableCellEnumerationRenderer.cpp @@ -1,4 +1,5 @@ /* + * Copyright 2014, Rene Gollent, rene@xxxxxxxxxxx. * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. * Distributed under the terms of the MIT License. */ @@ -19,8 +20,8 @@ TableCellEnumerationRenderer::TableCellEnumerationRenderer(Config* config) void -TableCellEnumerationRenderer::RenderValue(Value* _value, BRect rect, - BView* targetView) +TableCellEnumerationRenderer::RenderValue(Value* _value, bool valueChanged, + BRect rect, BView* targetView) { Config* config = GetConfig(); if (config != NULL && config->IntegerFormat() == INTEGER_FORMAT_DEFAULT) { @@ -31,12 +32,13 @@ TableCellEnumerationRenderer::RenderValue(Value* _value, BRect rect, if (EnumeratorValue* enumValue = value->GetType()->ValueFor(value->GetValue())) { TableCellValueRendererUtils::DrawString(targetView, rect, - enumValue->Name(), B_ALIGN_RIGHT, true); + enumValue->Name(), valueChanged, B_ALIGN_RIGHT, true); return; } } - TableCellIntegerRenderer::RenderValue(_value, rect, targetView); + TableCellIntegerRenderer::RenderValue(_value, valueChanged, rect, + targetView); } diff --git a/src/apps/debugger/user_interface/gui/value/TableCellEnumerationRenderer.h b/src/apps/debugger/user_interface/gui/value/TableCellEnumerationRenderer.h index 6a68fb5..a0fa34f 100644 --- a/src/apps/debugger/user_interface/gui/value/TableCellEnumerationRenderer.h +++ b/src/apps/debugger/user_interface/gui/value/TableCellEnumerationRenderer.h @@ -1,4 +1,5 @@ /* + * Copyright 2014, Rene Gollent, rene@xxxxxxxxxxx. * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. * Distributed under the terms of the MIT License. */ @@ -15,8 +16,8 @@ class TableCellEnumerationRenderer : public TableCellIntegerRenderer { public: TableCellEnumerationRenderer(Config* config); - virtual void RenderValue(Value* value, BRect rect, - BView* targetView); + virtual void RenderValue(Value* value, bool valueChanged, + BRect rect, BView* targetView); virtual float PreferredValueWidth(Value* value, BView* targetView); }; diff --git a/src/apps/debugger/user_interface/gui/value/TableCellFloatRenderer.cpp b/src/apps/debugger/user_interface/gui/value/TableCellFloatRenderer.cpp index fa71cb8..b28f0d4 100644 --- a/src/apps/debugger/user_interface/gui/value/TableCellFloatRenderer.cpp +++ b/src/apps/debugger/user_interface/gui/value/TableCellFloatRenderer.cpp @@ -1,4 +1,5 @@ /* + * Copyright 2014, Rene Gollent, rene@xxxxxxxxxxx. * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. * Distributed under the terms of the MIT License. */ @@ -13,7 +14,8 @@ void -TableCellFloatRenderer::RenderValue(Value* _value, BRect rect, BView* targetView) +TableCellFloatRenderer::RenderValue(Value* _value, bool valueChanged, + BRect rect, BView* targetView) { FloatValue* value = dynamic_cast<FloatValue*>(_value); if (value == NULL) @@ -23,7 +25,7 @@ TableCellFloatRenderer::RenderValue(Value* _value, BRect rect, BView* targetView snprintf(buffer, sizeof(buffer), "%g", value->GetValue()); TableCellValueRendererUtils::DrawString(targetView, rect, buffer, - B_ALIGN_RIGHT, true); + valueChanged, B_ALIGN_RIGHT, true); } diff --git a/src/apps/debugger/user_interface/gui/value/TableCellFloatRenderer.h b/src/apps/debugger/user_interface/gui/value/TableCellFloatRenderer.h index 2058d9a..b6253ac 100644 --- a/src/apps/debugger/user_interface/gui/value/TableCellFloatRenderer.h +++ b/src/apps/debugger/user_interface/gui/value/TableCellFloatRenderer.h @@ -1,4 +1,5 @@ /* + * Copyright 2014, Rene Gollent, rene@xxxxxxxxxxx. * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. * Distributed under the terms of the MIT License. */ @@ -13,8 +14,8 @@ class TableCellFloatRenderer : public TableCellValueRenderer { public: - virtual void RenderValue(Value* value, BRect rect, - BView* targetView); + virtual void RenderValue(Value* value, bool valueChanged, + BRect rect, BView* targetView); virtual float PreferredValueWidth(Value* value, BView* targetView); }; diff --git a/src/apps/debugger/user_interface/gui/value/TableCellIntegerRenderer.cpp b/src/apps/debugger/user_interface/gui/value/TableCellIntegerRenderer.cpp index 751fcfa..bba8e2e 100644 --- a/src/apps/debugger/user_interface/gui/value/TableCellIntegerRenderer.cpp +++ b/src/apps/debugger/user_interface/gui/value/TableCellIntegerRenderer.cpp @@ -1,4 +1,5 @@ /* + * Copyright 2014, Rene Gollent, rene@xxxxxxxxxxx. * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. * Distributed under the terms of the MIT License. */ @@ -41,8 +42,8 @@ TableCellIntegerRenderer::GetSettings() const void -TableCellIntegerRenderer::RenderValue(Value* _value, BRect rect, - BView* targetView) +TableCellIntegerRenderer::RenderValue(Value* _value, bool valueChanged, + BRect rect, BView* targetView) { IntegerValue* value = dynamic_cast<IntegerValue*>(_value); if (value == NULL) @@ -59,7 +60,7 @@ TableCellIntegerRenderer::RenderValue(Value* _value, BRect rect, // render TableCellValueRendererUtils::DrawString(targetView, rect, buffer, - B_ALIGN_RIGHT, true); + valueChanged, B_ALIGN_RIGHT, true); } diff --git a/src/apps/debugger/user_interface/gui/value/TableCellIntegerRenderer.h b/src/apps/debugger/user_interface/gui/value/TableCellIntegerRenderer.h index 2061fec..9d8a630 100644 --- a/src/apps/debugger/user_interface/gui/value/TableCellIntegerRenderer.h +++ b/src/apps/debugger/user_interface/gui/value/TableCellIntegerRenderer.h @@ -1,4 +1,5 @@ /* + * Copyright 2014, Rene Gollent, rene@xxxxxxxxxxx. * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. * Distributed under the terms of the MIT License. */ @@ -25,8 +26,8 @@ public: virtual Settings* GetSettings() const; - virtual void RenderValue(Value* value, BRect rect, - BView* targetView); + virtual void RenderValue(Value* value, bool valueChanged, + BRect rect, BView* targetView); virtual float PreferredValueWidth(Value* value, BView* targetView); diff --git a/src/apps/debugger/user_interface/gui/value/TableCellStringRenderer.cpp b/src/apps/debugger/user_interface/gui/value/TableCellStringRenderer.cpp index ebb905f..2d273e9 100644 --- a/src/apps/debugger/user_interface/gui/value/TableCellStringRenderer.cpp +++ b/src/apps/debugger/user_interface/gui/value/TableCellStringRenderer.cpp @@ -1,4 +1,5 @@ /* + * Copyright 2014, Rene Gollent, rene@xxxxxxxxxxx. * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. * Distributed under the terms of the MIT License. */ @@ -15,8 +16,8 @@ void -TableCellStringRenderer::RenderValue(Value* value, BRect rect, - BView* targetView) +TableCellStringRenderer::RenderValue(Value* value, bool valueChanged, + BRect rect, BView* targetView) { BString string = "\""; BString tempString; @@ -64,7 +65,7 @@ TableCellStringRenderer::RenderValue(Value* value, BRect rect, string += "\""; TableCellValueRendererUtils::DrawString(targetView, rect, string, - B_ALIGN_RIGHT, true); + valueChanged, B_ALIGN_RIGHT, true); } diff --git a/src/apps/debugger/user_interface/gui/value/TableCellStringRenderer.h b/src/apps/debugger/user_interface/gui/value/TableCellStringRenderer.h index 5e05efd..f763326 100644 --- a/src/apps/debugger/user_interface/gui/value/TableCellStringRenderer.h +++ b/src/apps/debugger/user_interface/gui/value/TableCellStringRenderer.h @@ -1,4 +1,5 @@ /* + * Copyright 2014, Rene Gollent, rene@xxxxxxxxxxx. * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. * Distributed under the terms of the MIT License. */ @@ -13,8 +14,8 @@ class TableCellStringRenderer : public TableCellValueRenderer { public: - virtual void RenderValue(Value* value, BRect rect, - BView* targetView); + virtual void RenderValue(Value* value, bool valueChanged, + BRect rect, BView* targetView); virtual float PreferredValueWidth(Value* value, BView* targetView); }; diff --git a/src/apps/debugger/user_interface/gui/value/TableCellValueRenderer.h b/src/apps/debugger/user_interface/gui/value/TableCellValueRenderer.h index 019e4c9..f943c7e 100644 --- a/src/apps/debugger/user_interface/gui/value/TableCellValueRenderer.h +++ b/src/apps/debugger/user_interface/gui/value/TableCellValueRenderer.h @@ -1,4 +1,5 @@ /* + * Copyright 2014, Rene Gollent, rene@xxxxxxxxxxx. * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. * Distributed under the terms of the MIT License. */ @@ -23,8 +24,8 @@ public: virtual Settings* GetSettings() const; // returns NULL, if no settings - virtual void RenderValue(Value* value, BRect rect, - BView* targetView) = 0; + virtual void RenderValue(Value* value, bool valueChanged, + BRect rect, BView* targetView) = 0; virtual float PreferredValueWidth(Value* value, BView* targetView) = 0; }; diff --git a/src/apps/debugger/user_interface/gui/value/TableCellValueRendererUtils.cpp b/src/apps/debugger/user_interface/gui/value/TableCellValueRendererUtils.cpp index 3af1934..2df0472 100644 --- a/src/apps/debugger/user_interface/gui/value/TableCellValueRendererUtils.cpp +++ b/src/apps/debugger/user_interface/gui/value/TableCellValueRendererUtils.cpp @@ -16,7 +16,8 @@ static const float kTextMargin = 8; /*static*/ void TableCellValueRendererUtils::DrawString(BView* view, BRect rect, - const char* string, enum alignment alignment, bool truncate) + const char* string, bool valueChanged, enum alignment alignment, + bool truncate) { // get font height info font_height fontHeight; @@ -56,7 +57,15 @@ TableCellValueRendererUtils::DrawString(BView* view, BRect rect, // TODO: This is the computation BColumnListView (respectively // BTitledColumn) is using, which I find somewhat weird. + if (valueChanged) { + view->PushState(); + view->SetHighColor((rgb_color){255, 0, 0, 255}); + } + view->DrawString(string, BPoint(x, y)); + + if (valueChanged) + view->PopState(); } diff --git a/src/apps/debugger/user_interface/gui/value/TableCellValueRendererUtils.h b/src/apps/debugger/user_interface/gui/value/TableCellValueRendererUtils.h index 1f48993..cd77cf0 100644 --- a/src/apps/debugger/user_interface/gui/value/TableCellValueRendererUtils.h +++ b/src/apps/debugger/user_interface/gui/value/TableCellValueRendererUtils.h @@ -17,6 +17,7 @@ class TableCellValueRendererUtils { public: static void DrawString(BView* view, BRect rect, const char* string, + bool valueChanged, enum alignment alignment, bool truncate = false); static float PreferredStringWidth(BView* view,