* modules/audio_output/alsa.c: the aout-device obj var wasn't destroyed properly...
[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.32 2003/05/26 19:06:47 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 #if !defined(MODULE_NAME_IS_skins)
45 /*****************************************************************************
46  * intf_sys_t: description and status of wxwindows interface
47  *****************************************************************************/
48 struct intf_sys_t
49 {
50     /* the wx parent window */
51     wxWindow            *p_wxwindow;
52     wxIcon              *p_icon;
53
54     /* secondary windows */
55     Playlist            *p_playlist_window;
56     Messages            *p_messages_window;
57     FileInfo            *p_fileinfo_window;
58
59     /* special actions */
60     vlc_bool_t          b_playing;
61     vlc_bool_t          b_popup_changed;                   /* display menu ? */
62     vlc_bool_t          b_window_changed;        /* window display toggled ? */
63     vlc_bool_t          b_playlist_changed;    /* playlist display toggled ? */
64     vlc_bool_t          b_slider_free;                      /* slider status */
65
66     /* menus handlers */
67     vlc_bool_t          b_program_update;   /* do we need to update programs
68                                                                         menu */
69     vlc_bool_t          b_title_update;  /* do we need to update title menus */
70     vlc_bool_t          b_chapter_update;            /* do we need to update
71                                                                chapter menus */
72     vlc_bool_t          b_audio_update;  /* do we need to update audio menus */
73     vlc_bool_t          b_spu_update;      /* do we need to update spu menus */
74
75     /* windows and widgets */
76
77     /* The input thread */
78     input_thread_t *    p_input;
79
80     /* The slider */
81     int                 i_slider_pos;                     /* slider position */
82     int                 i_slider_oldpos;                /* previous position */
83
84     /* The messages window */
85     msg_subscription_t* p_sub;                  /* message bank subscription */
86
87     /* Playlist management */
88     int                 i_playing;                 /* playlist selected item */
89
90     /* The window labels for DVD mode */
91     unsigned int        i_part;                           /* current chapter */
92 };
93 #endif /* !defined(MODULE_NAME_IS_skins) */
94
95 /*****************************************************************************
96  * Prototypes
97  *****************************************************************************/
98
99 /*****************************************************************************
100  * Classes declarations.
101  *****************************************************************************/
102 class Interface;
103
104 /* Timer */
105 class Timer: public wxTimer
106 {
107 public:
108     /* Constructor */
109     Timer( intf_thread_t *p_intf, Interface *p_main_interface );
110     virtual ~Timer();
111
112     virtual void Notify();
113
114 private:
115     intf_thread_t *p_intf;
116     Interface *p_main_interface;
117     int i_old_playing_status;
118     int i_old_rate;
119 };
120
121 /* Main Interface */
122 class OpenDialog;
123 class Interface: public wxFrame
124 {
125 public:
126     /* Constructor */
127     Interface( intf_thread_t *p_intf );
128     virtual ~Interface();
129     void TogglePlayButton( int i_playing_status );
130
131     wxBoxSizer  *frame_sizer;
132     wxStatusBar *statusbar;
133
134     wxSlider    *slider;
135     wxWindow    *slider_frame;
136     wxStaticBox *slider_box;
137
138     /* So we don't recreate the open dialog box each time
139      * (and keep the last settings) */
140     OpenDialog  *p_open_dialog;
141
142     wxMenu      *p_popup_menu;
143     vlc_bool_t  b_popup_change;
144
145 private:
146     void CreateOurMenuBar();
147     void CreateOurToolBar();
148     void CreateOurSlider();
149     void Open( int i_access_method );
150
151     /* Event handlers (these functions should _not_ be virtual) */
152     void OnExit( wxCommandEvent& event );
153     void OnAbout( wxCommandEvent& event );
154     void OnMessages( wxCommandEvent& event );
155     void OnPlaylist( wxCommandEvent& event );
156     void OnLogs( wxCommandEvent& event );
157     void OnFileInfo( wxCommandEvent& event );
158     void OnPreferences( wxCommandEvent& event );
159
160     void OnOpenFile( wxCommandEvent& event );
161     void OnOpenDisc( wxCommandEvent& event );
162     void OnOpenNet( wxCommandEvent& event );
163     void OnOpenSat( wxCommandEvent& event );
164
165     void OnPlayStream( wxCommandEvent& event );
166     void OnStopStream( wxCommandEvent& event );
167     void OnSliderUpdate( wxScrollEvent& event );
168     void OnPrevStream( wxCommandEvent& event );
169     void OnNextStream( wxCommandEvent& event );
170     void OnSlowStream( wxCommandEvent& event );
171     void OnFastStream( wxCommandEvent& event );
172
173     void OnMenuOpen( wxMenuEvent& event );
174
175 #if defined( __WXMSW__ ) || defined( __WXMAC__ )
176     void OnContextMenu(wxContextMenuEvent& event);
177 #else
178     void OnContextMenu(wxMouseEvent& event);
179 #endif
180
181     DECLARE_EVENT_TABLE();
182
183     Timer *timer;
184     intf_thread_t *p_intf;
185
186     wxFrame *p_prefs_dialog;
187
188     int i_old_playing_status;
189
190     /* For auto-generated menus */
191     wxMenu *p_audio_menu;
192     vlc_bool_t b_audio_menu;
193     wxMenu *p_video_menu;
194     vlc_bool_t b_video_menu;
195     wxMenu *p_navig_menu;
196     vlc_bool_t b_navig_menu;
197 };
198
199 /* Open Dialog */
200 class SoutDialog;
201 class SubsFileDialog;
202 class OpenDialog: public wxDialog
203 {
204 public:
205     /* Constructor */
206     OpenDialog( intf_thread_t *p_intf, wxWindow *p_parent,
207                 int i_access_method );
208     virtual ~OpenDialog();
209
210     int ShowModal();
211     int ShowModal( int i_access_method );
212
213     wxArrayString mrl;
214
215 private:
216     wxPanel *FilePanel( wxWindow* parent );
217     wxPanel *DiscPanel( wxWindow* parent );
218     wxPanel *NetPanel( wxWindow* parent );
219     wxPanel *SatPanel( wxWindow* parent );
220
221     void UpdateMRL( int i_access_method );
222     wxArrayString SeparateEntries( wxString );
223
224     /* Event handlers (these functions should _not_ be virtual) */
225     void OnOk( wxCommandEvent& event );
226     void OnCancel( wxCommandEvent& event );
227
228     void OnPageChange( wxNotebookEvent& event );
229     void OnMRLChange( wxCommandEvent& event );
230
231     /* Event handlers for the file page */
232     void OnFilePanelChange( wxCommandEvent& event );
233     void OnFileBrowse( wxCommandEvent& event );
234
235     /* Event handlers for the disc page */
236     void OnDiscPanelChange( wxCommandEvent& event );
237     void OnDiscTypeChange( wxCommandEvent& event );
238
239     /* Event handlers for the net page */
240     void OnNetPanelChange( wxCommandEvent& event );
241     void OnNetTypeChange( wxCommandEvent& event );
242
243     /* Event handlers for the stream output */
244     void OnSubsFileEnable( wxCommandEvent& event );
245     void OnSubsFileSettings( wxCommandEvent& WXUNUSED(event) );
246
247     /* Event handlers for the stream output */
248     void OnSoutEnable( wxCommandEvent& event );
249     void OnSoutSettings( wxCommandEvent& WXUNUSED(event) );
250
251     /* Event handlers for the demux dump */
252     void OnDemuxDumpEnable( wxCommandEvent& event );
253     void OnDemuxDumpBrowse( wxCommandEvent& event );
254     void OnDemuxDumpChange( wxCommandEvent& event );
255
256     DECLARE_EVENT_TABLE();
257
258     intf_thread_t *p_intf;
259     wxWindow *p_parent;
260     int i_current_access_method;
261
262     wxComboBox *mrl_combo;
263     wxNotebook *notebook;
264
265     /* Controls for the file panel */
266     wxComboBox *file_combo;
267     wxFileDialog *file_dialog;
268
269     /* Controls for the disc panel */
270     wxRadioBox *disc_type;
271     wxTextCtrl *disc_device;
272     wxSpinCtrl *disc_title;
273     wxSpinCtrl *disc_chapter;
274
275     /* Controls for the net panel */
276     wxRadioBox *net_type;
277     int i_net_type;
278     wxPanel *net_subpanels[4];
279     wxRadioButton *net_radios[4];
280     wxSpinCtrl *net_ports[4];
281     wxTextCtrl *net_addrs[4];
282
283     /* Controls for the subtitles file */
284     wxButton *subsfile_button;
285     wxCheckBox *subsfile_checkbox;
286     SubsFileDialog *subsfile_dialog;
287
288     /* Controls for the stream output */
289     wxButton *sout_button;
290     wxCheckBox *sout_checkbox;
291     SoutDialog *sout_dialog;
292
293     /* Controls for the demux dump */
294     wxTextCtrl *demuxdump_textctrl;
295     wxButton *demuxdump_button;
296     wxCheckBox *demuxdump_checkbox;
297     wxFileDialog *demuxdump_dialog;
298 };
299
300 enum
301 {
302     FILE_ACCESS = 0,
303     DISC_ACCESS,
304     NET_ACCESS,
305     SAT_ACCESS
306 };
307
308 /* Stream output Dialog */
309 class SoutDialog: public wxDialog
310 {
311 public:
312     /* Constructor */
313     SoutDialog( intf_thread_t *p_intf, wxWindow *p_parent );
314     virtual ~SoutDialog();
315
316     wxString mrl;
317
318 private:
319     void UpdateMRL();
320     wxPanel *AccessPanel( wxWindow* parent );
321     wxPanel *EncapsulationPanel( wxWindow* parent );
322     wxPanel *TranscodingPanel( wxWindow* parent );
323     void    ParseMRL();
324
325     /* Event handlers (these functions should _not_ be virtual) */
326     void OnOk( wxCommandEvent& event );
327     void OnCancel( wxCommandEvent& event );
328     void OnMRLChange( wxCommandEvent& event );
329     void OnAccessTypeChange( wxCommandEvent& event );
330
331     /* Event handlers for the file access output */
332     void OnFileChange( wxCommandEvent& event );
333     void OnFileBrowse( wxCommandEvent& event );
334
335     /* Event handlers for the net access output */
336     void OnNetChange( wxCommandEvent& event );
337
338     /* Event handlers for the encapsulation panel */
339     void OnEncapsulationChange( wxCommandEvent& event );
340
341     /* Event handlers for the transcoding panel */
342     void OnTranscodingEnable( wxCommandEvent& event );
343     void OnTranscodingChange( wxCommandEvent& event );
344
345     DECLARE_EVENT_TABLE();
346
347     intf_thread_t *p_intf;
348     wxWindow *p_parent;
349
350     wxComboBox *mrl_combo;
351
352     /* Controls for the access outputs */
353     wxPanel *access_subpanels[5];
354     wxCheckBox *access_checkboxes[5];
355
356     int i_access_type;
357
358     wxComboBox *file_combo;
359     wxSpinCtrl *net_port;
360     wxTextCtrl *net_addr;
361
362     /* Controls for the encapsulation */
363     wxRadioButton *encapsulation_radios[5];
364     int i_encapsulation_type;
365
366     /* Controls for transcoding */
367     wxCheckBox *video_transc_checkbox;
368     wxComboBox *video_codec_combo;
369     wxComboBox *audio_codec_combo;
370     wxCheckBox *audio_transc_checkbox;
371     wxComboBox *video_bitrate_combo;
372     wxComboBox *audio_bitrate_combo;
373 };
374
375 /* Subtitles File Dialog */
376 class SubsFileDialog: public wxDialog
377 {
378 public:
379     /* Constructor */
380     SubsFileDialog( intf_thread_t *p_intf, wxWindow *p_parent );
381     virtual ~SubsFileDialog();
382
383     wxComboBox *file_combo;
384     wxSpinCtrl *delay_spinctrl;
385     wxSpinCtrl *fps_spinctrl;
386
387 private:
388     /* Event handlers (these functions should _not_ be virtual) */
389     void OnOk( wxCommandEvent& event );
390     void OnCancel( wxCommandEvent& event );
391     void OnFileBrowse( wxCommandEvent& event );
392
393     DECLARE_EVENT_TABLE();
394
395     intf_thread_t *p_intf;
396     wxWindow *p_parent;
397 };
398
399 /* Preferences Dialog */
400 class PrefsTreeCtrl;
401 class PrefsDialog: public wxFrame
402 {
403 public:
404     /* Constructor */
405     PrefsDialog( intf_thread_t *p_intf, Interface *p_main_interface );
406     virtual ~PrefsDialog();
407
408 private:
409     wxPanel *PrefsPanel( wxWindow* parent );
410
411     /* Event handlers (these functions should _not_ be virtual) */
412     void OnOk( wxCommandEvent& event );
413     void OnCancel( wxCommandEvent& event );
414     void OnSave( wxCommandEvent& event );
415     void OnResetAll( wxCommandEvent& event );
416
417     DECLARE_EVENT_TABLE();
418
419     intf_thread_t *p_intf;
420     Interface *p_main_interface;
421
422     PrefsTreeCtrl *prefs_tree;
423 };
424
425 /* Messages */
426 class Messages: public wxFrame
427 {
428 public:
429     /* Constructor */
430     Messages( intf_thread_t *p_intf, Interface *_p_main_interface );
431     virtual ~Messages();
432     void UpdateLog();
433
434 private:
435     /* Event handlers (these functions should _not_ be virtual) */
436     void OnClose( wxCommandEvent& event );
437     void OnVerbose( wxCommandEvent& event );
438
439     DECLARE_EVENT_TABLE();
440
441     intf_thread_t *p_intf;
442     Interface *p_main_interface;
443     wxTextCtrl *textctrl;
444     wxTextAttr *info_attr;
445     wxTextAttr *err_attr;
446     wxTextAttr *warn_attr;
447     wxTextAttr *dbg_attr;
448
449     vlc_bool_t b_verbose;
450 };
451
452 /* Playlist */
453 class Playlist: public wxFrame
454 {
455 public:
456     /* Constructor */
457     Playlist( intf_thread_t *p_intf, Interface *p_main_interface );
458     virtual ~Playlist();
459
460     void UpdatePlaylist();
461     void ShowPlaylist( bool show );
462
463     bool b_need_update;
464     vlc_mutex_t lock;
465
466 private:
467     void DeleteItem( int item );
468
469     /* Event handlers (these functions should _not_ be virtual) */
470     void OnAddMRL( wxCommandEvent& event );
471     void OnClose( wxCommandEvent& event );
472     void OnOpen( wxCommandEvent& event );
473     void OnSave( wxCommandEvent& event );
474     void OnInvertSelection( wxCommandEvent& event );
475     void OnDeleteSelection( wxCommandEvent& event );
476     void OnSelectAll( wxCommandEvent& event );
477     void OnActivateItem( wxListEvent& event );
478     void OnKeyDown( wxListEvent& event );
479     void Rebuild();
480
481     DECLARE_EVENT_TABLE();
482
483     intf_thread_t *p_intf;
484     Interface *p_main_interface;
485     wxListView *listview;
486     int i_update_counter;
487 };
488
489 /* File Info */
490 class FileInfo: public wxFrame
491 {
492 public:
493     /* Constructor */
494     FileInfo( intf_thread_t *p_intf, Interface *p_main_interface );
495     virtual ~FileInfo();
496     void UpdateFileInfo();
497
498 private:
499     void OnClose( wxCommandEvent& event );
500
501     DECLARE_EVENT_TABLE();
502    
503     intf_thread_t *p_intf;
504     wxTreeCtrl *fileinfo_tree;
505     wxTreeItemId fileinfo_root;
506     wxString fileinfo_root_label;
507
508 };
509
510 #if !defined(__WXX11__)
511 /* Drag and Drop class */
512 class DragAndDrop: public wxFileDropTarget
513 {
514 public:
515     DragAndDrop( intf_thread_t *_p_intf );
516
517     virtual bool OnDropFiles( wxCoord x, wxCoord y,
518                               const wxArrayString& filenames );
519
520 private:
521     intf_thread_t *p_intf;
522 };
523 #endif
524
525 /* Menus */
526 void PopupMenu( intf_thread_t *_p_intf, Interface *_p_main_interface,
527                 const wxPoint& pos );
528 wxMenu *AudioMenu( intf_thread_t *_p_intf, Interface *_p_main_interface );
529 wxMenu *VideoMenu( intf_thread_t *_p_intf, Interface *_p_main_interface );
530 wxMenu *NavigMenu( intf_thread_t *_p_intf, Interface *_p_main_interface );
531
532 class MenuEvtHandler : public wxEvtHandler
533 {
534 public:
535     MenuEvtHandler( intf_thread_t *p_intf, Interface *p_main_interface );
536     virtual ~MenuEvtHandler();
537
538     void MenuEvtHandler::OnMenuEvent( wxCommandEvent& event );
539
540 private:
541
542     DECLARE_EVENT_TABLE()
543
544     intf_thread_t *p_intf;
545     Interface *p_main_interface;
546 };
547
548 class Menu: public wxMenu
549 {
550 public:
551     /* Constructor */
552     Menu( intf_thread_t *p_intf, Interface *p_main_interface, int i_count,
553           char **ppsz_names, int *pi_objects, int i_start_id );
554     virtual ~Menu();
555
556 private:
557     /* Event handlers (these functions should _not_ be virtual) */
558     void OnClose( wxCommandEvent& event );
559     void OnEntrySelected( wxCommandEvent& event );
560
561     wxMenu *Menu::CreateDummyMenu();
562     void   Menu::CreateMenuItem( wxMenu *, char *, vlc_object_t * );
563     wxMenu *Menu::CreateChoicesMenu( char *, vlc_object_t * );
564
565     DECLARE_EVENT_TABLE();
566
567     intf_thread_t *p_intf;
568     Interface *p_main_interface;
569
570     int  i_item_id;
571 };