PlayListWindow.cpp
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:11k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * PlayListWindow.cpp: beos interface
  3.  *****************************************************************************
  4.  * Copyright (C) 1999, 2000, 2001 VideoLAN
  5.  * $Id: PlayListWindow.cpp 8448 2004-08-17 17:24:02Z titer $
  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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  26.  *****************************************************************************/
  27. /* System headers */
  28. #include <InterfaceKit.h>
  29. #include <StorageKit.h>
  30. #include <string.h>
  31. /* VLC headers */
  32. #include <vlc/vlc.h>
  33. #include <vlc/intf.h>
  34. /* BeOS interface headers */
  35. #include "InterfaceWindow.h"
  36. #include "ListViews.h"
  37. #include "MsgVals.h"
  38. #include "PlayListWindow.h"
  39. enum
  40. {
  41. MSG_SELECT_ALL = 'sall',
  42. MSG_SELECT_NONE = 'none',
  43. MSG_RANDOMIZE = 'rndm',
  44. MSG_SORT_REVERSE = 'srtr',
  45. MSG_SORT_NAME = 'srtn',
  46. MSG_SORT_PATH = 'srtp',
  47. MSG_REMOVE = 'rmov',
  48. MSG_REMOVE_ALL = 'rmal',
  49. MSG_SELECTION_CHANGED = 'slch',
  50. MSG_SET_DISPLAY = 'stds',
  51. };
  52. /*****************************************************************************
  53.  * PlayListWindow::PlayListWindow
  54.  *****************************************************************************/
  55. PlayListWindow::PlayListWindow( BRect frame, const char* name,
  56. InterfaceWindow* mainWindow,
  57. intf_thread_t *p_interface )
  58. : BWindow( frame, name, B_FLOATING_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
  59.  B_WILL_ACCEPT_FIRST_CLICK | B_ASYNCHRONOUS_CONTROLS ),
  60. fMainWindow( mainWindow )
  61. {
  62.     char psz_tmp[1024];
  63. #define ADD_ELLIPSIS( a ) 
  64.     memset( psz_tmp, 0, 1024 ); 
  65.     snprintf( psz_tmp, 1024, "%s%s", a, B_UTF8_ELLIPSIS );
  66. p_intf = p_interface;
  67.     
  68.     SetName( _("playlist") );
  69.     // set up the main menu bar
  70. fMenuBar = new BMenuBar( BRect(0.0, 0.0, frame.Width(), 15.0), "main menu",
  71.  B_FOLLOW_NONE, B_ITEMS_IN_ROW, false );
  72.     AddChild( fMenuBar );
  73. // Add the File menu
  74. BMenu *fileMenu = new BMenu( _("File") );
  75. fMenuBar->AddItem( fileMenu );
  76. ADD_ELLIPSIS( _("Open File") );
  77. BMenuItem* item = new BMenuItem( psz_tmp, new BMessage( OPEN_FILE ), 'O' );
  78. item->SetTarget( fMainWindow );
  79. fileMenu->AddItem( item );
  80. CDMenu* cd_menu = new CDMenu( _("Open Disc") );
  81. fileMenu->AddItem( cd_menu );
  82. fileMenu->AddSeparatorItem();
  83. item = new BMenuItem( _("Close"),
  84.   new BMessage( B_QUIT_REQUESTED ), 'W' );
  85. fileMenu->AddItem( item );
  86. // Add the Edit menu
  87. BMenu *editMenu = new BMenu( _("Edit") );
  88. fMenuBar->AddItem( editMenu );
  89. fSelectAllMI = new BMenuItem( _("Select All"),
  90.   new BMessage( MSG_SELECT_ALL ), 'A' );
  91. editMenu->AddItem( fSelectAllMI );
  92. fSelectNoneMI = new BMenuItem( _("Select None"),
  93.    new BMessage( MSG_SELECT_NONE ), 'A', B_SHIFT_KEY );
  94. editMenu->AddItem( fSelectNoneMI );
  95. editMenu->AddSeparatorItem();
  96. fSortReverseMI = new BMenuItem( _("Sort Reverse"),
  97.  new BMessage( MSG_SORT_REVERSE ), 'F' );
  98. editMenu->AddItem( fSortReverseMI );
  99. fSortNameMI = new BMenuItem( _("Sort by Name"),
  100.  new BMessage( MSG_SORT_NAME ), 'N' );
  101. fSortNameMI->SetEnabled( false );
  102. editMenu->AddItem( fSortNameMI );
  103. fSortPathMI = new BMenuItem( _("Sort by Path"),
  104.  new BMessage( MSG_SORT_PATH ), 'P' );
  105. fSortPathMI->SetEnabled( false );
  106. editMenu->AddItem( fSortPathMI );
  107. fRandomizeMI = new BMenuItem( _("Randomize"),
  108.   new BMessage( MSG_RANDOMIZE ), 'R' );
  109. fRandomizeMI->SetEnabled( false );
  110. editMenu->AddItem( fRandomizeMI );
  111. editMenu->AddSeparatorItem();
  112. fRemoveMI = new BMenuItem( _("Remove"),
  113.   new BMessage( MSG_REMOVE ) );
  114. editMenu->AddItem( fRemoveMI );
  115. fRemoveAllMI = new BMenuItem( _("Remove All"),
  116.   new BMessage( MSG_REMOVE_ALL ) );
  117. editMenu->AddItem( fRemoveAllMI );
  118. // Add View menu
  119. fViewMenu = new BMenu( _("View") );
  120. fMenuBar->AddItem( fViewMenu );
  121. fViewMenu->SetRadioMode( true );
  122. BMessage* message = new BMessage( MSG_SET_DISPLAY );
  123. message->AddInt32( "mode", DISPLAY_PATH );
  124. item = new BMenuItem( _("Path"), message );
  125. item->SetMarked( true );
  126. fViewMenu->AddItem( item );
  127. message = new BMessage( MSG_SET_DISPLAY );
  128. message->AddInt32( "mode", DISPLAY_NAME );
  129. item = new BMenuItem( _("Name"), message );
  130. fViewMenu->AddItem( item );
  131. // make menu bar resize to correct height
  132. float menuWidth, menuHeight;
  133. fMenuBar->GetPreferredSize( &menuWidth, &menuHeight );
  134. // don't change next line! it's a workarround!
  135. fMenuBar->ResizeTo( frame.Width(), menuHeight );
  136. frame = Bounds();
  137. frame.top += fMenuBar->Bounds().IntegerHeight() + 1;
  138. frame.right -= B_V_SCROLL_BAR_WIDTH;
  139. fListView = new PlaylistView( p_intf, frame, fMainWindow,
  140.   new BMessage( MSG_SELECTION_CHANGED ) );
  141. fBackgroundView = new BScrollView( "playlist scrollview",
  142.    fListView, B_FOLLOW_ALL_SIDES,
  143.    0, false, true,
  144.    B_NO_BORDER );
  145. AddChild( fBackgroundView );
  146. // be up to date
  147. UpdatePlaylist();
  148. FrameResized( Bounds().Width(), Bounds().Height() );
  149. SetSizeLimits( menuWidth * 1.5, menuWidth * 8.0,
  150.    menuHeight * 5.0, menuHeight * 50.0 );
  151. UpdatePlaylist( true );
  152. // start window thread in hidden state
  153. Hide();
  154. Show();
  155. }
  156. /*****************************************************************************
  157.  * PlayListWindow::~PlayListWindow
  158.  *****************************************************************************/
  159. PlayListWindow::~PlayListWindow()
  160. {
  161. }
  162. /*****************************************************************************
  163.  * PlayListWindow::QuitRequested
  164.  *****************************************************************************/
  165. bool
  166. PlayListWindow::QuitRequested()
  167. {
  168. Hide(); 
  169. return false;
  170. }
  171. /*****************************************************************************
  172.  * PlayListWindow::MessageReceived
  173.  *****************************************************************************/
  174. void
  175. PlayListWindow::MessageReceived( BMessage * p_message )
  176. {
  177. switch ( p_message->what )
  178. {
  179. case OPEN_DVD:
  180. case B_REFS_RECEIVED:
  181. case B_SIMPLE_DATA:
  182. // forward to interface window
  183. fMainWindow->PostMessage( p_message );
  184. break;
  185. case MSG_SELECT_ALL:
  186. fListView->Select( 0, fListView->CountItems() - 1 );
  187. break;
  188. case MSG_SELECT_NONE:
  189. fListView->DeselectAll();
  190. break;
  191. case MSG_RANDOMIZE:
  192. break;
  193. case MSG_SORT_REVERSE:
  194. fListView->SortReverse();
  195. break;
  196. case MSG_SORT_NAME:
  197. break;
  198. case MSG_SORT_PATH:
  199. break;
  200. case MSG_REMOVE:
  201. fListView->RemoveSelected();
  202. break;
  203. case MSG_REMOVE_ALL:
  204. fListView->Select( 0, fListView->CountItems() - 1 );
  205. fListView->RemoveSelected();
  206. break;
  207. case MSG_SELECTION_CHANGED:
  208. _CheckItemsEnableState();
  209. break;
  210. case MSG_SET_DISPLAY:
  211. {
  212. uint32 mode;
  213. if ( p_message->FindInt32( "mode", (int32*)&mode ) == B_OK )
  214. SetDisplayMode( mode );
  215. break;
  216. }
  217. case B_MODIFIERS_CHANGED:
  218. fListView->ModifiersChanged();
  219. break;
  220. default:
  221. BWindow::MessageReceived( p_message );
  222. break;
  223. }
  224. }
  225. /*****************************************************************************
  226.  * PlayListWindow::FrameResized
  227.  *****************************************************************************/
  228. void
  229. PlayListWindow::FrameResized(float width, float height)
  230. {
  231. BRect r(Bounds());
  232. fMenuBar->MoveTo(r.LeftTop());
  233. fMenuBar->ResizeTo(r.Width(), fMenuBar->Bounds().Height());
  234. r.top += fMenuBar->Bounds().Height() + 1.0;
  235. fBackgroundView->MoveTo(r.LeftTop());
  236. // the "+ 1.0" is to make the scrollbar
  237. // be partly covered by the window border
  238. fBackgroundView->ResizeTo(r.Width() + 1.0, r.Height() + 1.0);
  239. }
  240. /*****************************************************************************
  241.  * PlayListWindow::ReallyQuit
  242.  *****************************************************************************/
  243. void
  244. PlayListWindow::ReallyQuit()
  245. {
  246.     Lock();
  247.     Hide();
  248.     Quit();
  249. }
  250. /*****************************************************************************
  251.  * PlayListWindow::UpdatePlaylist
  252.  *****************************************************************************/
  253. void
  254. PlayListWindow::UpdatePlaylist( bool rebuild )
  255. {
  256. if ( rebuild )
  257. fListView->RebuildList();
  258. #if 0
  259. fListView->SetCurrent( p_wrapper->PlaylistCurrent() );
  260. fListView->SetPlaying( p_wrapper->IsPlaying() );
  261. #endif
  262. _CheckItemsEnableState();
  263. }
  264. /*****************************************************************************
  265.  * PlayListWindow::SetDisplayMode
  266.  *****************************************************************************/
  267. void
  268. PlayListWindow::SetDisplayMode( uint32 mode )
  269. {
  270. if ( Lock() )
  271. {
  272. // propagate to list view
  273. fListView->SetDisplayMode( mode );
  274. // mark correct menu item
  275. for ( int32 i = 0; BMenuItem* item = fViewMenu->ItemAt( i ); i++ )
  276. {
  277. BMessage* message = item->Message();
  278. uint32 itemMode;
  279. if ( message
  280.  && message->FindInt32( "mode", (int32*)&itemMode ) == B_OK
  281.  && itemMode == mode )
  282. {
  283. item->SetMarked( true );
  284. break;
  285. }
  286. }
  287. Unlock();
  288. }
  289. }
  290. /*****************************************************************************
  291.  * PlayListWindow::DisplayMode
  292.  *****************************************************************************/
  293. uint32
  294. PlayListWindow::DisplayMode() const
  295. {
  296. return fListView->DisplayMode();
  297. }
  298. /*****************************************************************************
  299.  * PlayListWindow::_CheckItemsEnableState
  300.  *****************************************************************************/
  301. void
  302. PlayListWindow::_CheckItemsEnableState() const
  303. {
  304. // check if one item selected
  305. int32 test = fListView->CurrentSelection( 0 );
  306. bool enable1 = test >= 0;
  307. // check if at least two items selected
  308. test = fListView->CurrentSelection( 1 );
  309. bool enable2 = test >= 0;
  310. bool notEmpty = fListView->CountItems() > 0;
  311. _SetMenuItemEnabled( fSelectAllMI, notEmpty );
  312. _SetMenuItemEnabled( fSelectNoneMI, enable1 );
  313. _SetMenuItemEnabled( fSortReverseMI, enable2 );
  314. // _SetMenuItemEnabled( fSortNameMI, enable2 );
  315. // _SetMenuItemEnabled( fSortPathMI, enable2 );
  316. // _SetMenuItemEnabled( fRandomizeMI, enable2 );
  317. _SetMenuItemEnabled( fRemoveMI, enable1 );
  318. _SetMenuItemEnabled( fRemoveAllMI, notEmpty );
  319. }
  320. /*****************************************************************************
  321.  * PlayListWindow::_SetMenuItemEnabled
  322.  *****************************************************************************/
  323. void
  324. PlayListWindow::_SetMenuItemEnabled( BMenuItem* item, bool enabled ) const
  325. {
  326. // this check should actally be done in BMenuItem::SetEnabled(), but it is not...
  327. if ( item->IsEnabled() != enabled )
  328. item->SetEnabled( enabled );
  329. }