xref: /haiku/src/apps/debugger/user_interface/gui/team_window/VariablesView.h (revision 770075026caa7953c27fb2d7489c5b3ea25a5853)
1 /*
2  * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Copyright 2012-2015, Rene Gollent, rene@gollent.com.
4  * Distributed under the terms of the MIT License.
5  */
6 #ifndef VARIABLES_VIEW_H
7 #define VARIABLES_VIEW_H
8 
9 
10 #include <GroupView.h>
11 #include <util/OpenHashTable.h>
12 
13 #include "table/TreeTable.h"
14 
15 #include "ExpressionInfo.h"
16 
17 
18 class ActionMenuItem;
19 class CpuState;
20 class SettingsMenu;
21 class StackFrame;
22 class Thread;
23 class Type;
24 class TypeComponentPath;
25 class ValueLocation;
26 class ValueNode;
27 class ValueNodeChild;
28 class ValueNodeContainer;
29 class ValueNodeManager;
30 class Value;
31 class Variable;
32 class VariableEditWindow;
33 class VariablesViewState;
34 class VariablesViewStateHistory;
35 
36 
37 class VariablesView : public BGroupView, private TreeTableListener,
38 	private ExpressionInfo::Listener {
39 public:
40 	class Listener;
41 
42 public:
43 								VariablesView(Listener* listener);
44 								~VariablesView();
45 
46 	static	VariablesView*		Create(Listener* listener,
47 									ValueNodeManager* manager);
48 									// throws
49 
50 			void				SetStackFrame(Thread* thread,
51 									StackFrame* stackFrame);
52 
53 	virtual	void				MessageReceived(BMessage* message);
54 
55 	virtual	void				DetachedFromWindow();
56 
57 			void				LoadSettings(const BMessage& settings);
58 			status_t			SaveSettings(BMessage& settings);
59 
60 			void				SetStackFrameClearPending();
61 
62 private:
63 	// TreeTableListener
64 	virtual	void				TreeTableNodeExpandedChanged(TreeTable* table,
65 									const TreeTablePath& path, bool expanded);
66 	virtual	void				TreeTableNodeInvoked(TreeTable* table,
67 									const TreeTablePath& path);
68 	virtual	void				TreeTableCellMouseDown(TreeTable* table,
69 									const TreeTablePath& path,
70 									int32 columnIndex, BPoint screenWhere,
71 									uint32 buttons);
72 
73 	// ExpressionInfo::Listener
74 	virtual	void				ExpressionEvaluated(ExpressionInfo* info,
75 									status_t result, ExpressionResult* value);
76 
77 private:
78 			class ContainerListener;
79 			class ExpressionVariableID;
80 			class ModelNode;
81 			class VariableValueColumn;
82 			class VariableTableModel;
83 			class ContextMenu;
84 			class TableCellContextMenuTracker;
85 			class VariablesExpressionInfo;
86 			typedef BObjectList<ActionMenuItem> ContextActionList;
87 			typedef BObjectList<ExpressionInfo> ExpressionInfoList;
88 			typedef BObjectList<ValueNodeChild> ExpressionChildList;
89 
90 			struct FunctionKey;
91 			struct ExpressionInfoEntry;
92 			struct ExpressionInfoEntryHashDefinition;
93 
94 			typedef BOpenHashTable<ExpressionInfoEntryHashDefinition>
95 				ExpressionInfoTable;
96 
97 private:
98 			void				_Init(ValueNodeManager* manager);
99 
100 			void				_RequestNodeValue(ModelNode* node);
101 			status_t			_GetContextActionsForNode(ModelNode* node,
102 									ContextActionList*& _preActions,
103 									ContextActionList*& _postActions);
104 			status_t			_AddContextAction(const char* action,
105 									uint32 what, ContextActionList* actions,
106 									BMessage*& _message);
107 			status_t			_CreateContextAction(const char* action,
108 									uint32 what, ActionMenuItem*& _item);
109 			status_t			_AddTypeHandlerMenuIfNeeded(ModelNode* node,
110 									ContextActionList* actions);
111 			void				_FinishContextMenu(bool force);
112 			void				_SaveViewState(bool updateValues) const;
113 			void				_RestoreViewState();
114 			status_t			_AddViewStateDescendentNodeInfos(
115 									VariablesViewState* viewState,
116 									void* parent,
117 									TreeTablePath& path,
118 									bool updateValues) const;
119 			status_t			_ApplyViewStateDescendentNodeInfos(
120 									VariablesViewState* viewState,
121 									void* parent,
122 									TreeTablePath& path);
123 			void				_CopyVariableValueToClipboard();
124 
125 			status_t			_AddExpression(const char* expression,
126 									bool persistentExpression,
127 									ExpressionInfo*& _info);
128 			void				_RemoveExpression(ModelNode* node);
129 
130 			void				_RestoreExpressionNodes();
131 
132 			void				_AddExpressionNode(ExpressionInfo* info,
133 									status_t result, ExpressionResult* value);
134 
135 			void				_HandleTypecastResult(status_t result,
136 									ExpressionResult* value);
137 
138 			void				_HandleEditVariableRequest(ModelNode* node,
139 									Value* value);
140 
141 			status_t			_GetTypeForTypeCode(int32 typeCode,
142 									Type*& _resultType) const;
143 
144 private:
145 			Thread*				fThread;
146 			StackFrame*			fStackFrame;
147 			TreeTable*			fVariableTable;
148 			VariableTableModel*	fVariableTableModel;
149 			ContainerListener*	fContainerListener;
150 			VariablesViewState*	fPreviousViewState;
151 			VariablesViewStateHistory* fViewStateHistory;
152 			ExpressionInfoTable* fExpressions;
153 			ExpressionChildList	fExpressionChildren;
154 			TableCellContextMenuTracker* fTableCellContextMenuTracker;
155 			VariablesExpressionInfo* fPendingTypecastInfo;
156 			ExpressionInfo*		fTemporaryExpression;
157 			bool				fFrameClearPending;
158 			VariableEditWindow*	fEditWindow;
159 			Listener*			fListener;
160 };
161 
162 
163 class VariablesView::Listener {
164 public:
165 	virtual						~Listener();
166 
167 	virtual	void				ValueNodeValueRequested(CpuState* cpuState,
168 									ValueNodeContainer* container,
169 									ValueNode* valueNode) = 0;
170 
171 	virtual	void				ExpressionEvaluationRequested(
172 									ExpressionInfo* info,
173 									StackFrame* frame,
174 									Thread* thread) = 0;
175 
176 	virtual	void				ValueNodeWriteRequested(
177 									ValueNode* node,
178 									CpuState* state,
179 									Value* newValue) = 0;
180 
181 };
182 
183 
184 #endif	// VARIABLES_VIEW_H
185