1/*
2 * Copyright 2016 Dario Casalinuovo. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 */
6
7
8#include "NetworkStreamWin.h"
9
10#include <Alert.h>
11#include <Button.h>
12#include <Catalog.h>
13#include <Clipboard.h>
14#include <LayoutBuilder.h>
15
16#include "MainApp.h"
17
18
19#undef B_TRANSLATION_CONTEXT
20#define B_TRANSLATION_CONTEXT "MediaPlayer-NetworkStream"
21
22
23enum  {
24	M_OPEN_URL = 'NSOP',
25	M_CANCEL = 'NSCN'
26};
27
28
29NetworkStreamWin::NetworkStreamWin(BMessenger target)
30	:
31	BWindow(BRect(0, 0, 300, 100), B_TRANSLATE("Open network stream"),
32		B_MODAL_WINDOW, B_NOT_RESIZABLE),
33	fTarget(target)
34{
35	fTextControl = new BTextControl("InputControl",
36		B_TRANSLATE("Stream URL:"), NULL, NULL);
37
38	BLayoutBuilder::Group<>(this, B_VERTICAL)
39		.SetInsets(B_USE_HALF_ITEM_INSETS)
40		.Add(fTextControl)
41		.AddGroup(B_HORIZONTAL)
42			.AddGlue()
43			.Add(new BButton(B_TRANSLATE("OK"), new BMessage(M_OPEN_URL)))
44			.Add(new BButton(B_TRANSLATE("Cancel"), new BMessage(M_CANCEL)))
45		.End()
46	.End();
47
48	_LookIntoClipboardForUrl();
49
50	CenterOnScreen();
51}
52
53
54NetworkStreamWin::~NetworkStreamWin()
55{
56}
57
58
59void
60NetworkStreamWin::MessageReceived(BMessage* message)
61{
62	switch(message->what) {
63		case M_OPEN_URL:
64		{
65			BUrl url(fTextControl->Text());
66			if (!url.IsValid()) {
67				BAlert* alert = new BAlert(B_TRANSLATE("Bad URL"),
68					B_TRANSLATE("Invalid URL inserted!"),
69						B_TRANSLATE("OK"));
70					alert->Go();
71				return;
72			}
73
74			BMessage archivedUrl;
75			url.Archive(&archivedUrl);
76
77			BMessage msg(M_URL_RECEIVED);
78			msg.AddMessage("mediaplayer:url", &archivedUrl);
79			fTarget.SendMessage(&msg);
80
81			Quit();
82			break;
83		}
84
85		case M_CANCEL:
86			Quit();
87			break;
88
89		case B_KEY_DOWN:
90		{
91			int8 key;
92			if (message->FindInt8("byte", &key) == B_OK
93					&& key == B_ENTER) {
94				PostMessage(M_OPEN_URL);
95				break;
96			}
97		}
98
99		default:
100			BWindow::MessageReceived(message);
101	}
102}
103
104
105void
106NetworkStreamWin::WindowActivated(bool active)
107{
108	if (active)
109		_LookIntoClipboardForUrl();
110}
111
112
113void
114NetworkStreamWin::_LookIntoClipboardForUrl()
115{
116	// Don't do anything if we already have something
117	// set to avoid annoying the user.
118	if (fTextControl->TextView()->TextLength() > 0)
119		return;
120
121	// Let's see if we already have an url in the clipboard
122	// in that case avoid the user to paste it.
123	if (be_clipboard->Lock()) {
124		char* text = NULL;
125		ssize_t textLen = 0;
126
127		BMessage* data = be_clipboard->Data();
128		if (data->FindData("text/plain", B_MIME_TYPE,
129				(const void **)&text, &textLen) == B_OK) {
130
131			// NOTE: This is done because urls copied
132			// from WebPositive have the mime string at
133			// the end.
134			// TODO: Looks like a problem in Web+, should
135			// be fixed.
136			text[textLen] = '\0';
137
138			// Before to set the text let's see if it's really
139			// a valid URL.
140			BUrl url(text);
141			if (url.IsValid())
142				fTextControl->SetText(text);
143		}
144
145		be_clipboard->Unlock();
146	}
147}
148