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 #include <vlc_common.h>
38 #include <vlc_interface.h>
40 /* BeOS interface headers */
41 #include "InterfaceWindow.h"
42 #include "ListViews.h"
44 #include "PlayListWindow.h"
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',
55 MSG_REMOVE_ALL = 'rmal',
57 MSG_SELECTION_CHANGED = 'slch',
58 MSG_SET_DISPLAY = 'stds',
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 )
73 #define ADD_ELLIPSIS( a ) \
74 memset( psz_tmp, 0, 1024 ); \
75 snprintf( psz_tmp, 1024, "%s%s", a, B_UTF8_ELLIPSIS );
79 SetName( _("playlist") );
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 );
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 );
95 CDMenu* cd_menu = new CDMenu( _("Open Disc") );
96 fileMenu->AddItem( cd_menu );
98 fileMenu->AddSeparatorItem();
99 item = new BMenuItem( _("Close"),
100 new BMessage( B_QUIT_REQUESTED ), 'W' );
101 fileMenu->AddItem( item );
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 );
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 );
138 fViewMenu = new BMenu( _("View") );
139 fMenuBar->AddItem( fViewMenu );
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 );
148 message = new BMessage( MSG_SET_DISPLAY );
149 message->AddInt32( "mode", DISPLAY_NAME );
150 item = new BMenuItem( _("Name"), message );
151 fViewMenu->AddItem( item );
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 );
160 frame.top += fMenuBar->Bounds().IntegerHeight() + 1;
161 frame.right -= B_V_SCROLL_BAR_WIDTH;
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,
170 AddChild( fBackgroundView );
174 FrameResized( Bounds().Width(), Bounds().Height() );
175 SetSizeLimits( menuWidth * 1.5, menuWidth * 8.0,
176 menuHeight * 5.0, menuHeight * 50.0 );
178 UpdatePlaylist( true );
179 // start window thread in hidden state
184 /*****************************************************************************
185 * PlayListWindow::~PlayListWindow
186 *****************************************************************************/
187 PlayListWindow::~PlayListWindow()
191 /*****************************************************************************
192 * PlayListWindow::QuitRequested
193 *****************************************************************************/
195 PlayListWindow::QuitRequested()
201 /*****************************************************************************
202 * PlayListWindow::MessageReceived
203 *****************************************************************************/
205 PlayListWindow::MessageReceived( BMessage * p_message )
207 switch ( p_message->what )
210 case B_REFS_RECEIVED:
212 // forward to interface window
213 fMainWindow->PostMessage( p_message );
216 fListView->Select( 0, fListView->CountItems() - 1 );
218 case MSG_SELECT_NONE:
219 fListView->DeselectAll();
223 case MSG_SORT_REVERSE:
224 fListView->SortReverse();
231 fListView->RemoveSelected();
234 fListView->Select( 0, fListView->CountItems() - 1 );
235 fListView->RemoveSelected();
237 case MSG_SELECTION_CHANGED:
238 _CheckItemsEnableState();
240 case MSG_SET_DISPLAY:
243 if ( p_message->FindInt32( "mode", (int32*)&mode ) == B_OK )
244 SetDisplayMode( mode );
247 case B_MODIFIERS_CHANGED:
248 fListView->ModifiersChanged();
251 BWindow::MessageReceived( p_message );
256 /*****************************************************************************
257 * PlayListWindow::FrameResized
258 *****************************************************************************/
260 PlayListWindow::FrameResized(float width, float height)
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);
272 /*****************************************************************************
273 * PlayListWindow::ReallyQuit
274 *****************************************************************************/
276 PlayListWindow::ReallyQuit()
283 /*****************************************************************************
284 * PlayListWindow::UpdatePlaylist
285 *****************************************************************************/
287 PlayListWindow::UpdatePlaylist( bool rebuild )
289 playlist_t * p_playlist;
292 fListView->RebuildList();
294 p_playlist = pl_Yield( p_intf );
295 fListView->SetCurrent( p_playlist->i_index );
296 fListView->SetPlaying( p_playlist->status.i_status == PLAYLIST_RUNNING );
297 pl_Release( p_intf );
299 _CheckItemsEnableState();
302 /*****************************************************************************
303 * PlayListWindow::SetDisplayMode
304 *****************************************************************************/
306 PlayListWindow::SetDisplayMode( uint32 mode )
310 // propagate to list view
311 fListView->SetDisplayMode( mode );
312 // mark correct menu item
313 for ( int32 i = 0; BMenuItem* item = fViewMenu->ItemAt( i ); i++ )
315 BMessage* message = item->Message();
318 && message->FindInt32( "mode", (int32*)&itemMode ) == B_OK
319 && itemMode == mode )
321 item->SetMarked( true );
329 /*****************************************************************************
330 * PlayListWindow::DisplayMode
331 *****************************************************************************/
333 PlayListWindow::DisplayMode() const
335 return fListView->DisplayMode();
338 /*****************************************************************************
339 * PlayListWindow::_CheckItemsEnableState
340 *****************************************************************************/
342 PlayListWindow::_CheckItemsEnableState() const
344 // check if one item selected
345 int32 test = fListView->CurrentSelection( 0 );
346 bool enable1 = test >= 0;
347 // check if at least two items selected
348 test = fListView->CurrentSelection( 1 );
349 bool enable2 = test >= 0;
350 bool notEmpty = fListView->CountItems() > 0;
351 _SetMenuItemEnabled( fSelectAllMI, notEmpty );
352 _SetMenuItemEnabled( fSelectNoneMI, enable1 );
353 _SetMenuItemEnabled( fSortReverseMI, enable2 );
354 // _SetMenuItemEnabled( fSortNameMI, enable2 );
355 // _SetMenuItemEnabled( fSortPathMI, enable2 );
356 // _SetMenuItemEnabled( fRandomizeMI, enable2 );
357 _SetMenuItemEnabled( fRemoveMI, enable1 );
358 _SetMenuItemEnabled( fRemoveAllMI, notEmpty );
361 /*****************************************************************************
362 * PlayListWindow::_SetMenuItemEnabled
363 *****************************************************************************/
365 PlayListWindow::_SetMenuItemEnabled( BMenuItem* item, bool enabled ) const
367 // this check should actally be done in BMenuItem::SetEnabled(), but it is not...
368 if ( item->IsEnabled() != enabled )
369 item->SetEnabled( enabled );