/*
 * Copyright 2014-2016, Rene Gollent, rene@gollent.com.
 * Distributed under the terms of the MIT License.
 */
#include "BreakpointEditWindow.h"
 
#include <Button.h>
#include <LayoutBuilder.h>
#include <RadioButton.h>
#include <StringView.h>
#include <TextControl.h>
 
#include <AutoDeleter.h>
#include <AutoLocker.h>
 
#include "AppMessageCodes.h"
#include "Team.h"
#include "UserBreakpoint.h"
#include "UserInterface.h"
 
 
enum {
	MSG_SET_BREAK_ALWAYS 			= 'sbal',
	MSG_SET_BREAK_ON_CONDITION		= 'sboc',
	MSG_SAVE_BREAKPOINT_SETTINGS 	= 'sbps'
};
 
 
BreakpointEditWindow::BreakpointEditWindow(::Team* team,
	UserBreakpoint* breakpoint, UserInterfaceListener* listener,
	BHandler* target)
	:
	BWindow(BRect(), "Edit breakpoint", B_FLOATING_WINDOW,
		B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE),
	fTeam(team),
	fListener(listener),
	fTargetBreakpoint(breakpoint),
	fSaveButton(NULL),
	fCancelButton(NULL),
	fTarget(target)
{
	fTargetBreakpoint->AcquireReference();
}
 
 
BreakpointEditWindow::~BreakpointEditWindow()
{
	fTargetBreakpoint->ReleaseReference();
	BMessenger(fTarget).SendMessage(MSG_BREAKPOINT_EDIT_WINDOW_CLOSED);
}
 
 
BreakpointEditWindow*
BreakpointEditWindow::Create(::Team* team, UserBreakpoint* breakpoint,
	UserInterfaceListener* listener, BHandler* target)
{
	BreakpointEditWindow* self = new BreakpointEditWindow(
		team, breakpoint, listener, target);
 
	try {
		self->_Init();
	} catch (...) {
		delete self;
		throw;
	}
 
	return self;
 
}
 
void
BreakpointEditWindow::MessageReceived(BMessage* message)
{
	switch (message->what) {
		case MSG_SET_BREAK_ALWAYS:
			fConditionInput->SetEnabled(false);
			break;
		case MSG_SET_BREAK_ON_CONDITION:
			fConditionInput->SetEnabled(true);
			break;
		case MSG_SAVE_BREAKPOINT_SETTINGS:
		{
			if (fConditionRadio->Value() == B_CONTROL_ON) {
				fListener->SetBreakpointConditionRequested(
					fTargetBreakpoint, fConditionInput->Text());
			} else {
				fListener->ClearBreakpointConditionRequested(
					fTargetBreakpoint);
			}
			// fall through
		}
		case B_CANCEL:
			Quit();
			break;
 
		default:
			BWindow::MessageReceived(message);
			break;
	}
 
}
 
 
void
BreakpointEditWindow::Show()
{
	CenterOnScreen();
	BWindow::Show();
}
 
 
void
BreakpointEditWindow::_Init()
{
	fConditionInput = new BTextControl(NULL, NULL, NULL);
	BLayoutItem* textLayoutItem = fConditionInput->CreateTextViewLayoutItem();
	textLayoutItem->SetExplicitMinSize(BSize(200.0, B_SIZE_UNSET));
	BLayoutBuilder::Group<>(this, B_VERTICAL)
		.SetInsets(B_USE_DEFAULT_SPACING)
		.Add((fAlwaysRadio = new BRadioButton("Break always",
				new BMessage(MSG_SET_BREAK_ALWAYS))))
		.AddGroup(B_HORIZONTAL)
			.Add((fConditionRadio = new BRadioButton("Break on condition: ",
				new BMessage(MSG_SET_BREAK_ON_CONDITION))))
			.Add(textLayoutItem)
		.End()
		.AddGroup(B_HORIZONTAL)
			.AddGlue()
			.Add((fSaveButton = new BButton("Save",
				new BMessage(MSG_SAVE_BREAKPOINT_SETTINGS))))
			.Add((fCancelButton = new BButton("Cancel",
				new BMessage(B_CANCEL))))
		.End()
	.End();
 
	AutoLocker< ::Team> teamLocker(fTeam);
	if (fTargetBreakpoint->HasCondition()) {
		fConditionRadio->SetValue(B_CONTROL_ON);
		fConditionInput->SetText(fTargetBreakpoint->Condition());
	} else {
		fAlwaysRadio->SetValue(B_CONTROL_ON);
		fConditionInput->SetEnabled(false);
	}
}

V730 Not all members of a class are initialized inside the constructor. Consider inspecting: fConditionInput, fAlwaysRadio, fConditionRadio.