root/headers/private/debugger/debug_managers/ValueNodeManager.h
/*
 * Copyright 2012-2016, Rene Gollent, rene@gollent.com.
 * Distributed under the terms of the MIT License.
 */
#ifndef VALUE_NODE_MANAGER_H
#define VALUE_NODE_MANAGER_H

#include <Referenceable.h>

#include "ValueNodeContainer.h"

class StackFrame;
class Thread;
class Variable;


class ValueNodeManager : public BReferenceable,
        private ValueNodeContainer::Listener {
public:
                                                                ValueNodeManager(bool addFrameNodes = true);
        virtual                                         ~ValueNodeManager();

                        status_t                        SetStackFrame(::Thread* thread,
                                                                        StackFrame* frame);

                        bool                            AddListener(
                                                                        ValueNodeContainer::Listener* listener);
                        void                            RemoveListener(
                                                                        ValueNodeContainer::Listener* listener);

        virtual void                            ValueNodeChanged(ValueNodeChild* nodeChild,
                                                                        ValueNode* oldNode, ValueNode* newNode);
        virtual void                            ValueNodeChildrenCreated(ValueNode* node);
        virtual void                            ValueNodeChildrenDeleted(ValueNode* node);
        virtual void                            ValueNodeValueChanged(ValueNode* node);

                        ValueNodeContainer*     GetContainer() const { return fContainer; };

                        status_t                        AddChildNodes(ValueNodeChild* nodeChild);

private:
                        typedef BObjectList<ValueNodeContainer::Listener> ListenerList;

                        void                            _AddNode(Variable* variable);
                        status_t                        _CreateValueNode(ValueNodeChild* nodeChild);

private:
                        bool                            fAddFrameNodes;
                        ValueNodeContainer*     fContainer;
                        StackFrame*                     fStackFrame;
                        ::Thread*                       fThread;
                        ListenerList            fListeners;
};

#endif  // VALUE_NODE_MANAGER_H