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>
34 #include <vlc_interface.h>
36 /* BeOS interface headers */
37 #include "InterfaceWindow.h"
38 #include "ListViews.h"
40 #include "PlayListWindow.h"
44 MSG_SELECT_ALL = 'sall',
45 MSG_SELECT_NONE = 'none',
46 MSG_RANDOMIZE = 'rndm',
47 MSG_SORT_REVERSE = 'srtr',
48 MSG_SORT_NAME = 'srtn',
49 MSG_SORT_PATH = 'srtp',
51 MSG_REMOVE_ALL = 'rmal',
53 MSG_SELECTION_CHANGED = 'slch',
54 MSG_SET_DISPLAY = 'stds',
58 /*****************************************************************************
59 * PlayListWindow::PlayListWindow
60 *****************************************************************************/
61 PlayListWindow::PlayListWindow( BRect frame, const char* name,
62 InterfaceWindow* mainWindow,
63 intf_thread_t *p_interface )
64 : BWindow( frame, name, B_FLOATING_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
65 B_WILL_ACCEPT_FIRST_CLICK | B_ASYNCHRONOUS_CONTROLS ),
66 fMainWindow( mainWindow )
69 #define ADD_ELLIPSIS( a ) \
70 memset( psz_tmp, 0, 1024 ); \
71 snprintf( psz_tmp, 1024, "%s%s", a, B_UTF8_ELLIPSIS );
75 SetName( _("playlist") );
77 // set up the main menu bar
78 fMenuBar = new BMenuBar( BRect(0.0, 0.0, frame.Width(), 15.0), "main menu",
79 B_FOLLOW_NONE, B_ITEMS_IN_ROW, false );
84 BMenu *fileMenu = new BMenu( _("File") );
85 fMenuBar->AddItem( fileMenu );
86 ADD_ELLIPSIS( _("Open File") );
87 BMenuItem* item = new BMenuItem( psz_tmp, new BMessage( OPEN_FILE ), 'O' );
88 item->SetTarget( fMainWindow );
89 fileMenu->AddItem( item );
91 CDMenu* cd_menu = new CDMenu( _("Open Disc") );
92 fileMenu->AddItem( cd_menu );
94 fileMenu->AddSeparatorItem();
95 item = new BMenuItem( _("Close"),
96 new BMessage( B_QUIT_REQUESTED ), 'W' );
97 fileMenu->AddItem( item );
100 BMenu *editMenu = new BMenu( _("Edit") );
101 fMenuBar->AddItem( editMenu );
102 fSelectAllMI = new BMenuItem( _("Select All"),
103 new BMessage( MSG_SELECT_ALL ), 'A' );
104 editMenu->AddItem( fSelectAllMI );
105 fSelectNoneMI = new BMenuItem( _("Select None"),
106 new BMessage( MSG_SELECT_NONE ), 'A', B_SHIFT_KEY );
107 editMenu->AddItem( fSelectNoneMI );
109 editMenu->AddSeparatorItem();
110 fSortReverseMI = new BMenuItem( _("Sort Reverse"),
111 new BMessage( MSG_SORT_REVERSE ), 'F' );
112 editMenu->AddItem( fSortReverseMI );
113 fSortNameMI = new BMenuItem( _("Sort by Name"),
114 new BMessage( MSG_SORT_NAME ), 'N' );
115 fSortNameMI->SetEnabled( false );
116 editMenu->AddItem( fSortNameMI );
117 fSortPathMI = new BMenuItem( _("Sort by Path"),
118 new BMessage( MSG_SORT_PATH ), 'P' );
119 fSortPathMI->SetEnabled( false );
120 editMenu->AddItem( fSortPathMI );
121 fRandomizeMI = new BMenuItem( _("Randomize"),
122 new BMessage( MSG_RANDOMIZE ), 'R' );
123 fRandomizeMI->SetEnabled( false );
124 editMenu->AddItem( fRandomizeMI );
125 editMenu->AddSeparatorItem();
126 fRemoveMI = new BMenuItem( _("Remove"),
127 new BMessage( MSG_REMOVE ) );
128 editMenu->AddItem( fRemoveMI );
129 fRemoveAllMI = new BMenuItem( _("Remove All"),
130 new BMessage( MSG_REMOVE_ALL ) );
131 editMenu->AddItem( fRemoveAllMI );
134 fViewMenu = new BMenu( _("View") );
135 fMenuBar->AddItem( fViewMenu );
137 fViewMenu->SetRadioMode( true );
138 BMessage* message = new BMessage( MSG_SET_DISPLAY );
139 message->AddInt32( "mode", DISPLAY_PATH );
140 item = new BMenuItem( _("Path"), message );
141 item->SetMarked( true );
142 fViewMenu->AddItem( item );
144 message = new BMessage( MSG_SET_DISPLAY );
145 message->AddInt32( "mode", DISPLAY_NAME );
146 item = new BMenuItem( _("Name"), message );
147 fViewMenu->AddItem( item );
149 // make menu bar resize to correct height
150 float menuWidth, menuHeight;
151 fMenuBar->GetPreferredSize( &menuWidth, &menuHeight );
152 // don't change next line! it's a workarround!
153 fMenuBar->ResizeTo( frame.Width(), menuHeight );
156 frame.top += fMenuBar->Bounds().IntegerHeight() + 1;
157 frame.right -= B_V_SCROLL_BAR_WIDTH;
159 fListView = new PlaylistView( p_intf, frame, fMainWindow,
160 new BMessage( MSG_SELECTION_CHANGED ) );
161 fBackgroundView = new BScrollView( "playlist scrollview",
162 fListView, B_FOLLOW_ALL_SIDES,
166 AddChild( fBackgroundView );
170 FrameResized( Bounds().Width(), Bounds().Height() );
171 SetSizeLimits( menuWidth * 1.5, menuWidth * 8.0,
172 menuHeight * 5.0, menuHeight * 50.0 );
174 UpdatePlaylist( true );
175 // start window thread in hidden state
180 /*****************************************************************************
181 * PlayListWindow::~PlayListWindow
182 *****************************************************************************/
183 PlayListWindow::~PlayListWindow()
187 /*****************************************************************************
188 * PlayListWindow::QuitRequested
189 *****************************************************************************/
191 PlayListWindow::QuitRequested()
197 /*****************************************************************************
198 * PlayListWindow::MessageReceived
199 *****************************************************************************/
201 PlayListWindow::MessageReceived( BMessage * p_message )
203 switch ( p_message->what )
206 case B_REFS_RECEIVED:
208 // forward to interface window
209 fMainWindow->PostMessage( p_message );
212 fListView->Select( 0, fListView->CountItems() - 1 );
214 case MSG_SELECT_NONE:
215 fListView->DeselectAll();
219 case MSG_SORT_REVERSE:
220 fListView->SortReverse();
227 fListView->RemoveSelected();
230 fListView->Select( 0, fListView->CountItems() - 1 );
231 fListView->RemoveSelected();
233 case MSG_SELECTION_CHANGED:
234 _CheckItemsEnableState();
236 case MSG_SET_DISPLAY:
239 if ( p_message->FindInt32( "mode", (int32*)&mode ) == B_OK )
240 SetDisplayMode( mode );
243 case B_MODIFIERS_CHANGED:
244 fListView->ModifiersChanged();
247 BWindow::MessageReceived( p_message );
252 /*****************************************************************************
253 * PlayListWindow::FrameResized
254 *****************************************************************************/
256 PlayListWindow::FrameResized(float width, float height)
259 fMenuBar->MoveTo(r.LeftTop());
260 fMenuBar->ResizeTo(r.Width(), fMenuBar->Bounds().Height());
261 r.top += fMenuBar->Bounds().Height() + 1.0;
262 fBackgroundView->MoveTo(r.LeftTop());
263 // the "+ 1.0" is to make the scrollbar
264 // be partly covered by the window border
265 fBackgroundView->ResizeTo(r.Width() + 1.0, r.Height() + 1.0);
268 /*****************************************************************************
269 * PlayListWindow::ReallyQuit
270 *****************************************************************************/
272 PlayListWindow::ReallyQuit()
279 /*****************************************************************************
280 * PlayListWindow::UpdatePlaylist
281 *****************************************************************************/
283 PlayListWindow::UpdatePlaylist( bool rebuild )
285 playlist_t * p_playlist;
288 fListView->RebuildList();
290 p_playlist = (playlist_t *)
291 vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
292 fListView->SetCurrent( p_playlist->i_index );
293 fListView->SetPlaying( p_playlist->status.i_status == PLAYLIST_RUNNING );
294 vlc_object_release( p_playlist );
296 _CheckItemsEnableState();
299 /*****************************************************************************
300 * PlayListWindow::SetDisplayMode
301 *****************************************************************************/
303 PlayListWindow::SetDisplayMode( uint32 mode )
307 // propagate to list view
308 fListView->SetDisplayMode( mode );
309 // mark correct menu item
310 for ( int32 i = 0; BMenuItem* item = fViewMenu->ItemAt( i ); i++ )
312 BMessage* message = item->Message();
315 && message->FindInt32( "mode", (int32*)&itemMode ) == B_OK
316 && itemMode == mode )
318 item->SetMarked( true );
326 /*****************************************************************************
327 * PlayListWindow::DisplayMode
328 *****************************************************************************/
330 PlayListWindow::DisplayMode() const
332 return fListView->DisplayMode();
335 /*****************************************************************************
336 * PlayListWindow::_CheckItemsEnableState
337 *****************************************************************************/
339 PlayListWindow::_CheckItemsEnableState() const
341 // check if one item selected
342 int32 test = fListView->CurrentSelection( 0 );
343 bool enable1 = test >= 0;
344 // check if at least two items selected
345 test = fListView->CurrentSelection( 1 );
346 bool enable2 = test >= 0;
347 bool notEmpty = fListView->CountItems() > 0;
348 _SetMenuItemEnabled( fSelectAllMI, notEmpty );
349 _SetMenuItemEnabled( fSelectNoneMI, enable1 );
350 _SetMenuItemEnabled( fSortReverseMI, enable2 );
351 // _SetMenuItemEnabled( fSortNameMI, enable2 );
352 // _SetMenuItemEnabled( fSortPathMI, enable2 );
353 // _SetMenuItemEnabled( fRandomizeMI, enable2 );
354 _SetMenuItemEnabled( fRemoveMI, enable1 );
355 _SetMenuItemEnabled( fRemoveAllMI, notEmpty );
358 /*****************************************************************************
359 * PlayListWindow::_SetMenuItemEnabled
360 *****************************************************************************/
362 PlayListWindow::_SetMenuItemEnabled( BMenuItem* item, bool enabled ) const
364 // this check should actally be done in BMenuItem::SetEnabled(), but it is not...
365 if ( item->IsEnabled() != enabled )
366 item->SetEnabled( enabled );