* modules/gui/wxwindows/*: the wxWindows plugin is now UNICODE happy.
[vlc.git] / modules / gui / wxwindows / wxwindows.h
1 /*****************************************************************************
2  * wxwindows.h: private wxWindows interface description
3  *****************************************************************************
4  * Copyright (C) 1999, 2000 VideoLAN
5  * $Id: wxwindows.h,v 1.22 2003/05/11 13:22:23 gbazin Exp $
6  *
7  * Authors: Gildas Bazin <gbazin@netcourrier.com>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
22  *****************************************************************************/
23
24 #include <wx/listctrl.h>
25 #include <wx/textctrl.h>
26 #include <wx/notebook.h>
27 #include <wx/spinctrl.h>
28 #include <wx/dnd.h>
29 #include <wx/treectrl.h>
30
31 class Playlist;
32 class Messages;
33 class FileInfo;
34
35 #define SLIDER_MAX_POS 10000
36
37 /* wxU is used to convert ansi strings to unicode strings (wchar_t) */
38 #if wxUSE_UNICODE
39 #   define wxU(ansi) wxString(ansi, *wxConvCurrent)
40 #else
41 #   define wxU(ansi) ansi
42 #endif
43
44 /*****************************************************************************
45  * intf_sys_t: description and status of wxwindows interface
46  *****************************************************************************/
47 struct intf_sys_t
48 {
49     /* the wx parent window */
50     wxWindow            *p_wxwindow;
51     wxIcon              *p_icon;
52
53     /* secondary windows */
54     Playlist            *p_playlist_window;
55     Messages            *p_messages_window;
56     FileInfo            *p_fileinfo_window;
57
58     /* special actions */
59     vlc_bool_t          b_playing;
60     vlc_bool_t          b_popup_changed;                   /* display menu ? */
61     vlc_bool_t          b_window_changed;        /* window display toggled ? */
62     vlc_bool_t          b_playlist_changed;    /* playlist display toggled ? */
63     vlc_bool_t          b_slider_free;                      /* slider status */
64
65     /* menus handlers */
66     vlc_bool_t          b_program_update;   /* do we need to update programs
67                                                                         menu */
68     vlc_bool_t          b_title_update;  /* do we need to update title menus */
69     vlc_bool_t          b_chapter_update;            /* do we need to update
70                                                                chapter menus */
71     vlc_bool_t          b_audio_update;  /* do we need to update audio menus */
72     vlc_bool_t          b_spu_update;      /* do we need to update spu menus */
73
74     /* windows and widgets */
75
76     /* The input thread */
77     input_thread_t *    p_input;
78
79     /* The slider */
80     int                 i_slider_pos;                     /* slider position */
81     int                 i_slider_oldpos;                /* previous position */
82
83     /* The messages window */
84     msg_subscription_t* p_sub;                  /* message bank subscription */
85
86     /* Playlist management */
87     int                 i_playing;                 /* playlist selected item */
88
89     /* The window labels for DVD mode */
90     unsigned int        i_part;                           /* current chapter */
91 };
92
93 /*****************************************************************************
94  * Prototypes
95  *****************************************************************************/
96
97 /*****************************************************************************
98  * Classes declarations.
99  *****************************************************************************/
100 class Interface;
101
102 /* Timer */
103 class Timer: public wxTimer
104 {
105 public:
106     /* Constructor */
107     Timer( intf_thread_t *p_intf, Interface *p_main_interface );
108     virtual ~Timer();
109
110     virtual void Notify();
111
112 private:
113     intf_thread_t *p_intf;
114     Interface *p_main_interface;
115     int i_old_playing_status;
116 };
117
118 /* Main Interface */
119 class Interface: public wxFrame
120 {
121 public:
122     /* Constructor */
123     Interface( intf_thread_t *p_intf );
124     virtual ~Interface();
125     void TogglePlayButton( int i_playing_status );
126
127     wxBoxSizer  *frame_sizer;
128     wxStatusBar *statusbar;
129
130     wxSlider    *slider;
131     wxWindow    *slider_frame;
132     wxStaticBox *slider_box;
133
134     wxMenu      *p_popup_menu;
135
136     wxArrayString mrl_history;
137
138 private:
139     void CreateOurMenuBar();
140     void CreateOurToolBar();
141     void CreateOurSlider();
142     void Open( int i_access_method );
143
144     /* Event handlers (these functions should _not_ be virtual) */
145     void OnExit( wxCommandEvent& event );
146     void OnAbout( wxCommandEvent& event );
147     void OnMessages( wxCommandEvent& event );
148     void OnPlaylist( wxCommandEvent& event );
149     void OnLogs( wxCommandEvent& event );
150     void OnFileInfo( wxCommandEvent& event );
151     void OnPreferences( wxCommandEvent& event );
152
153     void OnOpenFile( wxCommandEvent& event );
154     void OnOpenDisc( wxCommandEvent& event );
155     void OnOpenNet( wxCommandEvent& event );
156     void OnOpenSat( wxCommandEvent& event );
157
158     void OnPlayStream( wxCommandEvent& event );
159     void OnStopStream( wxCommandEvent& event );
160     void OnSliderUpdate( wxScrollEvent& event );
161     void OnPrevStream( wxCommandEvent& event );
162     void OnNextStream( wxCommandEvent& event );
163
164     void OnMenuOpen( wxMenuEvent& event );
165
166 #if defined( __WXMSW__ ) || defined( __WXMAC__ )
167     void OnContextMenu(wxContextMenuEvent& event);
168 #else
169     void OnContextMenu(wxMouseEvent& event);
170 #endif
171
172     DECLARE_EVENT_TABLE();
173
174     Timer *timer;
175     intf_thread_t *p_intf;
176
177     wxFrame *p_prefs_dialog;
178
179     int i_old_playing_status;
180
181     /* For auto-generated menus */
182     wxMenu *p_audio_menu;
183     vlc_bool_t b_audio_menu;
184     wxMenu *p_video_menu;
185     vlc_bool_t b_video_menu;
186 };
187
188 /* Open Dialog */
189 class OpenDialog: public wxDialog
190 {
191 public:
192     /* Constructor */
193     OpenDialog( intf_thread_t *p_intf, Interface *p_main_interface,
194                 int i_access_method );
195     virtual ~OpenDialog();
196     void Rebuild();
197     void Manage();
198
199     wxString mrl;
200
201 private:
202     wxPanel *FilePanel( wxWindow* parent );
203     wxPanel *DiscPanel( wxWindow* parent );
204     wxPanel *NetPanel( wxWindow* parent );
205     wxPanel *SatPanel( wxWindow* parent );
206
207     void UpdateMRL( int i_access_method );
208
209     /* Event handlers (these functions should _not_ be virtual) */
210     void OnOk( wxCommandEvent& event );
211     void OnCancel( wxCommandEvent& event );
212
213     void OnPageChange( wxNotebookEvent& event );
214     void OnMRLChange( wxCommandEvent& event );
215
216     /* Event handlers for the file page */
217     void OnFilePanelChange( wxCommandEvent& event );
218     void OnFileBrowse( wxCommandEvent& event );
219
220     /* Event handlers for the disc page */
221     void OnDiscPanelChange( wxCommandEvent& event );
222     void OnDiscTypeChange( wxCommandEvent& event );
223
224     /* Event handlers for the net page */
225     void OnNetPanelChange( wxCommandEvent& event );
226     void OnNetTypeChange( wxCommandEvent& event );
227
228     /* Event handlers for the stream output */
229     void OnSoutEnable( wxCommandEvent& event );
230     void OnSoutSettings( wxCommandEvent& WXUNUSED(event) );
231
232     /* Event handlers for the demux dump */
233     void OnDemuxDumpEnable( wxCommandEvent& event );
234     void OnDemuxDumpBrowse( wxCommandEvent& event );
235     void OnDemuxDumpChange( wxCommandEvent& event );
236
237     DECLARE_EVENT_TABLE();
238
239     intf_thread_t *p_intf;
240     Interface *p_main_interface;
241     int i_current_access_method;
242
243     wxComboBox *mrl_combo;
244
245     /* Controls for the file panel */
246     wxComboBox *file_combo;
247
248     /* Controls for the disc panel */
249     wxRadioBox *disc_type;
250     wxTextCtrl *disc_device;
251     wxSpinCtrl *disc_title;
252     wxSpinCtrl *disc_chapter;
253
254     /* Controls for the net panel */
255     wxRadioBox *net_type;
256     int i_net_type;
257     wxPanel *net_subpanels[4];
258     wxRadioButton *net_radios[4];
259     wxSpinCtrl *net_ports[4];
260     wxTextCtrl *net_addrs[4];
261
262     /* Controls for the stream output */
263     wxButton *sout_button;
264     wxCheckBox *sout_checkbox;
265
266     /* Controls for the demux dump */
267     wxTextCtrl *demuxdump_textctrl;
268     wxButton *demuxdump_button;
269     wxCheckBox *demuxdump_checkbox;
270 };
271
272 enum
273 {
274     FILE_ACCESS = 0,
275     DISC_ACCESS,
276     NET_ACCESS,
277     SAT_ACCESS
278 };
279
280 /* Stream output Dialog */
281 class SoutDialog: public wxDialog
282 {
283 public:
284     /* Constructor */
285     SoutDialog( intf_thread_t *p_intf, Interface *p_main_interface );
286     virtual ~SoutDialog();
287
288     wxString mrl;
289
290 private:
291     void UpdateMRL();
292     wxPanel *AccessPanel( wxWindow* parent );
293     wxPanel *EncapsulationPanel( wxWindow* parent );
294     void    ParseMRL();
295
296     /* Event handlers (these functions should _not_ be virtual) */
297     void OnOk( wxCommandEvent& event );
298     void OnCancel( wxCommandEvent& event );
299     void OnMRLChange( wxCommandEvent& event );
300     void OnAccessTypeChange( wxCommandEvent& event );
301
302     /* Event handlers for the file access output */
303     void OnFileChange( wxCommandEvent& event );
304     void OnFileBrowse( wxCommandEvent& event );
305
306     /* Event handlers for the net access output */
307     void OnNetChange( wxCommandEvent& event );
308
309     /* Event handlers for the encapsulation panel */
310     void OnEncapsulationChange( wxCommandEvent& event );
311
312     DECLARE_EVENT_TABLE();
313
314     intf_thread_t *p_intf;
315     Interface *p_main_interface;
316
317     wxComboBox *mrl_combo;
318     wxPanel *access_panel;
319     wxPanel *encapsulation_panel;
320
321     /* Controls for the access outputs */
322     wxPanel *access_subpanels[4];
323     wxRadioButton *access_radios[4];
324
325     int i_access_type;
326
327     wxComboBox *file_combo;
328     wxSpinCtrl *net_port;
329     wxTextCtrl *net_addr;
330
331     /* Controls for the encapsulation */
332     wxRadioButton *encapsulation_radios[4];
333     int i_encapsulation_type;
334
335 };
336
337 /* Preferences Dialog */
338 class PrefsTreeCtrl;
339 class PrefsDialog: public wxFrame
340 {
341 public:
342     /* Constructor */
343     PrefsDialog( intf_thread_t *p_intf, Interface *p_main_interface );
344     virtual ~PrefsDialog();
345
346 private:
347     wxPanel *PrefsPanel( wxWindow* parent );
348
349     /* Event handlers (these functions should _not_ be virtual) */
350     void OnOk( wxCommandEvent& event );
351     void OnCancel( wxCommandEvent& event );
352     void OnSave( wxCommandEvent& event );
353
354     DECLARE_EVENT_TABLE();
355
356     intf_thread_t *p_intf;
357     Interface *p_main_interface;
358
359     PrefsTreeCtrl *prefs_tree;
360 };
361
362 /* Messages */
363 class Messages: public wxFrame
364 {
365 public:
366     /* Constructor */
367     Messages( intf_thread_t *p_intf, Interface *_p_main_interface );
368     virtual ~Messages();
369     void UpdateLog();
370
371 private:
372     /* Event handlers (these functions should _not_ be virtual) */
373     void OnClose( wxCommandEvent& event );
374     void OnVerbose( wxCommandEvent& event );
375
376     DECLARE_EVENT_TABLE();
377
378     intf_thread_t *p_intf;
379     Interface *p_main_interface;
380     wxTextCtrl *textctrl;
381     wxTextAttr *info_attr;
382     wxTextAttr *err_attr;
383     wxTextAttr *warn_attr;
384     wxTextAttr *dbg_attr;
385
386     vlc_bool_t b_verbose;
387 };
388
389 /* Playlist */
390 class Playlist: public wxFrame
391 {
392 public:
393     /* Constructor */
394     Playlist( intf_thread_t *p_intf, Interface *p_main_interface );
395     virtual ~Playlist();
396     void Rebuild();
397     void Manage();
398
399 private:
400     void DeleteItem( int item );
401
402     /* Event handlers (these functions should _not_ be virtual) */
403     void OnAddUrl( wxCommandEvent& event );
404     void OnAddDirectory( wxCommandEvent& event );
405     void OnClose( wxCommandEvent& event );
406     void OnInvertSelection( wxCommandEvent& event );
407     void OnDeleteSelection( wxCommandEvent& event );
408     void OnSelectAll( wxCommandEvent& event );
409     void OnActivateItem( wxListEvent& event );
410     void OnKeyDown( wxListEvent& event );
411
412     DECLARE_EVENT_TABLE();
413
414     intf_thread_t *p_intf;
415     Interface *p_main_interface;
416     wxListView *listview;
417     wxButton *ok_button;
418 };
419
420 /* File Info */
421 class FileInfo: public wxFrame
422 {
423 public:
424     /* Constructor */
425     FileInfo( intf_thread_t *p_intf, Interface *p_main_interface );
426     virtual ~FileInfo();
427     void UpdateFileInfo();
428
429 private:
430     void OnClose( wxCommandEvent& event );
431
432     DECLARE_EVENT_TABLE();
433    
434     intf_thread_t *p_intf;
435     wxTreeCtrl *fileinfo_tree;
436     wxTreeItemId fileinfo_root;
437     wxString fileinfo_root_label;
438
439 };
440
441 #if !defined(__WXX11__)
442 /* Drag and Drop class */
443 class DragAndDrop: public wxFileDropTarget
444 {
445 public:
446     DragAndDrop( intf_thread_t *_p_intf );
447
448     virtual bool OnDropFiles( wxCoord x, wxCoord y,
449                               const wxArrayString& filenames );
450
451 private:
452     intf_thread_t *p_intf;
453 };
454 #endif
455
456 /* Menus */
457 void PopupMenu( intf_thread_t *_p_intf, Interface *_p_main_interface,
458                 const wxPoint& pos );
459 wxMenu *AudioMenu( intf_thread_t *_p_intf, Interface *_p_main_interface );
460 wxMenu *VideoMenu( intf_thread_t *_p_intf, Interface *_p_main_interface );
461
462 class MenuEvtHandler : public wxEvtHandler
463 {
464 public:
465     MenuEvtHandler( intf_thread_t *p_intf, Interface *p_main_interface );
466     virtual ~MenuEvtHandler();
467
468     void MenuEvtHandler::OnMenuEvent( wxCommandEvent& event );
469
470 private:
471
472     DECLARE_EVENT_TABLE()
473
474     intf_thread_t *p_intf;
475     Interface *p_main_interface;
476 };
477
478 class Menu: public wxMenu
479 {
480 public:
481     /* Constructor */
482     Menu( intf_thread_t *p_intf, Interface *p_main_interface, int i_count,
483           char **ppsz_names, int *pi_objects, int i_start_id );
484     virtual ~Menu();
485
486 private:
487     /* Event handlers (these functions should _not_ be virtual) */
488     void OnClose( wxCommandEvent& event );
489     void OnEntrySelected( wxCommandEvent& event );
490
491     wxMenu *Menu::CreateDummyMenu();
492     void   Menu::CreateMenuItem( wxMenu *, char *, vlc_object_t * );
493     wxMenu *Menu::CreateChoicesMenu( char *, vlc_object_t * );
494
495     DECLARE_EVENT_TABLE();
496
497     intf_thread_t *p_intf;
498     Interface *p_main_interface;
499
500     int  i_item_id;
501 };