]> git.sesse.net Git - vlc/blob - modules/gui/beos/PlayListWindow.cpp
Cumulative fix for BeOS - by Cian Duffy < myob87 4t gmail dot com >
[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 #include <string.h>
32
33 /* VLC headers */
34 #include <vlc/vlc.h>
35 #include <vlc/intf.h>
36
37 /* BeOS interface headers */
38 #include "InterfaceWindow.h"
39 #include "ListViews.h"
40 #include "MsgVals.h"
41 #include "PlayListWindow.h"
42
43 enum
44 {
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',
51     MSG_REMOVE              = 'rmov',
52     MSG_REMOVE_ALL          = 'rmal',
53
54     MSG_SELECTION_CHANGED   = 'slch',
55     MSG_SET_DISPLAY         = 'stds',
56 };
57
58
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 )
68 {
69     char psz_tmp[1024];
70 #define ADD_ELLIPSIS( a ) \
71     memset( psz_tmp, 0, 1024 ); \
72     snprintf( psz_tmp, 1024, "%s%s", a, B_UTF8_ELLIPSIS );
73
74     p_intf = p_interface;
75     
76     SetName( _("playlist") );
77
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 );
81
82     AddChild( fMenuBar );
83
84     // Add the File menu
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 );
91
92     CDMenu* cd_menu = new CDMenu( _("Open Disc") );
93     fileMenu->AddItem( cd_menu );
94
95     fileMenu->AddSeparatorItem();
96     item = new BMenuItem( _("Close"),
97                           new BMessage( B_QUIT_REQUESTED ), 'W' );
98     fileMenu->AddItem( item );
99
100     // Add the Edit menu
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 );
109
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 );
133
134     // Add View menu
135     fViewMenu = new BMenu( _("View") );
136     fMenuBar->AddItem( fViewMenu );
137
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 );
144
145     message = new BMessage( MSG_SET_DISPLAY );
146     message->AddInt32( "mode", DISPLAY_NAME );
147     item = new BMenuItem( _("Name"), message );
148     fViewMenu->AddItem( item );
149
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 );
155
156     frame = Bounds();
157     frame.top += fMenuBar->Bounds().IntegerHeight() + 1;
158     frame.right -= B_V_SCROLL_BAR_WIDTH;
159
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,
164                                        0, false, true,
165                                        B_NO_BORDER );
166
167     AddChild( fBackgroundView );
168
169     // be up to date
170     UpdatePlaylist();
171     FrameResized( Bounds().Width(), Bounds().Height() );
172     SetSizeLimits( menuWidth * 1.5, menuWidth * 8.0,
173                    menuHeight * 5.0, menuHeight * 50.0 );
174
175     UpdatePlaylist( true );
176     // start window thread in hidden state
177     Hide();
178     Show();
179 }
180
181 /*****************************************************************************
182  * PlayListWindow::~PlayListWindow
183  *****************************************************************************/
184 PlayListWindow::~PlayListWindow()
185 {
186 }
187
188 /*****************************************************************************
189  * PlayListWindow::QuitRequested
190  *****************************************************************************/
191 bool
192 PlayListWindow::QuitRequested()
193 {
194     Hide(); 
195     return false;
196 }
197
198 /*****************************************************************************
199  * PlayListWindow::MessageReceived
200  *****************************************************************************/
201 void
202 PlayListWindow::MessageReceived( BMessage * p_message )
203 {
204     switch ( p_message->what )
205     {
206         case OPEN_DVD:
207         case B_REFS_RECEIVED:
208         case B_SIMPLE_DATA:
209             // forward to interface window
210             fMainWindow->PostMessage( p_message );
211             break;
212         case MSG_SELECT_ALL:
213             fListView->Select( 0, fListView->CountItems() - 1 );
214             break;
215         case MSG_SELECT_NONE:
216             fListView->DeselectAll();
217             break;
218         case MSG_RANDOMIZE:
219             break;
220         case MSG_SORT_REVERSE:
221             fListView->SortReverse();
222             break;
223         case MSG_SORT_NAME:
224             break;
225         case MSG_SORT_PATH:
226             break;
227         case MSG_REMOVE:
228             fListView->RemoveSelected();
229             break;
230         case MSG_REMOVE_ALL:
231             fListView->Select( 0, fListView->CountItems() - 1 );
232             fListView->RemoveSelected();
233             break;
234         case MSG_SELECTION_CHANGED:
235             _CheckItemsEnableState();
236             break;
237         case MSG_SET_DISPLAY:
238         {
239             uint32 mode;
240             if ( p_message->FindInt32( "mode", (int32*)&mode ) == B_OK )
241                 SetDisplayMode( mode );
242             break;
243         }
244         case B_MODIFIERS_CHANGED:
245             fListView->ModifiersChanged();
246             break;
247         default:
248             BWindow::MessageReceived( p_message );
249             break;
250     }
251 }
252
253 /*****************************************************************************
254  * PlayListWindow::FrameResized
255  *****************************************************************************/
256 void
257 PlayListWindow::FrameResized(float width, float height)
258 {
259     BRect r(Bounds());
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);
267 }
268
269 /*****************************************************************************
270  * PlayListWindow::ReallyQuit
271  *****************************************************************************/
272 void
273 PlayListWindow::ReallyQuit()
274 {
275     Lock();
276     Hide();
277     Quit();
278 }
279
280 /*****************************************************************************
281  * PlayListWindow::UpdatePlaylist
282  *****************************************************************************/
283 void
284 PlayListWindow::UpdatePlaylist( bool rebuild )
285 {
286     playlist_t * p_playlist;
287
288     if( rebuild )
289         fListView->RebuildList();
290
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 );
296
297     _CheckItemsEnableState();
298 }
299
300 /*****************************************************************************
301  * PlayListWindow::SetDisplayMode
302  *****************************************************************************/
303 void
304 PlayListWindow::SetDisplayMode( uint32 mode )
305 {
306     if ( Lock() )
307     {
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++ )
312         {
313             BMessage* message = item->Message();
314             uint32 itemMode;
315             if ( message
316                  && message->FindInt32( "mode", (int32*)&itemMode ) == B_OK
317                  && itemMode == mode )
318             {
319                 item->SetMarked( true );
320                 break;
321             }
322         }
323         Unlock();
324     }
325 }
326
327 /*****************************************************************************
328  * PlayListWindow::DisplayMode
329  *****************************************************************************/
330 uint32
331 PlayListWindow::DisplayMode() const
332 {
333     return fListView->DisplayMode();
334 }
335
336 /*****************************************************************************
337  * PlayListWindow::_CheckItemsEnableState
338  *****************************************************************************/
339 void
340 PlayListWindow::_CheckItemsEnableState() const
341 {
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 );
357 }
358
359 /*****************************************************************************
360  * PlayListWindow::_SetMenuItemEnabled
361  *****************************************************************************/
362 void
363 PlayListWindow::_SetMenuItemEnabled( BMenuItem* item, bool enabled ) const
364 {
365     // this check should actally be done in BMenuItem::SetEnabled(), but it is not...
366     if ( item->IsEnabled() != enabled )
367         item->SetEnabled( enabled );
368 }
369 #endif