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