14b7da592SKarsten Heimrich/*
24b7da592SKarsten Heimrich * Copyright 2008 Haiku Inc. All rights reserved.
34b7da592SKarsten Heimrich * Distributed under the terms of the MIT License.
44b7da592SKarsten Heimrich *
54b7da592SKarsten Heimrich * Authors:
64b7da592SKarsten Heimrich *		Julun, <host.haiku@gmx.de
74b7da592SKarsten Heimrich */
84b7da592SKarsten Heimrich
94b7da592SKarsten Heimrich#include <PrintPanel.h>
104b7da592SKarsten Heimrich
114b7da592SKarsten Heimrich#include <Button.h>
124b7da592SKarsten Heimrich#include <GroupLayoutBuilder.h>
134b7da592SKarsten Heimrich#include <GroupView.h>
144b7da592SKarsten Heimrich#include <Screen.h>
154b7da592SKarsten Heimrich
164b7da592SKarsten Heimrich
174b7da592SKarsten Heimrichnamespace BPrivate {
184b7da592SKarsten Heimrich	namespace Print {
194b7da592SKarsten Heimrich
204b7da592SKarsten Heimrich
214b7da592SKarsten Heimrich// #pragma mark -- _BPrintPanelFilter_
224b7da592SKarsten Heimrich
234b7da592SKarsten Heimrich
244b7da592SKarsten HeimrichBPrintPanel::_BPrintPanelFilter_::_BPrintPanelFilter_(BPrintPanel* panel)
254b7da592SKarsten Heimrich	: BMessageFilter(B_KEY_DOWN)
264b7da592SKarsten Heimrich	, fPrintPanel(panel)
274b7da592SKarsten Heimrich{
284b7da592SKarsten Heimrich}
294b7da592SKarsten Heimrich
304b7da592SKarsten Heimrich
314b7da592SKarsten Heimrichfilter_result
324b7da592SKarsten HeimrichBPrintPanel::_BPrintPanelFilter_::Filter(BMessage* msg, BHandler** target)
334b7da592SKarsten Heimrich{
344b7da592SKarsten Heimrich	int32 key;
354b7da592SKarsten Heimrich	filter_result result = B_DISPATCH_MESSAGE;
364b7da592SKarsten Heimrich	if (msg->FindInt32("key", &key) == B_OK && key == 1) {
374b7da592SKarsten Heimrich		fPrintPanel->PostMessage(B_QUIT_REQUESTED);
384b7da592SKarsten Heimrich		result = B_SKIP_MESSAGE;
394b7da592SKarsten Heimrich	}
404b7da592SKarsten Heimrich	return result;
414b7da592SKarsten Heimrich}
424b7da592SKarsten Heimrich
434b7da592SKarsten Heimrich
444b7da592SKarsten Heimrich// #pragma mark -- BPrintPanel
454b7da592SKarsten Heimrich
464b7da592SKarsten Heimrich
474b7da592SKarsten HeimrichBPrintPanel::BPrintPanel(const BString& title)
484b7da592SKarsten Heimrich	: BWindow(BRect(0, 0, 640, 480), title.String(), B_TITLED_WINDOW_LOOK,
494b7da592SKarsten Heimrich		B_MODAL_APP_WINDOW_FEEL, B_NOT_ZOOMABLE | B_NOT_RESIZABLE |
504b7da592SKarsten Heimrich		B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE)
514b7da592SKarsten Heimrich	, fPanel(new BGroupView)
524b7da592SKarsten Heimrich	, fPrintPanelSem(-1)
534b7da592SKarsten Heimrich	, fPrintPanelResult(B_CANCEL)
544b7da592SKarsten Heimrich{
554b7da592SKarsten Heimrich	BButton* ok = new BButton("OK", new BMessage('_ok_'));
564b7da592SKarsten Heimrich	BButton* cancel = new BButton("Cancel", new BMessage('_cl_'));
574b7da592SKarsten Heimrich
584b7da592SKarsten Heimrich	BGroupLayout *layout = new BGroupLayout(B_HORIZONTAL);
594b7da592SKarsten Heimrich	SetLayout(layout);
604b7da592SKarsten Heimrich
614b7da592SKarsten Heimrich	AddChild(BGroupLayoutBuilder(B_VERTICAL, 10.0)
624b7da592SKarsten Heimrich			.Add(fPanel)
634b7da592SKarsten Heimrich			.Add(BGroupLayoutBuilder(B_HORIZONTAL, 10.0)
644b7da592SKarsten Heimrich				.AddGlue()
654b7da592SKarsten Heimrich				.Add(cancel)
664b7da592SKarsten Heimrich				.Add(ok)
674b7da592SKarsten Heimrich				.SetInsets(0.0, 0.0, 0.0, 0.0))
684b7da592SKarsten Heimrich			.SetInsets(10.0, 10.0, 10.0, 10.0)
694b7da592SKarsten Heimrich		);
704b7da592SKarsten Heimrich
714b7da592SKarsten Heimrich	ok->MakeDefault(true);
724b7da592SKarsten Heimrich	AddCommonFilter(new _BPrintPanelFilter_(this));
734b7da592SKarsten Heimrich}
744b7da592SKarsten Heimrich
754b7da592SKarsten Heimrich
764b7da592SKarsten HeimrichBPrintPanel::~BPrintPanel()
774b7da592SKarsten Heimrich{
784b7da592SKarsten Heimrich	if (fPrintPanelSem > 0)
794b7da592SKarsten Heimrich		delete_sem(fPrintPanelSem);
804b7da592SKarsten Heimrich}
814b7da592SKarsten Heimrich
824b7da592SKarsten Heimrich
834b7da592SKarsten HeimrichBPrintPanel::BPrintPanel(BMessage* data)
844b7da592SKarsten Heimrich	: BWindow(data)
854b7da592SKarsten Heimrich{
864b7da592SKarsten Heimrich	// TODO: implement
874b7da592SKarsten Heimrich}
884b7da592SKarsten Heimrich
894b7da592SKarsten Heimrich
904b7da592SKarsten HeimrichBArchivable*
914b7da592SKarsten HeimrichBPrintPanel::Instantiate(BMessage* data)
924b7da592SKarsten Heimrich{
934b7da592SKarsten Heimrich	// TODO: implement
944b7da592SKarsten Heimrich	return NULL;
954b7da592SKarsten Heimrich}
964b7da592SKarsten Heimrich
974b7da592SKarsten Heimrich
984b7da592SKarsten Heimrichstatus_t
994b7da592SKarsten HeimrichBPrintPanel::Archive(BMessage* data, bool deep) const
1004b7da592SKarsten Heimrich{
1014b7da592SKarsten Heimrich	// TODO: implement
1024b7da592SKarsten Heimrich	return B_ERROR;
1034b7da592SKarsten Heimrich}
1044b7da592SKarsten Heimrich
1054b7da592SKarsten Heimrich
1064b7da592SKarsten HeimrichBView*
1074b7da592SKarsten HeimrichBPrintPanel::Panel() const
1084b7da592SKarsten Heimrich{
1094b7da592SKarsten Heimrich	return fPanel->ChildAt(0);
1104b7da592SKarsten Heimrich}
1114b7da592SKarsten Heimrich
1124b7da592SKarsten Heimrich
1134b7da592SKarsten Heimrichvoid
1144b7da592SKarsten HeimrichBPrintPanel::AddPanel(BView* panel)
1154b7da592SKarsten Heimrich{
1164b7da592SKarsten Heimrich	BView* child = Panel();
1174b7da592SKarsten Heimrich	if (child) {
1184b7da592SKarsten Heimrich		RemovePanel(child);
1194b7da592SKarsten Heimrich		delete child;
1204b7da592SKarsten Heimrich	}
1214b7da592SKarsten Heimrich
1224b7da592SKarsten Heimrich	fPanel->AddChild(panel);
1234b7da592SKarsten Heimrich
1244b7da592SKarsten Heimrich	BSize size = GetLayout()->PreferredSize();
1254b7da592SKarsten Heimrich	ResizeTo(size.Width(), size.Height());
1264b7da592SKarsten Heimrich}
1274b7da592SKarsten Heimrich
1284b7da592SKarsten Heimrich
1294b7da592SKarsten Heimrichbool
1304b7da592SKarsten HeimrichBPrintPanel::RemovePanel(BView* child)
1314b7da592SKarsten Heimrich{
1324b7da592SKarsten Heimrich	BView* panel = Panel();
1334b7da592SKarsten Heimrich	if (child == panel)
1344b7da592SKarsten Heimrich		return fPanel->RemoveChild(child);
1354b7da592SKarsten Heimrich
1364b7da592SKarsten Heimrich	return false;
1374b7da592SKarsten Heimrich}
1384b7da592SKarsten Heimrich
1394b7da592SKarsten Heimrich
1404b7da592SKarsten Heimrichvoid
1414b7da592SKarsten HeimrichBPrintPanel::MessageReceived(BMessage* message)
1424b7da592SKarsten Heimrich{
1434b7da592SKarsten Heimrich	switch (message->what) {
1444b7da592SKarsten Heimrich		case '_ok_': {
1454b7da592SKarsten Heimrich			fPrintPanelResult = B_OK;
1464b7da592SKarsten Heimrich
1474b7da592SKarsten Heimrich		// fall through
1484b7da592SKarsten Heimrich		case '_cl_':
1494b7da592SKarsten Heimrich			delete_sem(fPrintPanelSem);
1504b7da592SKarsten Heimrich			fPrintPanelSem = -1;
1514b7da592SKarsten Heimrich		}	break;
1524b7da592SKarsten Heimrich
1534b7da592SKarsten Heimrich		default:
1544b7da592SKarsten Heimrich			BWindow::MessageReceived(message);
1554b7da592SKarsten Heimrich	}
1564b7da592SKarsten Heimrich}
1574b7da592SKarsten Heimrich
1584b7da592SKarsten Heimrich
1594b7da592SKarsten Heimrichvoid
1604b7da592SKarsten HeimrichBPrintPanel::FrameResized(float newWidth, float newHeight)
1614b7da592SKarsten Heimrich{
1624b7da592SKarsten Heimrich	BWindow::FrameResized(newWidth, newHeight);
1634b7da592SKarsten Heimrich}
1644b7da592SKarsten Heimrich
1654b7da592SKarsten Heimrich
1664b7da592SKarsten HeimrichBHandler*
1674b7da592SKarsten HeimrichBPrintPanel::ResolveSpecifier(BMessage* message, int32 index, BMessage* specifier,
1684b7da592SKarsten Heimrich	int32 form, const char* property)
1694b7da592SKarsten Heimrich{
1704b7da592SKarsten Heimrich	return BWindow::ResolveSpecifier(message, index, specifier, form, property);
1714b7da592SKarsten Heimrich}
1724b7da592SKarsten Heimrich
1734b7da592SKarsten Heimrich
1744b7da592SKarsten Heimrichstatus_t
1754b7da592SKarsten HeimrichBPrintPanel::GetSupportedSuites(BMessage* data)
1764b7da592SKarsten Heimrich{
1774b7da592SKarsten Heimrich	return BWindow::GetSupportedSuites(data);
1784b7da592SKarsten Heimrich}
1794b7da592SKarsten Heimrich
1804b7da592SKarsten Heimrich
1814b7da592SKarsten Heimrichstatus_t
1824b7da592SKarsten HeimrichBPrintPanel::Perform(perform_code d, void* arg)
1834b7da592SKarsten Heimrich{
1844b7da592SKarsten Heimrich	return BWindow::Perform(d, arg);
1854b7da592SKarsten Heimrich}
1864b7da592SKarsten Heimrich
1874b7da592SKarsten Heimrich
1884b7da592SKarsten Heimrichvoid
1894b7da592SKarsten HeimrichBPrintPanel::Quit()
1904b7da592SKarsten Heimrich{
1914b7da592SKarsten Heimrich	BWindow::Quit();
1924b7da592SKarsten Heimrich}
1934b7da592SKarsten Heimrich
1944b7da592SKarsten Heimrich
1954b7da592SKarsten Heimrichbool
1964b7da592SKarsten HeimrichBPrintPanel::QuitRequested()
1974b7da592SKarsten Heimrich{
1984b7da592SKarsten Heimrich	return BWindow::QuitRequested();
1994b7da592SKarsten Heimrich}
2004b7da592SKarsten Heimrich
2014b7da592SKarsten Heimrich
2024b7da592SKarsten Heimrichvoid
2034b7da592SKarsten HeimrichBPrintPanel::DispatchMessage(BMessage* message, BHandler* handler)
2044b7da592SKarsten Heimrich{
2054b7da592SKarsten Heimrich	BWindow::DispatchMessage(message, handler);
2064b7da592SKarsten Heimrich}
2074b7da592SKarsten Heimrich
2084b7da592SKarsten Heimrich
2094b7da592SKarsten Heimrichstatus_t
2104b7da592SKarsten HeimrichBPrintPanel::ShowPanel()
2114b7da592SKarsten Heimrich{
2124b7da592SKarsten Heimrich	fPrintPanelSem = create_sem(0, "PrintPanel");
2134b7da592SKarsten Heimrich	if (fPrintPanelSem < 0) {
2144b7da592SKarsten Heimrich		Quit();
2154b7da592SKarsten Heimrich		return B_CANCEL;
2164b7da592SKarsten Heimrich	}
2174b7da592SKarsten Heimrich
2184b7da592SKarsten Heimrich	BWindow* window = dynamic_cast<BWindow*> (BLooper::LooperForThread(find_thread(NULL)));
2194b7da592SKarsten Heimrich
2204b7da592SKarsten Heimrich	{
2214b7da592SKarsten Heimrich		BRect bounds(Bounds());
2224b7da592SKarsten Heimrich		BRect frame(BScreen(B_MAIN_SCREEN_ID).Frame());
2234b7da592SKarsten Heimrich		MoveTo((frame.Width() - bounds.Width()) / 2.0,
2244b7da592SKarsten Heimrich			(frame.Height() - bounds.Height()) / 2.0);
2254b7da592SKarsten Heimrich	}
2264b7da592SKarsten Heimrich
2274b7da592SKarsten Heimrich	Show();
2284b7da592SKarsten Heimrich
2294b7da592SKarsten Heimrich	if (window) {
2304b7da592SKarsten Heimrich		status_t err;
2314b7da592SKarsten Heimrich		while (true) {
2324b7da592SKarsten Heimrich			do {
2334b7da592SKarsten Heimrich				err = acquire_sem_etc(fPrintPanelSem, 1, B_RELATIVE_TIMEOUT, 50000);
2344b7da592SKarsten Heimrich			} while (err == B_INTERRUPTED);
2354b7da592SKarsten Heimrich
2364b7da592SKarsten Heimrich			if (err == B_BAD_SEM_ID)
2374b7da592SKarsten Heimrich				break;
2384b7da592SKarsten Heimrich			window->UpdateIfNeeded();
2394b7da592SKarsten Heimrich		}
2404b7da592SKarsten Heimrich	} else {
2414b7da592SKarsten Heimrich		while (acquire_sem(fPrintPanelSem) == B_INTERRUPTED) {}
2424b7da592SKarsten Heimrich	}
2434b7da592SKarsten Heimrich
2444b7da592SKarsten Heimrich	return fPrintPanelResult;
2454b7da592SKarsten Heimrich}
2464b7da592SKarsten Heimrich
2474b7da592SKarsten Heimrich
2484b7da592SKarsten Heimrichvoid
2494b7da592SKarsten HeimrichBPrintPanel::AddChild(BView* child, BView* before)
2504b7da592SKarsten Heimrich{
2514b7da592SKarsten Heimrich	BWindow::AddChild(child, before);
2524b7da592SKarsten Heimrich}
2534b7da592SKarsten Heimrich
2544b7da592SKarsten Heimrich
2554b7da592SKarsten Heimrichbool
2564b7da592SKarsten HeimrichBPrintPanel::RemoveChild(BView* child)
2574b7da592SKarsten Heimrich{
2584b7da592SKarsten Heimrich	return BWindow::RemoveChild(child);
2594b7da592SKarsten Heimrich}
2604b7da592SKarsten Heimrich
2614b7da592SKarsten Heimrich
2624b7da592SKarsten HeimrichBView*
2634b7da592SKarsten HeimrichBPrintPanel::ChildAt(int32 index) const
2644b7da592SKarsten Heimrich{
2654b7da592SKarsten Heimrich	return BWindow::ChildAt(index);
2664b7da592SKarsten Heimrich}
2674b7da592SKarsten Heimrich
2684b7da592SKarsten Heimrich
2694b7da592SKarsten Heimrichvoid BPrintPanel::_ReservedBPrintPanel1() {}
2704b7da592SKarsten Heimrichvoid BPrintPanel::_ReservedBPrintPanel2() {}
2714b7da592SKarsten Heimrichvoid BPrintPanel::_ReservedBPrintPanel3() {}
2724b7da592SKarsten Heimrichvoid BPrintPanel::_ReservedBPrintPanel4() {}
2734b7da592SKarsten Heimrichvoid BPrintPanel::_ReservedBPrintPanel5() {}
2744b7da592SKarsten Heimrich
2754b7da592SKarsten Heimrich
2764b7da592SKarsten Heimrich	}	// namespace Print
2774b7da592SKarsten Heimrich}	// namespace BPrivate
278