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