]> git.sesse.net Git - vlc/blob - plugins/win32/mainframe.cpp
* ALL: got rid of p_object->p_this which is now useless.
[vlc] / plugins / win32 / mainframe.cpp
1 /*****************************************************************************\r
2  * mainframe.cpp: Win32 interface plugin for vlc\r
3  *****************************************************************************\r
4  * Copyright (C) 2002 VideoLAN\r
5  *\r
6  * Authors: Olivier Teulière <ipkiss@via.ecp.fr>\r
7  *\r
8  * This program is free software; you can redistribute it and/or modify\r
9  * it under the terms of the GNU General Public License as published by\r
10  * the Free Software Foundation; either version 2 of the License, or\r
11  * (at your option) any later version.\r
12  *\r
13  * This program is distributed in the hope that it will be useful,\r
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
16  * GNU General Public License for more details.\r
17  *\r
18  * You should have received a copy of the GNU General Public License\r
19  * along with this program; if not, write to the Free Software\r
20  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
21  *****************************************************************************/\r
22 \r
23 #include <vcl.h>\r
24 #pragma hdrstop\r
25 \r
26 #include <vlc/vlc.h>\r
27 #include <vlc/intf.h>\r
28 #include <vlc/vout.h>\r
29 \r
30 #include "mainframe.h"\r
31 #include "menu.h"\r
32 #include "control.h"\r
33 #include "disc.h"\r
34 #include "network.h"\r
35 #include "about.h"\r
36 #include "preferences.h"\r
37 #include "messages.h"\r
38 #include "playlist.h"\r
39 #include "win32_common.h"\r
40 \r
41 #include "netutils.h"\r
42 \r
43 //---------------------------------------------------------------------------\r
44 //#pragma package(smart_init)\r
45 #pragma link "CSPIN"\r
46 #pragma resource "*.dfm"\r
47 \r
48 extern intf_thread_t *p_intfGlobal;\r
49 extern int Win32Manage( intf_thread_t *p_intf );\r
50 \r
51 //---------------------------------------------------------------------------\r
52 __fastcall TMainFrameDlg::TMainFrameDlg( TComponent* Owner )\r
53         : TForm( Owner )\r
54 {\r
55     Application->ShowHint = true;\r
56     Application->OnHint = DisplayHint;\r
57 \r
58     TimerManage->Interval = INTF_IDLE_SLEEP / 1000;\r
59 \r
60     TrackBar->Max = SLIDER_MAX_VALUE;\r
61 \r
62     /* default height */\r
63     ClientHeight = 37 + ToolBar->Height;\r
64 \r
65     StringListPref = new TStringList();\r
66 }\r
67 //---------------------------------------------------------------------------\r
68 __fastcall TMainFrameDlg::~TMainFrameDlg()\r
69 {\r
70     delete StringListPref;\r
71 }\r
72 //---------------------------------------------------------------------------\r
73 \r
74 \r
75 /*****************************************************************************\r
76  * Event handlers\r
77  ****************************************************************************/\r
78 void __fastcall TMainFrameDlg::TimerManageTimer( TObject *Sender )\r
79 {\r
80     Win32Manage( p_intfGlobal );\r
81 }\r
82 //---------------------------------------------------------------------------\r
83 void __fastcall TMainFrameDlg::DisplayHint( TObject *Sender )\r
84 {\r
85     StatusBar->SimpleText = GetLongHint( Application->Hint );\r
86 }\r
87 //---------------------------------------------------------------------------\r
88 void __fastcall TMainFrameDlg::TrackBarChange( TObject *Sender )\r
89 {\r
90     /* This function displays the current date related to the position in\r
91      * the stream. It is called whenever the slider changes its value.\r
92      * The lock has to be taken before the function is called */\r
93 \r
94 //    vlc_mutex_lock( &p_intfGlobal->p_vlc->p_input_bank->pp_input[0]->stream.stream_lock );\r
95 \r
96     if( p_intfGlobal->p_vlc->p_input_bank->pp_input[0] != NULL )\r
97     {\r
98 #define p_area p_intfGlobal->p_vlc->p_input_bank->pp_input[0]->stream.p_selected_area\r
99         char psz_time[ OFFSETTOTIME_MAX_SIZE ];\r
100         off_t Value = TrackBar->Position;\r
101 \r
102         GroupBoxSlider->Caption =\r
103                 input_OffsetToTime( p_intfGlobal->p_vlc->p_input_bank->pp_input[0], psz_time,\r
104                         ( p_area->i_size * Value ) / (off_t)SLIDER_MAX_VALUE );\r
105 #undef p_area\r
106      }\r
107 \r
108 //    vlc_mutex_unlock( &p_intfGlobal->p_vlc->p_input_bank->pp_input[0]->stream.stream_lock );\r
109 }\r
110 //---------------------------------------------------------------------------\r
111 void __fastcall TMainFrameDlg::FormClose( TObject *Sender,\r
112       TCloseAction &Action )\r
113 {\r
114     intf_thread_t *p_intf = p_intfGlobal;\r
115 \r
116     vlc_mutex_lock( &p_intf->change_lock );\r
117     p_intf->p_vlc->b_die = 1;\r
118     vlc_mutex_unlock( &p_intf->change_lock );\r
119 \r
120     /* we don't destroy the form immediatly */\r
121     Action = caHide;\r
122 }\r
123 //---------------------------------------------------------------------------\r
124 \r
125 \r
126 /*****************************************************************************\r
127  * Menu callbacks\r
128  ****************************************************************************/\r
129 void __fastcall TMainFrameDlg::MenuOpenFileClick( TObject *Sender )\r
130 {\r
131     int             i_end = p_intfGlobal->p_vlc->p_playlist->i_size;\r
132     AnsiString      FileName;\r
133     if( OpenDialog1->Execute() )\r
134     {\r
135         /* add the new file to the interface playlist */\r
136         FileName = OpenDialog1->FileName;\r
137         intf_PlaylistAdd( p_intfGlobal->p_vlc->p_playlist, PLAYLIST_END,\r
138             (char*)FileName.c_str() );\r
139 \r
140         /* update the plugin display */\r
141         p_intfGlobal->p_sys->p_playlist->UpdateGrid( p_intfGlobal->p_vlc->p_playlist );\r
142 \r
143         /* end current item, select added item  */\r
144         if( p_intfGlobal->p_vlc->p_input_bank->pp_input[0] != NULL )\r
145         {\r
146             p_intfGlobal->p_vlc->p_input_bank->pp_input[0]->b_eof = 1;\r
147         }\r
148 \r
149         intf_PlaylistJumpto( p_intfGlobal->p_vlc->p_playlist, i_end - 1 );\r
150     };\r
151 }\r
152 //---------------------------------------------------------------------------\r
153 void __fastcall TMainFrameDlg::MenuOpenDiscClick( TObject *Sender )\r
154 {\r
155     TDiscDlg *p_disc = p_intfGlobal->p_sys->p_disc;\r
156     if( p_disc == NULL )\r
157     {\r
158         p_disc = new TDiscDlg( this );\r
159         p_intfGlobal->p_sys->p_disc = p_disc;\r
160     }\r
161     p_disc->Show();\r
162 }\r
163 //---------------------------------------------------------------------------\r
164 void __fastcall TMainFrameDlg::MenuNetworkStreamClick( TObject *Sender )\r
165 {\r
166     TNetworkDlg *p_network = p_intfGlobal->p_sys->p_network;\r
167     if( p_network == NULL )\r
168     {\r
169         p_network = new TNetworkDlg( this );\r
170         p_intfGlobal->p_sys->p_network = p_network;\r
171     }\r
172     p_network->Show();\r
173 }\r
174 //---------------------------------------------------------------------------\r
175 void __fastcall TMainFrameDlg::MenuExitClick( TObject *Sender )\r
176 {\r
177     Close();\r
178 }\r
179 //---------------------------------------------------------------------------\r
180 void __fastcall TMainFrameDlg::MenuHideinterfaceClick( TObject *Sender )\r
181 {\r
182      this->SendToBack();\r
183 }\r
184 //---------------------------------------------------------------------------\r
185 void __fastcall TMainFrameDlg::MenuFullscreenClick( TObject *Sender )\r
186 {\r
187     if( p_intfGlobal->p_vlc->p_vout_bank->i_count )\r
188     {\r
189         vlc_mutex_lock( &p_intfGlobal->p_vlc->p_vout_bank->pp_vout[0]->change_lock );\r
190 \r
191         p_intfGlobal->p_vlc->p_vout_bank->pp_vout[0]->i_changes |= VOUT_FULLSCREEN_CHANGE;\r
192 \r
193         vlc_mutex_unlock( &p_intfGlobal->p_vlc->p_vout_bank->pp_vout[0]->change_lock );\r
194     }\r
195 }\r
196 //---------------------------------------------------------------------------\r
197 void __fastcall TMainFrameDlg::MenuPlaylistClick( TObject *Sender )\r
198 {\r
199     TPlaylistDlg *p_playlist = p_intfGlobal->p_sys->p_playlist;\r
200     if( p_playlist->Visible )\r
201     {\r
202         p_playlist->Hide();\r
203     }\r
204     else\r
205     {\r
206         p_playlist->UpdateGrid( p_intfGlobal->p_vlc->p_playlist );\r
207         p_playlist->Show();\r
208     }\r
209 }\r
210 //---------------------------------------------------------------------------\r
211 void __fastcall TMainFrameDlg::MenuMessagesClick( TObject *Sender )\r
212 {\r
213      p_intfGlobal->p_sys->p_messages->Show();\r
214 }\r
215 //---------------------------------------------------------------------------\r
216 void __fastcall TMainFrameDlg::MenuPreferencesClick( TObject *Sender )\r
217 {\r
218     CreatePreferences( "main" );\r
219 }\r
220 //---------------------------------------------------------------------------\r
221 void __fastcall TMainFrameDlg::MenuAboutClick( TObject *Sender )\r
222 {\r
223     p_intfGlobal->p_sys->p_about = new TAboutDlg( this );\r
224     p_intfGlobal->p_sys->p_about->ShowModal();\r
225     delete p_intfGlobal->p_sys->p_about;\r
226 }\r
227 //---------------------------------------------------------------------------\r
228 \r
229 \r
230 /*****************************************************************************\r
231  * Toolbar callbacks\r
232  ****************************************************************************/\r
233 void __fastcall TMainFrameDlg::ToolButtonFileClick( TObject *Sender )\r
234 {\r
235     MenuOpenFileClick( Sender );\r
236 }\r
237 //---------------------------------------------------------------------------\r
238 void __fastcall TMainFrameDlg::ToolButtonDiscClick( TObject *Sender )\r
239 {\r
240     MenuOpenDiscClick( Sender );\r
241 }\r
242 //---------------------------------------------------------------------------\r
243 void __fastcall TMainFrameDlg::ToolButtonNetClick( TObject *Sender )\r
244 {\r
245     MenuNetworkStreamClick( Sender );\r
246 }\r
247 //---------------------------------------------------------------------------\r
248 void __fastcall TMainFrameDlg::ToolButtonPlaylistClick( TObject *Sender )\r
249 {\r
250     MenuPlaylistClick( Sender );\r
251 }\r
252 //---------------------------------------------------------------------------\r
253 void __fastcall TMainFrameDlg::ToolButtonBackClick( TObject *Sender )\r
254 {\r
255     ControlBack( Sender );\r
256 }\r
257 //---------------------------------------------------------------------------\r
258 void __fastcall TMainFrameDlg::ToolButtonStopClick( TObject *Sender )\r
259 {\r
260     ControlStop( Sender );\r
261 }\r
262 //---------------------------------------------------------------------------\r
263 void __fastcall TMainFrameDlg::ToolButtonPlayClick( TObject *Sender )\r
264 {\r
265     ControlPlay( Sender );\r
266 }\r
267 //---------------------------------------------------------------------------\r
268 void __fastcall TMainFrameDlg::ToolButtonPauseClick( TObject *Sender )\r
269 {\r
270     ControlPause( Sender );\r
271 }\r
272 //---------------------------------------------------------------------------\r
273 void __fastcall TMainFrameDlg::ToolButtonSlowClick( TObject *Sender )\r
274 {\r
275     ControlSlow( Sender );\r
276 }\r
277 //---------------------------------------------------------------------------\r
278 void __fastcall TMainFrameDlg::ToolButtonFastClick( TObject *Sender )\r
279 {\r
280     ControlFast( Sender );\r
281 }\r
282 //---------------------------------------------------------------------------\r
283 void __fastcall TMainFrameDlg::ToolButtonPrevClick( TObject *Sender )\r
284 {\r
285     p_intfGlobal->p_sys->p_playlist->Previous();\r
286 }\r
287 //---------------------------------------------------------------------------\r
288 void __fastcall TMainFrameDlg::ToolButtonNextClick( TObject *Sender )\r
289 {\r
290     p_intfGlobal->p_sys->p_playlist->Next();\r
291 }\r
292 //---------------------------------------------------------------------------\r
293 void __fastcall TMainFrameDlg::ToolButtonEjectClick( TObject *Sender )\r
294 {\r
295     AnsiString Device = "";\r
296 \r
297     /*\r
298      * Get the active input\r
299      * Determine whether we can eject a media, ie it's a VCD or DVD\r
300      * If it's neither a VCD nor a DVD, then return\r
301      */\r
302 \r
303     if( p_intfGlobal->p_vlc->p_playlist->current.psz_name != NULL )\r
304     {\r
305         if( strncmp( p_intfGlobal->p_vlc->p_playlist->current.psz_name, "dvd", 3 )\r
306             || strncmp( p_intfGlobal->p_vlc->p_playlist->current.psz_name, "vcd", 3 ) )\r
307         {\r
308             /* Determine the device name by omitting the first 4 characters\r
309              * and keeping 3 characters */\r
310             Device = strdup( ( p_intfGlobal->p_vlc->p_playlist->current.psz_name + 4 ) );\r
311             Device = Device.SubString( 1, 2 );\r
312         }\r
313     }\r
314 \r
315     if( Device == "" )\r
316     {\r
317         return;\r
318     }\r
319 \r
320     /* If there's a stream playing, we aren't allowed to eject ! */\r
321     if( p_input_bank->pp_input[0] == NULL )\r
322     {\r
323         intf_WarnMsg( 4, "intf: ejecting %s", Device.c_str() );\r
324 \r
325         intf_Eject( Device.c_str() );\r
326     }\r
327 }\r
328 //--------------------------------------------------------------------------\r
329 \r
330 \r
331 /*****************************************************************************\r
332  * Popup callbacks\r
333  ****************************************************************************/\r
334 void __fastcall TMainFrameDlg::PopupCloseClick( TObject *Sender )\r
335 {\r
336     /* We do nothing, we just need a click on a menu item\r
337      * to close the popup. Don't ask me why... */\r
338     return;\r
339 }\r
340 //---------------------------------------------------------------------------\r
341 void __fastcall TMainFrameDlg::PopupPlayClick( TObject *Sender )\r
342 {\r
343     ToolButtonPlayClick( Sender );\r
344 }\r
345 //---------------------------------------------------------------------------\r
346 void __fastcall TMainFrameDlg::PopupPauseClick( TObject *Sender )\r
347 {\r
348     ToolButtonPauseClick( Sender );\r
349 }\r
350 //---------------------------------------------------------------------------\r
351 void __fastcall TMainFrameDlg::PopupStopClick( TObject *Sender )\r
352 {\r
353     ToolButtonStopClick( Sender );\r
354 }\r
355 //---------------------------------------------------------------------------\r
356 void __fastcall TMainFrameDlg::PopupBackClick( TObject *Sender )\r
357 {\r
358     ToolButtonBackClick( Sender );\r
359 }\r
360 //---------------------------------------------------------------------------\r
361 void __fastcall TMainFrameDlg::PopupSlowClick( TObject *Sender )\r
362 {\r
363     ToolButtonSlowClick( Sender );\r
364 }\r
365 //---------------------------------------------------------------------------\r
366 void __fastcall TMainFrameDlg::PopupFastClick( TObject *Sender )\r
367 {\r
368     ToolButtonFastClick( Sender );\r
369 }\r
370 //---------------------------------------------------------------------------\r
371 void __fastcall TMainFrameDlg::PopupToggleInterfaceClick( TObject *Sender )\r
372 {\r
373     this->BringToFront();\r
374 }\r
375 //---------------------------------------------------------------------------\r
376 void __fastcall TMainFrameDlg::PopupFullscreenClick( TObject *Sender )\r
377 {\r
378     MenuFullscreenClick( Sender );\r
379 }\r
380 //---------------------------------------------------------------------------\r
381 void __fastcall TMainFrameDlg::PopupNextClick( TObject *Sender )\r
382 {\r
383     ToolButtonNextClick( Sender );\r
384 }\r
385 //---------------------------------------------------------------------------\r
386 void __fastcall TMainFrameDlg::PopupPrevClick( TObject *Sender )\r
387 {\r
388     ToolButtonPrevClick( Sender );\r
389 }\r
390 //---------------------------------------------------------------------------\r
391 void __fastcall TMainFrameDlg::PopupJumpClick( TObject *Sender )\r
392 {\r
393     // TODO\r
394 }\r
395 //---------------------------------------------------------------------------\r
396 void __fastcall TMainFrameDlg::PopupPlaylistClick( TObject *Sender )\r
397 {\r
398     MenuPlaylistClick( Sender );\r
399 }\r
400 //---------------------------------------------------------------------------\r
401 void __fastcall TMainFrameDlg::PopupPreferencesClick( TObject *Sender )\r
402 {\r
403     MenuPreferencesClick( Sender );\r
404 }\r
405 //---------------------------------------------------------------------------\r
406 void __fastcall TMainFrameDlg::PopupExitClick( TObject *Sender )\r
407 {\r
408     MenuExitClick( Sender );\r
409 }\r
410 //---------------------------------------------------------------------------\r
411 void __fastcall TMainFrameDlg::PopupOpenFileClick( TObject *Sender )\r
412 {\r
413     MenuOpenFileClick( Sender );\r
414 }\r
415 //---------------------------------------------------------------------------\r
416 void __fastcall TMainFrameDlg::PopupOpenDiscClick( TObject *Sender )\r
417 {\r
418     MenuOpenDiscClick( Sender );\r
419 }\r
420 //---------------------------------------------------------------------------\r
421 void __fastcall TMainFrameDlg::PopupNetworkStreamClick( TObject *Sender )\r
422 {\r
423     MenuNetworkStreamClick( Sender );\r
424 }\r
425 //---------------------------------------------------------------------------\r
426 \r
427 \r
428 /*****************************************************************************\r
429  * Callbacks for DVD/VCD navigation\r
430  ****************************************************************************/\r
431 void __fastcall TMainFrameDlg::ButtonTitlePrevClick( TObject *Sender )\r
432 {\r
433     intf_thread_t * p_intf;\r
434     input_bank_t  * p_input_bank;\r
435     input_area_t  * p_area;\r
436     int             i_id;\r
437 \r
438     p_intf = p_intfGlobal;\r
439     p_input_bank = p_intf->p_vlc->p_input_bank;\r
440     i_id = p_input_bank->pp_input[0]->stream.p_selected_area->i_id - 1;\r
441 \r
442     /* Disallow area 0 since it is used for video_ts.vob */\r
443     if( i_id > 0 )\r
444     {\r
445         p_area = p_input_bank->pp_input[0]->stream.pp_areas[i_id];\r
446         input_ChangeArea( p_input_bank->pp_input[0], (input_area_t*)p_area );\r
447 \r
448         input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY );\r
449 \r
450         p_intf->p_sys->b_title_update = 1;\r
451         vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock );\r
452         SetupMenus( p_intf );\r
453         vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock );\r
454     }\r
455 }\r
456 //---------------------------------------------------------------------------\r
457 void __fastcall TMainFrameDlg::ButtonTitleNextClick( TObject *Sender )\r
458 {\r
459     intf_thread_t * p_intf;\r
460     input_bank_t  * p_input_bank;\r
461     input_area_t  * p_area;\r
462     int             i_id;\r
463 \r
464     p_intf = p_intfGlobal;\r
465     p_input_bank = p_intf->p_vlc->p_input_bank;\r
466     i_id = p_input_bank->pp_input[0]->stream.p_selected_area->i_id + 1;\r
467 \r
468     if( i_id < p_input_bank->pp_input[0]->stream.i_area_nb )\r
469     {\r
470         p_area = p_input_bank->pp_input[0]->stream.pp_areas[i_id];   \r
471         input_ChangeArea( p_input_bank->pp_input[0], (input_area_t*)p_area );\r
472                   \r
473         input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY );\r
474 \r
475         p_intf->p_sys->b_title_update = 1;\r
476         vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock );\r
477         SetupMenus( p_intf );\r
478         vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock );\r
479     }\r
480 }\r
481 //---------------------------------------------------------------------------\r
482 void __fastcall TMainFrameDlg::ButtonChapterPrevClick( TObject *Sender )\r
483 {\r
484     intf_thread_t * p_intf = p_intfGlobal;\r
485     input_bank_t  * p_input_bank = p_intf->p_vlc->p_input_bank;\r
486     input_area_t  * p_area;\r
487 \r
488     p_area = p_input_bank->pp_input[0]->stream.p_selected_area;\r
489 \r
490     if( p_area->i_part > 0 )\r
491     {\r
492         p_area->i_part--;\r
493         input_ChangeArea( p_input_bank->pp_input[0], (input_area_t*)p_area );\r
494 \r
495         input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY );\r
496 \r
497         p_intf->p_sys->b_chapter_update = 1;\r
498         vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock );\r
499         SetupMenus( p_intf );\r
500         vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock );\r
501     }\r
502 }\r
503 //---------------------------------------------------------------------------\r
504 void __fastcall TMainFrameDlg::ButtonChapterNextClick( TObject *Sender )\r
505 {\r
506     intf_thread_t * p_intf = p_intfGlobal;\r
507     input_bank_t  * p_input_bank = p_intf->p_vlc->p_input_bank;\r
508     input_area_t  * p_area;\r
509 \r
510     p_area = p_input_bank->pp_input[0]->stream.p_selected_area;\r
511     \r
512     if( p_area->i_part < p_area->i_part_nb )\r
513     {\r
514         p_area->i_part++;\r
515         input_ChangeArea( p_input_bank->pp_input[0], (input_area_t*)p_area );\r
516 \r
517         input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY );\r
518 \r
519         p_intf->p_sys->b_chapter_update = 1;\r
520         vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock );\r
521         SetupMenus( p_intf );\r
522         vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock );\r
523     }\r
524 }\r
525 //---------------------------------------------------------------------------\r
526 \r
527 \r
528 /*****************************************************************************\r
529  * Callback for the 'go!' button\r
530  ****************************************************************************/\r
531 void __fastcall TMainFrameDlg::ButtonGoClick( TObject *Sender )\r
532 {\r
533     intf_thread_t *p_intf = p_intfGlobal;\r
534     input_bank_t  *p_input_bank = p_intf->p_vlc->p_input_bank;\r
535     int i_channel;\r
536 \r
537     i_channel = SpinEditChannel->Value;\r
538     msg_Dbg( p_intf, "joining channel %d", i_channel );\r
539 \r
540     vlc_mutex_lock( &p_intf->change_lock );\r
541     if( p_input_bank->pp_input[0] != NULL )\r
542     {\r
543         /* end playing item */\r
544         p_input_bank->pp_input[0]->b_eof = 1;\r
545 \r
546         /* update playlist */\r
547         vlc_mutex_lock( &p_intf->p_vlc->p_playlist->change_lock );\r
548 \r
549         p_intf->p_vlc->p_playlist->i_index--;\r
550         p_intf->p_vlc->p_playlist->b_stopped = 1;\r
551 \r
552         vlc_mutex_unlock( &p_intf->p_vlc->p_playlist->change_lock );\r
553 \r
554         /* FIXME: ugly hack to close input and outputs */\r
555         p_intf->pf_manage( p_intf );\r
556     }\r
557 \r
558     network_ChannelJoin( p_intf, i_channel );\r
559 \r
560     /* FIXME 2 */\r
561     p_intf->p_vlc->p_playlist->b_stopped = 0;\r
562     p_intf->pf_manage( p_intf );\r
563 \r
564     vlc_mutex_unlock( &p_intf->change_lock );\r
565 \r
566 //    input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY );\r
567 }\r
568 //---------------------------------------------------------------------------\r
569 \r
570 \r
571 /*****************************************************************************\r
572  * ModeManage: actualise the aspect of the interface whenever the input\r
573  *             changes.\r
574  *****************************************************************************\r
575  * The lock has to be taken before you call the function.\r
576  *****************************************************************************/\r
577 void __fastcall TMainFrameDlg::ModeManage()\r
578 {\r
579     intf_thread_t * p_intf = p_intfGlobal;\r
580     input_bank_t  * p_input_bank = p_intf->p_vlc->p_input_bank;\r
581     TGroupBox     * ActiveGB;\r
582     int             i_Height;\r
583     bool            b_control;\r
584 \r
585     /* hide all boxes */\r
586     GroupBoxFile->Visible = false;\r
587     GroupBoxNetwork->Visible = false;\r
588     GroupBoxDisc->Visible = false;\r
589 \r
590     /* hide slider */\r
591     GroupBoxSlider->Hide();\r
592 \r
593     /* controls unavailable */\r
594     b_control = 0;\r
595 \r
596     /* show the box related to current input mode */\r
597     if( p_input_bank->pp_input[0] != NULL )\r
598     {\r
599         switch( p_input_bank->pp_input[0]->stream.i_method & 0xf0 )\r
600         {    \r
601             case INPUT_METHOD_FILE:\r
602                 GroupBoxFile->Visible = true;\r
603                 ActiveGB = GroupBoxFile;\r
604                 LabelFileName->Caption = p_input_bank->pp_input[0]->psz_source;\r
605                 break;\r
606             case INPUT_METHOD_DISC:\r
607                 GroupBoxDisc->Visible = true;\r
608                 ActiveGB = GroupBoxDisc;\r
609                 break;\r
610             case INPUT_METHOD_NETWORK:\r
611                 GroupBoxNetwork->Visible = true;\r
612                 ActiveGB = GroupBoxNetwork;\r
613                 LabelServer->Caption = p_input_bank->pp_input[0]->psz_source;\r
614                 if( config_GetInt( p_intf, "network-channel" ) )\r
615                 {\r
616                     LabelChannel->Visible = true;\r
617                 }\r
618                 else\r
619                 {\r
620                     LabelChannel->Visible = false;\r
621                 }\r
622                 break;\r
623             default:\r
624                 msg_Warn( p_intf, "cannot determine input method" );\r
625                 GroupBoxFile->Visible = true;\r
626                 ActiveGB = GroupBoxFile;\r
627                 LabelFileName->Caption = p_input_bank->pp_input[0]->psz_source;\r
628                 break;\r
629         }\r
630 \r
631         i_Height = StatusBar->Height + ActiveGB->Height + ToolBar->Height + 54;\r
632 \r
633         /* initialize and show slider for seekable streams */\r
634         if( p_input_bank->pp_input[0]->stream.b_seekable )\r
635         {\r
636             TrackBar->Position = p_intf->p_sys->OldValue = 0;\r
637             GroupBoxSlider->Show();\r
638             i_Height += GroupBoxSlider->Height;\r
639         }\r
640 \r
641         /* control buttons for free pace streams */\r
642         b_control = p_input_bank->pp_input[0]->stream.b_pace_control;\r
643 \r
644         /* get ready for menu regeneration */\r
645         p_intf->p_sys->b_program_update = 1;\r
646         p_intf->p_sys->b_title_update = 1;\r
647         p_intf->p_sys->b_chapter_update = 1;\r
648         p_intf->p_sys->b_audio_update = 1;\r
649         p_intf->p_sys->b_spu_update = 1;\r
650         p_intf->p_sys->i_part = 0;\r
651 \r
652         p_input_bank->pp_input[0]->stream.b_changed = 0;\r
653         msg_Dbg( p_intf, "stream has changed, refreshing interface" );\r
654     }\r
655     else\r
656     {\r
657         i_Height = StatusBar->Height + ToolBar->Height + 47;\r
658 \r
659         if( config_GetInt( p_intf, "network-channel" ) )\r
660         {\r
661             GroupBoxNetwork->Visible = true;\r
662             LabelChannel->Visible = true;\r
663             i_Height += GroupBoxNetwork->Height + 7;\r
664         }\r
665         else\r
666         {\r
667             /* add space between tolbar and statusbar when\r
668              * nothing is displayed; isn't it nicer ? :) */ \r
669             i_Height += 17;\r
670 \r
671             /* unsensitize menus */\r
672             MenuProgram->Enabled = false;\r
673             MenuTitle->Enabled = false;\r
674             MenuChapter->Enabled = false;\r
675             MenuAudio->Enabled = false;\r
676             MenuSubtitles->Enabled = false;\r
677             PopupNavigation->Enabled = false;\r
678             PopupAudio->Enabled = false;\r
679             PopupSubtitles->Enabled = false;\r
680         }\r
681     }\r
682 \r
683     /* resize main window */\r
684     this->Height = i_Height;\r
685 \r
686     /* set control items */\r
687     ToolButtonBack->Enabled = false;\r
688     ToolButtonStop->Enabled = true;\r
689     ToolButtonEject->Enabled = !b_control;\r
690     ToolButtonPause->Enabled = b_control;\r
691     ToolButtonSlow->Enabled = b_control;\r
692     ToolButtonFast->Enabled = b_control;\r
693     PopupBack->Enabled = false;\r
694     PopupPause->Enabled = b_control;\r
695     PopupSlow->Enabled = b_control;\r
696     PopupFast->Enabled = b_control;\r
697 }\r
698 //---------------------------------------------------------------------------\r
699 \r
700 \r
701 /*****************************************************************************\r
702  * CreateConfig: create a configuration dialog and save it for further use\r
703  *****************************************************************************\r
704  * Check if the dialog box is already opened, if so this will save us\r
705  * quite a bit of work. (the interface will be destroyed when you actually\r
706  * close the main window, but remember that it is only hidden if you\r
707  * clicked on the action buttons). This trick also allows us not to\r
708  * duplicate identical dialog windows.\r
709  *****************************************************************************/\r
710 void __fastcall TMainFrameDlg::CreatePreferences( AnsiString Name )\r
711 {\r
712     TPreferencesDlg *Preferences;\r
713     int i_index, i_pos;\r
714 \r
715     i_index = StringListPref->IndexOf( Name );\r
716     if( i_index != -1 )\r
717     {\r
718         /* config dialog already exists */\r
719         Preferences = (TPreferencesDlg *)StringListPref->Objects[i_index];\r
720     }\r
721     else\r
722     {\r
723         /* create the config dialog */\r
724         Preferences = new TPreferencesDlg( this );\r
725         Preferences->CreateConfigDialog( Name.c_str() );\r
726 \r
727         /* save it */\r
728         i_pos = StringListPref->Add( Name );\r
729         StringListPref->Objects[i_pos] = Preferences;\r
730     }\r
731 \r
732     /* display the dialog */\r
733     Preferences->Show();\r
734 }\r
735 //---------------------------------------------------------------------------\r
736 \r