An event arguments class that describes items that have moved in a reorderable list view.
Inheritance: System.EventArgs
        /// <summary>
        /// Raises the <see cref="Control.DragDrop"/> event of the list view.
        /// </summary>
        /// <remarks>
        /// This inserts the items being reordered.
        /// </remarks>
        /// <param name="drgevent">A <see cref="DragEventArgs"/> describing the event arguments.</param>
        protected override void OnDragDrop(DragEventArgs drgevent)
        {
            base.OnDragDrop(drgevent);
            if (drgevent.Effect == DragDropEffects.Move)
            {
                List <ListViewItem> data = (List <ListViewItem>)drgevent.Data.GetData(typeof(List <ListViewItem>));

                ReorderedItemsEventArgs riaEventArgs = new ReorderedItemsEventArgs();
                m_booIsDropping = true;
                for (Int32 i = data.Count - 1; i >= 0; i--)
                {
                    riaEventArgs.ReorderedListViewItems.Insert(0, new ReorderedItemsEventArgs.ReorderedListViewItem(data[i], data[i].Index, m_intInsertIndex + i));
                    Items.Remove(data[i]);
                }
                for (Int32 i = data.Count - 1; i >= 0; i--)
                {
                    Items.Insert(m_intInsertIndex, data[i]).EnsureVisible();
                }
                m_intInsertIndex = -1;
                m_booIsDropping  = false;
                try
                {
                    OnItemsReordered(riaEventArgs);
                }
                catch (Exception e)
                {
                    //this is required as drag/drop operations, even when performed within the same
                    // application, are handled by OLE, which doesn't differentiate between an external
                    // an internal drag/drop source. furhter, OLE doesn't understand exceptions, and so
                    // doesn't pass them on. even if it could, in general, the source of a drag/drop
                    // operation wouldn't care if the target was having an issue. we only care
                    // because the source and target are the same application, and the source
                    // needs to rethrow the exception, or else it will be lost in the ether
                    m_queDragDropExceptions.Enqueue(e);
                }
            }
        }
 /// <summary>
 /// Raises the <see cref="ItemsReordered"/> event.
 /// </summary>
 /// <param name="e">An <see cref="EventArgs"/> describing the event arguments.</param>
 protected virtual void OnItemsReordered(ReorderedItemsEventArgs e)
 {
     ItemsReordered(this, e);
 }
		/// <summary>
		/// Handles the <see cref="ReorderableListView.ItemsReordered"/> event of the list view of file sets.
		/// </summary>
		/// <remarks>
		/// This propagates the order change to the view model.
		/// </remarks>
		/// <param name="sender">The object that raised the event.</param>
		/// <param name="e">A <see cref="ReorderedItemsEventArgs"/> describing the event arguments.</param>
		private void rlvConditionalInstalls_ItemsReordered(object sender, ReorderedItemsEventArgs e)
		{
			foreach (ReorderedItemsEventArgs.ReorderedListViewItem rliItem in e.ReorderedListViewItems)
				ViewModel.MovePattern(rliItem.OldIndex, rliItem.NewIndex);
		}
		/// <summary>
		/// Raises the <see cref="ItemsReordered"/> event.
		/// </summary>
		/// <param name="e">An <see cref="EventArgs"/> describing the event arguments.</param>
		protected virtual void OnItemsReordered(ReorderedItemsEventArgs e)
		{
			ItemsReordered(this, e);
		}
		/// <summary>
		/// Raises the <see cref="Control.DragDrop"/> event of the list view.
		/// </summary>
		/// <remarks>
		/// This inserts the items being reordered.
		/// </remarks>
		/// <param name="drgevent">A <see cref="DragEventArgs"/> describing the event arguments.</param>
		protected override void OnDragDrop(DragEventArgs drgevent)
		{
			base.OnDragDrop(drgevent);
			if (drgevent.Effect == DragDropEffects.Move)
			{
				List<ListViewItem> data = (List<ListViewItem>)drgevent.Data.GetData(typeof(List<ListViewItem>));

				ReorderedItemsEventArgs riaEventArgs = new ReorderedItemsEventArgs();
				m_booIsDropping = true;
				for (Int32 i = data.Count - 1; i >= 0; i--)
				{
					riaEventArgs.ReorderedListViewItems.Insert(0, new ReorderedItemsEventArgs.ReorderedListViewItem(data[i], data[i].Index, m_intInsertIndex + i));
					Items.Remove(data[i]);
				}
				for (Int32 i = data.Count - 1; i >= 0; i--)
					Items.Insert(m_intInsertIndex, data[i]).EnsureVisible();
				m_intInsertIndex = -1;
				m_booIsDropping = false;
				try
				{
					OnItemsReordered(riaEventArgs);
				}
				catch (Exception e)
				{
					//this is required as drag/drop operations, even when performed within the same
					// application, are handled by OLE, which doesn't differentiate between an external
					// an internal drag/drop source. furhter, OLE doesn't understand exceptions, and so
					// doesn't pass them on. even if it could, in general, the source of a drag/drop
					// operation wouldn't care if the target was having an issue. we only care
					// because the source and target are the same application, and the source
					// needs to rethrow the exception, or else it will be lost in the ether
					m_queDragDropExceptions.Enqueue(e);
				}
			}
		}
		/// <summary>
		/// Handles the <see cref="ReorderableListView.ItemsReordered"/> event of the plugin list.
		/// </summary>
		/// <remarks>
		/// This reorders the moved plugins.
		/// </remarks>
		/// <param name="sender">The object that raised the event.</param>
		/// <param name="e">A <see cref="ReorderedItemsEventArgs"/> describing the event arguments.</param>
		private void rlvPlugins_ItemsReordered(object sender, ReorderedItemsEventArgs e)
		{
			foreach (ReorderedItemsEventArgs.ReorderedListViewItem lviPlugin in e.ReorderedListViewItems)
				ViewModel.SetPluginOrderIndex((Plugin)lviPlugin.Item.Tag, lviPlugin.NewIndex);
		}
		private void rlvSteps_ItemsReordered(object sender, ReorderedItemsEventArgs e)
		{
			foreach (ReorderedItemsEventArgs.ReorderedListViewItem rliItem in e.ReorderedListViewItems)
			{
				InstallStepsVM.InstallSteps.RemoveAt(rliItem.OldIndex);
				InstallStepsVM.InstallSteps.Insert(rliItem.NewIndex, (InstallStep)rliItem.Item.Tag);
			}
			ViewModel.SaveInstallSteps(ObjectHelper.GetPropertyName<InstallStepsVM>(x => x.InstallSteps));
		}
		private void rlvOptions_ItemsReordered(object sender, ReorderedItemsEventArgs e)
		{
			foreach (ReorderedItemsEventArgs.ReorderedListViewItem rliItem in e.ReorderedListViewItems)
			{
				OptionGroupVM.Options.RemoveAt(rliItem.OldIndex);
				OptionGroupVM.Options.Insert(rliItem.NewIndex, (Option)rliItem.Item.Tag);
			}
			ViewModel.SaveOptionGroup(ObjectHelper.GetPropertyName<OptionGroup>(x => x.Options));
		}