xref: /haiku/src/add-ons/print/transports/print_to_file/FileSelector.cpp (revision 7120e97489acbf17d86d3f33e3b2e68974fd4b23)
1 #include <stdio.h>
2 
3 #include <InterfaceKit.h>
4 
5 #include "FileSelector.h"
6 
7 FileSelector::FileSelector(void)
8 	: BWindow(BRect(0,0,320,160), "printtofile", B_TITLED_WINDOW,
9 	B_NOT_ZOOMABLE, B_CURRENT_WORKSPACE)
10 {
11 	m_exit_sem 		= create_sem(0, "FileSelector");
12 	m_result 		= B_ERROR;
13 	m_save_panel 	= NULL;
14 }
15 
16 FileSelector::~FileSelector()
17 {
18 	delete m_save_panel;
19 	delete_sem(m_exit_sem);
20 }
21 
22 
23 bool FileSelector::QuitRequested()
24 {
25 	release_sem(m_exit_sem);
26 	return true;
27 }
28 
29 
30 void FileSelector::MessageReceived(BMessage * msg)
31 {
32 	switch (msg->what)
33 		{
34 		case START_MSG:
35 			m_save_panel = new BFilePanel(B_SAVE_PANEL,
36 							new BMessenger(this), NULL, 0, false);
37 
38 			m_save_panel->Window()->SetWorkspaces(B_CURRENT_WORKSPACE);
39 			m_save_panel->Show();
40 			break;
41 
42 		case B_SAVE_REQUESTED:
43 			{
44 			entry_ref 		dir;
45 
46 			if ( msg->FindRef("directory", &dir) == B_OK)
47 				{
48 				const char *	name;
49 
50 				BDirectory bdir(&dir);
51 				if ( msg->FindString("name", &name) == B_OK)
52 					{
53 					if ( name != NULL )
54 						m_result = m_entry.SetTo(&bdir, name);
55 					};
56 				};
57 
58 			release_sem(m_exit_sem);
59 			break;
60 			};
61 
62 		case B_CANCEL:
63 			release_sem(m_exit_sem);
64 			break;
65 
66 		default:
67 			inherited::MessageReceived(msg);
68 			break;
69 		};
70 }
71 
72 
73 status_t FileSelector::Go(entry_ref * ref)
74 {
75 	MoveTo(300,300);
76 	Hide();
77 	Show();
78 	PostMessage(START_MSG);
79 	acquire_sem(m_exit_sem);
80 
81 	if ( m_result == B_OK && ref)
82 		m_result = m_entry.GetRef(ref);
83 
84 	Lock();
85 	Quit();
86 
87 	return m_result;
88 }
89 
90 
91 
92