Video4Linux / PVR / KFIR unified panel
[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.54 2003/08/19 21:16:09 adn 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 #include <wx/accel.h>
32 #include "vlc_keys.h"
33
34 DECLARE_LOCAL_EVENT_TYPE( wxEVT_DIALOG, 0 );
35
36 class OpenDialog;
37 class Playlist;
38 class Messages;
39 class FileInfo;
40
41 #define SLIDER_MAX_POS 10000
42
43 /* wxU is used to convert ansi/utf8 strings to unicode strings (wchar_t) */
44 #if defined( ENABLE_NLS ) && defined( HAVE_GETTEXT ) && \
45     defined( WIN32 ) && !defined( HAVE_INCLUDED_GETTEXT )
46 #if wxUSE_UNICODE
47 #   define wxU(utf8) wxString(utf8, wxConvUTF8)
48 #else
49 #   define wxU(utf8) wxString(wxConvUTF8.cMB2WC(utf8), *wxConvCurrent)
50 #endif
51
52 #else // ENABLE_NLS && HAVE_GETTEXT && WIN32 && !HAVE_INCLUDED_GETTEXT
53 #if wxUSE_UNICODE
54 #   define wxU(ansi) wxString(ansi, *wxConvCurrent)
55 #else
56 #   define wxU(ansi) ansi
57 #endif
58
59 #endif
60
61 wxArrayString SeparateEntries( wxString );
62
63 /*****************************************************************************
64  * intf_sys_t: description and status of wxwindows interface
65  *****************************************************************************/
66 struct intf_sys_t
67 {
68     /* the wx parent window */
69     wxWindow            *p_wxwindow;
70     wxIcon              *p_icon;
71
72     /* special actions */
73     vlc_bool_t          b_playing;
74
75     /* The input thread */
76     input_thread_t *    p_input;
77
78     /* The slider */
79     int                 i_slider_pos;                     /* slider position */
80     int                 i_slider_oldpos;                /* previous position */
81     vlc_bool_t          b_slider_free;                      /* slider status */
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     /* Send an event to show a dialog */
90     void (*pf_show_dialog) ( intf_thread_t *p_intf, int i_dialog, int i_arg,
91                              intf_dialog_args_t *p_arg );
92
93     /* Popup menu */
94     wxMenu              *p_popup_menu;
95
96 };
97
98 /*****************************************************************************
99  * Prototypes
100  *****************************************************************************/
101
102 /*****************************************************************************
103  * Classes declarations.
104  *****************************************************************************/
105 class Interface;
106
107 /* Timer */
108 class Timer: public wxTimer
109 {
110 public:
111     /* Constructor */
112     Timer( intf_thread_t *p_intf, Interface *p_main_interface );
113     virtual ~Timer();
114
115     virtual void Notify();
116
117 private:
118     intf_thread_t *p_intf;
119     Interface *p_main_interface;
120     int i_old_playing_status;
121     int i_old_rate;
122 };
123
124 /* Main Interface */
125 class Interface: public wxFrame
126 {
127 public:
128     /* Constructor */
129     Interface( intf_thread_t *p_intf );
130     virtual ~Interface();
131     void TogglePlayButton( int i_playing_status );
132
133     wxBoxSizer  *frame_sizer;
134     wxStatusBar *statusbar;
135
136     wxSlider    *slider;
137     wxWindow    *slider_frame;
138     wxStaticBox *slider_box;
139
140     wxGauge     *volctrl;
141
142 private:
143     void UpdateAcceleratorTable();
144     void CreateOurMenuBar();
145     void CreateOurToolBar();
146     void CreateOurSlider();
147     void Open( int i_access_method );
148
149     /* Event handlers (these functions should _not_ be virtual) */
150     void OnExit( wxCommandEvent& event );
151     void OnAbout( wxCommandEvent& event );
152
153     void OnOpenFileSimple( wxCommandEvent& event );
154     void OnOpenFile( wxCommandEvent& event );
155     void OnOpenDisc( wxCommandEvent& event );
156     void OnOpenNet( wxCommandEvent& event );
157     void OnOpenSat( wxCommandEvent& event );
158     void OnOpenV4L( wxCommandEvent& event );
159     void OnShowDialog( wxCommandEvent& event );
160     void OnPlayStream( wxCommandEvent& event );
161     void OnStopStream( wxCommandEvent& event );
162     void OnSliderUpdate( wxScrollEvent& event );
163     void OnPrevStream( wxCommandEvent& event );
164     void OnNextStream( wxCommandEvent& event );
165     void OnSlowStream( wxCommandEvent& event );
166     void OnFastStream( wxCommandEvent& event );
167
168     void OnMenuOpen( wxMenuEvent& event );
169
170 #if defined( __WXMSW__ ) || defined( __WXMAC__ )
171     void OnContextMenu2(wxContextMenuEvent& event);
172 #endif
173     void OnContextMenu(wxMouseEvent& event);
174
175     DECLARE_EVENT_TABLE();
176
177     Timer *timer;
178     intf_thread_t *p_intf;
179
180 private:
181     int i_old_playing_status;
182
183     /* For auto-generated menus */
184     wxMenu *p_audio_menu;
185     vlc_bool_t b_audio_menu;
186     wxMenu *p_video_menu;
187     vlc_bool_t b_video_menu;
188     wxMenu *p_navig_menu;
189     vlc_bool_t b_navig_menu;
190 };
191
192 /* Dialogs Provider */
193 class DialogsProvider: public wxFrame
194 {
195 public:
196     /* Constructor */
197     DialogsProvider( intf_thread_t *p_intf, wxWindow *p_parent );
198     virtual ~DialogsProvider();
199
200 private:
201     void Open( int i_access_method, int i_arg );
202
203     /* Event handlers (these functions should _not_ be virtual) */
204     void OnExit( wxCommandEvent& event );
205     void OnPlaylist( wxCommandEvent& event );
206     void OnMessages( wxCommandEvent& event );
207     void OnFileInfo( wxCommandEvent& event );
208     void OnPreferences( wxCommandEvent& event );
209
210     void OnOpenFileGeneric( wxCommandEvent& event );
211     void OnOpenFileSimple( wxCommandEvent& event );
212     void OnOpenFile( wxCommandEvent& event );
213     void OnOpenDisc( wxCommandEvent& event );
214     void OnOpenNet( wxCommandEvent& event );
215     void OnOpenSat( wxCommandEvent& event );
216
217     void OnPopupMenu( wxCommandEvent& event );
218
219     void OnIdle( wxIdleEvent& event );
220
221     void OnExitThread( wxCommandEvent& event );
222
223     DECLARE_EVENT_TABLE();
224
225     intf_thread_t *p_intf;
226
227 public:
228     /* Secondary windows */
229     OpenDialog          *p_open_dialog;
230     wxFileDialog        *p_file_dialog;
231     Playlist            *p_playlist_dialog;
232     Messages            *p_messages_dialog;
233     FileInfo            *p_fileinfo_dialog;
234     wxFrame             *p_prefs_dialog;
235     wxFileDialog        *p_file_generic_dialog;
236 };
237
238 /* Open Dialog */
239 class V4LDialog;
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     wxPanel *V4LPanel( wxWindow* parent );
261
262     void UpdateMRL( int i_access_method );
263
264     /* Event handlers (these functions should _not_ be virtual) */
265     void OnOk( wxCommandEvent& event );
266     void OnCancel( wxCommandEvent& event );
267
268     void OnPageChange( wxNotebookEvent& event );
269     void OnMRLChange( wxCommandEvent& event );
270
271     /* Event handlers for the file page */
272     void OnFilePanelChange( wxCommandEvent& event );
273     void OnFileBrowse( wxCommandEvent& event );
274
275     /* Event handlers for the disc page */
276     void OnDiscPanelChange( wxCommandEvent& event );
277     void OnDiscTypeChange( wxCommandEvent& event );
278
279     /* Event handlers for the net page */
280     void OnNetPanelChange( wxCommandEvent& event );
281     void OnNetTypeChange( wxCommandEvent& event );
282
283     /* Event handlers for the v4l page */
284     void OnV4LPanelChange( wxCommandEvent& event );
285     void OnV4LTypeChange( wxCommandEvent& event );
286     void OnV4LSettingsChange( wxCommandEvent& event );
287
288     /* Event handlers for the stream output */
289     void OnSubsFileEnable( wxCommandEvent& event );
290     void OnSubsFileSettings( wxCommandEvent& WXUNUSED(event) );
291
292     /* Event handlers for the stream output */
293     void OnSoutEnable( wxCommandEvent& event );
294     void OnSoutSettings( wxCommandEvent& WXUNUSED(event) );
295
296     /* Event handlers for the demux dump */
297     void OnDemuxDumpEnable( wxCommandEvent& event );
298     void OnDemuxDumpBrowse( wxCommandEvent& event );
299     void OnDemuxDumpChange( wxCommandEvent& event );
300
301     DECLARE_EVENT_TABLE();
302
303     intf_thread_t *p_intf;
304     wxWindow *p_parent;
305     int i_current_access_method;
306
307     wxComboBox *mrl_combo;
308     wxNotebook *notebook;
309
310     /* Controls for the file panel */
311     wxComboBox *file_combo;
312     wxFileDialog *file_dialog;
313
314     /* Controls for the disc panel */
315     wxRadioBox *disc_type;
316     wxTextCtrl *disc_device;
317     wxSpinCtrl *disc_title;
318     int        i_disc_title;
319     wxSpinCtrl *disc_chapter;
320     int        i_disc_chapter;
321
322     /* Controls for the net panel */
323     wxRadioBox *net_type;
324     int i_net_type;
325     wxPanel *net_subpanels[4];
326     wxRadioButton *net_radios[4];
327     wxSpinCtrl *net_ports[4];
328     int        i_net_ports[4];
329     wxTextCtrl *net_addrs[4];
330
331     /* Controls for the v4l panel */
332     wxRadioBox *video_type;
333     wxTextCtrl *video_device;
334     wxSpinCtrl *video_channel;
335     wxButton *v4l_button;
336     V4LDialog *v4l_dialog;
337     wxArrayString v4l_mrl;
338
339     /* Controls for the subtitles file */
340     wxButton *subsfile_button;
341     wxCheckBox *subsfile_checkbox;
342     SubsFileDialog *subsfile_dialog;
343     wxArrayString subsfile_mrl;
344
345     /* Controls for the stream output */
346     wxButton *sout_button;
347     wxCheckBox *sout_checkbox;
348     SoutDialog *sout_dialog;
349     wxArrayString sout_mrl;
350
351     /* Controls for the demux dump */
352     wxTextCtrl *demuxdump_textctrl;
353     wxButton *demuxdump_button;
354     wxCheckBox *demuxdump_checkbox;
355     wxFileDialog *demuxdump_dialog;
356 };
357
358 enum
359 {
360     FILE_ACCESS = 0,
361     DISC_ACCESS,
362     NET_ACCESS,
363     SAT_ACCESS,
364     V4L_ACCESS,
365     FILE_SIMPLE_ACCESS
366 };
367
368 /* V4L Dialog */
369 class V4LDialog: public wxDialog
370 {
371 public:
372     /* Constructor */
373     V4LDialog( intf_thread_t *p_intf, wxWindow *p_parent );
374     virtual ~V4LDialog();
375
376     wxArrayString GetOptions();
377
378 private:
379     void UpdateMRL();
380     wxPanel *AudioPanel( wxWindow* parent );
381     wxPanel *CommonPanel( wxWindow* parent );
382     void    ParseMRL();
383
384     /* Event handlers (these functions should _not_ be virtual) */
385     void OnOk( wxCommandEvent& event );
386     void OnCancel( wxCommandEvent& event );
387     void OnMRLChange( wxCommandEvent& event );
388     void OnAudioEnable( wxCommandEvent& event );
389     void OnAudioChannel( wxCommandEvent& event );
390     void OnSizeEnable( wxCommandEvent& event );
391     void OnSize( wxCommandEvent& event );
392     void OnNormEnable( wxCommandEvent& event );
393     void OnNorm( wxCommandEvent& event );
394     void OnFrequencyEnable( wxCommandEvent& event );
395     void OnFrequency( wxCommandEvent& event );
396
397     DECLARE_EVENT_TABLE();
398
399     intf_thread_t *p_intf;
400     wxWindow *p_parent;
401
402     wxComboBox *mrl_combo;
403
404     int i_access_type;
405
406     /* Controls for the v4l advanced options */
407     wxPanel *common_subpanel;
408     wxPanel *common_panel;
409     wxCheckBox *size_checkbox;
410     wxComboBox *size_combo;
411     wxCheckBox *norm_checkbox;
412     wxComboBox *norm_combo;
413     wxCheckBox *frequency_checkbox;
414     wxSpinCtrl *frequency;
415
416     wxPanel *audio_subpanel;
417     wxPanel *audio_panel;
418     wxCheckBox *audio_checkbox;
419     wxTextCtrl *audio_device;
420     wxSpinCtrl *audio_channel;
421
422 };
423
424 /* Stream output Dialog */
425 class SoutDialog: public wxDialog
426 {
427 public:
428     /* Constructor */
429     SoutDialog( intf_thread_t *p_intf, wxWindow *p_parent );
430     virtual ~SoutDialog();
431
432     wxArrayString GetOptions();
433
434 private:
435     void UpdateMRL();
436     wxPanel *AccessPanel( wxWindow* parent );
437     wxPanel *MiscPanel( wxWindow* parent );
438     wxPanel *EncapsulationPanel( wxWindow* parent );
439     wxPanel *TranscodingPanel( wxWindow* parent );
440     void    ParseMRL();
441
442     /* Event handlers (these functions should _not_ be virtual) */
443     void OnOk( wxCommandEvent& event );
444     void OnCancel( wxCommandEvent& event );
445     void OnMRLChange( wxCommandEvent& event );
446     void OnAccessTypeChange( wxCommandEvent& event );
447
448     /* Event handlers for the file access output */
449     void OnFileChange( wxCommandEvent& event );
450     void OnFileBrowse( wxCommandEvent& event );
451
452     /* Event handlers for the net access output */
453     void OnNetChange( wxCommandEvent& event );
454
455     /* Event specific to the announce address */
456     void OnAnnounceAddrChange( wxCommandEvent& event );
457
458     /* Event handlers for the encapsulation panel */
459     void OnEncapsulationChange( wxCommandEvent& event );
460
461     /* Event handlers for the transcoding panel */
462     void OnTranscodingEnable( wxCommandEvent& event );
463     void OnTranscodingChange( wxCommandEvent& event );
464
465     /* Event handlers for the misc panel */
466     void OnSAPMiscChange( wxCommandEvent& event );
467     void OnSLPMiscChange( wxCommandEvent& event );
468
469     DECLARE_EVENT_TABLE();
470
471     intf_thread_t *p_intf;
472     wxWindow *p_parent;
473
474     wxComboBox *mrl_combo;
475
476     /* Controls for the access outputs */
477     wxPanel *access_subpanels[5];
478     wxCheckBox *access_checkboxes[5];
479
480     int i_access_type;
481
482     wxComboBox *file_combo;
483     wxSpinCtrl *net_ports[5];
484     wxTextCtrl *net_addrs[5];
485
486     /* Controls for the SAP announces */
487     wxPanel *misc_subpanels[1];
488     wxCheckBox *sap_checkbox;
489     wxCheckBox *slp_checkbox;
490     wxTextCtrl *announce_addr;
491
492     /* Controls for the encapsulation */
493     wxRadioButton *encapsulation_radios[5];
494     int i_encapsulation_type;
495
496     /* Controls for transcoding */
497     wxCheckBox *video_transc_checkbox;
498     wxComboBox *video_codec_combo;
499     wxComboBox *audio_codec_combo;
500     wxCheckBox *audio_transc_checkbox;
501     wxComboBox *video_bitrate_combo;
502     wxComboBox *audio_bitrate_combo;
503     wxComboBox *audio_channels_combo;
504 };
505
506 /* Subtitles File Dialog */
507 class SubsFileDialog: public wxDialog
508 {
509 public:
510     /* Constructor */
511     SubsFileDialog( intf_thread_t *p_intf, wxWindow *p_parent );
512     virtual ~SubsFileDialog();
513
514     wxComboBox *file_combo;
515     wxComboBox *encoding_combo;
516     wxSpinCtrl *delay_spinctrl;
517     wxSpinCtrl *fps_spinctrl;
518
519 private:
520     /* Event handlers (these functions should _not_ be virtual) */
521     void OnOk( wxCommandEvent& event );
522     void OnCancel( wxCommandEvent& event );
523     void OnFileBrowse( wxCommandEvent& event );
524
525     DECLARE_EVENT_TABLE();
526
527     intf_thread_t *p_intf;
528     wxWindow *p_parent;
529 };
530
531 /* Preferences Dialog */
532 class PrefsTreeCtrl;
533 class PrefsDialog: public wxFrame
534 {
535 public:
536     /* Constructor */
537     PrefsDialog( intf_thread_t *p_intf, wxWindow *p_parent );
538     virtual ~PrefsDialog();
539
540 private:
541     wxPanel *PrefsPanel( wxWindow* parent );
542
543     /* Event handlers (these functions should _not_ be virtual) */
544     void OnOk( wxCommandEvent& event );
545     void OnCancel( wxCommandEvent& event );
546     void OnSave( wxCommandEvent& event );
547     void OnResetAll( wxCommandEvent& event );
548
549     DECLARE_EVENT_TABLE();
550
551     intf_thread_t *p_intf;
552
553     PrefsTreeCtrl *prefs_tree;
554 };
555
556 /* Messages */
557 class Messages: public wxFrame
558 {
559 public:
560     /* Constructor */
561     Messages( intf_thread_t *p_intf, wxWindow *p_parent );
562     virtual ~Messages();
563     void UpdateLog();
564
565 private:
566     /* Event handlers (these functions should _not_ be virtual) */
567     void OnClose( wxCommandEvent& event );
568     void OnVerbose( wxCommandEvent& event );
569     void OnClear( wxCommandEvent& event );
570     void OnSaveLog( wxCommandEvent& event );
571
572     DECLARE_EVENT_TABLE();
573
574     intf_thread_t *p_intf;
575     wxTextCtrl *textctrl;
576     wxTextAttr *info_attr;
577     wxTextAttr *err_attr;
578     wxTextAttr *warn_attr;
579     wxTextAttr *dbg_attr;
580
581     wxFileDialog *save_log_dialog;
582
583     vlc_bool_t b_verbose;
584 };
585
586 /* Playlist */
587 class Playlist: public wxFrame
588 {
589 public:
590     /* Constructor */
591     Playlist( intf_thread_t *p_intf, wxWindow *p_parent );
592     virtual ~Playlist();
593
594     void UpdatePlaylist();
595     void ShowPlaylist( bool show );
596
597     bool b_need_update;
598     vlc_mutex_t lock;
599
600 private:
601     void DeleteItem( int item );
602
603     /* Event handlers (these functions should _not_ be virtual) */
604     void OnAddFile( wxCommandEvent& event );
605     void OnAddMRL( wxCommandEvent& event );
606     void OnClose( wxCommandEvent& event );
607     void OnOpen( wxCommandEvent& event );
608     void OnSave( wxCommandEvent& event );
609     void OnInvertSelection( wxCommandEvent& event );
610     void OnDeleteSelection( wxCommandEvent& event );
611     void OnSelectAll( wxCommandEvent& event );
612     void OnRandom( wxCommandEvent& event );
613     void OnLoop ( wxCommandEvent& event );
614     void OnActivateItem( wxListEvent& event );
615     void OnKeyDown( wxListEvent& event );
616     void Rebuild();
617
618     DECLARE_EVENT_TABLE();
619
620     intf_thread_t *p_intf;
621     wxListView *listview;
622     int i_update_counter;
623 };
624
625 /* File Info */
626 class FileInfo: public wxFrame
627 {
628 public:
629     /* Constructor */
630     FileInfo( intf_thread_t *p_intf, wxWindow *p_parent );
631     virtual ~FileInfo();
632     void UpdateFileInfo();
633
634 private:
635     void OnClose( wxCommandEvent& event );
636
637     DECLARE_EVENT_TABLE();
638
639     intf_thread_t *p_intf;
640     wxTreeCtrl *fileinfo_tree;
641     wxTreeItemId fileinfo_root;
642     wxString fileinfo_root_label;
643
644 };
645
646 #if !defined(__WXX11__)
647 /* Drag and Drop class */
648 class DragAndDrop: public wxFileDropTarget
649 {
650 public:
651     DragAndDrop( intf_thread_t *_p_intf );
652
653     virtual bool OnDropFiles( wxCoord x, wxCoord y,
654                               const wxArrayString& filenames );
655
656 private:
657     intf_thread_t *p_intf;
658 };
659 #endif
660
661 /* Menus */
662 void PopupMenu( intf_thread_t *_p_intf, wxWindow *p_parent,
663                 const wxPoint& pos );
664 wxMenu *AudioMenu( intf_thread_t *_p_intf, wxWindow *p_parent );
665 wxMenu *VideoMenu( intf_thread_t *_p_intf, wxWindow *p_parent );
666 wxMenu *NavigMenu( intf_thread_t *_p_intf, wxWindow *p_parent );
667
668 class MenuEvtHandler : public wxEvtHandler
669 {
670 public:
671     MenuEvtHandler( intf_thread_t *p_intf, Interface *p_main_interface );
672     virtual ~MenuEvtHandler();
673
674     void OnMenuEvent( wxCommandEvent& event );
675     void OnShowDialog( wxCommandEvent& event );
676
677 private:
678
679     DECLARE_EVENT_TABLE()
680
681     intf_thread_t *p_intf;
682     Interface *p_main_interface;
683 };
684
685 class Menu: public wxMenu
686 {
687 public:
688     /* Constructor */
689     Menu( intf_thread_t *p_intf, wxWindow *p_parent, int i_count,
690           char **ppsz_names, int *pi_objects, int i_start_id );
691     virtual ~Menu();
692
693 private:
694     /* Event handlers (these functions should _not_ be virtual) */
695     void OnClose( wxCommandEvent& event );
696     void OnShowDialog( wxCommandEvent& event );
697     void OnEntrySelected( wxCommandEvent& event );
698
699     wxMenu *Menu::CreateDummyMenu();
700     void   Menu::CreateMenuItem( wxMenu *, char *, vlc_object_t * );
701     wxMenu *Menu::CreateChoicesMenu( char *, vlc_object_t * );
702
703     DECLARE_EVENT_TABLE();
704
705     intf_thread_t *p_intf;
706
707     int  i_item_id;
708 };
709
710 static inline int ConvertHotkeyModifiers( int i_hotkey )
711 {
712     int i_accel_flags = 0;
713     if( i_hotkey & KEY_MODIFIER_ALT ) i_accel_flags |= wxACCEL_ALT;
714     if( i_hotkey & KEY_MODIFIER_CTRL ) i_accel_flags |= wxACCEL_CTRL;
715     if( i_hotkey & KEY_MODIFIER_SHIFT ) i_accel_flags |= wxACCEL_SHIFT;
716     return i_accel_flags;
717 }
718
719 static inline int ConvertHotkey( int i_hotkey )
720 {
721     int i_key = i_hotkey & ~KEY_MODIFIER;
722     if( i_key & KEY_ASCII ) return i_key & KEY_ASCII;
723     else if( i_key & KEY_SPECIAL )
724     {
725         switch ( i_key )
726         {
727         case KEY_LEFT: return WXK_LEFT;
728         case KEY_RIGHT: return WXK_RIGHT;
729         case KEY_UP: return WXK_UP;
730         case KEY_DOWN: return WXK_DOWN;
731         case KEY_SPACE: return WXK_SPACE;
732         case KEY_ENTER: return WXK_RETURN;
733         case KEY_F1: return WXK_F1;
734         case KEY_F2: return WXK_F2;
735         case KEY_F3: return WXK_F3;
736         case KEY_F4: return WXK_F4;
737         case KEY_F5: return WXK_F5;
738         case KEY_F6: return WXK_F6;
739         case KEY_F7: return WXK_F7;
740         case KEY_F8: return WXK_F8;
741         case KEY_F9: return WXK_F9;
742         case KEY_F10: return WXK_F10;
743         case KEY_F11: return WXK_F11;
744         case KEY_F12: return WXK_F12;
745         case KEY_HOME: return WXK_HOME;
746         case KEY_END: return WXK_HOME;
747         case KEY_MENU: return WXK_MENU;
748         case KEY_ESC: return WXK_ESCAPE;
749         case KEY_PAGEUP: return WXK_PRIOR;
750         case KEY_PAGEDOWN: return WXK_NEXT;
751         case KEY_TAB: return WXK_TAB;
752         case KEY_BACKSPACE: return WXK_BACK;
753         default:
754             return 0;
755         }
756     }
757 }