/*
 * Copyright 2015, Rene Gollent, rene@gollent.com.
 * Distributed under the terms of the MIT License.
 */

#include "TableCellTextControlEditor.h"

#include "Value.h"
#include "ValueFormatter.h"


enum {
	MSG_INPUT_VALIDATION_NEEDED 	= 'ivne',
	MSG_TEXT_VALUE_CHANGED 			= 'tevc'
};


TableCellTextControlEditor::TableCellTextControlEditor(::Value* initialValue,
	ValueFormatter* formatter)
	:
	TableCellFormattedValueEditor(initialValue, formatter),
	BTextControl("", "", NULL)
{
}


TableCellTextControlEditor::~TableCellTextControlEditor()
{
}


status_t
TableCellTextControlEditor::Init()
{
	BMessage* message = new(std::nothrow) BMessage(
		MSG_INPUT_VALIDATION_NEEDED);
	if (message == NULL)
		return B_NO_MEMORY;

	SetMessage(message);

	message = new(std::nothrow) BMessage(MSG_TEXT_VALUE_CHANGED);
	if (message == NULL)
		return B_NO_MEMORY;

	SetModificationMessage(message);

	return B_OK;
}


BView*
TableCellTextControlEditor::GetView()
{
	return this;
}


void
TableCellTextControlEditor::AttachedToWindow()
{
	BTextControl::AttachedToWindow();

	SetTarget(this);

	BString output;

	if (GetValueFormatter()->FormatValue(InitialValue(), output) == B_OK)
		SetText(output);

	NotifyEditBeginning();
}


void
TableCellTextControlEditor::MessageReceived(BMessage* message)
{
	switch (message->what) {
		case MSG_TEXT_VALUE_CHANGED:
		{
			// TODO: highlight the input view in some way to show
			// invalid inputs

			// fall through
		}
		case MSG_INPUT_VALIDATION_NEEDED:
		{
			if (ValidateInput()) {
				::Value* value = NULL;
				status_t error = GetValueForInput(value);
				if (error != B_OK)
					break;

				BReference< ::Value> valueReference(value, true);
				NotifyEditCompleted(value);
			}
			break;
		}
		default:
			BTextControl::MessageReceived(message);
			break;
	}
}