/*
 * Copyright 2016 Dario Casalinuovo. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 */
 
 
#include "NetworkStreamWin.h"
 
#include <Alert.h>
#include <Button.h>
#include <Catalog.h>
#include <Clipboard.h>
#include <LayoutBuilder.h>
 
#include "MainApp.h"
 
 
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "MediaPlayer-NetworkStream"
 
 
enum  {
	M_OPEN_URL = 'NSOP',
	M_CANCEL = 'NSCN'
};
 
 
NetworkStreamWin::NetworkStreamWin(BMessenger target)
	:
	BWindow(BRect(0, 0, 300, 100), B_TRANSLATE("Open network stream"),
		B_MODAL_WINDOW, B_NOT_RESIZABLE),
	fTarget(target)
{
	fTextControl = new BTextControl("InputControl",
		B_TRANSLATE("Stream URL:"), NULL, NULL);
 
	BLayoutBuilder::Group<>(this, B_VERTICAL)
		.SetInsets(B_USE_HALF_ITEM_INSETS)
		.Add(fTextControl)
		.AddGroup(B_HORIZONTAL)
			.AddGlue()
			.Add(new BButton(B_TRANSLATE("OK"), new BMessage(M_OPEN_URL)))
			.Add(new BButton(B_TRANSLATE("Cancel"), new BMessage(M_CANCEL)))
		.End()
	.End();
 
	_LookIntoClipboardForUrl();
 
	CenterOnScreen();
}
 
 
NetworkStreamWin::~NetworkStreamWin()
{
}
 
 
void
NetworkStreamWin::MessageReceived(BMessage* message)
{
	switch(message->what) {
		case M_OPEN_URL:
		{
			BUrl url(fTextControl->Text());
			if (!url.IsValid()) {
				BAlert* alert = new BAlert(B_TRANSLATE("Bad URL"),
					B_TRANSLATE("Invalid URL inserted!"),
						B_TRANSLATE("OK"));
					alert->Go();
				return;
			}
 
			BMessage archivedUrl;
			url.Archive(&archivedUrl);
 
			BMessage msg(M_URL_RECEIVED);
			msg.AddMessage("mediaplayer:url", &archivedUrl);
			fTarget.SendMessage(&msg);
 
			Quit();
			break;
		}
 
		case M_CANCEL:
			Quit();
			break;
 
		case B_KEY_DOWN:
		{
			int8 key;
			if (message->FindInt8("byte", &key) == B_OK
					&& key == B_ENTER) {
				PostMessage(M_OPEN_URL);
				break;
			}
		}
 
		default:
			BWindow::MessageReceived(message);
	}
}
 
 
void
NetworkStreamWin::WindowActivated(bool active)
{
	if (active)
		_LookIntoClipboardForUrl();
}
 
 
void
NetworkStreamWin::_LookIntoClipboardForUrl()
{
	// Don't do anything if we already have something
	// set to avoid annoying the user.
	if (fTextControl->TextView()->TextLength() > 0)
		return;
 
	// Let's see if we already have an url in the clipboard
	// in that case avoid the user to paste it.
	if (be_clipboard->Lock()) {
		char* text = NULL;
		ssize_t textLen = 0;
 
		BMessage* data = be_clipboard->Data();
		if (data->FindData("text/plain", B_MIME_TYPE,
				(const void **)&text, &textLen) == B_OK) {
 
			// NOTE: This is done because urls copied
			// from WebPositive have the mime string at
			// the end.
			// TODO: Looks like a problem in Web+, should
			// be fixed.
			text[textLen] = '\0';
 
			// Before to set the text let's see if it's really
			// a valid URL.
			BUrl url(text);
			if (url.IsValid())
				fTextControl->SetText(text);
		}
 
		be_clipboard->Unlock();
	}
}

V773 The function was exited without releasing the 'alert' pointer. A memory leak is possible.