* modules/gui/skins/src/*: oops, forgot to add a bunch of files.
[vlc.git] / modules / gui / skins / src / dialogs.cpp
1 /*****************************************************************************\r
2  * dialogs.cpp: Handles all the different dialog boxes we provide.\r
3  *****************************************************************************\r
4  * Copyright (C) 2003 VideoLAN\r
5  * $Id: dialogs.cpp,v 1.1 2003/06/03 22:20:00 gbazin Exp $\r
6  *\r
7  * Authors: Olivier Teulière <ipkiss@via.ecp.fr>\r
8  *          Emmanuel Puig    <karibu@via.ecp.fr>\r
9  *\r
10  * This program is free software; you can redistribute it and/or modify\r
11  * it under the terms of the GNU General Public License as published by\r
12  * the Free Software Foundation; either version 2 of the License, or\r
13  * (at your option) any later version.\r
14  *\r
15  * This program is distributed in the hope that it will be useful,\r
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
18  * GNU General Public License for more details.\r
19  *\r
20  * You should have received a copy of the GNU General Public License\r
21  * along with this program; if not, write to the Free Software\r
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111,\r
23  * USA.\r
24  *****************************************************************************/\r
25 \r
26 //--- VLC -------------------------------------------------------------------\r
27 #include <vlc/vlc.h>\r
28 #include <vlc/intf.h>\r
29 \r
30 //--- SKIN ------------------------------------------------------------------\r
31 #include "../os_api.h"\r
32 #include "event.h"\r
33 #include "banks.h"\r
34 #include "theme.h"\r
35 #include "../os_theme.h"\r
36 #include "themeloader.h"\r
37 #include "window.h"\r
38 #include "vlcproc.h"\r
39 #include "skin_common.h"\r
40 #include "dialogs.h"\r
41 \r
42 #ifdef BASIC_SKINS\r
43 \r
44 // Constructor\r
45 Dialogs::Dialogs( intf_thread_t *_p_intf ){}\r
46 // Destructor\r
47 Dialogs::~Dialogs(){}\r
48 \r
49 void Dialogs::ShowOpen( bool b_play ){}\r
50 void Dialogs::ShowMessages(){}\r
51 void Dialogs::ShowPrefs(){}\r
52 void Dialogs::ShowFileInfo(){}\r
53 \r
54 #else // BASIC_SKINS\r
55 \r
56 #include "../../wxwindows/wxwindows.h"\r
57 #include "share/vlc32x32.xpm"       // include the graphic icon\r
58 \r
59 #define ShowOpen_Event     0\r
60 #define ShowMessages_Event 1\r
61 #define ShowPrefs_Event    2\r
62 #define ShowFileInfo_Event 3\r
63 #define ExitThread_Event   99\r
64 \r
65 //---------------------------------------------------------------------------\r
66 // Local classes declarations.\r
67 //---------------------------------------------------------------------------\r
68 \r
69 DEFINE_EVENT_TYPE(wxEVT_DIALOG)\r
70 \r
71 class Instance: public wxApp\r
72 {\r
73 public:\r
74     Instance();\r
75 #ifdef GTK2_SKINS\r
76     Instance( intf_thread_t *_p_intf, CallBackObjects *callback );\r
77 #else\r
78     Instance( intf_thread_t *_p_intf );\r
79 #endif\r
80 \r
81     bool OnInit();\r
82     int  OnExit();\r
83 \r
84 private:\r
85     intf_thread_t *p_intf;\r
86 \r
87 #ifdef GTK2_SKINS\r
88     CallBackObjects *callbackobj;\r
89 #endif\r
90 \r
91     DECLARE_EVENT_TABLE();\r
92 };\r
93 \r
94 BEGIN_EVENT_TABLE(Instance, wxApp)\r
95     EVT_COMMAND(ShowOpen_Event, wxEVT_DIALOG, Dialogs::OnShowOpen)\r
96     EVT_COMMAND(ShowMessages_Event, wxEVT_DIALOG, Dialogs::OnShowMessages)\r
97     EVT_COMMAND(ShowPrefs_Event, wxEVT_DIALOG, Dialogs::OnShowPrefs)\r
98     EVT_COMMAND(ShowFileInfo_Event, wxEVT_DIALOG, Dialogs::OnShowFileInfo)\r
99     EVT_COMMAND(ExitThread_Event, wxEVT_DIALOG, Dialogs::OnExitThread)\r
100 END_EVENT_TABLE()\r
101 \r
102 //---------------------------------------------------------------------------\r
103 // Implementation of Instance class\r
104 //---------------------------------------------------------------------------\r
105 Instance::Instance( )\r
106 {\r
107 }\r
108 \r
109 #ifdef GTK2_SKINS\r
110 Instance::Instance( intf_thread_t *_p_intf, CallBackObjects *callback )\r
111 {\r
112     // Initialization\r
113     p_intf = _p_intf;\r
114     callbackobj = callback;\r
115 }\r
116 #else\r
117 Instance::Instance( intf_thread_t *_p_intf )\r
118 {\r
119     // Initialization\r
120     p_intf = _p_intf;\r
121 }\r
122 #endif\r
123 \r
124 IMPLEMENT_APP_NO_MAIN(Instance)\r
125 \r
126 bool Instance::OnInit()\r
127 {\r
128     p_intf->p_sys->p_icon = new wxIcon( vlc_xpm );\r
129 \r
130 #ifdef GTK2_SKINS\r
131     // Set event callback. Yes, it's a big hack ;)\r
132     gdk_event_handler_set( GTK2Proc, (gpointer)callbackobj, NULL );\r
133 #endif\r
134 \r
135     // Create all the dialog boxes\r
136     p_intf->p_sys->p_dialogs->OpenDlg =\r
137         new OpenDialog( p_intf, NULL, FILE_ACCESS );\r
138     p_intf->p_sys->p_dialogs->MessagesDlg = new Messages( p_intf, NULL );\r
139     p_intf->p_sys->p_dialogs->PrefsDlg = new PrefsDialog( p_intf, NULL );\r
140     p_intf->p_sys->p_dialogs->FileInfoDlg = new FileInfo( p_intf, NULL );\r
141 \r
142 #ifdef GTK2_SKINS\r
143     // Add timer\r
144     g_timeout_add( 200, (GSourceFunc)RefreshTimer, (gpointer)p_intf );\r
145 #endif\r
146 \r
147     // OK, initialization is over, now the other thread can go on working...\r
148     vlc_thread_ready( p_intf );\r
149 \r
150     return TRUE;\r
151 }\r
152 \r
153 int Instance::OnExit()\r
154 {\r
155     // Delete evertything\r
156     delete p_intf->p_sys->p_dialogs->FileInfoDlg;\r
157     delete p_intf->p_sys->p_dialogs->PrefsDlg;\r
158     delete p_intf->p_sys->p_dialogs->MessagesDlg;\r
159     delete p_intf->p_sys->p_dialogs->OpenDlg;\r
160     delete p_intf->p_sys->p_icon;\r
161 \r
162     return 0;\r
163 }\r
164 \r
165 //---------------------------------------------------------------------------\r
166 #if !defined(__BUILTIN__) && defined( WIN32 )\r
167 HINSTANCE hInstance = 0;\r
168 extern "C" BOOL WINAPI\r
169 DllMain (HANDLE hModule, DWORD fdwReason, LPVOID lpReserved)\r
170 {\r
171     hInstance = (HINSTANCE)hModule;\r
172     return TRUE;\r
173 }\r
174 #endif\r
175 \r
176 //---------------------------------------------------------------------------\r
177 // Thread callback\r
178 // We create all wxWindows dialogs in a separate thread because we don't want\r
179 // any interaction with our own message loop\r
180 //---------------------------------------------------------------------------\r
181 void SkinsDialogsThread( intf_thread_t *p_intf )\r
182 {\r
183 #if !defined( WIN32 )\r
184     static char  *p_args[] = { "" };\r
185 #endif\r
186 \r
187     /* Hack to pass the p_intf pointer to the new wxWindow Instance object */\r
188     wxTheApp = new Instance( p_intf );\r
189 \r
190 #if defined( WIN32 )\r
191 #if !defined(__BUILTIN__)\r
192     wxEntry( hInstance/*GetModuleHandle(NULL)*/, NULL, NULL, SW_SHOW, TRUE );\r
193 #else\r
194     wxEntry( GetModuleHandle( NULL ), NULL, NULL, SW_SHOW, TRUE );\r
195 #endif\r
196 #else\r
197     wxEntry( 1, p_args );\r
198 #endif\r
199 \r
200     return;\r
201 }\r
202 \r
203 //---------------------------------------------------------------------------\r
204 // Implementation of Dialogs class\r
205 //---------------------------------------------------------------------------\r
206 Dialogs::Dialogs( intf_thread_t *_p_intf )\r
207 {\r
208     p_intf = _p_intf;\r
209     p_intf->p_sys->p_dialogs = this;\r
210 \r
211     // Create a new thread for wxWindows\r
212     if( vlc_thread_create( p_intf, "Skins Dialogs Thread", SkinsDialogsThread,\r
213                            0, VLC_TRUE ) )\r
214     {\r
215         OpenDlg = NULL;\r
216         msg_Err( p_intf, "cannot create SkinsDialogsThread" );\r
217     }\r
218 }\r
219 \r
220 Dialogs::~Dialogs()\r
221 {\r
222     wxCommandEvent event( wxEVT_DIALOG, ExitThread_Event );\r
223     event.SetClientData( this );\r
224 \r
225     wxTheApp->AddPendingEvent( event );\r
226 \r
227     vlc_thread_join( p_intf ); //FIXME, use own vlc_object\r
228 }\r
229 \r
230 void Dialogs::ShowOpen( bool b_play )\r
231 {\r
232     wxCommandEvent event( wxEVT_DIALOG, ShowOpen_Event );\r
233     event.SetClientData( this );\r
234     event.SetInt( b_play );\r
235 \r
236     wxTheApp->AddPendingEvent( event );\r
237 }\r
238 \r
239 void Dialogs::ShowMessages()\r
240 {\r
241     wxCommandEvent event( wxEVT_DIALOG, ShowMessages_Event );\r
242     event.SetClientData( this );\r
243 \r
244     wxTheApp->AddPendingEvent( event );\r
245 }\r
246 \r
247 void Dialogs::ShowPrefs()\r
248 {\r
249     wxCommandEvent event( wxEVT_DIALOG, ShowPrefs_Event );\r
250     event.SetClientData( this );\r
251 \r
252     wxTheApp->AddPendingEvent( event );\r
253 }\r
254 \r
255 void Dialogs::ShowFileInfo()\r
256 {\r
257     wxCommandEvent event( wxEVT_DIALOG, ShowFileInfo_Event );\r
258     event.SetClientData( this );\r
259 \r
260     wxTheApp->AddPendingEvent( event );\r
261 }\r
262 \r
263 void Dialogs::OnShowOpen( wxCommandEvent& event )\r
264 {\r
265     Dialogs *p_dialogs = (Dialogs *)event.GetClientData();\r
266     bool b_play = event.GetInt() ? TRUE : FALSE;\r
267 \r
268     //p_dialogs->OpenDlg->Show( !p_dialogs->OpenDlg->IsShown() );\r
269  \r
270     if( p_dialogs->OpenDlg->ShowModal() != wxID_OK )\r
271     {\r
272         return;\r
273     }\r
274 \r
275     // Check if playlist is available\r
276     playlist_t *p_playlist = p_dialogs->p_intf->p_sys->p_playlist;\r
277     if( p_playlist == NULL )\r
278     {\r
279         return;\r
280     }\r
281 \r
282     if( b_play )\r
283     {\r
284         // Append and play\r
285         for( size_t i = 0; i < p_dialogs->OpenDlg->mrl.GetCount(); i++ )\r
286         {\r
287             playlist_Add( p_playlist,\r
288                 (const char *)p_dialogs->OpenDlg->mrl[i].mb_str(),\r
289                 PLAYLIST_APPEND | (i ? 0 : PLAYLIST_GO), PLAYLIST_END );\r
290         }\r
291         p_dialogs->p_intf->p_sys->p_theme->EvtBank->Get( "play" )->SendEvent();\r
292     }\r
293     else\r
294     {\r
295         // Append only\r
296         for( size_t i = 0; i < p_dialogs->OpenDlg->mrl.GetCount(); i++ )\r
297         {\r
298             playlist_Add( p_playlist,\r
299                 (const char *)p_dialogs->OpenDlg->mrl[i].mb_str(),\r
300                 PLAYLIST_APPEND, PLAYLIST_END );\r
301         }\r
302     }\r
303 \r
304     // Refresh interface !\r
305     p_dialogs->p_intf->p_sys->p_theme->EvtBank->Get( "playlist_refresh" )\r
306         ->PostSynchroMessage();\r
307 \r
308     return;\r
309 }\r
310 \r
311 void Dialogs::OnShowMessages( wxCommandEvent& event )\r
312 {\r
313     Dialogs *p_dialogs = (Dialogs *)event.GetClientData();\r
314     p_dialogs->MessagesDlg->Show( !p_dialogs->MessagesDlg->IsShown() );\r
315 }\r
316 \r
317 void Dialogs::OnShowPrefs( wxCommandEvent& event )\r
318 {\r
319     Dialogs *p_dialogs = (Dialogs *)event.GetClientData();\r
320     p_dialogs->PrefsDlg->Show( !p_dialogs->PrefsDlg->IsShown() );\r
321 }\r
322 \r
323 void Dialogs::OnShowFileInfo( wxCommandEvent& event )\r
324 {\r
325     Dialogs *p_dialogs = (Dialogs *)event.GetClientData();\r
326     p_dialogs->FileInfoDlg->Show( !p_dialogs->FileInfoDlg->IsShown() );\r
327 }\r
328 \r
329 void Dialogs::OnExitThread( wxCommandEvent& event )\r
330 {\r
331     wxTheApp->ExitMainLoop();\r
332 }\r
333 #endif // BASIC_SKINS\r