]> git.sesse.net Git - vlc/blob - modules/gui/beos/PlayListWindow.cpp
+ src/libvlc.h: use KEY_SPACE instead of ' '
[vlc] / modules / gui / beos / PlayListWindow.cpp
1 /*****************************************************************************
2  * PlayListWindow.cpp: beos interface
3  *****************************************************************************
4  * Copyright (C) 1999, 2000, 2001 VideoLAN
5  * $Id$
6  *
7  * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
8  *          Samuel Hocevar <sam@zoy.org>
9  *          Tony Castley <tony@castley.net>
10  *          Richard Shepherd <richard@rshepherd.demon.co.uk>
11  *          Stephan Aßmus <stippi@yellowbites.com>
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
26  *****************************************************************************/
27
28 /* System headers */
29 #include <InterfaceKit.h>
30 #include <StorageKit.h>
31 #include <string.h>
32
33 /* VLC headers */
34 #include <vlc/vlc.h>
35 #include <vlc/intf.h>
36
37 /* BeOS interface headers */
38 #include "InterfaceWindow.h"
39 #include "ListViews.h"
40 #include "MsgVals.h"
41 #include "PlayListWindow.h"
42
43 enum
44 {
45         MSG_SELECT_ALL                  = 'sall',
46         MSG_SELECT_NONE                 = 'none',
47         MSG_RANDOMIZE                   = 'rndm',
48         MSG_SORT_REVERSE                = 'srtr',
49         MSG_SORT_NAME                   = 'srtn',
50         MSG_SORT_PATH                   = 'srtp',
51         MSG_REMOVE                              = 'rmov',
52         MSG_REMOVE_ALL                  = 'rmal',
53
54         MSG_SELECTION_CHANGED   = 'slch',
55         MSG_SET_DISPLAY                 = 'stds',
56 };
57
58
59 /*****************************************************************************
60  * PlayListWindow::PlayListWindow
61  *****************************************************************************/
62 PlayListWindow::PlayListWindow( BRect frame, const char* name,
63                                                                 InterfaceWindow* mainWindow,
64                                                                 intf_thread_t *p_interface )
65         :       BWindow( frame, name, B_FLOATING_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
66                                  B_WILL_ACCEPT_FIRST_CLICK | B_ASYNCHRONOUS_CONTROLS ),
67                 fMainWindow( mainWindow )
68 {
69     char psz_tmp[1024];
70 #define ADD_ELLIPSIS( a ) \
71     memset( psz_tmp, 0, 1024 ); \
72     snprintf( psz_tmp, 1024, "%s%s", a, B_UTF8_ELLIPSIS );
73
74         p_intf = p_interface;
75     
76     SetName( _("playlist") );
77
78     // set up the main menu bar
79         fMenuBar = new BMenuBar( BRect(0.0, 0.0, frame.Width(), 15.0), "main menu",
80                                                          B_FOLLOW_NONE, B_ITEMS_IN_ROW, false );
81
82     AddChild( fMenuBar );
83
84         // Add the File menu
85         BMenu *fileMenu = new BMenu( _("File") );
86         fMenuBar->AddItem( fileMenu );
87         ADD_ELLIPSIS( _("Open File") );
88         BMenuItem* item = new BMenuItem( psz_tmp, new BMessage( OPEN_FILE ), 'O' );
89         item->SetTarget( fMainWindow );
90         fileMenu->AddItem( item );
91
92         CDMenu* cd_menu = new CDMenu( _("Open Disc") );
93         fileMenu->AddItem( cd_menu );
94
95         fileMenu->AddSeparatorItem();
96         item = new BMenuItem( _("Close"),
97                                                   new BMessage( B_QUIT_REQUESTED ), 'W' );
98         fileMenu->AddItem( item );
99
100         // Add the Edit menu
101         BMenu *editMenu = new BMenu( _("Edit") );
102         fMenuBar->AddItem( editMenu );
103         fSelectAllMI = new BMenuItem( _("Select All"),
104                                                                   new BMessage( MSG_SELECT_ALL ), 'A' );
105         editMenu->AddItem( fSelectAllMI );
106         fSelectNoneMI = new BMenuItem( _("Select None"),
107                                                                    new BMessage( MSG_SELECT_NONE ), 'A', B_SHIFT_KEY );
108         editMenu->AddItem( fSelectNoneMI );
109
110         editMenu->AddSeparatorItem();
111         fSortReverseMI = new BMenuItem( _("Sort Reverse"),
112                                                                  new BMessage( MSG_SORT_REVERSE ), 'F' );
113         editMenu->AddItem( fSortReverseMI );
114         fSortNameMI = new BMenuItem( _("Sort by Name"),
115                                                                  new BMessage( MSG_SORT_NAME ), 'N' );
116 fSortNameMI->SetEnabled( false );
117         editMenu->AddItem( fSortNameMI );
118         fSortPathMI = new BMenuItem( _("Sort by Path"),
119                                                                  new BMessage( MSG_SORT_PATH ), 'P' );
120 fSortPathMI->SetEnabled( false );
121         editMenu->AddItem( fSortPathMI );
122         fRandomizeMI = new BMenuItem( _("Randomize"),
123                                                                   new BMessage( MSG_RANDOMIZE ), 'R' );
124 fRandomizeMI->SetEnabled( false );
125         editMenu->AddItem( fRandomizeMI );
126         editMenu->AddSeparatorItem();
127         fRemoveMI = new BMenuItem( _("Remove"),
128                                                   new BMessage( MSG_REMOVE ) );
129         editMenu->AddItem( fRemoveMI );
130         fRemoveAllMI = new BMenuItem( _("Remove All"),
131                                                                   new BMessage( MSG_REMOVE_ALL ) );
132         editMenu->AddItem( fRemoveAllMI );
133
134         // Add View menu
135         fViewMenu = new BMenu( _("View") );
136         fMenuBar->AddItem( fViewMenu );
137
138         fViewMenu->SetRadioMode( true );
139         BMessage* message = new BMessage( MSG_SET_DISPLAY );
140         message->AddInt32( "mode", DISPLAY_PATH );
141         item = new BMenuItem( _("Path"), message );
142         item->SetMarked( true );
143         fViewMenu->AddItem( item );
144
145         message = new BMessage( MSG_SET_DISPLAY );
146         message->AddInt32( "mode", DISPLAY_NAME );
147         item = new BMenuItem( _("Name"), message );
148         fViewMenu->AddItem( item );
149
150         // make menu bar resize to correct height
151         float menuWidth, menuHeight;
152         fMenuBar->GetPreferredSize( &menuWidth, &menuHeight );
153         // don't change next line! it's a workarround!
154         fMenuBar->ResizeTo( frame.Width(), menuHeight );
155
156         frame = Bounds();
157         frame.top += fMenuBar->Bounds().IntegerHeight() + 1;
158         frame.right -= B_V_SCROLL_BAR_WIDTH;
159
160         fListView = new PlaylistView( p_intf, frame, fMainWindow,
161                                                                   new BMessage( MSG_SELECTION_CHANGED ) );
162         fBackgroundView = new BScrollView( "playlist scrollview",
163                                                                            fListView, B_FOLLOW_ALL_SIDES,
164                                                                            0, false, true,
165                                                                            B_NO_BORDER );
166
167         AddChild( fBackgroundView );
168
169         // be up to date
170         UpdatePlaylist();
171         FrameResized( Bounds().Width(), Bounds().Height() );
172         SetSizeLimits( menuWidth * 1.5, menuWidth * 8.0,
173                                    menuHeight * 5.0, menuHeight * 50.0 );
174
175         UpdatePlaylist( true );
176         // start window thread in hidden state
177         Hide();
178         Show();
179 }
180
181 /*****************************************************************************
182  * PlayListWindow::~PlayListWindow
183  *****************************************************************************/
184 PlayListWindow::~PlayListWindow()
185 {
186 }
187
188 /*****************************************************************************
189  * PlayListWindow::QuitRequested
190  *****************************************************************************/
191 bool
192 PlayListWindow::QuitRequested()
193 {
194         Hide(); 
195         return false;
196 }
197
198 /*****************************************************************************
199  * PlayListWindow::MessageReceived
200  *****************************************************************************/
201 void
202 PlayListWindow::MessageReceived( BMessage * p_message )
203 {
204         switch ( p_message->what )
205         {
206                 case OPEN_DVD:
207                 case B_REFS_RECEIVED:
208                 case B_SIMPLE_DATA:
209                         // forward to interface window
210                         fMainWindow->PostMessage( p_message );
211                         break;
212                 case MSG_SELECT_ALL:
213                         fListView->Select( 0, fListView->CountItems() - 1 );
214                         break;
215                 case MSG_SELECT_NONE:
216                         fListView->DeselectAll();
217                         break;
218                 case MSG_RANDOMIZE:
219                         break;
220                 case MSG_SORT_REVERSE:
221                         fListView->SortReverse();
222                         break;
223                 case MSG_SORT_NAME:
224                         break;
225                 case MSG_SORT_PATH:
226                         break;
227                 case MSG_REMOVE:
228                         fListView->RemoveSelected();
229                         break;
230                 case MSG_REMOVE_ALL:
231                         fListView->Select( 0, fListView->CountItems() - 1 );
232                         fListView->RemoveSelected();
233                         break;
234                 case MSG_SELECTION_CHANGED:
235                         _CheckItemsEnableState();
236                         break;
237                 case MSG_SET_DISPLAY:
238                 {
239                         uint32 mode;
240                         if ( p_message->FindInt32( "mode", (int32*)&mode ) == B_OK )
241                                 SetDisplayMode( mode );
242                         break;
243                 }
244                 case B_MODIFIERS_CHANGED:
245                         fListView->ModifiersChanged();
246                         break;
247                 default:
248                         BWindow::MessageReceived( p_message );
249                         break;
250         }
251 }
252
253 /*****************************************************************************
254  * PlayListWindow::FrameResized
255  *****************************************************************************/
256 void
257 PlayListWindow::FrameResized(float width, float height)
258 {
259         BRect r(Bounds());
260         fMenuBar->MoveTo(r.LeftTop());
261         fMenuBar->ResizeTo(r.Width(), fMenuBar->Bounds().Height());
262         r.top += fMenuBar->Bounds().Height() + 1.0;
263         fBackgroundView->MoveTo(r.LeftTop());
264         // the "+ 1.0" is to make the scrollbar
265         // be partly covered by the window border
266         fBackgroundView->ResizeTo(r.Width() + 1.0, r.Height() + 1.0);
267 }
268
269 /*****************************************************************************
270  * PlayListWindow::ReallyQuit
271  *****************************************************************************/
272 void
273 PlayListWindow::ReallyQuit()
274 {
275     Lock();
276     Hide();
277     Quit();
278 }
279
280 /*****************************************************************************
281  * PlayListWindow::UpdatePlaylist
282  *****************************************************************************/
283 void
284 PlayListWindow::UpdatePlaylist( bool rebuild )
285 {
286         if ( rebuild )
287                 fListView->RebuildList();
288 #if 0
289         fListView->SetCurrent( p_wrapper->PlaylistCurrent() );
290         fListView->SetPlaying( p_wrapper->IsPlaying() );
291 #endif
292         _CheckItemsEnableState();
293 }
294
295 /*****************************************************************************
296  * PlayListWindow::SetDisplayMode
297  *****************************************************************************/
298 void
299 PlayListWindow::SetDisplayMode( uint32 mode )
300 {
301         if ( Lock() )
302         {
303                 // propagate to list view
304                 fListView->SetDisplayMode( mode );
305                 // mark correct menu item
306                 for ( int32 i = 0; BMenuItem* item = fViewMenu->ItemAt( i ); i++ )
307                 {
308                         BMessage* message = item->Message();
309                         uint32 itemMode;
310                         if ( message
311                                  && message->FindInt32( "mode", (int32*)&itemMode ) == B_OK
312                                  && itemMode == mode )
313                         {
314                                 item->SetMarked( true );
315                                 break;
316                         }
317                 }
318                 Unlock();
319         }
320 }
321
322 /*****************************************************************************
323  * PlayListWindow::DisplayMode
324  *****************************************************************************/
325 uint32
326 PlayListWindow::DisplayMode() const
327 {
328         return fListView->DisplayMode();
329 }
330
331 /*****************************************************************************
332  * PlayListWindow::_CheckItemsEnableState
333  *****************************************************************************/
334 void
335 PlayListWindow::_CheckItemsEnableState() const
336 {
337         // check if one item selected
338         int32 test = fListView->CurrentSelection( 0 );
339         bool enable1 = test >= 0;
340         // check if at least two items selected
341         test = fListView->CurrentSelection( 1 );
342         bool enable2 = test >= 0;
343         bool notEmpty = fListView->CountItems() > 0;
344         _SetMenuItemEnabled( fSelectAllMI, notEmpty );
345         _SetMenuItemEnabled( fSelectNoneMI, enable1 );
346         _SetMenuItemEnabled( fSortReverseMI, enable2 );
347 //      _SetMenuItemEnabled( fSortNameMI, enable2 );
348 //      _SetMenuItemEnabled( fSortPathMI, enable2 );
349 //      _SetMenuItemEnabled( fRandomizeMI, enable2 );
350         _SetMenuItemEnabled( fRemoveMI, enable1 );
351         _SetMenuItemEnabled( fRemoveAllMI, notEmpty );
352 }
353
354 /*****************************************************************************
355  * PlayListWindow::_SetMenuItemEnabled
356  *****************************************************************************/
357 void
358 PlayListWindow::_SetMenuItemEnabled( BMenuItem* item, bool enabled ) const
359 {
360         // this check should actally be done in BMenuItem::SetEnabled(), but it is not...
361         if ( item->IsEnabled() != enabled )
362                 item->SetEnabled( enabled );
363 }