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