/Application/GUI/Controls/Navigation.xaml.cs
C# | 615 lines | 394 code | 71 blank | 150 comment | 98 complexity | f66766adee2bc567a95df3c90a979b73 MD5 | raw file
- /**
- * Navigation.xaml.cs
- *
- * The left-hand navigation tree.
- *
- * * * * * * * * *
- *
- * This code is part of the Stoffi Music Player Project.
- * Visit our website at: stoffiplayer.com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 3 of the License, or (at your option) any later version.
- *
- * See stoffiplayer.com/license for more information.
- **/
-
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Navigation;
- using System.Windows.Shapes;
-
- namespace Stoffi
- {
- /// <summary>
- /// Interaction logic for Navigation.xaml
- /// </summary>
- public partial class Navigation : UserControl
- {
- #region Members
-
- public ContextMenu playlistMenu;
- public List<TreeViewItem> historyList = new List<TreeViewItem>();
- public MenuItem playlistMenuSave = new MenuItem();
- public MenuItem playlistMenuRename = new MenuItem();
- public MenuItem playlistMenuRemove = new MenuItem();
- public MenuItem playlistMenuShare = new MenuItem();
- private EditableTextBlock rightClickedEtb;
- private StoffiWindow parent;
-
- #endregion
-
- #region Properties
-
- /// <summary>
- /// Gets or sets the queue of tracks to add to a playlist after it has been created
- /// </summary>
- public List<object> AddToPlaylistQueue { get; set; }
-
- /// <summary>
- /// TODO: Remove this!
- /// </summary>
- public StoffiWindow ParentWindow
- {
- get { return parent; }
- set { parent = value; }
- }
-
- #endregion
-
- #region Constructor
-
- /// <summary>
- /// Creates a navigation class
- /// </summary>
- public Navigation()
- {
- U.L(LogLevel.Debug, "NAVIGATION", "Initialize");
- InitializeComponent();
- U.L(LogLevel.Debug, "NAVIGATION", "Initialized");
- SettingsManager.PropertyChanged += new PropertyChangedWithValuesEventHandler(SettingsManager_PropertyChanged);
- NowPlayingIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/NoteSingle.ico", 16, 16);
- MusicIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/NoteSingle.ico", 16, 16);
- FilesIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/FileAudio.ico", 16, 16);
- YoutubeIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/YouTube.ico", 16, 16);
- QueueIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/Queue.ico", 16, 16);
- HistoryIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/Clock.ico", 16, 16);
- PlaylistsIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/DiscAudio.ico", 16, 16);
- CreateNewIcon.Source = Utilities.GetIcoImage("pack://application:,,,/GUI/Images/Icons/DiscAudio.ico", 16, 16);
- U.L(LogLevel.Debug, "NAVIGATION", "Created");
- }
-
- #endregion
-
- #region Methods
-
- #region Override
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="e"></param>
- protected override void OnInitialized(EventArgs e)
- {
- BorderThickness = new Thickness(0);
-
- playlistMenu = new ContextMenu();
-
- playlistMenuSave = new MenuItem();
- playlistMenuSave.Header = U.T("MenuSavePlaylist");
- playlistMenuSave.Click += SavePlaylist_Clicked;
- playlistMenu.Items.Add(playlistMenuSave);
-
- playlistMenuRename = new MenuItem();
- playlistMenuRename.Header = U.T("MenuRenamePlaylist");
- playlistMenuRename.Click += RenamePlaylist_Clicked;
- playlistMenu.Items.Add(playlistMenuRename);
-
- playlistMenuRemove = new MenuItem();
- playlistMenuRemove.Header = U.T("MenuRemovePlaylist");
- playlistMenuRemove.Click += RemovePlaylist_Clicked;
- playlistMenu.Items.Add(playlistMenuRemove);
-
- playlistMenuShare = new MenuItem();
- playlistMenuShare.Header = U.T("MenuSharePlaylist");
- playlistMenuShare.Click += SharePlaylist_Clicked;
- playlistMenu.Items.Add(playlistMenuShare);
-
- base.OnInitialized(e);
- }
-
- #endregion
-
- #region Public
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="text"></param>
- public void SwitchNavigation(string text)
- {
- if (text == null) text = "Files";
-
- ParentWindow.MainContainer.Children.Remove(ParentWindow.ControlPanel);
- ParentWindow.MusicPanel.Visibility = System.Windows.Visibility.Visible;
- ParentWindow.PlaybackControls.Search.Box.IsEnabled = true;
-
- if (text.StartsWith("Playlist:"))
- {
- String playlistName = text.Split(new[]{':'},2)[1];
- foreach (TreeViewItem tvi in Playlists.Items)
- {
- PlaylistData pl = Tvi2Pl(tvi);
- if (pl != null && pl.Name == playlistName)
- {
- tvi.Focus();
- break;
- }
- }
- }
- else if (text == "History")
- History.Focus();
- else if (text == "Queue")
- Queue.Focus();
- else if (text == "Files")
- Files.Focus();
- else if (text == "NowPlaying")
- NowPlaying.Focus();
- else if (text == "YouTube")
- Youtube.Focus();
- }
-
- #endregion
-
- #region Private
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="tvi"></param>
- /// <returns></returns>
- private PlaylistData Tvi2Pl(TreeViewItem tvi)
- {
- StackPanel sp = tvi.Header as StackPanel;
- EditableTextBlock etb = null;
-
- foreach (object child in sp.Children)
- if (child is EditableTextBlock)
- etb = child as EditableTextBlock;
-
- if (etb == null) return null;
-
- return PlaylistManager.FindPlaylist(etb.Text);
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="tl"></param>
- /// <param name="header"></param>
- /// <param name="tvi"></param>
- /// <param name="name"></param>
- /// <param name="time"></param>
- private void ToggleTrackLists(ViewDetails tl, string header, TreeViewItem tvi, string name, int time)
- {
- ParentWindow.NowPlayingContainer.Visibility = System.Windows.Visibility.Collapsed;
- ParentWindow.YouTubeContainer.Visibility = System.Windows.Visibility.Collapsed;
- ParentWindow.TrackContainer.Visibility = System.Windows.Visibility.Visible;
- ParentWindow.FileTracks.Visibility = ParentWindow.FileTracks == tl ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
- ParentWindow.HistoryTracks.Visibility = ParentWindow.HistoryTracks == tl ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
- ParentWindow.QueueTracks.Visibility = ParentWindow.QueueTracks == tl ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
- foreach (DictionaryEntry pltl in ParentWindow.PlaylistTrackLists)
- ((ViewDetails)pltl.Value).Visibility = ((ViewDetails)pltl.Value) == tl ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
-
- ParentWindow.PlaybackControls.Search.Box.IsEnabled = true;
-
- //if (name != "NowPlaying")
- SettingsManager.CurrentSelectedNavigation = name;
-
- if (tl != null)
- {
- int tracks = 0;
- if (tl == ParentWindow.FileTracks)
- tracks = SettingsManager.FileTracks.Count;
- else if (tl == ParentWindow.HistoryTracks)
- tracks = SettingsManager.HistoryTracks.Count;
- else if (tl == ParentWindow.QueueTracks)
- tracks = SettingsManager.QueueTracks.Count;
- else
- {
- foreach (DictionaryEntry pltl in ParentWindow.PlaylistTrackLists)
- {
- if (tl == (ViewDetails)pltl.Value)
- {
- PlaylistData p = PlaylistManager.FindPlaylist((String)pltl.Key);
- if (p != null)
- {
- tracks = p.Tracks.Count;
- break;
- }
- }
- }
- }
- ParentWindow.InfoPaneTracks.Text = tracks.ToString() + " " + U.T("HeaderTracks");
- ParentWindow.InfoPaneDuration.Text = U.TimeSpanToLongString(new TimeSpan(0, 0, time));
- ParentWindow.InfoPaneTitle.Text = header;
-
- ViewDetailsConfig vdc;
- if (name == "History")
- vdc = SettingsManager.HistoryListConfig;
- else if (name == "Queue")
- vdc = SettingsManager.QueueListConfig;
- else if (name.StartsWith("Playlist:"))
- vdc = PlaylistManager.FindPlaylist(name.Split(new[]{':'},2)[1]).ListConfig;
- else
- vdc = SettingsManager.FileListConfig;
-
- if (vdc.Filter == null || vdc.Filter == "" || vdc.Filter == U.T("PlaybackSearch"))
- {
- ParentWindow.PlaybackControls.Search.IsActive = false;
- }
- else
- {
- ParentWindow.PlaybackControls.Search.IsActive = true;
- ParentWindow.PlaybackControls.Search.Text = vdc.Filter;
- }
- tl.Filter = vdc.Filter;
- }
-
- tvi.Focus();
- historyList.Remove(tvi);
- historyList.Add(tvi);
- }
-
- #endregion
-
- #region Event Handlers
-
- /// <summary>
- /// Invoked when a property of the settings manager changes
- /// </summary>
- /// <param name="sender">The sender of the event</param>
- /// <param name="e">The event data</param>
- private void SettingsManager_PropertyChanged(object sender, PropertyChangedWithValuesEventArgs e)
- {
- switch (e.PropertyName)
- {
- case "CurrentSelectedNavigation":
- SwitchNavigation(SettingsManager.CurrentSelectedNavigation);
- break;
- }
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void Navigation_Loaded(object sender, RoutedEventArgs e)
- {
- if (SettingsManager.CurrentSelectedNavigation.StartsWith("Playlist:"))
- if (PlaylistManager.FindPlaylist(SettingsManager.CurrentSelectedNavigation.Split(new[] { ':' }, 2)[1]) == null)
- SettingsManager.CurrentSelectedNavigation = "Files";
-
- if (System.Windows.Forms.VisualStyles.VisualStyleInformation.DisplayName == "")
- {
- NavigationTree.ItemContainerStyle = (Style)TryFindResource("ClassicNavigationStyle");
- Library.ItemContainerStyle = (Style)TryFindResource("ClassicNavigationStyle");
- Playlists.ItemContainerStyle = (Style)TryFindResource("ClassicNavigationStyle");
- }
- else
- {
- NavigationTree.ItemContainerStyle = (Style)TryFindResource("AeroNavigationStyle");
- Library.ItemContainerStyle = (Style)TryFindResource("AeroNavigationStyle");
- Playlists.ItemContainerStyle = (Style)TryFindResource("AeroNavigationStyle");
- }
-
- AddToPlaylistQueue = new List<object>();
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void NowPlaying_Selected(object sender, RoutedEventArgs e)
- {
- ToggleTrackLists(null, "", (TreeViewItem)sender, "NowPlaying", 0);
- ParentWindow.TrackContainer.Visibility = System.Windows.Visibility.Collapsed;
- ParentWindow.YouTubeContainer.Visibility = System.Windows.Visibility.Collapsed;
- ParentWindow.NowPlayingContainer.Visibility = System.Windows.Visibility.Visible;
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void Files_Selected(object sender, RoutedEventArgs e)
- {
- ToggleTrackLists(ParentWindow.FileTracks, U.T("NavigationFilesTitle"), (TreeViewItem)sender, "Files", (int)ParentWindow.LibraryTime);
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void Youtube_Selected(object sender, RoutedEventArgs e)
- {
- ToggleTrackLists(null, "", (TreeViewItem)sender, "YouTube", 0);
- ParentWindow.TrackContainer.Visibility = System.Windows.Visibility.Collapsed;
- ParentWindow.NowPlayingContainer.Visibility = System.Windows.Visibility.Collapsed;
- ParentWindow.YouTubeContainer.Visibility = System.Windows.Visibility.Visible;
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void Queue_Selected(object sender, RoutedEventArgs e)
- {
- ToggleTrackLists(ParentWindow.QueueTracks, U.T("NavigationQueueTitle"), (TreeViewItem)sender, "Queue", (int)ParentWindow.QueueTime);
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void History_Selected(object sender, RoutedEventArgs e)
- {
- ToggleTrackLists(ParentWindow.HistoryTracks, U.T("NavigationHistoryTitle"), (TreeViewItem)sender, "History", (int)ParentWindow.HistoryTime);
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- public void Playlists_Selected(object sender, RoutedEventArgs e)
- {
- TreeViewItem tvi = sender as TreeViewItem;
- if (tvi.IsSelected)
- {
- historyList.Remove(tvi);
- historyList.Add(tvi);
- }
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- public void Playlist_Selected(object sender, RoutedEventArgs e)
- {
- PlaylistData playlist = Tvi2Pl(sender as TreeViewItem);
- if (playlist == null) return;
-
- foreach (DictionaryEntry pltl in ParentWindow.PlaylistTrackLists)
- {
- if ((string)pltl.Key == playlist.Name)
- {
- ToggleTrackLists((ViewDetails)pltl.Value, U.T("NavigationPlaylistTitle") + " '" + playlist.Name + "'", (TreeViewItem)sender, "Playlist:" + playlist.Name, (int)playlist.Time);
- ((TreeViewItem)sender).Focus();
- SettingsManager.CurrentSelectedNavigation = "Playlist:" + playlist.Name;
- break;
- }
- }
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- public void Playlist_Edited(object sender, EditableTextBlockEventArgs e)
- {
- PlaylistManager.RenamePlaylist(e.OldText, e.NewText);
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void CreateNewPlaylist_Selected(object sender, RoutedEventArgs e)
- {
- TreeViewItem item = sender as TreeViewItem;
- StackPanel sp = item.Header as StackPanel;
- EditableTextBlock etb = sp.Children[1] as EditableTextBlock;
-
- if (etb.IsEditable)
- etb.IsInEditMode = true;
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void CreateNewPlaylist_Edited(object sender, EditableTextBlockEventArgs e)
- {
- if (e.NewText != U.T("NavigationCreateNew") && e.NewText != "")
- {
- List<object> addQueue = AddToPlaylistQueue;
- PlaylistManager.CreatePlaylist(e.NewText);
- if (addQueue.Count > 0)
- {
- PlaylistManager.AddToPlaylist(addQueue, e.NewText);
- addQueue.Clear();
- }
- }
- else
- {
- CreateNewPlaylist_Canceled(e);
- }
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="e"></param>
- private void CreateNewPlaylist_Canceled(EventArgs e)
- {
- if (historyList.Count > 0)
- historyList.Last<TreeViewItem>().Focus();
-
- else if (Playlists.Items.Count > 1)
- ((TreeViewItem)Playlists.Items[0]).Focus();
-
- else
- Library.Focus();
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- public void RemovePlaylist_Clicked(object sender, RoutedEventArgs e)
- {
- if (rightClickedEtb != null)
- {
- PlaylistData pld = PlaylistManager.FindPlaylist(rightClickedEtb.Text);
- if (pld != null)
- {
- string title = U.T("MessageDeletePlaylist", "Title");
- string message = U.T("MessageDeletePlaylist", "Message");
- message = message.Replace("%name", rightClickedEtb.Text);
- if (pld.Tracks.Count == 0 || MessageBox.Show(message, title, MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
- PlaylistManager.RemovePlaylist(rightClickedEtb.Text);
- }
- }
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- public void SavePlaylist_Clicked(object sender, RoutedEventArgs e)
- {
- if (rightClickedEtb != null)
- {
- try
- {
- Microsoft.Win32.SaveFileDialog dialog = new Microsoft.Win32.SaveFileDialog();
- dialog.Title = "Save Playlist";
- dialog.DefaultExt = ".pls";
- dialog.Filter = "Playlist (*.pls)|*.pls|Playlist (*.m3u)|*.m3u";
- dialog.FileName = rightClickedEtb.Text;
- bool result = (bool)dialog.ShowDialog();
- if (result == true)
- {
- PlaylistManager.SavePlaylist(dialog.FileName, rightClickedEtb.Text);
- }
- }
- catch (Exception exc)
- {
- MessageBox.Show(U.T("MessageSavingPlaylist", "Message") + ":\n" + exc.Message,
- U.T("MessageSavingPlaylist", "Title"),
- MessageBoxButton.OK,
- MessageBoxImage.Error);
- }
- }
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- public void RenamePlaylist_Clicked(object sender, RoutedEventArgs e)
- {
- if (rightClickedEtb != null && rightClickedEtb.IsEditable)
- rightClickedEtb.IsInEditMode = true;
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- public void SharePlaylist_Clicked(object sender, RoutedEventArgs e)
- {
- if (NavigationTree.SelectedItem is TreeViewItem)
- {
- TreeViewItem tvi = NavigationTree.SelectedItem as TreeViewItem;
-
- if (tvi.Header is StackPanel)
- {
- StackPanel sp = tvi.Header as StackPanel;
- EditableTextBlock etb = sp.Children[1] as EditableTextBlock;
-
- ServiceManager.SharePlaylist(PlaylistManager.FindPlaylist(etb.Text));
- }
- }
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- public void Playlist_Drop(object sender, DragEventArgs e)
- {
- List<object> DraggedItems = e.Data.GetData(typeof(List<object>)) as List<object>;
- TreeViewItem tvi = sender as TreeViewItem;
- StackPanel sp = tvi.Header as StackPanel;
- EditableTextBlock etb = sp.Children[1] as EditableTextBlock;
-
- if (etb.Text == U.T("NavigationCreateNew"))
- {
- AddToPlaylistQueue.Clear();
- foreach (TrackData track in DraggedItems)
- AddToPlaylistQueue.Add(track);
- CreateNewPlaylistETB.IsInEditMode = true;
- }
- else
- {
- PlaylistManager.AddToPlaylist(DraggedItems, etb.Text);
- }
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void NavigationTree_KeyUp(object sender, KeyEventArgs e)
- {
- if (e.Key == Key.Delete)
- RemovePlaylist_Clicked(sender, e);
- }
-
- /// <summary>
- /// Invoked when the user right-clicks on a playlist
- /// </summary>
- /// <param name="sender">The sender of the event</param>
- /// <param name="e">The event data</param>
- public void Playlist_ContextMenuOpening(object sender, ContextMenuEventArgs e)
- {
- if (e.Source is EditableTextBlock)
- rightClickedEtb = e.Source as EditableTextBlock;
- }
-
- #endregion
-
- #endregion
- }
- }