1 /*****************************************************************************
2 * PlayListWindow.cpp: beos interface
3 *****************************************************************************
4 * Copyright (C) 1999, 2000, 2001 VideoLAN
5 * $Id: PlayListWindow.cpp,v 1.10 2004/01/26 16:52:31 zorglub Exp $
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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
26 *****************************************************************************/
29 #include <InterfaceKit.h>
30 #include <StorageKit.h>
37 /* BeOS interface headers */
38 #include "VlcWrapper.h"
39 #include "InterfaceWindow.h"
40 #include "ListViews.h"
42 #include "PlayListWindow.h"
46 MSG_SELECT_ALL = 'sall',
47 MSG_SELECT_NONE = 'none',
48 MSG_RANDOMIZE = 'rndm',
49 MSG_SORT_REVERSE = 'srtr',
50 MSG_SORT_NAME = 'srtn',
51 MSG_SORT_PATH = 'srtp',
53 MSG_REMOVE_ALL = 'rmal',
55 MSG_SELECTION_CHANGED = 'slch',
56 MSG_SET_DISPLAY = 'stds',
60 /*****************************************************************************
61 * PlayListWindow::PlayListWindow
62 *****************************************************************************/
63 PlayListWindow::PlayListWindow( BRect frame, const char* name,
64 InterfaceWindow* mainWindow,
65 intf_thread_t *p_interface )
66 : BWindow( frame, name, B_FLOATING_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
67 B_WILL_ACCEPT_FIRST_CLICK | B_ASYNCHRONOUS_CONTROLS ),
68 fMainWindow( mainWindow )
71 p_wrapper = p_intf->p_sys->p_wrapper;
73 SetName( _("playlist") );
75 // set up the main menu bar
76 fMenuBar = new BMenuBar( BRect(0.0, 0.0, frame.Width(), 15.0), "main menu",
77 B_FOLLOW_NONE, B_ITEMS_IN_ROW, false );
82 BMenu *fileMenu = new BMenu( _("File") );
83 fMenuBar->AddItem( fileMenu );
84 BMenuItem* item = new BMenuItem( _AddEllipsis(_("Open File")),
85 new BMessage( OPEN_FILE ), 'O' );
86 item->SetTarget( fMainWindow );
87 fileMenu->AddItem( item );
89 CDMenu* cd_menu = new CDMenu( _("Open Disc") );
90 fileMenu->AddItem( cd_menu );
92 fileMenu->AddSeparatorItem();
93 item = new BMenuItem( _("Close"),
94 new BMessage( B_QUIT_REQUESTED ), 'W' );
95 fileMenu->AddItem( item );
98 BMenu *editMenu = new BMenu( _("Edit") );
99 fMenuBar->AddItem( editMenu );
100 fSelectAllMI = new BMenuItem( _("Select All"),
101 new BMessage( MSG_SELECT_ALL ), 'A' );
102 editMenu->AddItem( fSelectAllMI );
103 fSelectNoneMI = new BMenuItem( _("Select None"),
104 new BMessage( MSG_SELECT_NONE ), 'A', B_SHIFT_KEY );
105 editMenu->AddItem( fSelectNoneMI );
107 editMenu->AddSeparatorItem();
108 fSortReverseMI = new BMenuItem( _("Sort Reverse"),
109 new BMessage( MSG_SORT_REVERSE ), 'F' );
110 editMenu->AddItem( fSortReverseMI );
111 fSortNameMI = new BMenuItem( _("Sort by Name"),
112 new BMessage( MSG_SORT_NAME ), 'N' );
113 fSortNameMI->SetEnabled( false );
114 editMenu->AddItem( fSortNameMI );
115 fSortPathMI = new BMenuItem( _("Sort by Path"),
116 new BMessage( MSG_SORT_PATH ), 'P' );
117 fSortPathMI->SetEnabled( false );
118 editMenu->AddItem( fSortPathMI );
119 fRandomizeMI = new BMenuItem( _("Randomize"),
120 new BMessage( MSG_RANDOMIZE ), 'R' );
121 fRandomizeMI->SetEnabled( false );
122 editMenu->AddItem( fRandomizeMI );
123 editMenu->AddSeparatorItem();
124 fRemoveMI = new BMenuItem( _("Remove"),
125 new BMessage( MSG_REMOVE ) );
126 editMenu->AddItem( fRemoveMI );
127 fRemoveAllMI = new BMenuItem( _("Remove All"),
128 new BMessage( MSG_REMOVE_ALL ) );
129 editMenu->AddItem( fRemoveAllMI );
132 fViewMenu = new BMenu( _("View") );
133 fMenuBar->AddItem( fViewMenu );
135 fViewMenu->SetRadioMode( true );
136 BMessage* message = new BMessage( MSG_SET_DISPLAY );
137 message->AddInt32( "mode", DISPLAY_PATH );
138 item = new BMenuItem( _("Path"), message );
139 item->SetMarked( true );
140 fViewMenu->AddItem( item );
142 message = new BMessage( MSG_SET_DISPLAY );
143 message->AddInt32( "mode", DISPLAY_NAME );
144 item = new BMenuItem( _("Name"), message );
145 fViewMenu->AddItem( item );
147 // make menu bar resize to correct height
148 float menuWidth, menuHeight;
149 fMenuBar->GetPreferredSize( &menuWidth, &menuHeight );
150 // don't change next line! it's a workarround!
151 fMenuBar->ResizeTo( frame.Width(), menuHeight );
154 frame.top += fMenuBar->Bounds().IntegerHeight() + 1;
155 frame.right -= B_V_SCROLL_BAR_WIDTH;
157 fListView = new PlaylistView( frame, fMainWindow, p_wrapper,
158 new BMessage( MSG_SELECTION_CHANGED ) );
159 fBackgroundView = new BScrollView( "playlist scrollview",
160 fListView, B_FOLLOW_ALL_SIDES,
164 AddChild( fBackgroundView );
168 FrameResized( Bounds().Width(), Bounds().Height() );
169 SetSizeLimits( menuWidth * 1.5, menuWidth * 8.0,
170 menuHeight * 5.0, menuHeight * 50.0 );
172 UpdatePlaylist( true );
173 // start window thread in hidden state
178 /*****************************************************************************
179 * PlayListWindow::~PlayListWindow
180 *****************************************************************************/
181 PlayListWindow::~PlayListWindow()
185 /*****************************************************************************
186 * PlayListWindow::QuitRequested
187 *****************************************************************************/
189 PlayListWindow::QuitRequested()
195 /*****************************************************************************
196 * PlayListWindow::MessageReceived
197 *****************************************************************************/
199 PlayListWindow::MessageReceived( BMessage * p_message )
201 switch ( p_message->what )
204 case B_REFS_RECEIVED:
206 // forward to interface window
207 fMainWindow->PostMessage( p_message );
210 fListView->Select( 0, fListView->CountItems() - 1 );
212 case MSG_SELECT_NONE:
213 fListView->DeselectAll();
217 case MSG_SORT_REVERSE:
218 fListView->SortReverse();
225 fListView->RemoveSelected();
228 fListView->Select( 0, fListView->CountItems() - 1 );
229 fListView->RemoveSelected();
231 case MSG_SELECTION_CHANGED:
232 _CheckItemsEnableState();
234 case MSG_SET_DISPLAY:
237 if ( p_message->FindInt32( "mode", (int32*)&mode ) == B_OK )
238 SetDisplayMode( mode );
241 case B_MODIFIERS_CHANGED:
242 fListView->ModifiersChanged();
245 BWindow::MessageReceived( p_message );
250 /*****************************************************************************
251 * PlayListWindow::FrameResized
252 *****************************************************************************/
254 PlayListWindow::FrameResized(float width, float height)
257 fMenuBar->MoveTo(r.LeftTop());
258 fMenuBar->ResizeTo(r.Width(), fMenuBar->Bounds().Height());
259 r.top += fMenuBar->Bounds().Height() + 1.0;
260 fBackgroundView->MoveTo(r.LeftTop());
261 // the "+ 1.0" is to make the scrollbar
262 // be partly covered by the window border
263 fBackgroundView->ResizeTo(r.Width() + 1.0, r.Height() + 1.0);
266 /*****************************************************************************
267 * PlayListWindow::ReallyQuit
268 *****************************************************************************/
270 PlayListWindow::ReallyQuit()
277 /*****************************************************************************
278 * PlayListWindow::UpdatePlaylist
279 *****************************************************************************/
281 PlayListWindow::UpdatePlaylist( bool rebuild )
284 fListView->RebuildList();
285 fListView->SetCurrent( p_wrapper->PlaylistCurrent() );
286 fListView->SetPlaying( p_wrapper->IsPlaying() );
288 _CheckItemsEnableState();
291 /*****************************************************************************
292 * PlayListWindow::SetDisplayMode
293 *****************************************************************************/
295 PlayListWindow::SetDisplayMode( uint32 mode )
299 // propagate to list view
300 fListView->SetDisplayMode( mode );
301 // mark correct menu item
302 for ( int32 i = 0; BMenuItem* item = fViewMenu->ItemAt( i ); i++ )
304 BMessage* message = item->Message();
307 && message->FindInt32( "mode", (int32*)&itemMode ) == B_OK
308 && itemMode == mode )
310 item->SetMarked( true );
318 /*****************************************************************************
319 * PlayListWindow::DisplayMode
320 *****************************************************************************/
322 PlayListWindow::DisplayMode() const
324 return fListView->DisplayMode();
327 /*****************************************************************************
328 * PlayListWindow::_CheckItemsEnableState
329 *****************************************************************************/
331 PlayListWindow::_CheckItemsEnableState() const
333 // check if one item selected
334 int32 test = fListView->CurrentSelection( 0 );
335 bool enable1 = test >= 0;
336 // check if at least two items selected
337 test = fListView->CurrentSelection( 1 );
338 bool enable2 = test >= 0;
339 bool notEmpty = fListView->CountItems() > 0;
340 _SetMenuItemEnabled( fSelectAllMI, notEmpty );
341 _SetMenuItemEnabled( fSelectNoneMI, enable1 );
342 _SetMenuItemEnabled( fSortReverseMI, enable2 );
343 // _SetMenuItemEnabled( fSortNameMI, enable2 );
344 // _SetMenuItemEnabled( fSortPathMI, enable2 );
345 // _SetMenuItemEnabled( fRandomizeMI, enable2 );
346 _SetMenuItemEnabled( fRemoveMI, enable1 );
347 _SetMenuItemEnabled( fRemoveAllMI, notEmpty );
350 /*****************************************************************************
351 * PlayListWindow::_SetMenuItemEnabled
352 *****************************************************************************/
354 PlayListWindow::_SetMenuItemEnabled( BMenuItem* item, bool enabled ) const
356 // this check should actally be done in BMenuItem::SetEnabled(), but it is not...
357 if ( item->IsEnabled() != enabled )
358 item->SetEnabled( enabled );