* Rename and make VariableTableModel::_GetTreePath() public so VariablesView

can make use of it, and adjust existing callers.
* For nodes that need child creation to be deferred until after value
  resolution succeeds, send a request to the view to restore their view state
  once child creation is complete. This gets the view state working again
  for things like BPoints and other complex structures embedded in a BMessage.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42469 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Rene Gollent
2011-07-24 01:31:35 +00:00
parent 5fb1d0a640
commit efc5edfaa2
@@ -1,5 +1,6 @@
/* /*
* Copyright 2009, Ingo Weinhold, [email protected]. * Copyright 2009, Ingo Weinhold, [email protected].
* Copyright 2011, Rene Gollent, [email protected].
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
@@ -48,8 +49,9 @@ enum {
enum { enum {
MSG_MODEL_NODE_HIDDEN = 'monh', MSG_MODEL_NODE_HIDDEN = 'monh',
MSG_VALUE_NODE_NEEDS_VALUE = 'mvnv' MSG_VALUE_NODE_NEEDS_VALUE = 'mvnv',
MSG_RESTORE_PARTIAL_VIEW_STATE = 'mpvs'
}; };
@@ -73,6 +75,8 @@ public:
virtual void ModelNodeValueRequested(ModelNode* node); virtual void ModelNodeValueRequested(ModelNode* node);
virtual void ModelNodeRestoreViewStateRequested(ModelNode* node);
private: private:
BHandler* fIndirectTarget; BHandler* fIndirectTarget;
VariableTableModel* fModel; VariableTableModel* fModel;
@@ -364,6 +368,9 @@ public:
virtual bool GetValueAt(void* object, int32 columnIndex, virtual bool GetValueAt(void* object, int32 columnIndex,
BVariant& _value); BVariant& _value);
bool GetTreePath(ModelNode* node,
TreeTablePath& _path) const;
void NodeExpanded(ModelNode* node); void NodeExpanded(ModelNode* node);
void NotifyNodeChanged(ModelNode* node); void NotifyNodeChanged(ModelNode* node);
@@ -412,8 +419,6 @@ private:
// ModelNode* _GetNode(Variable* variable, // ModelNode* _GetNode(Variable* variable,
// TypeComponentPath* path) const; // TypeComponentPath* path) const;
bool _GetTreePath(ModelNode* node,
TreeTablePath& _path) const;
private: private:
Thread* fThread; Thread* fThread;
@@ -706,6 +711,21 @@ VariablesView::ContainerListener::ModelNodeValueRequested(ModelNode* node)
} }
void
VariablesView::ContainerListener::ModelNodeRestoreViewStateRequested(
ModelNode* node)
{
BReference<ModelNode> nodeReference(node);
BMessage message(MSG_RESTORE_PARTIAL_VIEW_STATE);
if (message.AddPointer("node", node) == B_OK
&& fIndirectTarget->Looper()->PostMessage(&message, fIndirectTarget)
== B_OK) {
nodeReference.Detach();
}
}
// #pragma mark - VariableTableModel // #pragma mark - VariableTableModel
@@ -869,6 +889,7 @@ VariablesView::VariableTableModel::ValueNodeChildrenCreated(
fContainerListener->ModelNodeValueRequested(childNode); fContainerListener->ModelNodeValueRequested(childNode);
} }
fContainerListener->ModelNodeRestoreViewStateRequested(modelNode);
} }
} }
@@ -1047,7 +1068,7 @@ VariablesView::VariableTableModel::NotifyNodeChanged(ModelNode* node)
{ {
if (!node->IsHidden()) { if (!node->IsHidden()) {
TreeTablePath treePath; TreeTablePath treePath;
if (_GetTreePath(node, treePath)) { if (GetTreePath(node, treePath)) {
int32 index = treePath.RemoveLastComponent(); int32 index = treePath.RemoveLastComponent();
NotifyNodesChanged(treePath, index, 1); NotifyNodesChanged(treePath, index, 1);
} }
@@ -1118,7 +1139,7 @@ VariablesView::VariableTableModel::_AddNode(Variable* variable,
// notify table model listeners // notify table model listeners
if (!node->IsHidden()) { if (!node->IsHidden()) {
TreeTablePath path; TreeTablePath path;
if (parent == NULL || _GetTreePath(parent, path)) if (parent == NULL || GetTreePath(parent, path))
NotifyNodesAdded(path, childIndex, 1); NotifyNodesAdded(path, childIndex, 1);
} }
@@ -1269,12 +1290,12 @@ VariablesView::VariableTableModel::_AddChildNodes(ValueNodeChild* nodeChild)
bool bool
VariablesView::VariableTableModel::_GetTreePath(ModelNode* node, VariablesView::VariableTableModel::GetTreePath(ModelNode* node,
TreeTablePath& _path) const TreeTablePath& _path) const
{ {
// recurse, if the node has a parent // recurse, if the node has a parent
if (ModelNode* parent = node->Parent()) { if (ModelNode* parent = node->Parent()) {
if (!_GetTreePath(parent, _path)) if (!GetTreePath(parent, _path))
return false; return false;
if (node->IsHidden()) if (node->IsHidden())
@@ -1437,6 +1458,28 @@ VariablesView::MessageReceived(BMessage* message)
break; break;
} }
case MSG_RESTORE_PARTIAL_VIEW_STATE:
{
ModelNode* node;
if (message->FindPointer("node", (void**)&node) == B_OK) {
TreeTablePath path;
if (fVariableTableModel->GetTreePath(node, path)) {
FunctionID* functionID = fStackFrame->Function()
->GetFunctionID();
if (functionID == NULL)
return;
BReference<FunctionID> functionIDReference(functionID,
true);
VariablesViewState* viewState = fViewStateHistory
->GetState(fThread->ID(), functionID);
if (viewState != NULL) {
_ApplyViewStateDescendentNodeInfos(viewState, node,
path);
}
}
}
break;
}
case MSG_VALUE_NODE_NEEDS_VALUE: case MSG_VALUE_NODE_NEEDS_VALUE:
case MSG_MODEL_NODE_HIDDEN: case MSG_MODEL_NODE_HIDDEN:
{ {