1 /*****************************************************************************
2 * PlayListWindow.cpp: beos interface
3 *****************************************************************************
4 * Copyright (C) 1999, 2000, 2001 the VideoLAN team
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>
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.
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.
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 *****************************************************************************/
29 #include <InterfaceKit.h>
30 #include <StorageKit.h>
37 /* BeOS interface headers */
38 #include "InterfaceWindow.h"
39 #include "ListViews.h"
41 #include "PlayListWindow.h"
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',
52 MSG_REMOVE_ALL = 'rmal',
54 MSG_SELECTION_CHANGED = 'slch',
55 MSG_SET_DISPLAY = 'stds',
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 )
70 #define ADD_ELLIPSIS( a ) \
71 memset( psz_tmp, 0, 1024 ); \
72 snprintf( psz_tmp, 1024, "%s%s", a, B_UTF8_ELLIPSIS );
76 SetName( _("playlist") );
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 );
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 );
92 CDMenu* cd_menu = new CDMenu( _("Open Disc") );
93 fileMenu->AddItem( cd_menu );
95 fileMenu->AddSeparatorItem();
96 item = new BMenuItem( _("Close"),
97 new BMessage( B_QUIT_REQUESTED ), 'W' );
98 fileMenu->AddItem( item );
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 );
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 );
135 fViewMenu = new BMenu( _("View") );
136 fMenuBar->AddItem( fViewMenu );
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 );
145 message = new BMessage( MSG_SET_DISPLAY );
146 message->AddInt32( "mode", DISPLAY_NAME );
147 item = new BMenuItem( _("Name"), message );
148 fViewMenu->AddItem( item );
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 );
157 frame.top += fMenuBar->Bounds().IntegerHeight() + 1;
158 frame.right -= B_V_SCROLL_BAR_WIDTH;
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,
167 AddChild( fBackgroundView );
171 FrameResized( Bounds().Width(), Bounds().Height() );
172 SetSizeLimits( menuWidth * 1.5, menuWidth * 8.0,
173 menuHeight * 5.0, menuHeight * 50.0 );
175 UpdatePlaylist( true );
176 // start window thread in hidden state
181 /*****************************************************************************
182 * PlayListWindow::~PlayListWindow
183 *****************************************************************************/
184 PlayListWindow::~PlayListWindow()
188 /*****************************************************************************
189 * PlayListWindow::QuitRequested
190 *****************************************************************************/
192 PlayListWindow::QuitRequested()
198 /*****************************************************************************
199 * PlayListWindow::MessageReceived
200 *****************************************************************************/
202 PlayListWindow::MessageReceived( BMessage * p_message )
204 switch ( p_message->what )
207 case B_REFS_RECEIVED:
209 // forward to interface window
210 fMainWindow->PostMessage( p_message );
213 fListView->Select( 0, fListView->CountItems() - 1 );
215 case MSG_SELECT_NONE:
216 fListView->DeselectAll();
220 case MSG_SORT_REVERSE:
221 fListView->SortReverse();
228 fListView->RemoveSelected();
231 fListView->Select( 0, fListView->CountItems() - 1 );
232 fListView->RemoveSelected();
234 case MSG_SELECTION_CHANGED:
235 _CheckItemsEnableState();
237 case MSG_SET_DISPLAY:
240 if ( p_message->FindInt32( "mode", (int32*)&mode ) == B_OK )
241 SetDisplayMode( mode );
244 case B_MODIFIERS_CHANGED:
245 fListView->ModifiersChanged();
248 BWindow::MessageReceived( p_message );
253 /*****************************************************************************
254 * PlayListWindow::FrameResized
255 *****************************************************************************/
257 PlayListWindow::FrameResized(float width, float height)
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);
269 /*****************************************************************************
270 * PlayListWindow::ReallyQuit
271 *****************************************************************************/
273 PlayListWindow::ReallyQuit()
280 /*****************************************************************************
281 * PlayListWindow::UpdatePlaylist
282 *****************************************************************************/
284 PlayListWindow::UpdatePlaylist( bool rebuild )
286 playlist_t * p_playlist;
289 fListView->RebuildList();
291 p_playlist = (playlist_t *)
292 vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
293 fListView->SetCurrent( p_playlist->i_index );
294 fListView->SetPlaying( p_playlist->status.i_status == PLAYLIST_RUNNING );
295 vlc_object_release( p_playlist );
297 _CheckItemsEnableState();
300 /*****************************************************************************
301 * PlayListWindow::SetDisplayMode
302 *****************************************************************************/
304 PlayListWindow::SetDisplayMode( uint32 mode )
308 // propagate to list view
309 fListView->SetDisplayMode( mode );
310 // mark correct menu item
311 for ( int32 i = 0; BMenuItem* item = fViewMenu->ItemAt( i ); i++ )
313 BMessage* message = item->Message();
316 && message->FindInt32( "mode", (int32*)&itemMode ) == B_OK
317 && itemMode == mode )
319 item->SetMarked( true );
327 /*****************************************************************************
328 * PlayListWindow::DisplayMode
329 *****************************************************************************/
331 PlayListWindow::DisplayMode() const
333 return fListView->DisplayMode();
336 /*****************************************************************************
337 * PlayListWindow::_CheckItemsEnableState
338 *****************************************************************************/
340 PlayListWindow::_CheckItemsEnableState() const
342 // check if one item selected
343 int32 test = fListView->CurrentSelection( 0 );
344 bool enable1 = test >= 0;
345 // check if at least two items selected
346 test = fListView->CurrentSelection( 1 );
347 bool enable2 = test >= 0;
348 bool notEmpty = fListView->CountItems() > 0;
349 _SetMenuItemEnabled( fSelectAllMI, notEmpty );
350 _SetMenuItemEnabled( fSelectNoneMI, enable1 );
351 _SetMenuItemEnabled( fSortReverseMI, enable2 );
352 // _SetMenuItemEnabled( fSortNameMI, enable2 );
353 // _SetMenuItemEnabled( fSortPathMI, enable2 );
354 // _SetMenuItemEnabled( fRandomizeMI, enable2 );
355 _SetMenuItemEnabled( fRemoveMI, enable1 );
356 _SetMenuItemEnabled( fRemoveAllMI, notEmpty );
359 /*****************************************************************************
360 * PlayListWindow::_SetMenuItemEnabled
361 *****************************************************************************/
363 PlayListWindow::_SetMenuItemEnabled( BMenuItem* item, bool enabled ) const
365 // this check should actally be done in BMenuItem::SetEnabled(), but it is not...
366 if ( item->IsEnabled() != enabled )
367 item->SetEnabled( enabled );