PageRenderTime 64ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/Application/GUI/Controls/Navigation.xaml.cs

http://yet-another-music-application.googlecode.com/
C# | 615 lines | 394 code | 71 blank | 150 comment | 98 complexity | f66766adee2bc567a95df3c90a979b73 MD5 | raw file
  1. /**
  2. * Navigation.xaml.cs
  3. *
  4. * The left-hand navigation tree.
  5. *
  6. * * * * * * * * *
  7. *
  8. * This code is part of the Stoffi Music Player Project.
  9. * Visit our website at: stoffiplayer.com
  10. *
  11. * This program is free software; you can redistribute it and/or
  12. * modify it under the terms of the GNU General Public License
  13. * as published by the Free Software Foundation; either version
  14. * 3 of the License, or (at your option) any later version.
  15. *
  16. * See stoffiplayer.com/license for more information.
  17. **/
  18. using System;
  19. using System.Collections;
  20. using System.Collections.Generic;
  21. using System.Linq;
  22. using System.Text;
  23. using System.Windows;
  24. using System.Windows.Controls;
  25. using System.Windows.Data;
  26. using System.Windows.Documents;
  27. using System.Windows.Input;
  28. using System.Windows.Media;
  29. using System.Windows.Media.Imaging;
  30. using System.Windows.Navigation;
  31. using System.Windows.Shapes;
  32. namespace Stoffi
  33. {
  34. /// <summary>
  35. /// Interaction logic for Navigation.xaml
  36. /// </summary>
  37. public partial class Navigation : UserControl
  38. {
  39. #region Members
  40. public ContextMenu playlistMenu;
  41. public List<TreeViewItem> historyList = new List<TreeViewItem>();
  42. public MenuItem playlistMenuSave = new MenuItem();
  43. public MenuItem playlistMenuRename = new MenuItem();
  44. public MenuItem playlistMenuRemove = new MenuItem();
  45. public MenuItem playlistMenuShare = new MenuItem();
  46. private EditableTextBlock rightClickedEtb;
  47. private StoffiWindow parent;
  48. #endregion
  49. #region Properties
  50. /// <summary>
  51. /// Gets or sets the queue of tracks to add to a playlist after it has been created
  52. /// </summary>
  53. public List<object> AddToPlaylistQueue { get; set; }
  54. /// <summary>
  55. /// TODO: Remove this!
  56. /// </summary>
  57. public StoffiWindow ParentWindow
  58. {
  59. get { return parent; }
  60. set { parent = value; }
  61. }
  62. #endregion
  63. #region Constructor
  64. /// <summary>
  65. /// Creates a navigation class
  66. /// </summary>
  67. public Navigation()
  68. {
  69. U.L(LogLevel.Debug, "NAVIGATION", "Initialize");
  70. InitializeComponent();
  71. U.L(LogLevel.Debug, "NAVIGATION", "Initialized");
  72. SettingsManager.PropertyChanged += new PropertyChangedWithValuesEventHandler(SettingsManager_PropertyChanged);
  73. NowPlayingIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/NoteSingle.ico", 16, 16);
  74. MusicIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/NoteSingle.ico", 16, 16);
  75. FilesIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/FileAudio.ico", 16, 16);
  76. YoutubeIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/YouTube.ico", 16, 16);
  77. QueueIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/Queue.ico", 16, 16);
  78. HistoryIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/Clock.ico", 16, 16);
  79. PlaylistsIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/DiscAudio.ico", 16, 16);
  80. CreateNewIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/DiscAudio.ico", 16, 16);
  81. U.L(LogLevel.Debug, "NAVIGATION", "Created");
  82. }
  83. #endregion
  84. #region Methods
  85. #region Override
  86. /// <summary>
  87. ///
  88. /// </summary>
  89. /// <param name="e"></param>
  90. protected override void OnInitialized(EventArgs e)
  91. {
  92. BorderThickness = new Thickness(0);
  93. playlistMenu = new ContextMenu();
  94. playlistMenuSave = new MenuItem();
  95. playlistMenuSave.Header = U.T("MenuSavePlaylist");
  96. playlistMenuSave.Click += SavePlaylist_Clicked;
  97. playlistMenu.Items.Add(playlistMenuSave);
  98. playlistMenuRename = new MenuItem();
  99. playlistMenuRename.Header = U.T("MenuRenamePlaylist");
  100. playlistMenuRename.Click += RenamePlaylist_Clicked;
  101. playlistMenu.Items.Add(playlistMenuRename);
  102. playlistMenuRemove = new MenuItem();
  103. playlistMenuRemove.Header = U.T("MenuRemovePlaylist");
  104. playlistMenuRemove.Click += RemovePlaylist_Clicked;
  105. playlistMenu.Items.Add(playlistMenuRemove);
  106. playlistMenuShare = new MenuItem();
  107. playlistMenuShare.Header = U.T("MenuSharePlaylist");
  108. playlistMenuShare.Click += SharePlaylist_Clicked;
  109. playlistMenu.Items.Add(playlistMenuShare);
  110. base.OnInitialized(e);
  111. }
  112. #endregion
  113. #region Public
  114. /// <summary>
  115. ///
  116. /// </summary>
  117. /// <param name="text"></param>
  118. public void SwitchNavigation(string text)
  119. {
  120. if (text == null) text = "Files";
  121. ParentWindow.MainContainer.Children.Remove(ParentWindow.ControlPanel);
  122. ParentWindow.MusicPanel.Visibility = System.Windows.Visibility.Visible;
  123. ParentWindow.PlaybackControls.Search.Box.IsEnabled = true;
  124. if (text.StartsWith("Playlist:"))
  125. {
  126. String playlistName = text.Split(new[]{':'},2)[1];
  127. foreach (TreeViewItem tvi in Playlists.Items)
  128. {
  129. PlaylistData pl = Tvi2Pl(tvi);
  130. if (pl != null && pl.Name == playlistName)
  131. {
  132. tvi.Focus();
  133. break;
  134. }
  135. }
  136. }
  137. else if (text == "History")
  138. History.Focus();
  139. else if (text == "Queue")
  140. Queue.Focus();
  141. else if (text == "Files")
  142. Files.Focus();
  143. else if (text == "NowPlaying")
  144. NowPlaying.Focus();
  145. else if (text == "YouTube")
  146. Youtube.Focus();
  147. }
  148. #endregion
  149. #region Private
  150. /// <summary>
  151. ///
  152. /// </summary>
  153. /// <param name="tvi"></param>
  154. /// <returns></returns>
  155. private PlaylistData Tvi2Pl(TreeViewItem tvi)
  156. {
  157. StackPanel sp = tvi.Header as StackPanel;
  158. EditableTextBlock etb = null;
  159. foreach (object child in sp.Children)
  160. if (child is EditableTextBlock)
  161. etb = child as EditableTextBlock;
  162. if (etb == null) return null;
  163. return PlaylistManager.FindPlaylist(etb.Text);
  164. }
  165. /// <summary>
  166. ///
  167. /// </summary>
  168. /// <param name="tl"></param>
  169. /// <param name="header"></param>
  170. /// <param name="tvi"></param>
  171. /// <param name="name"></param>
  172. /// <param name="time"></param>
  173. private void ToggleTrackLists(ViewDetails tl, string header, TreeViewItem tvi, string name, int time)
  174. {
  175. ParentWindow.NowPlayingContainer.Visibility = System.Windows.Visibility.Collapsed;
  176. ParentWindow.YouTubeContainer.Visibility = System.Windows.Visibility.Collapsed;
  177. ParentWindow.TrackContainer.Visibility = System.Windows.Visibility.Visible;
  178. ParentWindow.FileTracks.Visibility = ParentWindow.FileTracks == tl ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
  179. ParentWindow.HistoryTracks.Visibility = ParentWindow.HistoryTracks == tl ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
  180. ParentWindow.QueueTracks.Visibility = ParentWindow.QueueTracks == tl ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
  181. foreach (DictionaryEntry pltl in ParentWindow.PlaylistTrackLists)
  182. ((ViewDetails)pltl.Value).Visibility = ((ViewDetails)pltl.Value) == tl ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
  183. ParentWindow.PlaybackControls.Search.Box.IsEnabled = true;
  184. //if (name != "NowPlaying")
  185. SettingsManager.CurrentSelectedNavigation = name;
  186. if (tl != null)
  187. {
  188. int tracks = 0;
  189. if (tl == ParentWindow.FileTracks)
  190. tracks = SettingsManager.FileTracks.Count;
  191. else if (tl == ParentWindow.HistoryTracks)
  192. tracks = SettingsManager.HistoryTracks.Count;
  193. else if (tl == ParentWindow.QueueTracks)
  194. tracks = SettingsManager.QueueTracks.Count;
  195. else
  196. {
  197. foreach (DictionaryEntry pltl in ParentWindow.PlaylistTrackLists)
  198. {
  199. if (tl == (ViewDetails)pltl.Value)
  200. {
  201. PlaylistData p = PlaylistManager.FindPlaylist((String)pltl.Key);
  202. if (p != null)
  203. {
  204. tracks = p.Tracks.Count;
  205. break;
  206. }
  207. }
  208. }
  209. }
  210. ParentWindow.InfoPaneTracks.Text = tracks.ToString() + " " + U.T("HeaderTracks");
  211. ParentWindow.InfoPaneDuration.Text = U.TimeSpanToLongString(new TimeSpan(0, 0, time));
  212. ParentWindow.InfoPaneTitle.Text = header;
  213. ViewDetailsConfig vdc;
  214. if (name == "History")
  215. vdc = SettingsManager.HistoryListConfig;
  216. else if (name == "Queue")
  217. vdc = SettingsManager.QueueListConfig;
  218. else if (name.StartsWith("Playlist:"))
  219. vdc = PlaylistManager.FindPlaylist(name.Split(new[]{':'},2)[1]).ListConfig;
  220. else
  221. vdc = SettingsManager.FileListConfig;
  222. if (vdc.Filter == null || vdc.Filter == "" || vdc.Filter == U.T("PlaybackSearch"))
  223. {
  224. ParentWindow.PlaybackControls.Search.IsActive = false;
  225. }
  226. else
  227. {
  228. ParentWindow.PlaybackControls.Search.IsActive = true;
  229. ParentWindow.PlaybackControls.Search.Text = vdc.Filter;
  230. }
  231. tl.Filter = vdc.Filter;
  232. }
  233. tvi.Focus();
  234. historyList.Remove(tvi);
  235. historyList.Add(tvi);
  236. }
  237. #endregion
  238. #region Event Handlers
  239. /// <summary>
  240. /// Invoked when a property of the settings manager changes
  241. /// </summary>
  242. /// <param name="sender">The sender of the event</param>
  243. /// <param name="e">The event data</param>
  244. private void SettingsManager_PropertyChanged(object sender, PropertyChangedWithValuesEventArgs e)
  245. {
  246. switch (e.PropertyName)
  247. {
  248. case "CurrentSelectedNavigation":
  249. SwitchNavigation(SettingsManager.CurrentSelectedNavigation);
  250. break;
  251. }
  252. }
  253. /// <summary>
  254. ///
  255. /// </summary>
  256. /// <param name="sender"></param>
  257. /// <param name="e"></param>
  258. private void Navigation_Loaded(object sender, RoutedEventArgs e)
  259. {
  260. if (SettingsManager.CurrentSelectedNavigation.StartsWith("Playlist:"))
  261. if (PlaylistManager.FindPlaylist(SettingsManager.CurrentSelectedNavigation.Split(new[] { ':' }, 2)[1]) == null)
  262. SettingsManager.CurrentSelectedNavigation = "Files";
  263. if (System.Windows.Forms.VisualStyles.VisualStyleInformation.DisplayName == "")
  264. {
  265. NavigationTree.ItemContainerStyle = (Style)TryFindResource("ClassicNavigationStyle");
  266. Library.ItemContainerStyle = (Style)TryFindResource("ClassicNavigationStyle");
  267. Playlists.ItemContainerStyle = (Style)TryFindResource("ClassicNavigationStyle");
  268. }
  269. else
  270. {
  271. NavigationTree.ItemContainerStyle = (Style)TryFindResource("AeroNavigationStyle");
  272. Library.ItemContainerStyle = (Style)TryFindResource("AeroNavigationStyle");
  273. Playlists.ItemContainerStyle = (Style)TryFindResource("AeroNavigationStyle");
  274. }
  275. AddToPlaylistQueue = new List<object>();
  276. }
  277. /// <summary>
  278. ///
  279. /// </summary>
  280. /// <param name="sender"></param>
  281. /// <param name="e"></param>
  282. private void NowPlaying_Selected(object sender, RoutedEventArgs e)
  283. {
  284. ToggleTrackLists(null, "", (TreeViewItem)sender, "NowPlaying", 0);
  285. ParentWindow.TrackContainer.Visibility = System.Windows.Visibility.Collapsed;
  286. ParentWindow.YouTubeContainer.Visibility = System.Windows.Visibility.Collapsed;
  287. ParentWindow.NowPlayingContainer.Visibility = System.Windows.Visibility.Visible;
  288. }
  289. /// <summary>
  290. ///
  291. /// </summary>
  292. /// <param name="sender"></param>
  293. /// <param name="e"></param>
  294. private void Files_Selected(object sender, RoutedEventArgs e)
  295. {
  296. ToggleTrackLists(ParentWindow.FileTracks, U.T("NavigationFilesTitle"), (TreeViewItem)sender, "Files", (int)ParentWindow.LibraryTime);
  297. }
  298. /// <summary>
  299. ///
  300. /// </summary>
  301. /// <param name="sender"></param>
  302. /// <param name="e"></param>
  303. private void Youtube_Selected(object sender, RoutedEventArgs e)
  304. {
  305. ToggleTrackLists(null, "", (TreeViewItem)sender, "YouTube", 0);
  306. ParentWindow.TrackContainer.Visibility = System.Windows.Visibility.Collapsed;
  307. ParentWindow.NowPlayingContainer.Visibility = System.Windows.Visibility.Collapsed;
  308. ParentWindow.YouTubeContainer.Visibility = System.Windows.Visibility.Visible;
  309. }
  310. /// <summary>
  311. ///
  312. /// </summary>
  313. /// <param name="sender"></param>
  314. /// <param name="e"></param>
  315. private void Queue_Selected(object sender, RoutedEventArgs e)
  316. {
  317. ToggleTrackLists(ParentWindow.QueueTracks, U.T("NavigationQueueTitle"), (TreeViewItem)sender, "Queue", (int)ParentWindow.QueueTime);
  318. }
  319. /// <summary>
  320. ///
  321. /// </summary>
  322. /// <param name="sender"></param>
  323. /// <param name="e"></param>
  324. private void History_Selected(object sender, RoutedEventArgs e)
  325. {
  326. ToggleTrackLists(ParentWindow.HistoryTracks, U.T("NavigationHistoryTitle"), (TreeViewItem)sender, "History", (int)ParentWindow.HistoryTime);
  327. }
  328. /// <summary>
  329. ///
  330. /// </summary>
  331. /// <param name="sender"></param>
  332. /// <param name="e"></param>
  333. public void Playlists_Selected(object sender, RoutedEventArgs e)
  334. {
  335. TreeViewItem tvi = sender as TreeViewItem;
  336. if (tvi.IsSelected)
  337. {
  338. historyList.Remove(tvi);
  339. historyList.Add(tvi);
  340. }
  341. }
  342. /// <summary>
  343. ///
  344. /// </summary>
  345. /// <param name="sender"></param>
  346. /// <param name="e"></param>
  347. public void Playlist_Selected(object sender, RoutedEventArgs e)
  348. {
  349. PlaylistData playlist = Tvi2Pl(sender as TreeViewItem);
  350. if (playlist == null) return;
  351. foreach (DictionaryEntry pltl in ParentWindow.PlaylistTrackLists)
  352. {
  353. if ((string)pltl.Key == playlist.Name)
  354. {
  355. ToggleTrackLists((ViewDetails)pltl.Value, U.T("NavigationPlaylistTitle") + " '" + playlist.Name + "'", (TreeViewItem)sender, "Playlist:" + playlist.Name, (int)playlist.Time);
  356. ((TreeViewItem)sender).Focus();
  357. SettingsManager.CurrentSelectedNavigation = "Playlist:" + playlist.Name;
  358. break;
  359. }
  360. }
  361. }
  362. /// <summary>
  363. ///
  364. /// </summary>
  365. /// <param name="sender"></param>
  366. /// <param name="e"></param>
  367. public void Playlist_Edited(object sender, EditableTextBlockEventArgs e)
  368. {
  369. PlaylistManager.RenamePlaylist(e.OldText, e.NewText);
  370. }
  371. /// <summary>
  372. ///
  373. /// </summary>
  374. /// <param name="sender"></param>
  375. /// <param name="e"></param>
  376. private void CreateNewPlaylist_Selected(object sender, RoutedEventArgs e)
  377. {
  378. TreeViewItem item = sender as TreeViewItem;
  379. StackPanel sp = item.Header as StackPanel;
  380. EditableTextBlock etb = sp.Children[1] as EditableTextBlock;
  381. if (etb.IsEditable)
  382. etb.IsInEditMode = true;
  383. }
  384. /// <summary>
  385. ///
  386. /// </summary>
  387. /// <param name="sender"></param>
  388. /// <param name="e"></param>
  389. private void CreateNewPlaylist_Edited(object sender, EditableTextBlockEventArgs e)
  390. {
  391. if (e.NewText != U.T("NavigationCreateNew") && e.NewText != "")
  392. {
  393. List<object> addQueue = AddToPlaylistQueue;
  394. PlaylistManager.CreatePlaylist(e.NewText);
  395. if (addQueue.Count > 0)
  396. {
  397. PlaylistManager.AddToPlaylist(addQueue, e.NewText);
  398. addQueue.Clear();
  399. }
  400. }
  401. else
  402. {
  403. CreateNewPlaylist_Canceled(e);
  404. }
  405. }
  406. /// <summary>
  407. ///
  408. /// </summary>
  409. /// <param name="e"></param>
  410. private void CreateNewPlaylist_Canceled(EventArgs e)
  411. {
  412. if (historyList.Count > 0)
  413. historyList.Last<TreeViewItem>().Focus();
  414. else if (Playlists.Items.Count > 1)
  415. ((TreeViewItem)Playlists.Items[0]).Focus();
  416. else
  417. Library.Focus();
  418. }
  419. /// <summary>
  420. ///
  421. /// </summary>
  422. /// <param name="sender"></param>
  423. /// <param name="e"></param>
  424. public void RemovePlaylist_Clicked(object sender, RoutedEventArgs e)
  425. {
  426. if (rightClickedEtb != null)
  427. {
  428. PlaylistData pld = PlaylistManager.FindPlaylist(rightClickedEtb.Text);
  429. if (pld != null)
  430. {
  431. string title = U.T("MessageDeletePlaylist", "Title");
  432. string message = U.T("MessageDeletePlaylist", "Message");
  433. message = message.Replace("%name", rightClickedEtb.Text);
  434. if (pld.Tracks.Count == 0 || MessageBox.Show(message, title, MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
  435. PlaylistManager.RemovePlaylist(rightClickedEtb.Text);
  436. }
  437. }
  438. }
  439. /// <summary>
  440. ///
  441. /// </summary>
  442. /// <param name="sender"></param>
  443. /// <param name="e"></param>
  444. public void SavePlaylist_Clicked(object sender, RoutedEventArgs e)
  445. {
  446. if (rightClickedEtb != null)
  447. {
  448. try
  449. {
  450. Microsoft.Win32.SaveFileDialog dialog = new Microsoft.Win32.SaveFileDialog();
  451. dialog.Title = "Save Playlist";
  452. dialog.DefaultExt = ".pls";
  453. dialog.Filter = "Playlist (*.pls)|*.pls|Playlist (*.m3u)|*.m3u";
  454. dialog.FileName = rightClickedEtb.Text;
  455. bool result = (bool)dialog.ShowDialog();
  456. if (result == true)
  457. {
  458. PlaylistManager.SavePlaylist(dialog.FileName, rightClickedEtb.Text);
  459. }
  460. }
  461. catch (Exception exc)
  462. {
  463. MessageBox.Show(U.T("MessageSavingPlaylist", "Message") + ":\n" + exc.Message,
  464. U.T("MessageSavingPlaylist", "Title"),
  465. MessageBoxButton.OK,
  466. MessageBoxImage.Error);
  467. }
  468. }
  469. }
  470. /// <summary>
  471. ///
  472. /// </summary>
  473. /// <param name="sender"></param>
  474. /// <param name="e"></param>
  475. public void RenamePlaylist_Clicked(object sender, RoutedEventArgs e)
  476. {
  477. if (rightClickedEtb != null && rightClickedEtb.IsEditable)
  478. rightClickedEtb.IsInEditMode = true;
  479. }
  480. /// <summary>
  481. ///
  482. /// </summary>
  483. /// <param name="sender"></param>
  484. /// <param name="e"></param>
  485. public void SharePlaylist_Clicked(object sender, RoutedEventArgs e)
  486. {
  487. if (NavigationTree.SelectedItem is TreeViewItem)
  488. {
  489. TreeViewItem tvi = NavigationTree.SelectedItem as TreeViewItem;
  490. if (tvi.Header is StackPanel)
  491. {
  492. StackPanel sp = tvi.Header as StackPanel;
  493. EditableTextBlock etb = sp.Children[1] as EditableTextBlock;
  494. ServiceManager.SharePlaylist(PlaylistManager.FindPlaylist(etb.Text));
  495. }
  496. }
  497. }
  498. /// <summary>
  499. ///
  500. /// </summary>
  501. /// <param name="sender"></param>
  502. /// <param name="e"></param>
  503. public void Playlist_Drop(object sender, DragEventArgs e)
  504. {
  505. List<object> DraggedItems = e.Data.GetData(typeof(List<object>)) as List<object>;
  506. TreeViewItem tvi = sender as TreeViewItem;
  507. StackPanel sp = tvi.Header as StackPanel;
  508. EditableTextBlock etb = sp.Children[1] as EditableTextBlock;
  509. if (etb.Text == U.T("NavigationCreateNew"))
  510. {
  511. AddToPlaylistQueue.Clear();
  512. foreach (TrackData track in DraggedItems)
  513. AddToPlaylistQueue.Add(track);
  514. CreateNewPlaylistETB.IsInEditMode = true;
  515. }
  516. else
  517. {
  518. PlaylistManager.AddToPlaylist(DraggedItems, etb.Text);
  519. }
  520. }
  521. /// <summary>
  522. ///
  523. /// </summary>
  524. /// <param name="sender"></param>
  525. /// <param name="e"></param>
  526. private void NavigationTree_KeyUp(object sender, KeyEventArgs e)
  527. {
  528. if (e.Key == Key.Delete)
  529. RemovePlaylist_Clicked(sender, e);
  530. }
  531. /// <summary>
  532. /// Invoked when the user right-clicks on a playlist
  533. /// </summary>
  534. /// <param name="sender">The sender of the event</param>
  535. /// <param name="e">The event data</param>
  536. public void Playlist_ContextMenuOpening(object sender, ContextMenuEventArgs e)
  537. {
  538. if (e.Source is EditableTextBlock)
  539. rightClickedEtb = e.Source as EditableTextBlock;
  540. }
  541. #endregion
  542. #endregion
  543. }
  544. }