Start adding support for typecast support.
Not yet complete/working.
This commit is contained in:
parent
6bfaef2ba6
commit
e8cdcede03
@ -47,7 +47,9 @@ enum {
|
|||||||
MSG_DEBUG_THIS_TEAM = 'dbtt',
|
MSG_DEBUG_THIS_TEAM = 'dbtt',
|
||||||
MSG_SHOW_INSPECTOR_WINDOW = 'sirw',
|
MSG_SHOW_INSPECTOR_WINDOW = 'sirw',
|
||||||
MSG_INSPECTOR_WINDOW_CLOSED = 'irwc',
|
MSG_INSPECTOR_WINDOW_CLOSED = 'irwc',
|
||||||
MSG_INSPECT_ADDRESS = 'isad'
|
MSG_INSPECT_ADDRESS = 'isad',
|
||||||
|
MSG_SHOW_TYPECAST_NODE_PROMPT = 'stnp',
|
||||||
|
MSG_TYPECAST_NODE = 'tyno'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#include <AutoDeleter.h>
|
#include <AutoDeleter.h>
|
||||||
#include <AutoLocker.h>
|
#include <AutoLocker.h>
|
||||||
|
#include <PromptWindow.h>
|
||||||
|
|
||||||
#include "table/TableColumns.h"
|
#include "table/TableColumns.h"
|
||||||
|
|
||||||
@ -32,10 +33,12 @@
|
|||||||
#include "StackFrameValues.h"
|
#include "StackFrameValues.h"
|
||||||
#include "TableCellValueRenderer.h"
|
#include "TableCellValueRenderer.h"
|
||||||
#include "Team.h"
|
#include "Team.h"
|
||||||
|
#include "TeamDebugInfo.h"
|
||||||
#include "Thread.h"
|
#include "Thread.h"
|
||||||
#include "Tracing.h"
|
#include "Tracing.h"
|
||||||
#include "TypeComponentPath.h"
|
#include "TypeComponentPath.h"
|
||||||
#include "TypeHandlerRoster.h"
|
#include "TypeHandlerRoster.h"
|
||||||
|
#include "TypeLookupConstraints.h"
|
||||||
#include "Value.h"
|
#include "Value.h"
|
||||||
#include "ValueHandler.h"
|
#include "ValueHandler.h"
|
||||||
#include "ValueHandlerRoster.h"
|
#include "ValueHandlerRoster.h"
|
||||||
@ -268,6 +271,23 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RemoveChild(ModelNode* child)
|
||||||
|
{
|
||||||
|
if (!fChildren.RemoveItem(child))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
child->ReleaseReference();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RemoveAllChildren()
|
||||||
|
{
|
||||||
|
for (int32 i = 0; i < fChildren.CountItems(); i++)
|
||||||
|
RemoveChild(fChildren.ItemAt(i));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef BObjectList<ModelNode> ChildList;
|
typedef BObjectList<ModelNode> ChildList;
|
||||||
|
|
||||||
@ -935,7 +955,15 @@ VariablesView::VariableTableModel::ValueNodeChanged(ValueNodeChild* nodeChild,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
AutoLocker<ValueNodeContainer> containerLocker(fContainer);
|
AutoLocker<ValueNodeContainer> containerLocker(fContainer);
|
||||||
// TODO:...
|
|
||||||
|
ModelNode* modelNode = fNodeTable.Lookup(nodeChild);
|
||||||
|
if (modelNode == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (oldNode != NULL)
|
||||||
|
ValueNodeChildrenDeleted(oldNode);
|
||||||
|
ValueNodeChildrenCreated(newNode);
|
||||||
|
fContainerListener->ModelNodeValueRequested(modelNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -986,7 +1014,21 @@ VariablesView::VariableTableModel::ValueNodeChildrenDeleted(ValueNode* node)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
AutoLocker<ValueNodeContainer> containerLocker(fContainer);
|
AutoLocker<ValueNodeContainer> containerLocker(fContainer);
|
||||||
// TODO:...
|
|
||||||
|
// check whether we know the node
|
||||||
|
ValueNodeChild* nodeChild = node->NodeChild();
|
||||||
|
if (nodeChild == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ModelNode* modelNode = fNodeTable.Lookup(nodeChild);
|
||||||
|
if (modelNode == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (int32 i = 0; i < modelNode->CountChildren(); i++) {
|
||||||
|
BReference<ModelNode> childNode = modelNode->ChildAt(i);
|
||||||
|
modelNode->RemoveChild(childNode);
|
||||||
|
fNodeTable.Remove(childNode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1574,6 +1616,56 @@ VariablesView::MessageReceived(BMessage* message)
|
|||||||
Looper()->PostMessage(message);
|
Looper()->PostMessage(message);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MSG_SHOW_TYPECAST_NODE_PROMPT:
|
||||||
|
{
|
||||||
|
BMessage* promptMessage = new(std::nothrow) BMessage(
|
||||||
|
MSG_TYPECAST_NODE);
|
||||||
|
|
||||||
|
if (promptMessage == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ObjectDeleter<BMessage> messageDeleter(promptMessage);
|
||||||
|
promptMessage->AddPointer("node", fVariableTable
|
||||||
|
->SelectionModel()->NodeAt(0));
|
||||||
|
PromptWindow* promptWindow = new(std::nothrow) PromptWindow(
|
||||||
|
"Specify Type", "Type: ", BMessenger(this), promptMessage);
|
||||||
|
if (promptWindow == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
messageDeleter.Detach();
|
||||||
|
promptWindow->CenterOnScreen();
|
||||||
|
promptWindow->Show();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MSG_TYPECAST_NODE:
|
||||||
|
{
|
||||||
|
ModelNode* node = NULL;
|
||||||
|
if (message->FindPointer("node", reinterpret_cast<void **>(&node)) != B_OK)
|
||||||
|
return;
|
||||||
|
TeamDebugInfo* info = fThread->GetTeam()->DebugInfo();
|
||||||
|
if (info == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Type* type = NULL;
|
||||||
|
if (info->LookupTypeByName(message->FindString("text"),
|
||||||
|
TypeLookupConstraints(), type) != B_OK) {
|
||||||
|
// TODO: notify user
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ValueNode* valueNode = NULL;
|
||||||
|
if (TypeHandlerRoster::Default()->CreateValueNode(
|
||||||
|
node->NodeChild(), type, valueNode) != B_OK) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ValueNode* previousNode = node->NodeChild()->Node();
|
||||||
|
BReference<ValueNode> nodeRef(previousNode);
|
||||||
|
node->NodeChild()->SetNode(valueNode);
|
||||||
|
fVariableTableModel->ValueNodeChanged(node->NodeChild(),
|
||||||
|
previousNode, valueNode );
|
||||||
|
break;
|
||||||
|
}
|
||||||
case MSG_VALUE_NODE_CHANGED:
|
case MSG_VALUE_NODE_CHANGED:
|
||||||
{
|
{
|
||||||
ValueNodeChild* nodeChild;
|
ValueNodeChild* nodeChild;
|
||||||
@ -1881,10 +1973,25 @@ VariablesView::_GetContextActionsForNode(ModelNode* node,
|
|||||||
|
|
||||||
messageDeleter.Detach();
|
messageDeleter.Detach();
|
||||||
ObjectDeleter<ActionMenuItem> actionDeleter(item);
|
ObjectDeleter<ActionMenuItem> actionDeleter(item);
|
||||||
|
if (!actions->AddItem(item))
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
|
message = new(std::nothrow)BMessage(MSG_SHOW_TYPECAST_NODE_PROMPT);
|
||||||
|
if (message == NULL)
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
|
item = new(std::nothrow) ActionMenuItem("Cast as" B_UTF8_ELLIPSIS,
|
||||||
|
message);
|
||||||
|
if (item == NULL)
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
|
messageDeleter.Detach();
|
||||||
|
|
||||||
if (!actions->AddItem(item))
|
if (!actions->AddItem(item))
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
actionDeleter.Detach();
|
actionDeleter.Detach();
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user