private void ShowAddMediaDialog() { var typeFilters = new List <string>(); typeFilters.Add(Resource.vFilterSupportedMediaTypes + "|" + String.Join(";", (from h in MediaManager.Handlers from ext in h.Extensions select "*" + ext).Distinct())); typeFilters.AddRange(from h in MediaManager.Handlers select h.Description + "|" + String.Join(";", h.Extensions.Select(s => "*" + s))); typeFilters.Add(Resource.vFilterAllFiles + "|*"); var dlg = new Microsoft.Win32.OpenFileDialog(); dlg.Title = Resource.vMenuAddMedia; dlg.Filter = String.Join("|", typeFilters); dlg.Multiselect = true; dlg.InitialDirectory = Properties.Settings.Default.LastMediaDirectory; if (dlg.ShowDialog() == true) { Properties.Settings.Default.LastMediaDirectory = Path.GetDirectoryName(dlg.FileNames[0]); MediaOrderItem inserted = null; var selectedMedia = OrderListBox.SelectedItem as MediaOrderItem; int insertionIndex; if (selectedMedia != null) { insertionIndex = orderList.IndexOf(selectedMedia) + 1; } else { insertionIndex = orderList.Count; } if (dlg.FileNames.Count() > 1) { foreach (var m in MediaManager.LoadMultipleMediaMetadata(dlg.FileNames.Select(f => new Uri(f)))) { inserted = orderList.Insert(insertionIndex++, m); } } else { inserted = orderList.Insert(insertionIndex, MediaManager.LoadMediaMetadata(new Uri(dlg.FileName), null)); } OrderListBox.SelectedItem = inserted; portfolioModified = true; } }
void OrderListBox_Drop(object sender, DragEventArgs e) { try { this.RemoveInsertionAdorner(); int index = OrderListBox.GetIndexAtPosition(e.GetPosition(OrderListBox)); FrameworkElement container; bool isInFirstHalf = false; if (index >= 0) { container = OrderListBox.ItemContainerGenerator.ContainerFromIndex(index) as FrameworkElement; isInFirstHalf = e.GetPosition(container).IsInFirstHalf(container, true); } else { index = OrderListBox.HasItems ? OrderListBox.Items.Count - 1 : 0; } // Data comes from list itself if (e.Data.GetData(typeof(MediaOrderItem)) != null) { if (oldIndex < 0 || index == oldIndex) { return; } if (index < oldIndex) { index++; } if (isInFirstHalf) { index--; } MediaOrderItem movedItem = orderList[oldIndex]; if (index < 0) { orderList.Move(new MediaOrderItem[] { movedItem }, orderList.Count - oldIndex - 1); } else { orderList.Move(new MediaOrderItem[] { movedItem }, index - oldIndex); } oldIndex = -1; } // Data comes from song list else if (e.Data.GetData(SongDataObject.SongDataFormat) != null) { if (OrderListBox.HasItems) { index++; } if (isInFirstHalf) { index--; } SongData data = (SongData)e.Data.GetData(SongDataObject.SongDataFormat); Media m = MediaManager.LoadMediaMetadata(data.Uri, null); orderList.Insert(index, m); } // Data comes from explorer else if (e.Data.GetData(DataFormats.FileDrop) != null) { if (OrderListBox.HasItems) { index++; } if (isInFirstHalf) { index--; } string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); IEnumerable <Media> result; if (files.Length < 1) { return; } if (files.Length == 1) { if (MediaManager.TryLoadPortfolio(files[0], out result)) { // TODO: maybe insert contents at drop position if the portfolio isn't empty? Controller.OpenPortfolio(files[0]); } else { Media m = MediaManager.LoadMediaMetadata(new Uri(files[0]), null); orderList.Insert(index, m); } } else { foreach (var m in MediaManager.LoadMultipleMediaMetadata(files.Select(f => new Uri(f)))) { orderList.Insert(index++, m); } } } else if (e.Data.GetData(typeof(String)) != null) { string data = (string)e.Data.GetData(typeof(String)); Uri u = null; if (!Uri.TryCreate(data, UriKind.Absolute, out u)) { Uri.TryCreate("http://" + data, UriKind.Absolute, out u); } if (u != null) { Media m = MediaManager.LoadMediaMetadata(u, null); orderList.Insert(index, m); } } } catch (Exception ex) { Controller.ShowUnhandledException(ex, false); } }