dialogs.cpp 15.8 KB
Newer Older
gbazin's avatar
   
gbazin committed
1
/*****************************************************************************
2
 * dialogs.cpp : wxWidgets plugin for vlc
gbazin's avatar
   
gbazin committed
3
 *****************************************************************************
4
 * Copyright (C) 2000-2004 the VideoLAN team
gbazin's avatar
gbazin committed
5
 * $Id$
gbazin's avatar
   
gbazin committed
6
 *
7
 * Authors: Gildas Bazin <gbazin@videolan.org>
gbazin's avatar
   
gbazin committed
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
 *****************************************************************************/

/*****************************************************************************
 * Preamble
 *****************************************************************************/
#include <stdlib.h>                                      /* malloc(), free() */
#include <errno.h>                                                 /* ENOMEM */
#include <string.h>                                            /* strerror() */
#include <stdio.h>

#include <vlc/vlc.h>
#include <vlc/aout.h>
#include <vlc/intf.h>

36
#include "wxwidgets.h"
gbazin's avatar
   
gbazin committed
37
38
39
40

/* include the icon graphic */
#include "../../../share/vlc32x32.xpm"

gbazin's avatar
gbazin committed
41
42
43
44
45
46
47
48
49
50
51
52
/* Dialogs Provider */
class DialogsProvider: public wxFrame
{
public:
    /* Constructor */
    DialogsProvider( intf_thread_t *p_intf, wxWindow *p_parent );
    virtual ~DialogsProvider();

private:
    void Open( int i_access_method, int i_arg );

    /* Event handlers (these functions should _not_ be virtual) */
53
    void OnUpdateVLC( wxCommandEvent& event );
gbazin's avatar
gbazin committed
54
55
56
57
58
59
60
61
62
63
    void OnExit( wxCommandEvent& event );
    void OnPlaylist( wxCommandEvent& event );
    void OnMessages( wxCommandEvent& event );
    void OnFileInfo( wxCommandEvent& event );
    void OnPreferences( wxCommandEvent& event );
    void OnWizardDialog( wxCommandEvent& event );
    void OnBookmarks( wxCommandEvent& event );

    void OnOpenFileGeneric( wxCommandEvent& event );
    void OnOpenFileSimple( wxCommandEvent& event );
zorglub's avatar
zorglub committed
64
    void OnOpenDirectory( wxCommandEvent& event );
gbazin's avatar
gbazin committed
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
    void OnOpenFile( wxCommandEvent& event );
    void OnOpenDisc( wxCommandEvent& event );
    void OnOpenNet( wxCommandEvent& event );
    void OnOpenCapture( wxCommandEvent& event );
    void OnOpenSat( wxCommandEvent& event );

    void OnPopupMenu( wxCommandEvent& event );

    void OnIdle( wxIdleEvent& event );

    void OnExitThread( wxCommandEvent& event );

    DECLARE_EVENT_TABLE();

    intf_thread_t *p_intf;

public:
    /* Secondary windows */
    OpenDialog          *p_open_dialog;
    wxFileDialog        *p_file_dialog;
zorglub's avatar
zorglub committed
85
    wxDirDialog         *p_dir_dialog;
gbazin's avatar
gbazin committed
86
87
88
89
90
    Playlist            *p_playlist_dialog;
    Messages            *p_messages_dialog;
    FileInfo            *p_fileinfo_dialog;
    WizardDialog        *p_wizard_dialog;
    wxFrame             *p_prefs_dialog;
91
    wxFrame             *p_bookmarks_dialog;
gbazin's avatar
gbazin committed
92
    wxFileDialog        *p_file_generic_dialog;
93
    UpdateVLC           *p_updatevlc_dialog;
gbazin's avatar
gbazin committed
94
95
};

gbazin's avatar
   
gbazin committed
96
97
98
99
100
101
102
103
104
105
DEFINE_LOCAL_EVENT_TYPE( wxEVT_DIALOG );

BEGIN_EVENT_TABLE(DialogsProvider, wxFrame)
    /* Idle loop used to update some of the dialogs */
    EVT_IDLE(DialogsProvider::OnIdle)

    /* Custom wxDialog events */
    EVT_COMMAND(INTF_DIALOG_FILE, wxEVT_DIALOG, DialogsProvider::OnOpenFile)
    EVT_COMMAND(INTF_DIALOG_DISC, wxEVT_DIALOG, DialogsProvider::OnOpenDisc)
    EVT_COMMAND(INTF_DIALOG_NET, wxEVT_DIALOG, DialogsProvider::OnOpenNet)
gbazin's avatar
gbazin committed
106
107
    EVT_COMMAND(INTF_DIALOG_CAPTURE, wxEVT_DIALOG,
                DialogsProvider::OnOpenCapture)
gbazin's avatar
   
gbazin committed
108
109
    EVT_COMMAND(INTF_DIALOG_FILE_SIMPLE, wxEVT_DIALOG,
                DialogsProvider::OnOpenFileSimple)
gbazin's avatar
   
gbazin committed
110
111
    EVT_COMMAND(INTF_DIALOG_FILE_GENERIC, wxEVT_DIALOG,
                DialogsProvider::OnOpenFileGeneric)
zorglub's avatar
zorglub committed
112
113
    EVT_COMMAND(INTF_DIALOG_DIRECTORY, wxEVT_DIALOG,
                DialogsProvider::OnOpenDirectory)
gbazin's avatar
   
gbazin committed
114
115
116
117
118
119
120

    EVT_COMMAND(INTF_DIALOG_PLAYLIST, wxEVT_DIALOG,
                DialogsProvider::OnPlaylist)
    EVT_COMMAND(INTF_DIALOG_MESSAGES, wxEVT_DIALOG,
                DialogsProvider::OnMessages)
    EVT_COMMAND(INTF_DIALOG_PREFS, wxEVT_DIALOG,
                DialogsProvider::OnPreferences)
121
122
    EVT_COMMAND(INTF_DIALOG_WIZARD, wxEVT_DIALOG,
                DialogsProvider::OnWizardDialog)
gbazin's avatar
   
gbazin committed
123
124
    EVT_COMMAND(INTF_DIALOG_FILEINFO, wxEVT_DIALOG,
                DialogsProvider::OnFileInfo)
gbazin's avatar
gbazin committed
125
126
    EVT_COMMAND(INTF_DIALOG_BOOKMARKS, wxEVT_DIALOG,
                DialogsProvider::OnBookmarks)
gbazin's avatar
   
gbazin committed
127
128
    EVT_COMMAND(INTF_DIALOG_POPUPMENU, wxEVT_DIALOG,
                DialogsProvider::OnPopupMenu)
gbazin's avatar
   
gbazin committed
129
130
    EVT_COMMAND(INTF_DIALOG_EXIT, wxEVT_DIALOG,
                DialogsProvider::OnExitThread)
131
132
    EVT_COMMAND(INTF_DIALOG_UPDATEVLC, wxEVT_DIALOG,
                DialogsProvider::OnUpdateVLC)
gbazin's avatar
   
gbazin committed
133
134
END_EVENT_TABLE()

gbazin's avatar
gbazin committed
135
136
137
138
139
wxWindow *CreateDialogsProvider( intf_thread_t *p_intf, wxWindow *p_parent )
{
    return new DialogsProvider( p_intf, p_parent );
}

gbazin's avatar
   
gbazin committed
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*****************************************************************************
 * Constructor.
 *****************************************************************************/
DialogsProvider::DialogsProvider( intf_thread_t *_p_intf, wxWindow *p_parent )
  :  wxFrame( p_parent, -1, wxT("") )
{
    /* Initializations */
    p_intf = _p_intf;
    p_open_dialog = NULL;
    p_file_dialog = NULL;
    p_playlist_dialog = NULL;
    p_messages_dialog = NULL;
    p_fileinfo_dialog = NULL;
    p_prefs_dialog = NULL;
gbazin's avatar
   
gbazin committed
154
    p_file_generic_dialog = NULL;
155
    p_wizard_dialog = NULL;
gbazin's avatar
gbazin committed
156
    p_bookmarks_dialog = NULL;
157
    p_dir_dialog = NULL;
158
    p_updatevlc_dialog = NULL;
gbazin's avatar
   
gbazin committed
159
160
161
162
163
164

    /* Give our interface a nice little icon */
    p_intf->p_sys->p_icon = new wxIcon( vlc_xpm );

    /* Create the messages dialog so it can begin storing logs */
    p_messages_dialog = new Messages( p_intf, p_parent ? p_parent : this );
gbazin's avatar
   
gbazin committed
165

gbazin's avatar
gbazin committed
166
167
    /* Check if user wants to show the bookmarks dialog by default */
    wxCommandEvent dummy_event;
168
    if( config_GetInt( p_intf, "wx-bookmarks" ) )
gbazin's avatar
gbazin committed
169
170
        OnBookmarks( dummy_event );

gbazin's avatar
   
gbazin committed
171
172
    /* Intercept all menu events in our custom event handler */
    PushEventHandler( new MenuEvtHandler( p_intf, NULL ) );
173
174
175
176
177
178
179
180
181
182
183
184
185


    WindowSettings *ws = p_intf->p_sys->p_window_settings;
    wxPoint p;
    wxSize  s;
    bool    b_shown;

#define INIT( id, w, N, S ) \
    if( ws->GetSettings( WindowSettings::id, b_shown, p, s ) && b_shown ) \
    {                           \
        if( !w )                \
            w = N;              \
        w->SetSize( s );        \
186
        w->Move( p );           \
187
188
189
190
191
192
193
194
        w->S( true );           \
    }

    INIT( ID_PLAYLIST, p_playlist_dialog, new Playlist(p_intf,this), ShowPlaylist );
    INIT( ID_MESSAGES, p_messages_dialog, new Messages(p_intf,this), Show );
    INIT( ID_FILE_INFO, p_fileinfo_dialog, new FileInfo(p_intf,this), Show );
    INIT( ID_BOOKMARKS, p_bookmarks_dialog, BookmarksDialog(p_intf,this), Show);
#undef INIT
gbazin's avatar
   
gbazin committed
195
196
197
198
}

DialogsProvider::~DialogsProvider()
{
199
200
201
202
    WindowSettings *ws = p_intf->p_sys->p_window_settings;

#define UPDATE(id,w)                                        \
  {                                                         \
203
    if( w && w->IsShown() && !w->IsIconized() )             \
204
205
206
207
208
209
210
211
212
213
214
215
216
        ws->SetSettings(  WindowSettings::id, true,         \
                          w->GetPosition(), w->GetSize() ); \
    else                                                    \
        ws->SetSettings(  WindowSettings::id, false );      \
  }

    UPDATE( ID_PLAYLIST,  p_playlist_dialog );
    UPDATE( ID_MESSAGES,  p_messages_dialog );
    UPDATE( ID_FILE_INFO, p_fileinfo_dialog );
    UPDATE( ID_BOOKMARKS, p_bookmarks_dialog );

#undef UPDATE

217
218
	PopEventHandler(true);

gbazin's avatar
   
gbazin committed
219
220
221
222
223
224
225
    /* Clean up */
    if( p_open_dialog )     delete p_open_dialog;
    if( p_prefs_dialog )    p_prefs_dialog->Destroy();
    if( p_file_dialog )     delete p_file_dialog;
    if( p_playlist_dialog ) delete p_playlist_dialog;
    if( p_messages_dialog ) delete p_messages_dialog;
    if( p_fileinfo_dialog ) delete p_fileinfo_dialog;
gbazin's avatar
   
gbazin committed
226
    if( p_file_generic_dialog ) delete p_file_generic_dialog;
227
    if( p_wizard_dialog ) delete p_wizard_dialog;
gbazin's avatar
gbazin committed
228
    if( p_bookmarks_dialog ) delete p_bookmarks_dialog;
229
    if( p_updatevlc_dialog ) delete p_updatevlc_dialog;
zorglub's avatar
zorglub committed
230

gbazin's avatar
   
gbazin committed
231
232

    if( p_intf->p_sys->p_icon ) delete p_intf->p_sys->p_icon;
233
234
235
236
237
238

    /* We must set this here because on win32 this destructor will be
     * automatically called so we must not call it again on wxApp->OnExit().
     * There shouldn't be any race conditions as all this should be done
     * from the same thread. */
    p_intf->p_sys->p_wxwindow = NULL;
gbazin's avatar
   
gbazin committed
239
240
241
242
}

void DialogsProvider::OnIdle( wxIdleEvent& WXUNUSED(event) )
{
243
244
245
    /* Update the log window */
    if( p_messages_dialog )
        p_messages_dialog->UpdateLog();
gbazin's avatar
   
gbazin committed
246

247
248
249
    /* Update the playlist */
    if( p_playlist_dialog )
        p_playlist_dialog->UpdatePlaylist();
gbazin's avatar
   
gbazin committed
250

251
252
253
    /* Update the fileinfo windows */
    if( p_fileinfo_dialog )
        p_fileinfo_dialog->UpdateFileInfo();
gbazin's avatar
   
gbazin committed
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
}

void DialogsProvider::OnPlaylist( wxCommandEvent& WXUNUSED(event) )
{
    /* Show/hide the playlist window */
    if( !p_playlist_dialog )
        p_playlist_dialog = new Playlist( p_intf, this );

    if( p_playlist_dialog )
    {
        p_playlist_dialog->ShowPlaylist( !p_playlist_dialog->IsShown() );
    }
}

void DialogsProvider::OnMessages( wxCommandEvent& WXUNUSED(event) )
{
    /* Show/hide the log window */
    if( !p_messages_dialog )
        p_messages_dialog = new Messages( p_intf, this );

    if( p_messages_dialog )
    {
        p_messages_dialog->Show( !p_messages_dialog->IsShown() );
    }
}

void DialogsProvider::OnFileInfo( wxCommandEvent& WXUNUSED(event) )
{
    /* Show/hide the file info window */
    if( !p_fileinfo_dialog )
        p_fileinfo_dialog = new FileInfo( p_intf, this );

    if( p_fileinfo_dialog )
    {
        p_fileinfo_dialog->Show( !p_fileinfo_dialog->IsShown() );
    }
}

void DialogsProvider::OnPreferences( wxCommandEvent& WXUNUSED(event) )
{
    /* Show/hide the open dialog */
    if( !p_prefs_dialog )
        p_prefs_dialog = new PrefsDialog( p_intf, this );

    if( p_prefs_dialog )
    {
        p_prefs_dialog->Show( !p_prefs_dialog->IsShown() );
    }
}

304
305
void DialogsProvider::OnWizardDialog( wxCommandEvent& WXUNUSED(event) )
{
306
    p_wizard_dialog = new WizardDialog( p_intf, this, NULL, 0, 0 );
307
308
309
310

    if( p_wizard_dialog )
    {
        p_wizard_dialog->Run();
311
        delete p_wizard_dialog;
312
313
314
315
316
    }

    p_wizard_dialog = NULL;
}

gbazin's avatar
gbazin committed
317
318
319
320
void DialogsProvider::OnBookmarks( wxCommandEvent& WXUNUSED(event) )
{
    /* Show/hide the open dialog */
    if( !p_bookmarks_dialog )
321
        p_bookmarks_dialog = BookmarksDialog( p_intf, this );
gbazin's avatar
gbazin committed
322
323
324
325
326
327
328

    if( p_bookmarks_dialog )
    {
        p_bookmarks_dialog->Show( !p_bookmarks_dialog->IsShown() );
    }
}

gbazin's avatar
   
gbazin committed
329
330
331
332
333
334
335
336
337
338
339
void DialogsProvider::OnOpenFileGeneric( wxCommandEvent& event )
{
    intf_dialog_args_t *p_arg = (intf_dialog_args_t *)event.GetClientData();

    if( p_arg == NULL )
    {
        msg_Dbg( p_intf, "OnOpenFileGeneric() called with NULL arg" );
        return;
    }

    if( p_file_generic_dialog == NULL )
340
        p_file_generic_dialog = new wxFileDialog( NULL );
gbazin's avatar
   
gbazin committed
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381

    if( p_file_generic_dialog )
    {
        p_file_generic_dialog->SetMessage( wxU(p_arg->psz_title) );
        p_file_generic_dialog->SetWildcard( wxU(p_arg->psz_extensions) );
        p_file_generic_dialog->SetStyle( (p_arg->b_save ? wxSAVE : wxOPEN) |
                                         (p_arg->b_multiple ? wxMULTIPLE:0) );
    }

    if( p_file_generic_dialog &&
        p_file_generic_dialog->ShowModal() == wxID_OK )
    {
        wxArrayString paths;

        p_file_generic_dialog->GetPaths( paths );

        p_arg->i_results = paths.GetCount();
        p_arg->psz_results = (char **)malloc( p_arg->i_results *
                                              sizeof(char *) );
        for( size_t i = 0; i < paths.GetCount(); i++ )
        {
            p_arg->psz_results[i] = strdup( paths[i].mb_str() );
        }
    }

    /* Callback */
    if( p_arg->pf_callback )
    {
        p_arg->pf_callback( p_arg );
    }

    if( p_arg->psz_results )
    {
        for( int i = 0; i < p_arg->i_results; i++ )
        {
            free( p_arg->psz_results[i] );
        }
        free( p_arg->psz_results );
    }
    if( p_arg->psz_title ) free( p_arg->psz_title );
    if( p_arg->psz_extensions ) free( p_arg->psz_extensions );
382

383
    free( p_arg );
gbazin's avatar
   
gbazin committed
384
385
}

gbazin's avatar
   
gbazin committed
386
387
388
389
390
391
392
393
394
395
396
void DialogsProvider::OnOpenFileSimple( wxCommandEvent& event )
{
    playlist_t *p_playlist =
        (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
                                       FIND_ANYWHERE );
    if( p_playlist == NULL )
    {
        return;
    }

    if( p_file_dialog == NULL )
397
        p_file_dialog = new wxFileDialog( NULL, wxU(_("Open File")),
gbazin's avatar
   
gbazin committed
398
399
400
401
402
403
404
405
406
            wxT(""), wxT(""), wxT("*"), wxOPEN | wxMULTIPLE );

    if( p_file_dialog && p_file_dialog->ShowModal() == wxID_OK )
    {
        wxArrayString paths;

        p_file_dialog->GetPaths( paths );

        for( size_t i = 0; i < paths.GetCount(); i++ )
407
408
        {
            char *psz_utf8 = FromLocale( paths[i].mb_str() );
gbazin's avatar
   
gbazin committed
409
            if( event.GetInt() )
410
                playlist_Add( p_playlist, psz_utf8, psz_utf8,
gbazin's avatar
   
gbazin committed
411
412
413
                              PLAYLIST_APPEND | (i ? 0 : PLAYLIST_GO),
                              PLAYLIST_END );
            else
414
                playlist_Add( p_playlist, psz_utf8, psz_utf8,
415
                              PLAYLIST_APPEND, PLAYLIST_END );
416
417
            LocaleFree( psz_utf8 );
        }
gbazin's avatar
   
gbazin committed
418
419
420
421
422
    }

    vlc_object_release( p_playlist );
}

zorglub's avatar
zorglub committed
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
void DialogsProvider::OnOpenDirectory( wxCommandEvent& event )
{
    playlist_t *p_playlist =
        (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
                                       FIND_ANYWHERE );
    if( p_playlist == NULL )
    {
        return;
    }

    if( p_dir_dialog == NULL )
        p_dir_dialog = new wxDirDialog( NULL );

    if( p_dir_dialog && p_dir_dialog->ShowModal() == wxID_OK )
    {
        wxString path = p_dir_dialog->GetPath();
439
440
        char *psz_utf8 = FromLocale( path.mb_str() );
        playlist_Add( p_playlist, psz_utf8, psz_utf8,
441
442
                      PLAYLIST_APPEND | (event.GetInt() ? PLAYLIST_GO : 0),
                      PLAYLIST_END );
443
        LocaleFree( psz_utf8 );
zorglub's avatar
zorglub committed
444
445
446
447
448
    }

    vlc_object_release( p_playlist );
}

gbazin's avatar
   
gbazin committed
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
void DialogsProvider::OnOpenFile( wxCommandEvent& event )
{
    Open( FILE_ACCESS, event.GetInt() );
}

void DialogsProvider::OnOpenDisc( wxCommandEvent& event )
{
    Open( DISC_ACCESS, event.GetInt() );
}

void DialogsProvider::OnOpenNet( wxCommandEvent& event )
{
    Open( NET_ACCESS, event.GetInt() );
}

gbazin's avatar
gbazin committed
464
465
466
467
468
void DialogsProvider::OnOpenCapture( wxCommandEvent& event )
{
    Open( CAPTURE_ACCESS, event.GetInt() );
}

gbazin's avatar
   
gbazin committed
469
470
471
472
void DialogsProvider::Open( int i_access_method, int i_arg )
{
    /* Show/hide the open dialog */
    if( !p_open_dialog )
gbazin's avatar
   
gbazin committed
473
474
        p_open_dialog = new OpenDialog( p_intf, this, i_access_method, i_arg,
                                        OPEN_NORMAL );
gbazin's avatar
   
gbazin committed
475
476
477
478
479
480

    if( p_open_dialog )
    {
        p_open_dialog->Show( i_access_method, i_arg );
    }
}
gbazin's avatar
   
gbazin committed
481
482
483

void DialogsProvider::OnPopupMenu( wxCommandEvent& event )
{
484
    wxPoint mousepos = ScreenToClient( wxGetMousePosition() );
gbazin's avatar
   
gbazin committed
485
486
    ::PopupMenu( p_intf, this, mousepos );
}
gbazin's avatar
   
gbazin committed
487
488
489
490
491

void DialogsProvider::OnExitThread( wxCommandEvent& WXUNUSED(event) )
{
    wxTheApp->ExitMainLoop();
}
492
493
494
495
496
497
498
499
500
501
502
503

void DialogsProvider::OnUpdateVLC( wxCommandEvent& WXUNUSED(event) )
{
    /* Show/hide the file info window */
    if( !p_updatevlc_dialog )
        p_updatevlc_dialog = new UpdateVLC( p_intf, this );

    if( p_updatevlc_dialog )
    {
        p_updatevlc_dialog->Show( !p_updatevlc_dialog->IsShown() );
    }
}