Skip to content

Commit

Permalink
Debugger: Add support for copying variable values.
Browse files Browse the repository at this point in the history
- Implements a simple copy option in the variables context menu that
  allows one to copy the displayed value to the clipboard.
  • Loading branch information
anevilyak committed Jun 28, 2014
1 parent 2f605e9 commit 473a74f
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 4 deletions.
39 changes: 36 additions & 3 deletions src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp
@@ -1,19 +1,18 @@
/*
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2011-2013, Rene Gollent, rene@gollent.com.
* Copyright 2011-2014, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/


#include "VariablesView.h"

#include <stdio.h>

#include <new>

#include <debugger.h>

#include <Alert.h>
#include <Clipboard.h>
#include <Looper.h>
#include <PopUpMenu.h>
#include <ToolTip.h>
Expand Down Expand Up @@ -1822,6 +1821,11 @@ VariablesView::MessageReceived(BMessage* message)
fVariableTableModel->NotifyNodeChanged(node);
break;
}
case B_COPY:
{
_CopyVariableValueToClipboard();
break;
}
default:
BGroupView::MessageReceived(message);
break;
Expand Down Expand Up @@ -2084,6 +2088,15 @@ VariablesView::_GetContextActionsForNode(ModelNode* node,
if (valueNode == NULL)
return B_OK;

if (valueNode->LocationAndValueResolutionState() == B_OK) {
result = _AddContextAction("Copy Value", B_COPY, actions, message);
if (result != B_OK)
return result;
}

// if the current node isn't itself a ranged container, check if it
// contains a hidden node which is, since in the latter case we
// want to present the range selection as well.
if (!valueNode->IsRangedContainer()) {
if (node->CountChildren() == 1 && node->ChildAt(0)->IsHidden()) {
valueNode = node->ChildAt(0)->NodeChild()->Node();
Expand Down Expand Up @@ -2296,6 +2309,26 @@ VariablesView::_ApplyViewStateDescendentNodeInfos(VariablesViewState* viewState,
}


void
VariablesView::_CopyVariableValueToClipboard()
{
ModelNode* node = reinterpret_cast<ModelNode*>(
fVariableTable->SelectionModel()->NodeAt(0));

Value* value = node->GetValue();
BString valueData;
if (value != NULL && value->ToString(valueData)) {
be_clipboard->Lock();
be_clipboard->Data()->RemoveData("text/plain");
be_clipboard->Data()->AddData ("text/plain",
B_MIME_TYPE, valueData.String(),
valueData.Length());
be_clipboard->Commit();
be_clipboard->Unlock();
}
}


// #pragma mark - Listener


Expand Down
@@ -1,6 +1,6 @@
/*
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2012, Rene Gollent, rene@gollent.com.
* Copyright 2012-2014, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/
#ifndef VARIABLES_VIEW_H
Expand Down Expand Up @@ -86,6 +86,7 @@ class VariablesView : public BGroupView, private TreeTableListener {
status_t _ApplyViewStateDescendentNodeInfos(
VariablesViewState* viewState, void* parent,
TreeTablePath& path);
void _CopyVariableValueToClipboard();

private:
Thread* fThread;
Expand Down

0 comments on commit 473a74f

Please sign in to comment.