xref: /haiku/src/apps/debugger/user_interface/gui/value/value_handlers/EnumerationValueHandler.cpp (revision ed24eb5ff12640d052171c6a7feba37fab8a75d1)
1 /*
2  * Copyright 2015, Rene Gollent, rene@gollent.com.
3  * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
4  * Distributed under the terms of the MIT License.
5  */
6 
7 
8 #include "EnumerationValueHandler.h"
9 
10 #include <new>
11 
12 #include "EnumerationValue.h"
13 #include "EnumerationValueFormatter.h"
14 #include "TableCellEnumerationEditor.h"
15 #include "TableCellFormattedValueRenderer.h"
16 #include "Type.h"
17 
18 
19 EnumerationValueHandler::EnumerationValueHandler()
20 {
21 }
22 
23 
24 EnumerationValueHandler::~EnumerationValueHandler()
25 {
26 }
27 
28 
29 status_t
30 EnumerationValueHandler::Init()
31 {
32 	return B_OK;
33 }
34 
35 
36 float
37 EnumerationValueHandler::SupportsValue(Value* value)
38 {
39 	return dynamic_cast<EnumerationValue*>(value) != NULL ? 0.7f : 0;
40 }
41 
42 
43 status_t
44 EnumerationValueHandler::GetValueFormatter(Value* _value,
45 	ValueFormatter*& _formatter)
46 {
47 	EnumerationValue* value = dynamic_cast<EnumerationValue*>(_value);
48 	if (value == NULL)
49 		return B_BAD_VALUE;
50 
51 	IntegerValueFormatter::Config* config = NULL;
52 	status_t error = CreateIntegerFormatterConfig(value, config);
53 	if (error != B_OK)
54 		return error;
55 	BReference<IntegerValueFormatter::Config> configReference(config, true);
56 
57 	ValueFormatter* formatter = NULL;
58 	error = CreateValueFormatter(config, formatter);
59 	if (error != B_OK)
60 		return error;
61 
62 	_formatter = formatter;
63 
64 	return B_OK;
65 }
66 
67 
68 status_t
69 EnumerationValueHandler::GetTableCellValueEditor(Value* _value,
70 	Settings* settings, TableCellValueEditor*& _editor)
71 {
72 	EnumerationValue* value = dynamic_cast<EnumerationValue*>(_value);
73 	if (value == NULL)
74 		return B_BAD_VALUE;
75 
76 	IntegerValueFormatter::Config* config = NULL;
77 	status_t error = CreateIntegerFormatterConfig(value, config);
78 	if (error != B_OK)
79 		return error;
80 	BReference<IntegerValueFormatter::Config> configReference(config, true);
81 
82 	ValueFormatter* formatter;
83 	error = CreateValueFormatter(config, formatter);
84 	if (error != B_OK)
85 		return error;
86 	BReference<ValueFormatter> formatterReference(formatter, true);
87 
88 	TableCellEnumerationEditor* editor = new(std::nothrow)
89 		TableCellEnumerationEditor(value, formatter);
90 	if (editor == NULL)
91 		return B_NO_MEMORY;
92 
93 	BReference<TableCellEnumerationEditor> editorReference(editor, true);
94 	error = editor->Init();
95 	if (error != B_OK)
96 		return error;
97 
98 	editorReference.Detach();
99 	_editor = editor;
100 	return B_OK;
101 }
102 
103 
104 integer_format
105 EnumerationValueHandler::DefaultIntegerFormat(IntegerValue* _value)
106 {
107 	EnumerationValue* value = dynamic_cast<EnumerationValue*>(_value);
108 	if (value != NULL && value->GetType()->ValueFor(value->GetValue()) != NULL)
109 		return INTEGER_FORMAT_DEFAULT;
110 
111 	return IntegerValueHandler::DefaultIntegerFormat(_value);
112 }
113 
114 
115 status_t
116 EnumerationValueHandler::CreateValueFormatter(
117 	IntegerValueFormatter::Config* config, ValueFormatter*& _formatter)
118 {
119 	ValueFormatter* formatter = new(std::nothrow) EnumerationValueFormatter(
120 		config);
121 	if (formatter == NULL)
122 		return B_NO_MEMORY;
123 
124 	_formatter = formatter;
125 	return B_OK;
126 }
127 
128 
129 status_t
130 EnumerationValueHandler::AddIntegerFormatSettingOptions(IntegerValue* _value,
131 	OptionsSettingImpl* setting)
132 {
133 	EnumerationValue* value = dynamic_cast<EnumerationValue*>(_value);
134 	if (value != NULL
135 		&& value->GetType()->ValueFor(value->GetValue()) != NULL) {
136 		status_t error = AddIntegerFormatOption(setting, "name", "Enum Name",
137 			INTEGER_FORMAT_DEFAULT);
138 		if (error != B_OK)
139 			return error;
140 	}
141 
142 	return IntegerValueHandler::AddIntegerFormatSettingOptions(_value, setting);
143 }
144 
145 
146 status_t
147 EnumerationValueHandler::CreateTableCellValueRenderer(IntegerValue* _value,
148 	IntegerValueFormatter::Config* config,
149 	TableCellValueRenderer*& _renderer)
150 {
151 	EnumerationValue* value = dynamic_cast<EnumerationValue*>(_value);
152 	if (value != NULL
153 		&& value->GetType()->ValueFor(value->GetValue()) != NULL) {
154 		ValueFormatter* formatter = NULL;
155 		status_t error = GetValueFormatter(value, formatter);
156 		if (error != B_OK)
157 			return error;
158 		BReference<ValueFormatter> formatterReference(formatter,
159 			true);
160 
161 		TableCellValueRenderer* renderer
162 			= new(std::nothrow) TableCellFormattedValueRenderer(formatter);
163 		if (renderer == NULL)
164 			return B_NO_MEMORY;
165 
166 		_renderer = renderer;
167 		return B_OK;
168 	}
169 
170 	return IntegerValueHandler::CreateTableCellValueRenderer(_value, config,
171 		_renderer);
172 }
173