示例#1
0
        /// <summary>
        /// Initializes the GUI
        /// </summary>
        private void InitGUI()
        {
            // create glass effect
            RefreshGlassEffect();

            #region Events handlers

            NavigationPane.GotFocus += new RoutedEventHandler(NavigationPane_GotFocus);

            SettingsManager.QueueTracks.CollectionChanged += new NotifyCollectionChangedEventHandler(QueueTracks_CollectionChanged);
            SettingsManager.HistoryTracks.CollectionChanged += new NotifyCollectionChangedEventHandler(HistoryTracks_CollectionChanged);
            SettingsManager.FileTracks.CollectionChanged += new NotifyCollectionChangedEventHandler(LibraryTracks_CollectionChanged);
            SettingsManager.RadioTracks.CollectionChanged += new NotifyCollectionChangedEventHandler(RadioTracks_CollectionChanged);
            if (SettingsManager.FileListConfig != null)
                SettingsManager.FileListConfig.PropertyChanged += new PropertyChangedEventHandler(ViewDetailsConfig_PropertyChanged);
            if (SettingsManager.YouTubeListConfig != null)
                SettingsManager.YouTubeListConfig.PropertyChanged += new PropertyChangedEventHandler(ViewDetailsConfig_PropertyChanged);
            if (SettingsManager.SoundCloudListConfig != null)
                SettingsManager.SoundCloudListConfig.PropertyChanged += new PropertyChangedEventHandler(ViewDetailsConfig_PropertyChanged);
            if (SettingsManager.RadioListConfig != null)
                SettingsManager.RadioListConfig.PropertyChanged += new PropertyChangedEventHandler(ViewDetailsConfig_PropertyChanged);
            if (SettingsManager.JamendoListConfig != null)
                SettingsManager.JamendoListConfig.PropertyChanged += new PropertyChangedEventHandler(ViewDetailsConfig_PropertyChanged);
            if (SettingsManager.QueueListConfig != null)
                SettingsManager.QueueListConfig.PropertyChanged += new PropertyChangedEventHandler(ViewDetailsConfig_PropertyChanged);
            if (SettingsManager.HistoryListConfig != null)
                SettingsManager.HistoryListConfig.PropertyChanged += new PropertyChangedEventHandler(ViewDetailsConfig_PropertyChanged);

            FilesystemManager.SourceModified += new SourceModifiedEventHandler(FilesystemManager_SourceModified);
            FilesystemManager.TrackModified += new PropertyChangedEventHandler(FilesystemManager_TrackModified);
            FilesystemManager.PathModified += new PathModifiedEventHandler(FilesystemManager_PathModified);
            FilesystemManager.PathRenamed += new RenamedEventHandler(FilesystemManager_PathRenamed);
            FilesystemManager.ProgressChanged += new ProgressChangedEventHandler(FilesystemManager_ProgressChanged);
            FilesystemManager.SourceAdded += new SourcesModifiedEventHandler(FilesystemManager_SourceAdded);
            FilesystemManager.SourceRemoved += new SourcesModifiedEventHandler(FilesystemManager_SourceRemoved);

            MediaManager.TrackSwitched += new TrackSwitchedEventHandler(MediaManager_TrackSwitched);
            MediaManager.LoadedTrack += new LoadedTrackDelegate(MediaManager_LoadedTrack);
            MediaManager.Started += new EventHandler(MediaManager_Started);
            MediaManager.SearchMatch = TrackList_SearchMatch;

            UpgradeManager.Checked += new EventHandler(UpgradeManager_Checked);
            UpgradeManager.ErrorOccured += new Core.ErrorEventHandler(UpgradeManager_ErrorOccured);
            UpgradeManager.ProgressChanged += new ProgressChangedEventHandler(UpgradeManager_ProgressChanged);
            UpgradeManager.Upgraded += new EventHandler(UpgradeManager_Upgraded);
            UpgradeManager.UpgradeFound += new EventHandler(UpgradeManager_UpgradeFound);

            PluginManager.RefreshVisualizerSelector += new EventHandler(PluginManager_RefreshVisualizerSelector);
            PluginManager.Installed += new EventHandler<PluginEventArgs>(PluginManager_Installed);
            PluginManager.Uninstalled += new EventHandler<PluginEventArgs>(PluginManager_Uninstalled);
            PluginManager.Initialize();

            SettingsManager.PropertyChanged += new PropertyChangedWithValuesEventHandler(SettingsManager_PropertyChanged);
            ServiceManager.ModifyTracks += new EventHandler<ModifiedEventArgs>(ServiceManager_ModifyTracks);

            NavigationPane.CreateNewPlaylistETB.EnteredEditMode += new EventHandler(EditableTextBlock_EnteredEditMode);
            SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);

            resortDelay.Interval = new TimeSpan(0, 0, 0, 0, 500);
            resortDelay.Tick += new EventHandler(ResortDelay_Tick);

            sourceModifiedDelay.Tick += new EventHandler(SourceModifiedDelay_Tick);
            sourceModifiedDelay.Interval = new TimeSpan(0, 0, 0, 1, 500);

            #endregion

            #region Tray icon

            // create system tray icon
            trayIcon = (TaskbarIcon)FindResource("NotifyIcon");
            trayIcon.TrayToolTip = new TrayToolTip(this);
            trayIcon.TrayLeftMouseUp += TaskbarClicked;
            trayMenu = new ContextMenu();
            trayMenuShow = new MenuItem();
            trayMenuExit = new MenuItem();
            trayMenuPlay = new MenuItem();
            trayMenuNext = new MenuItem();
            trayMenuPrev = new MenuItem();
            trayMenuShow.Header = U.T("TrayShow");
            trayMenuExit.Header = U.T("TrayExit");
            trayMenuPlay.Header = U.T("TrayPlay");
            trayMenuNext.Header = U.T("TrayNext");
            trayMenuPrev.Header = U.T("TrayPrev");
            trayMenuShow.Click += TrayShow_Clicked;
            trayMenuExit.Click += TrayExit_Clicked;
            trayMenuPlay.Click += TrayPlayPause_Clicked;
            trayMenuNext.Click += TrayNext_Clicked;
            trayMenuPrev.Click += TrayPrevious_Clicked;
            trayMenu.Items.Add(trayMenuShow);
            trayMenu.Items.Add(new Separator());
            trayMenu.Items.Add(trayMenuPlay);
            trayMenu.Items.Add(trayMenuNext);
            trayMenu.Items.Add(trayMenuPrev);
            trayMenu.Items.Add(new Separator());
            trayMenu.Items.Add(trayMenuExit);
            trayIcon.ContextMenu = trayMenu;

            #endregion

            #region Thumbnail buttons

            //// create thumbnail buttons
            taskbarPrev = new ThumbnailToolbarButton(Properties.Resources.Previous, U.T("TaskbarPrev"));
            taskbarPrev.Enabled = true;
            taskbarPrev.Click += TaskbarPrevious_Clicked;
            taskbarPlay = new ThumbnailToolbarButton(Properties.Resources.Play, U.T("TaskbarPlay"));
            taskbarPlay.Enabled = true;
            taskbarPlay.Click += TaskbarPlayPause_Clicked;
            taskbarNext = new ThumbnailToolbarButton(Properties.Resources.Next, U.T("TaskbarNext"));
            taskbarNext.Enabled = true;
            taskbarNext.Click += TaskbarNext_Clicked;
            TaskbarManager.Instance.ThumbnailToolbars.AddButtons(
                new WindowInteropHelper(this).Handle,
                new ThumbnailToolbarButton[] { taskbarPrev, taskbarPlay, taskbarNext }
            );

            #endregion

            #region Jump lists

            jumpTaskPlay = new JumpTask()
            {
                Title = U.T("JumpPlay", "Title"),
                Arguments = "/play",
                Description = U.T("JumpPlay", "Description"),
                IconResourceIndex = -1,
                ApplicationPath = Assembly.GetEntryAssembly().CodeBase,
            };

            jumpTaskNext = new JumpTask()
            {
                Title = U.T("JumpNext", "Title"),
                Arguments = "/next",
                Description = U.T("JumpNext", "Description"),
                IconResourceIndex = -1,
                ApplicationPath = Assembly.GetEntryAssembly().CodeBase,
            };

            jumpTaskPrev = new JumpTask()
            {
                Title = U.T("JumpPrev", "Title"),
                Arguments = "/previous",
                Description = U.T("JumpPrev", "Description"),
                IconResourceIndex = -1,
                ApplicationPath = Assembly.GetEntryAssembly().CodeBase,
            };

            jumpList = new System.Windows.Shell.JumpList();
            jumpList.JumpItems.Add(jumpTaskPlay);
            jumpList.JumpItems.Add(jumpTaskNext);
            jumpList.JumpItems.Add(jumpTaskPrev);
            jumpList.ShowRecentCategory = true;
            jumpList.ShowFrequentCategory = true;
            System.Windows.Shell.JumpList.SetJumpList(Application.Current, jumpList);

            #endregion

            #region Style

            Utilities.DefaultAlbumArt = "/Platform/Windows 7/GUI/Images/AlbumArt/Default.jpg";

            // rough detection of aero vs classic
            // you'll se a lot more of these around the code
            if (System.Windows.Forms.VisualStyles.VisualStyleInformation.DisplayName == "")
            {
                // applying classic theme
                SolidColorBrush scb = (SolidColorBrush)FindResource("DetailsPaneKey");
                scb.Color = SystemColors.ControlTextColor;
                scb = (SolidColorBrush)FindResource("DetailsPaneValue");
                scb.Color = SystemColors.ControlTextColor;
                scb = (SolidColorBrush)FindResource("InfoPaneTitle");
                scb.Color = SystemColors.ControlTextColor;
                scb = (SolidColorBrush)FindResource("InfoPaneText");
                scb.Color = SystemColors.ControlTextColor;

                MainFrame.BorderBrush = SystemColors.ControlBrush;
                MainFrame.Background = SystemColors.ControlBrush;
                MainContainer.Background = SystemColors.ControlBrush;
                InfoPane.Background = SystemColors.WindowBrush;
                VerticalSplitter.Background = SystemColors.ControlBrush;

                TopToolbar.Style = null;
                DetailsPane.Style = (Style)FindResource("ClassicDetailsPaneStyle");

                OuterBottomRight.BorderBrush = SystemColors.ControlLightLightBrush;
                OuterTopLeft.BorderBrush = SystemColors.ControlDarkBrush;
                InnerBottomRight.BorderBrush = SystemColors.ControlDarkBrush;
                InnerTopLeft.BorderBrush = SystemColors.ControlLightLightBrush;

                ControlPanel.AboutTitle.Style = (Style)FindResource("ClassicControlPanelTitleStyle");
                ControlPanel.ShortcutTitle.Style = (Style)FindResource("ClassicControlPanelTitleStyle");
                ControlPanel.GeneralTitle.Style = (Style)FindResource("ClassicControlPanelTitleStyle");
                Utilities.DefaultAlbumArt = "/Platform/Windows 7/GUI/Images/AlbumArt/Classic.jpg";
            }

            #endregion

            VisualizerList.ItemsSource = PluginManager.VisualizerSelector;

            LibraryTime = 0;
            QueueTime = 0;
            HistoryTime = 0;
            if (SettingsManager.FileTracks != null)
                foreach (TrackData track in SettingsManager.FileTracks)
                    LibraryTime += track.Length;
            if (SettingsManager.QueueTracks != null)
                foreach (TrackData track in SettingsManager.QueueTracks)
                    QueueTime += track.Length;
            if (SettingsManager.HistoryTracks != null)
                foreach (TrackData track in SettingsManager.HistoryTracks)
                    HistoryTime += track.Length;

            NavigationColumn.Width = new GridLength(SettingsManager.NavigationPaneWidth);
            double h = SettingsManager.DetailsPaneHeight;
            DetailsRow.Height = new GridLength(h);

            UpdateVisibility("menubar");
            UpdateVisibility("details");

            RefreshStrings();
            U.ListenForShortcut = true;

            FilesystemManager.AddSystemFolders(true);

            #region Create playlists

            foreach (PlaylistData playlist in SettingsManager.Playlists)
                CreatePlaylist(playlist, false);

            PlaylistManager.PlaylistModified += new ModifiedEventHandler(PlaylistManager_PlaylistModified);
            PlaylistManager.PlaylistRenamed += new RenamedEventHandler(PlaylistManager_PlaylistRenamed);

            if (SettingsManager.CurrentSelectedNavigation == "YouTube")
                NavigationPane.Youtube.Focus();
            else if (SettingsManager.CurrentSelectedNavigation == "SoundCloud")
                NavigationPane.SoundCloud.Focus();
            else if (SettingsManager.CurrentSelectedNavigation == "Radio")
                NavigationPane.Radio.Focus();
            else if (SettingsManager.CurrentSelectedNavigation == "Jamendo")
                NavigationPane.Jamendo.Focus();
            else if (SettingsManager.CurrentSelectedNavigation == "Queue")
                NavigationPane.Queue.Focus();
            else if (SettingsManager.CurrentSelectedNavigation == "History")
                NavigationPane.History.Focus();
            else if (SettingsManager.CurrentSelectedNavigation == "Video")
                NavigationPane.Video.Focus();
            else if (SettingsManager.CurrentSelectedNavigation == "Visualizer")
                NavigationPane.Visualizer.Focus();
            else if (!SettingsManager.CurrentSelectedNavigation.StartsWith("Playlist:"))
                NavigationPane.Files.Focus();
            else
            {
                string name = SettingsManager.CurrentSelectedNavigation.Split(new[] { ':' }, 2)[1];
                foreach (TreeViewItem tvi in NavigationPane.Playlists.Items)
                {
                    if ((string)tvi.Tag == name)
                    {
                        tvi.Focus();
                        break;
                    }
                }
            }

            #endregion

            #region Load track lists

            U.L(LogLevel.Debug, "main", "Initialize track lists");
            switch (SettingsManager.CurrentActiveNavigation)
            {
                case "Queue":
                    if (FileTracks == null)
                        FileTracks = InitTrackList(new ViewDetails(), SettingsManager.FileListConfig, SettingsManager.FileTracks);
                    break;

                case "Radio":
                    if (RadioTracks == null)
                        RadioTracks = InitTrackList(new ViewDetails(), SettingsManager.RadioListConfig, SettingsManager.RadioTracks);
                    break;

                case "YouTube":
                    if (YouTubeTracks == null)
                        YouTubeTracks = (YouTubeTracks)InitTrackList(new YouTubeTracks(), SettingsManager.YouTubeListConfig);
                    break;

                case "SoundCloud":
                    if (SoundCloudTracks == null)
                        SoundCloudTracks = (SoundCloudTracks)InitTrackList(new SoundCloudTracks(), SettingsManager.SoundCloudListConfig);
                    break;

                case "Jamendo":
                    if (JamendoTracks == null)
                        JamendoTracks = (JamendoTracks)InitTrackList(new JamendoTracks(), SettingsManager.JamendoListConfig);
                    break;

                default:
                    if (SettingsManager.CurrentActiveNavigation.StartsWith("Playlist:"))
                    {
                        string pname = SettingsManager.CurrentActiveNavigation.Split(new[] { ':' }, 2)[1];
                        PlaylistData p = PlaylistManager.FindPlaylist(pname);
                        if (p != null)
                        {
                            ViewDetails vd = (ViewDetails)PlaylistTrackLists[pname];
                            if (vd == null)
                                vd = InitTrackList(new ViewDetails(), p.ListConfig, p.Tracks);
                        }
                    }
                    break;
            }
            if (FileTracks == null)
                FileTracks = InitTrackList(new ViewDetails(), SettingsManager.FileListConfig, SettingsManager.FileTracks);

            #endregion

            #region File association prompt

            if (SettingsManager.FirstRun)
            {
                Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate()
                {
                    // Show welcome dialog
                    TaskDialogResult tdr = Welcome.Show(new WindowInteropHelper(this).Handle);
                    Associations a = new Associations();

                    ProcessStartInfo assProcInfo = new ProcessStartInfo();
                    assProcInfo.FileName = U.FullPath;
                    assProcInfo.Verb = "runas";
                    string assProcArgs = "--associate {0}";

                    try
                    {
                        switch (tdr)
                        {
                            case TaskDialogResult.Yes:
                                assProcInfo.Arguments = String.Format(assProcArgs,
                                    string.Join(",", a.FullFileList.ToArray()));
                                Process.Start(assProcInfo);
                                break;

                            case TaskDialogResult.CustomButtonClicked:
                                a.ShowDialog();
                                assProcInfo.Arguments = String.Format(assProcArgs,
                                    string.Join(",", a.FileList.ToArray()));
                                Process.Start(assProcInfo);
                                break;

                            case TaskDialogResult.Cancel:
                                break;
                        }
                    }
                    catch (Exception e)
                    {
                        U.L(LogLevel.Warning, "MAIN", "Could not set associations: " + e.Message);
                    }
                }));

                SettingsManager.FirstRun = false;
            }

            #endregion

            #region Commented
            //System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.PerUserRoamingAndLocal);
            #endregion
        }
示例#2
0
        /// <summary>
        /// Initializes the GUI
        /// </summary>
        private void InitGUI()
        {
            Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate()
            {
                // TODO: remove all these lines
                //FileTracks.ParentWindow = this;
                //QueueTracks.ParentWindow = this;
                //HistoryTracks.ParentWindow = this;
                ControlPanel.ParentWindow = this;
                //NavigationPane.ParentWindow = this;
                //PlaybackControls.ParentWindow = this;

                NavigationPane.GotFocus += new RoutedEventHandler(NavigationPane_GotFocus);

                #region Track info

                ComboBoxItem ytFilter = FilterMusic;
                ComboBoxItem ytQuality = QualityDefault;
                foreach (ComboBoxItem cbi in YouTubeFilter.Items)
                {
                    if ((string)cbi.Tag == SettingsManager.YouTubeFilter)
                    {
                        ytFilter = cbi;
                        break;
                    }
                }
                foreach (ComboBoxItem cbi in YouTubeQuality.Items)
                {
                    if ((string)cbi.Tag == SettingsManager.YouTubeQuality)
                    {
                        ytQuality = cbi;
                        break;
                    }
                }
                YouTubeFilter.SelectedItem = ytFilter;
                YouTubeQuality.SelectedItem = ytQuality;

                #endregion

                #region List config events

                if (SettingsManager.FileListConfig != null)
                    SettingsManager.FileListConfig.PropertyChanged += new PropertyChangedEventHandler(ViewDetailsConfig_PropertyChanged);
                if (SettingsManager.YouTubeListConfig != null)
                    SettingsManager.YouTubeListConfig.PropertyChanged += new PropertyChangedEventHandler(ViewDetailsConfig_PropertyChanged);
                if (SettingsManager.SoundCloudListConfig != null)
                    SettingsManager.SoundCloudListConfig.PropertyChanged += new PropertyChangedEventHandler(ViewDetailsConfig_PropertyChanged);
                if (SettingsManager.RadioListConfig != null)
                    SettingsManager.RadioListConfig.PropertyChanged += new PropertyChangedEventHandler(ViewDetailsConfig_PropertyChanged);
                if (SettingsManager.QueueListConfig != null)
                    SettingsManager.QueueListConfig.PropertyChanged += new PropertyChangedEventHandler(ViewDetailsConfig_PropertyChanged);
                if (SettingsManager.HistoryListConfig != null)
                    SettingsManager.HistoryListConfig.PropertyChanged += new PropertyChangedEventHandler(ViewDetailsConfig_PropertyChanged);

                #endregion

                #region Context menus

                addMenu = new ContextMenu();
                showMenu = new ContextMenu();
                toolsMenu = new ContextMenu();

                addMenuFile = new MenuItem();
                addMenuFile.Header = U.T("ToolbarAddTrack");
                addMenuFile.Click += AddFile_Clicked;

                addMenuFolder = new MenuItem();
                addMenuFolder.Header = U.T("ToolbarAddFolder");
                addMenuFolder.Click += AddFolder_Clicked;

                addMenuPlaylist = new MenuItem();
                addMenuPlaylist.Header = U.T("ToolbarAddPlaylist");
                addMenuPlaylist.Click += AddPlaylist_Clicked;

                addMenuRadioStation = new MenuItem();
                addMenuRadioStation.Header = U.T("ToolbarAddRadioStation");
                addMenuRadioStation.Click += OpenURL_Clicked;

                addMenuPlugin = new MenuItem();
                addMenuPlugin.Header = U.T("ToolbarAddApp");
                addMenuPlugin.Click += AddPlugin_Clicked;

                showMenuDetailsPane = new MenuItem();
                showMenuDetailsPane.Header = U.T("ToolbarDetailsPane");
                showMenuDetailsPane.IsCheckable = true;
                showMenuDetailsPane.Click += ToggleDetailsPane;

                showMenuMenuBar = new MenuItem();
                showMenuMenuBar.Header = U.T("ToolbarMenuBar");
                showMenuMenuBar.IsCheckable = true;
                showMenuMenuBar.Click += ToggleMenuBar;

                toolsMenuImporter = new MenuItem();
                toolsMenuImporter.Header = U.T("ToolbarImporter");
                toolsMenuImporter.Click += Importer_Clicked;

                toolsMenuExporter = new MenuItem();
                toolsMenuExporter.Header = U.T("ToolbarExporter");
                toolsMenuExporter.Click += Exporter_Clicked;

                toolsMenuGenerate = new MenuItem();
                toolsMenuGenerate.Header = U.T("ToolbarGeneratePlaylist");
                toolsMenuGenerate.Click += GeneratePlaylist_Clicked;

                addMenu.Items.Add(addMenuFile);
                addMenu.Items.Add(addMenuFolder);
                addMenu.Items.Add(addMenuPlaylist);
                addMenu.Items.Add(addMenuRadioStation);
                addMenu.Items.Add(addMenuPlugin);
                showMenu.Items.Add(showMenuMenuBar);
                showMenu.Items.Add(showMenuDetailsPane);
                toolsMenu.Items.Add(toolsMenuImporter);
                toolsMenu.Items.Add(toolsMenuExporter);
                toolsMenu.Items.Add(toolsMenuGenerate);
                addMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;
                showMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;
                toolsMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;

                listMenuAddToPlaylist.Header = U.T("MenuAddToPlaylist", "Header");
                listMenuDelete.Header = U.T("MenuDelete");
                listMenuDelete.Click += new RoutedEventHandler(listMenuDelete_Click);
                listMenuInfo.Header = U.T("MenuInfo");
                listMenuInfo.Click += new RoutedEventHandler(listMenuInfo_Click);
                listMenuPlay.Header = U.T("MenuPlay");
                listMenuPlay.Click += new RoutedEventHandler(listMenuPlay_Click);
                listMenuPlay.FontWeight = FontWeights.Bold;
                listMenuWatchOnYouTube.Header = U.T("MenuWatchOnYouTube");
                listMenuWatchOnYouTube.Click += new RoutedEventHandler(listMenuWatchOnYouTube_Click);
                listMenuListenOnSoundCloud.Header = U.T("MenuListenOnSoundCloud");
                listMenuListenOnSoundCloud.Click += new RoutedEventHandler(listMenuListenOnSoundCloud_Click);
                listMenuOpenFolder.Header = U.T("MenuOpenFolder");
                listMenuOpenFolder.Click += new RoutedEventHandler(listMenuOpenFolder_Click);
                listMenuShareSong.Header = U.T("MenuShareSong");
                listMenuShareSong.Click += new RoutedEventHandler(listMenuShareSong_Click);
                listMenuVisitWebsite.Header = U.T("MenuVisitWebsite", "Header");
                listMenuVisitWebsite.Click += new RoutedEventHandler(listMenuVisitWebsite_Click);
                listMenuQueue.Header = U.T("MenuQueue");
                listMenuQueue.Click += new RoutedEventHandler(listMenuQueue_Click);
                listMenuCopy.Header = U.T("MenuCopy");
                listMenuCopy.Click += new RoutedEventHandler(listMenuCopyMove_Click);
                listMenuMove.Header = U.T("MenuMove");
                listMenuMove.Click += new RoutedEventHandler(listMenuCopyMove_Click);
                listMenuRemove.Header = U.T("MenuRemove");
                listMenuRemove.Click += new RoutedEventHandler(listMenuRemove_Click);
                listMenuRemoveFromPlaylist.Header = U.T("MenuRemoveFromPlaylist", "Header");
                listMenuRemoveFromPlaylist.Visibility = System.Windows.Visibility.Collapsed;

                listMenuAddToNew = new MenuItem();
                listMenuAddToNew.Header = U.T("MenuCreateNew", "Header");
                listMenuAddToNew.FontStyle = FontStyles.Italic;
                listMenuAddToNew.Click += new RoutedEventHandler(listMenuAddToPlaylist_Click);
                listMenuAddToPlaylist.Items.Add(listMenuAddToNew);

                listMenu.Items.Add(listMenuPlay);
                listMenu.Items.Add(listMenuQueue);
                listMenu.Items.Add(new Separator());
                listMenu.Items.Add(listMenuAddToPlaylist);
                listMenu.Items.Add(listMenuRemoveFromPlaylist);
                listMenu.Items.Add(new Separator());
                listMenu.Items.Add(listMenuOpenFolder);
                listMenu.Items.Add(listMenuCopy);
                listMenu.Items.Add(listMenuMove);
                listMenu.Items.Add(listMenuRemove);
                listMenu.Items.Add(listMenuDelete);
                listMenu.Items.Add(listMenuFilesystemSeparator);
                listMenu.Items.Add(listMenuWatchOnYouTube);
                listMenu.Items.Add(listMenuListenOnSoundCloud);
                listMenu.Items.Add(listMenuVisitWebsite);
                listMenu.Items.Add(listMenuShareSong);
                listMenu.Items.Add(listMenuInfo);

                FileTracks.ContextMenu = listMenu;
                HistoryTracks.ContextMenu = listMenu;
                QueueTracks.ContextMenu = listMenu;
                RadioTracks.ContextMenu = listMenu;
                YouTubeTracks.ContextMenu = listMenu;
                SoundCloudTracks.ContextMenu = listMenu;

                #endregion

                #region List events

                PlaylistTrackLists = new Hashtable();

                YouTubeTracks.MouseDoubleClick += new MouseButtonEventHandler(TrackList_MouseDoubleClick);
                YouTubeTracks.SelectionChanged += new SelectionChangedEventHandler(TrackList_SelectionChanged);
                YouTubeTracks.ContextMenuOpening += new ContextMenuEventHandler(TrackList_ContextMenuOpening);
                YouTubeTracks.GotFocus += new RoutedEventHandler(TrackList_GotFocus);
                YouTubeTracks.MoveItem += new MoveItemEventHandler(TrackList_MoveItem);

                SoundCloudTracks.MouseDoubleClick += new MouseButtonEventHandler(TrackList_MouseDoubleClick);
                SoundCloudTracks.SelectionChanged += new SelectionChangedEventHandler(TrackList_SelectionChanged);
                SoundCloudTracks.ContextMenuOpening += new ContextMenuEventHandler(TrackList_ContextMenuOpening);
                SoundCloudTracks.GotFocus += new RoutedEventHandler(TrackList_GotFocus);
                SoundCloudTracks.MoveItem += new MoveItemEventHandler(TrackList_MoveItem);

                FileTracks.SelectionChanged += new SelectionChangedEventHandler(TrackList_SelectionChanged);
                FileTracks.MouseDoubleClick += new MouseButtonEventHandler(TrackList_MouseDoubleClick);
                FileTracks.ContextMenuOpening += new ContextMenuEventHandler(TrackList_ContextMenuOpening);
                FileTracks.FilesDropped += new FileDropEventHandler(TrackList_FilesDropped);
                FileTracks.MoveItem += new MoveItemEventHandler(TrackList_MoveItem);
                FileTracks.GotFocus += new RoutedEventHandler(TrackList_GotFocus);
                FileTracks.FilterMatch = TrackList_SearchMatch;

                RadioTracks.SelectionChanged += new SelectionChangedEventHandler(TrackList_SelectionChanged);
                RadioTracks.MouseDoubleClick += new MouseButtonEventHandler(TrackList_MouseDoubleClick);
                RadioTracks.ContextMenuOpening += new ContextMenuEventHandler(TrackList_ContextMenuOpening);
                RadioTracks.FilesDropped += new FileDropEventHandler(TrackList_FilesDropped);
                RadioTracks.MoveItem += new MoveItemEventHandler(TrackList_MoveItem);
                RadioTracks.GotFocus += new RoutedEventHandler(TrackList_GotFocus);
                RadioTracks.FilterMatch = TrackList_SearchMatch;

                DiscTracks.SelectionChanged += new SelectionChangedEventHandler(TrackList_SelectionChanged);
                DiscTracks.MouseDoubleClick += new MouseButtonEventHandler(TrackList_MouseDoubleClick);
                DiscTracks.ContextMenuOpening += new ContextMenuEventHandler(TrackList_ContextMenuOpening);
                DiscTracks.FilesDropped += new FileDropEventHandler(TrackList_FilesDropped);
                DiscTracks.MoveItem += new MoveItemEventHandler(TrackList_MoveItem);
                DiscTracks.GotFocus += new RoutedEventHandler(TrackList_GotFocus);
                DiscTracks.FilterMatch = TrackList_SearchMatch;

                HistoryTracks.SelectionChanged += new SelectionChangedEventHandler(TrackList_SelectionChanged);
                HistoryTracks.MouseDoubleClick += new MouseButtonEventHandler(TrackList_MouseDoubleClick);
                HistoryTracks.ContextMenuOpening += new ContextMenuEventHandler(TrackList_ContextMenuOpening);
                HistoryTracks.FilesDropped += new FileDropEventHandler(TrackList_FilesDropped);
                HistoryTracks.MoveItem += new MoveItemEventHandler(TrackList_MoveItem);
                HistoryTracks.GotFocus += new RoutedEventHandler(TrackList_GotFocus);
                HistoryTracks.FilterMatch = TrackList_SearchMatch;

                QueueTracks.SelectionChanged += new SelectionChangedEventHandler(TrackList_SelectionChanged);
                QueueTracks.MouseDoubleClick += new MouseButtonEventHandler(TrackList_MouseDoubleClick);
                QueueTracks.ContextMenuOpening += new ContextMenuEventHandler(TrackList_ContextMenuOpening);
                QueueTracks.FilesDropped += new FileDropEventHandler(TrackList_FilesDropped);
                QueueTracks.MoveItem += new MoveItemEventHandler(TrackList_MoveItem);
                QueueTracks.GotFocus += new RoutedEventHandler(TrackList_GotFocus);
                QueueTracks.FilterMatch = TrackList_SearchMatch;

                YouTubePlayerInterface ypi = new YouTubePlayerInterface();
                ypi.ErrorOccured += new ErrorEventHandler(YouTube_ErrorOccured);
                ypi.NoFlashDetected += new EventHandler(YouTube_NoFlashDetected);
                ypi.PlayerReady += new EventHandler(YouTube_PlayerReady);

                #endregion

                sourceModifiedDelay.Tick += new EventHandler(SourceModifiedDelay_Tick);
                sourceModifiedDelay.Interval = new TimeSpan(0, 0, 0, 1, 500);

                SettingsManager.PropertyChanged += new PropertyChangedWithValuesEventHandler(SettingsManager_PropertyChanged);
                ServiceManager.ModifyTracks += new EventHandler<ModifiedEventArgs>(ServiceManager_ModifyTracks);

                NavigationPane.CreateNewPlaylistETB.EnteredEditMode += new EventHandler(EditableTextBlock_EnteredEditMode);

                U.ListenForShortcut = true;

                SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);

                #region Style

                Utilities.DefaultAlbumArt = "/Platform/Windows 7/GUI/Images/AlbumArt/Default.jpg";

                // rough detection of aero vs classic
                // you'll se a lot more of these around the code
                if (System.Windows.Forms.VisualStyles.VisualStyleInformation.DisplayName == "")
                {
                    // applying classic theme
                    SolidColorBrush scb = (SolidColorBrush)FindResource("DetailsPaneKey");
                    scb.Color = SystemColors.ControlTextColor;
                    scb = (SolidColorBrush)FindResource("DetailsPaneValue");
                    scb.Color = SystemColors.ControlTextColor;
                    scb = (SolidColorBrush)FindResource("InfoPaneTitle");
                    scb.Color = SystemColors.ControlTextColor;
                    scb = (SolidColorBrush)FindResource("InfoPaneText");
                    scb.Color = SystemColors.ControlTextColor;

                    MainFrame.BorderBrush = SystemColors.ControlBrush;
                    MainFrame.Background = SystemColors.ControlBrush;
                    MainContainer.Background = SystemColors.ControlBrush;
                    InfoPane.Background = SystemColors.WindowBrush;
                    VerticalSplitter.Background = SystemColors.ControlBrush;
                    VerticalSplitter.Margin = new Thickness(-4,0,-4,0);
                    HorizontalSplitter.Background = SystemColors.ControlBrush;

                    InfoPaneBorder.BorderThickness = new Thickness(0);
                    TopToolbar.Style = null;
                    AddButton.Style = (Style)FindResource("ClassicToolbarButtonStyle");
                    ShowButton.Style = (Style)FindResource("ClassicToolbarButtonStyle");
                    ToolsButton.Style = (Style)FindResource("ClassicToolbarButtonStyle");
                    EqualizerButton.Style = (Style)FindResource("ClassicToolbarButtonStyle");
                    PreferencesButton.Style = (Style)FindResource("ClassicToolbarButtonStyle");
                    HelpButton.Style = (Style)FindResource("ClassicToolbarSmallButtonStyle");
                    DetailsPane.Style = (Style)FindResource("ClassicDetailsPaneStyle");

                    OuterBottomRight.BorderBrush = SystemColors.ControlLightLightBrush;
                    OuterTopLeft.BorderBrush = SystemColors.ControlDarkBrush;
                    InnerBottomRight.BorderBrush = SystemColors.ControlDarkBrush;
                    InnerTopLeft.BorderBrush = SystemColors.ControlLightLightBrush;

                    ControlPanel.SourceTitle.Style = (Style)FindResource("ClassicControlPanelTitleStyle");
                    ControlPanel.AboutTitle.Style = (Style)FindResource("ClassicControlPanelTitleStyle");
                    ControlPanel.ShortcutTitle.Style = (Style)FindResource("ClassicControlPanelTitleStyle");
                    ControlPanel.GeneralTitle.Style = (Style)FindResource("ClassicControlPanelTitleStyle");

                    YouTubeQuality.Style = (Style)FindResource("ClassicComboBoxStyle");
                    YouTubeFilter.Style = (Style)FindResource("ClassicComboBoxStyle");
                    VisualizerList.Style = (Style)FindResource("ClassicComboBoxStyle");

                    Utilities.DefaultAlbumArt = "/Platform/Windows 7/GUI/Images/AlbumArt/Classic.jpg";
                }

                #endregion

                #region Tray icon

                // create system tray icon
                trayIcon = (TaskbarIcon)FindResource("NotifyIcon");
                trayIcon.TrayToolTip = new TrayToolTip(this);
                trayIcon.TrayLeftMouseUp += TaskbarClicked;
                trayMenu = new ContextMenu();
                trayMenuShow = new MenuItem();
                trayMenuExit = new MenuItem();
                trayMenuPlay = new MenuItem();
                trayMenuNext = new MenuItem();
                trayMenuPrev = new MenuItem();
                trayMenuShow.Header = U.T("TrayShow");
                trayMenuExit.Header = U.T("TrayExit");
                trayMenuPlay.Header = U.T("TrayPlay");
                trayMenuNext.Header = U.T("TrayNext");
                trayMenuPrev.Header = U.T("TrayPrev");
                trayMenuShow.Click += TrayShow_Clicked;
                trayMenuExit.Click += TrayExit_Clicked;
                trayMenuPlay.Click += TrayPlayPause_Clicked;
                trayMenuNext.Click += TrayNext_Clicked;
                trayMenuPrev.Click += TrayPrevious_Clicked;
                trayMenu.Items.Add(trayMenuShow);
                trayMenu.Items.Add(new Separator());
                trayMenu.Items.Add(trayMenuPlay);
                trayMenu.Items.Add(trayMenuNext);
                trayMenu.Items.Add(trayMenuPrev);
                trayMenu.Items.Add(new Separator());
                trayMenu.Items.Add(trayMenuExit);
                trayIcon.ContextMenu = trayMenu;

                #endregion

                // create glass effect
                RefreshGlassEffect();

                System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.PerUserRoamingAndLocal);

                resortDelay.Interval = new TimeSpan(0, 0, 0, 0, 500);
                resortDelay.Tick += new EventHandler(ResortDelay_Tick);

                #region Manager events

                FilesystemManager.SourceModified += new SourceModifiedEventHandler(FilesystemManager_SourceModified);
                FilesystemManager.TrackModified += new PropertyChangedEventHandler(FilesystemManager_TrackModified);
                FilesystemManager.PathModified += new PathModifiedEventHandler(FilesystemManager_PathModified);
                FilesystemManager.PathRenamed += new RenamedEventHandler(FilesystemManager_PathRenamed);
                FilesystemManager.ProgressChanged += new ProgressChangedEventHandler(FilesystemManager_ProgressChanged);
                FilesystemManager.SourceAdded += new SourcesModifiedEventHandler(FilesystemManager_SourceAdded);
                FilesystemManager.SourceRemoved += new SourcesModifiedEventHandler(FilesystemManager_SourceRemoved);

                MediaManager.TrackSwitched += new TrackSwitchedEventHandler(MediaManager_TrackSwitched);
                MediaManager.LoadedTrack += new LoadedTrackDelegate(MediaManager_LoadedTrack);
                MediaManager.Started += new EventHandler(MediaManager_Started);
                MediaManager.SearchMatch = TrackList_SearchMatch;

                UpgradeManager.Checked += new EventHandler(UpgradeManager_Checked);
                UpgradeManager.ErrorOccured += new ErrorEventHandler(UpgradeManager_ErrorOccured);
                UpgradeManager.ProgressChanged += new ProgressChangedEventHandler(UpgradeManager_ProgressChanged);
                UpgradeManager.Upgraded += new EventHandler(UpgradeManager_Upgraded);
                UpgradeManager.UpgradeFound += new EventHandler(UpgradeManager_UpgradeFound);

                PluginManager.RefreshVisualizerSelector += new EventHandler(PluginManager_RefreshVisualizerSelector);
                PluginManager.Installed += new EventHandler<PluginEventArgs>(PluginManager_Installed);
                PluginManager.Uninstalled += new EventHandler<PluginEventArgs>(PluginManager_Uninstalled);

                #endregion

                #region Web browser magic

                // WebBrowser will not load if it's not visible
                try
                {
                    // warning for fugliness
                    VideoContainer.Children.Remove(VideoContainer.Browser);
                    ControlPanel.Services.BrowserBorder.Child = null;
                    ContentContainer.Children.Add(VideoContainer.Browser);
                    ContentContainer.Children.Add(ControlPanel.Services.Browser);
                    ContentContainer.Children.Remove(VideoContainer.Browser);
                    ContentContainer.Children.Remove(ControlPanel.Services.Browser);
                    ControlPanel.Services.BrowserBorder.Child = ControlPanel.Services.Browser;
                    VideoContainer.Browser.Visibility = System.Windows.Visibility.Collapsed;
                }
                catch (Exception exc)
                {
                    U.L(LogLevel.Error, "MAIN", "There was a problem moving browsers into view for loading");
                    U.L(LogLevel.Error, "MAIN", exc.Message);
                }

                VideoContainer.Browser.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
                VideoContainer.Browser.VerticalAlignment = System.Windows.VerticalAlignment.Stretch;
                VideoContainer.Browser.Width = double.NaN;
                VideoContainer.Browser.Height = double.NaN;
                VideoContainer.Browser.ObjectForScripting = ypi;
                VideoContainer.NoVideoMessage.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
                VideoContainer.NoVideoMessage.Visibility = System.Windows.Visibility.Visible;

                if (YouTubeManager.IsYouTube(SettingsManager.CurrentTrack))
                {
                    VideoContainer.BrowserVisibility = Visibility.Visible;
                }

                #endregion
            }));

            U.L(LogLevel.Debug, "MAIN", "Init settings manager");
            SettingsManager.Initialize();

            U.L(LogLevel.Debug, "MAIN", "Init service manager");
            ServiceManager.Initialize();

            #region File association prompt

            if (SettingsManager.FirstRun)
            {
                Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate()
                {
                    // Show welcome dialog
                    TaskDialogResult tdr = Welcome.Show(new WindowInteropHelper(this).Handle);
                    Associations a = new Associations();

                    ProcessStartInfo assProcInfo = new ProcessStartInfo();
                    assProcInfo.FileName = U.FullPath;
                    assProcInfo.Verb = "runas";
                    string assProcArgs = "--associate {0}";

                    try
                    {
                        switch (tdr)
                        {
                            case TaskDialogResult.Yes:
                                assProcInfo.Arguments = String.Format(assProcArgs, true);
                                Process.Start(assProcInfo);
                                break;

                            case TaskDialogResult.CustomButtonClicked:
                            case TaskDialogResult.No: // CustomButtonClicked doesn't work for some unknown reason
                                assProcInfo.Arguments = String.Format(assProcArgs, false);
                                Process.Start(assProcInfo);
                                break;

                            case TaskDialogResult.Cancel:
                                break;
                        }
                    }
                    catch (Exception e)
                    {
                        U.L(LogLevel.Warning, "MAIN", "Could not set associations: " + e.Message);
                    }
                }));

                SettingsManager.FirstRun = false;
            }

            #endregion

            #region Create playlists

            ThreadStart PlaylistThread = delegate()
            {
                Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate()
                {
                    if (SettingsManager.CurrentSelectedNavigation == "YouTube")
                        NavigationPane.Youtube.Focus();
                    else if (SettingsManager.CurrentSelectedNavigation == "SoundCloud")
                        NavigationPane.SoundCloud.Focus();
                    else if (SettingsManager.CurrentSelectedNavigation == "Radio")
                        NavigationPane.Radio.Focus();
                    else if (SettingsManager.CurrentSelectedNavigation == "Queue")
                        NavigationPane.Queue.Focus();
                    else if (SettingsManager.CurrentSelectedNavigation == "History")
                        NavigationPane.History.Focus();
                    else if (SettingsManager.CurrentSelectedNavigation == "Video")
                        NavigationPane.Video.Focus();
                    else if (SettingsManager.CurrentSelectedNavigation == "Visualizer")
                        NavigationPane.Visualizer.Focus();
                    else if (!SettingsManager.CurrentSelectedNavigation.StartsWith("Playlist:"))
                        NavigationPane.Files.Focus();

                    // fix null tracks
                    for (int i = 0; i < SettingsManager.Playlists.Count; i++)
                    {
                        var playlist = SettingsManager.Playlists[i];
                        bool allTracksNull = true;
                        foreach (TrackData t in playlist.Tracks)
                            if (t != null)
                            {
                                allTracksNull = false;
                                break;
                            }
                        if (allTracksNull) playlist.Tracks.Clear();
                    }

                    // create playlists
                    PlaylistManager.Initialize();

                    for (int i = 0; i < SettingsManager.Playlists.Count; i++)
                        CreatePlaylist(SettingsManager.Playlists[i], false);

                    PlaylistManager.PlaylistModified += new ModifiedEventHandler(PlaylistManager_PlaylistModified);
                    PlaylistManager.PlaylistRenamed += new RenamedEventHandler(PlaylistManager_PlaylistRenamed);

                    // if csn == playlist: select
                    if (SettingsManager.CurrentSelectedNavigation.StartsWith("Playlist:"))
                    {
                        string name = SettingsManager.CurrentSelectedNavigation.Split(new[] { ':' }, 2)[1];
                        foreach (TreeViewItem tvi in NavigationPane.Playlists.Items)
                        {
                            if ((string)tvi.Tag == name)
                            {
                                tvi.Focus();
                                break;
                            }
                        }
                    }
                }));
            };

            #endregion

            ThreadStart GUIThread = delegate()
            {
                // init media manager
                ThreadStart MediaManagerThread = delegate()
                {
                    Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate()
                    {
                        MediaManager.Initialize();
                        MediaManager.FetchCollectionCallback = FetchActiveTrackCollection;

                        // check if we have any command line arguments
                        U.L(LogLevel.Debug, "main", "Send any app arguments to media manager");
                        String[] arguments = Environment.GetCommandLineArgs();
                        if (arguments.Length > 1)
                        {
                            if (arguments[1] == "/play") MediaManager.Play();
                            else if (arguments[1] == "/pause") MediaManager.Pause();
                            else if (arguments[1] == "/stop") MediaManager.Stop();
                            else if (arguments[1] == "/next") MediaManager.Next(true);
                            else if (arguments[1] == "/previous") MediaManager.Previous();

                            else if (MediaManager.IsSupported(arguments[1]))
                                Open(arguments[1], true);

                            else if (PlaylistManager.IsSupported(arguments[1]))
                            {
                                PlaylistData pl = PlaylistManager.LoadPlaylist(arguments[1]);
                                if (pl != null)
                                {
                                    SettingsManager.CurrentSelectedNavigation = "Playlist:" + pl.Name;
                                    if (pl.Tracks.Count > 0)
                                    {
                                        MediaManager.Load(pl.Tracks[0]);
                                        MediaManager.Play();
                                    }
                                }
                            }
                        }
                    }));

                    SettingsManager.Sources.CollectionChanged +=
                        new System.Collections.Specialized.NotifyCollectionChangedEventHandler(ControlPanel.SourceList.ItemsSource_CollectionChanged);
                };

                // init upgrade manager
                ThreadStart UpgradeManagerThread = delegate()
                {
                    UpgradeManager.Initialize(new TimeSpan(1, 0, 0));
                };

                // init filesystem manager
                ThreadStart FilesystemManagerThread = delegate()
                {
                    FilesystemManager.Initialize();
                    FilesystemManager.AddSystemFolders(true);
                };

                // calculate play time
                ThreadStart PTThread = delegate()
                {
                    LibraryTime = 0;
                    QueueTime = 0;
                    HistoryTime = 0;
                    if (SettingsManager.FileTracks != null)
                        foreach (TrackData track in SettingsManager.FileTracks)
                            LibraryTime += track.Length;
                    if (SettingsManager.QueueTracks != null)
                        foreach (TrackData track in SettingsManager.QueueTracks)
                            QueueTime += track.Length;
                    if (SettingsManager.HistoryTracks != null)
                        foreach (TrackData track in SettingsManager.HistoryTracks)
                            HistoryTime += track.Length;
                };

                Thread mm_thread = new Thread(MediaManagerThread);
                Thread um_thread = new Thread(UpgradeManagerThread);
                Thread fm_thread = new Thread(FilesystemManagerThread);
                Thread pt_thread = new Thread(PTThread);
                mm_thread.Name = "Init Media Manager";
                um_thread.Name = "Init Upgrade Manager";
                fm_thread.Name = "Init Filesystem Manager";
                pt_thread.Name = "Playing Time Thread";
                mm_thread.Priority = ThreadPriority.BelowNormal;
                um_thread.Priority = ThreadPriority.BelowNormal;
                fm_thread.Priority = ThreadPriority.BelowNormal;
                pt_thread.Priority = ThreadPriority.BelowNormal;
                mm_thread.Start();
                um_thread.Start();
                fm_thread.Start();
                pt_thread.Start();

                #region Assign list configs

                Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate()
                {
                    FileTracks.Config = SettingsManager.FileListConfig;
                    RadioTracks.Config = SettingsManager.RadioListConfig;
                    DiscTracks.Config = SettingsManager.DiscListConfig;
                    HistoryTracks.Config = SettingsManager.HistoryListConfig;
                    QueueTracks.Config = SettingsManager.QueueListConfig;
                    YouTubeTracks.Config = SettingsManager.YouTubeListConfig;
                    SoundCloudTracks.Config = SettingsManager.SoundCloudListConfig;
                    ControlPanel.SourceList.Config = SettingsManager.SourceListConfig;
                    ControlPanel.Plugins.PluginList.Config = SettingsManager.PluginListConfig;

                    FileTracks.ItemsSource = SettingsManager.FileTracks;
                    RadioTracks.ItemsSource = SettingsManager.RadioTracks;
                    QueueTracks.ItemsSource = SettingsManager.QueueTracks;
                    HistoryTracks.ItemsSource = SettingsManager.HistoryTracks;
                    ControlPanel.SourceList.ItemsSource = SettingsManager.Sources;
                    ControlPanel.Plugins.PluginList.ItemsSource = SettingsManager.Plugins;
                    YouTubeTracks.Search(SettingsManager.YouTubeListConfig.Filter);
                    SoundCloudTracks.Search(SettingsManager.SoundCloudListConfig.Filter);

                    FileTracks.SelectIndices(SettingsManager.FileListConfig.SelectedIndices);
                    RadioTracks.SelectIndices(SettingsManager.RadioListConfig.SelectedIndices);
                    QueueTracks.SelectIndices(SettingsManager.QueueListConfig.SelectedIndices);
                    HistoryTracks.SelectIndices(SettingsManager.HistoryListConfig.SelectedIndices);
                    ControlPanel.SourceList.SelectIndices(SettingsManager.SourceListConfig.SelectedIndices);
                    YouTubeTracks.SelectIndices(SettingsManager.YouTubeListConfig.SelectedIndices);
                    SoundCloudTracks.SelectIndices(SettingsManager.SoundCloudListConfig.SelectedIndices);
                    for (int i = 0; i < SettingsManager.Playlists.Count; i++)
                    {
                        var p = SettingsManager.Playlists[i];
                        var vd = PlaylistTrackLists[p.Name] as ViewDetails;
                        if (vd != null)
                            vd.SelectIndices(p.ListConfig.SelectedIndices);
                    }
                }));

                SettingsManager.FileTracks.CollectionChanged += new NotifyCollectionChangedEventHandler(FileTracks.ItemsSource_CollectionChanged);
                SettingsManager.RadioTracks.CollectionChanged += new NotifyCollectionChangedEventHandler(RadioTracks.ItemsSource_CollectionChanged);
                SettingsManager.QueueTracks.CollectionChanged += new NotifyCollectionChangedEventHandler(QueueTracks.ItemsSource_CollectionChanged);
                SettingsManager.HistoryTracks.CollectionChanged += new NotifyCollectionChangedEventHandler(HistoryTracks.ItemsSource_CollectionChanged);
                SettingsManager.QueueTracks.CollectionChanged += new NotifyCollectionChangedEventHandler(QueueTracks_CollectionChanged);
                SettingsManager.HistoryTracks.CollectionChanged += new NotifyCollectionChangedEventHandler(HistoryTracks_CollectionChanged);
                SettingsManager.FileTracks.CollectionChanged += new NotifyCollectionChangedEventHandler(LibraryTracks_CollectionChanged);
                SettingsManager.RadioTracks.CollectionChanged += new NotifyCollectionChangedEventHandler(RadioTracks_CollectionChanged);

                #endregion

                #region Jump lists

                jumpTaskPlay = new JumpTask()
                {
                    Title = U.T("JumpPlay", "Title"),
                    Arguments = "/play",
                    Description = U.T("JumpPlay", "Description"),
                    IconResourceIndex = -1,
                    ApplicationPath = Assembly.GetEntryAssembly().CodeBase,
                };

                jumpTaskNext = new JumpTask()
                {
                    Title = U.T("JumpNext", "Title"),
                    Arguments = "/next",
                    Description = U.T("JumpNext", "Description"),
                    IconResourceIndex = -1,
                    ApplicationPath = Assembly.GetEntryAssembly().CodeBase,
                };

                jumpTaskPrev = new JumpTask()
                {
                    Title = U.T("JumpPrev", "Title"),
                    Arguments = "/previous",
                    Description = U.T("JumpPrev", "Description"),
                    IconResourceIndex = -1,
                    ApplicationPath = Assembly.GetEntryAssembly().CodeBase,
                };

                jumpList = new System.Windows.Shell.JumpList();
                jumpList.JumpItems.Add(jumpTaskPlay);
                jumpList.JumpItems.Add(jumpTaskNext);
                jumpList.JumpItems.Add(jumpTaskPrev);
                jumpList.ShowRecentCategory = true;
                jumpList.ShowFrequentCategory = true;

                #endregion

                Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate()
                {
                    PlaybackControls.VolumeSlide.Value = SettingsManager.Volume;

                    NavigationColumn.Width = new GridLength(SettingsManager.NavigationPaneWidth);
                    double h = SettingsManager.DetailsPaneHeight;
                    DetailsRow.Height = new GridLength(h);

                    UpdateVisibility("menubar");
                    UpdateVisibility("details");

                    ControlPanel.InitShortcuts();
                    System.Windows.Shell.JumpList.SetJumpList(Application.Current, jumpList);

                    RefreshStrings();
                }));

                PluginManager.Initialize();

                Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate()
                {
                    VisualizerList.ItemsSource = PluginManager.VisualizerSelector;
                    UpdateSelectedVisualizer();
                }));
            };

            Thread pl_thread = new Thread(PlaylistThread);
            Thread gui_thread = new Thread(GUIThread);
            pl_thread.Name = "Init Playlist Manager";
            gui_thread.Name = "Init managers and GUI";
            pl_thread.Priority = ThreadPriority.BelowNormal;
            gui_thread.Priority = ThreadPriority.BelowNormal;
            pl_thread.Start();
            gui_thread.Start();
        }