Index: /trunk/eraser6/Eraser.DefaultPlugins/CustomMethodEditorForm.Designer.cs
===================================================================
--- /trunk/eraser6/Eraser.DefaultPlugins/CustomMethodEditorForm.Designer.cs	(revision 1498)
+++ /trunk/eraser6/Eraser.DefaultPlugins/CustomMethodEditorForm.Designer.cs	(revision 1499)
@@ -60,12 +60,10 @@
 			this.passesRemoveBtn = new System.Windows.Forms.Button();
 			this.passesDuplicateBtn = new System.Windows.Forms.Button();
-			this.passesMoveUpBtn = new System.Windows.Forms.Button();
-			this.passesMoveDownBtn = new System.Windows.Forms.Button();
 			this.passGrp = new System.Windows.Forms.GroupBox();
+			this.passEditor = new Eraser.DefaultPlugins.CustomMethodPassEditor();
 			this.randomizeChk = new System.Windows.Forms.CheckBox();
 			this.okBtn = new System.Windows.Forms.Button();
 			this.cancelBtn = new System.Windows.Forms.Button();
 			this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
-			this.passEditor = new Eraser.DefaultPlugins.CustomMethodPassEditor();
 			this.passGrp.SuspendLayout();
 			((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
@@ -84,4 +82,5 @@
 			// passesLv
 			// 
+			this.passesLv.AllowDrop = true;
 			resources.ApplyResources(this.passesLv, "passesLv");
 			this.passesLv.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
@@ -89,9 +88,14 @@
             this.passesColType});
 			this.passesLv.FullRowSelect = true;
+			this.passesLv.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
 			this.passesLv.HideSelection = false;
 			this.passesLv.Name = "passesLv";
 			this.passesLv.UseCompatibleStateImageBehavior = false;
 			this.passesLv.View = System.Windows.Forms.View.Details;
+			this.passesLv.DragDrop += new System.Windows.Forms.DragEventHandler(this.passesLv_DragDrop);
 			this.passesLv.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.passesLv_ItemSelectionChanged);
+			this.passesLv.DragEnter += new System.Windows.Forms.DragEventHandler(this.passesLv_DragEnter);
+			this.passesLv.GiveFeedback += new System.Windows.Forms.GiveFeedbackEventHandler(this.passesLv_GiveFeedback);
+			this.passesLv.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.passesLv_ItemDrag);
 			// 
 			// passesColNumber
@@ -124,18 +128,4 @@
 			this.passesDuplicateBtn.Click += new System.EventHandler(this.passesDuplicateBtn_Click);
 			// 
-			// passesMoveUpBtn
-			// 
-			resources.ApplyResources(this.passesMoveUpBtn, "passesMoveUpBtn");
-			this.passesMoveUpBtn.Name = "passesMoveUpBtn";
-			this.passesMoveUpBtn.UseVisualStyleBackColor = true;
-			this.passesMoveUpBtn.Click += new System.EventHandler(this.passesMoveUpBtn_Click);
-			// 
-			// passesMoveDownBtn
-			// 
-			resources.ApplyResources(this.passesMoveDownBtn, "passesMoveDownBtn");
-			this.passesMoveDownBtn.Name = "passesMoveDownBtn";
-			this.passesMoveDownBtn.UseVisualStyleBackColor = true;
-			this.passesMoveDownBtn.Click += new System.EventHandler(this.passesMoveDownBtn_Click);
-			// 
 			// passGrp
 			// 
@@ -145,4 +135,11 @@
 			this.passGrp.TabStop = false;
 			// 
+			// passEditor
+			// 
+			resources.ApplyResources(this.passEditor, "passEditor");
+			this.passEditor.Name = "passEditor";
+			this.passEditor.PassData = null;
+			this.passEditor.PassType = Eraser.DefaultPlugins.CustomMethodPassEditorPassType.Text;
+			// 
 			// randomizeChk
 			// 
@@ -168,11 +165,4 @@
 			// 
 			this.errorProvider.ContainerControl = this;
-			// 
-			// passEditor
-			// 
-			resources.ApplyResources(this.passEditor, "passEditor");
-			this.passEditor.Name = "passEditor";
-			this.passEditor.PassData = null;
-			this.passEditor.PassType = Eraser.DefaultPlugins.CustomMethodPassEditorPassType.Text;
 			// 
 			// CustomMethodEditorForm
@@ -186,6 +176,4 @@
 			this.Controls.Add(this.randomizeChk);
 			this.Controls.Add(this.passGrp);
-			this.Controls.Add(this.passesMoveDownBtn);
-			this.Controls.Add(this.passesMoveUpBtn);
 			this.Controls.Add(this.passesDuplicateBtn);
 			this.Controls.Add(this.passesRemoveBtn);
@@ -214,6 +202,4 @@
 		private System.Windows.Forms.Button passesRemoveBtn;
 		private System.Windows.Forms.Button passesDuplicateBtn;
-		private System.Windows.Forms.Button passesMoveUpBtn;
-		private System.Windows.Forms.Button passesMoveDownBtn;
 		private System.Windows.Forms.GroupBox passGrp;
 		private System.Windows.Forms.CheckBox randomizeChk;
Index: /trunk/eraser6/Eraser.DefaultPlugins/CustomMethodEditorForm.cs
===================================================================
--- /trunk/eraser6/Eraser.DefaultPlugins/CustomMethodEditorForm.cs	(revision 1498)
+++ /trunk/eraser6/Eraser.DefaultPlugins/CustomMethodEditorForm.cs	(revision 1499)
@@ -152,18 +152,6 @@
 		private void EnableButtons()
 		{
-			passesRemoveBtn.Enabled = passesDuplicateBtn.Enabled = passesMoveUpBtn.Enabled =
-				passesMoveDownBtn.Enabled = passesLv.SelectedItems.Count >= 1;
+			passesRemoveBtn.Enabled = passesDuplicateBtn.Enabled = passesLv.SelectedItems.Count >= 1;
 			passGrp.Enabled = passEditor.Enabled = passesLv.SelectedItems.Count == 1;
-
-			ListView.SelectedListViewItemCollection items = passesLv.SelectedItems;
-			if (items.Count > 0)
-			{
-				foreach (ListViewItem item in items)
-				{
-					int index = item.Index;
-					passesMoveUpBtn.Enabled = passesMoveUpBtn.Enabled && index > 0;
-					passesMoveDownBtn.Enabled = passesMoveDownBtn.Enabled && index < passesLv.Items.Count - 1;
-				}
-			}
 		}
 
@@ -210,46 +198,112 @@
 		}
 
-		private void passesMoveUpBtn_Click(object sender, EventArgs e)
-		{
-			//Save the current pass to prevent data loss
+		private void passesLv_ItemDrag(object sender, ItemDragEventArgs e)
+		{
+			//Save the currently edited pass before allowing the drag & drop operation.
 			SavePass(currentPass);
 
-			foreach (ListViewItem item in passesLv.SelectedItems)
-			{
-				//Insert the current item into the index before, only if the item has got
-				//space to move up!
-				int index = item.Index;
-				if (index >= 1)
+			//Then initiate the drag & drop.
+			passesLv.DoDragDrop(passesLv.SelectedItems, DragDropEffects.All);
+		}
+
+		private void passesLv_DragEnter(object sender, DragEventArgs e)
+		{
+			ListView.SelectedListViewItemCollection items =
+				e.Data.GetData(typeof(ListView.SelectedListViewItemCollection)) as
+					ListView.SelectedListViewItemCollection;
+			if (items == null)
+				return;
+
+			e.Effect = DragDropEffects.Move;
+		}
+
+		ListViewItem lastInsertionPoint = null;
+		private void passesLv_GiveFeedback(object sender, GiveFeedbackEventArgs e)
+		{
+			e.UseDefaultCursors = true;
+			Point mousePoint = passesLv.PointToClient(Cursor.Position);
+			ListViewItem insertionPoint = GetInsertionPoint(mousePoint);
+
+			if (insertionPoint != lastInsertionPoint)
+			{
+				passesLv.Invalidate();
+				passesLv.Update();
+
+				using (Graphics g = passesLv.CreateGraphics())
 				{
-					passesLv.Items.RemoveAt(index);
-					passesLv.Items.Insert(index - 1, item);
+					//Only handle the exception: when insertionPoint is null, the item should
+					//be appended to the back of the listview.
+					if (insertionPoint == null)
+					{
+						if (passesLv.Items.Count > 0)
+						{
+							ListViewItem lastItem = passesLv.Items[passesLv.Items.Count - 1];
+							g.FillRectangle(new SolidBrush(Color.Black),
+								lastItem.Bounds.Left, lastItem.Bounds.Bottom - 1, passesLv.Width, 2);
+						}
+						else
+						{
+							g.FillRectangle(new SolidBrush(Color.Black),
+								   0, 0, passesLv.Width, 2);
+						}
+					}
+					else
+					{
+						g.FillRectangle(new SolidBrush(Color.Black),
+							insertionPoint.Bounds.Left, insertionPoint.Bounds.Top - 1, passesLv.Width, 2);
+					}
 				}
-			}
-
+
+				lastInsertionPoint = insertionPoint;
+			}
+		}
+
+		private void passesLv_DragDrop(object sender, DragEventArgs e)
+		{
+			//Remove the insertion mark
+			lastInsertionPoint = null;
+
+			//Get the item we dragged and the item we dropped over.
+			ListView.SelectedListViewItemCollection draggedItems =
+				e.Data.GetData(typeof(ListView.SelectedListViewItemCollection)) as
+					ListView.SelectedListViewItemCollection;
+			List<ListViewItem> items = new List<ListViewItem>(draggedItems.Count);
+			foreach (ListViewItem item in draggedItems)
+				items.Add(item);
+			Point mousePoint = passesLv.PointToClient(Cursor.Position);
+			ListViewItem dropItem = GetInsertionPoint(mousePoint);
+
+			//If we do not have an item, it is not a valid drag & drop operation.
+			if (items == null || items.Count == 0)
+				return;
+
+			//Ignore the operation if the drag source and the destination items match.
+			if (items.IndexOf(dropItem) != -1)
+				return;
+
+			//Prevent the listview from refreshing to speed things up.
+			passesLv.BeginUpdate();
+			passesLv.Invalidate();
+
+			//Remove the item we dragged
+			foreach (ListViewItem item in items)
+				item.Remove();
+
+			//If we don't have an item we dropped over, it's the last item in the list.
+			if (dropItem == null)
+			{
+				foreach (ListViewItem item in items)
+					passesLv.Items.Add(item);
+			}
+			else
+			{
+				foreach (ListViewItem item in items)
+					passesLv.Items.Insert(dropItem.Index, item);
+			}
+
+			//Renumber the passes for congruency
 			RenumberPasses();
 			EnableButtons();
-		}
-
-		private void passesMoveDownBtn_Click(object sender, EventArgs e)
-		{
-			//Save the current pass to prevent data loss
-			SavePass(currentPass);
-
-			ListView.SelectedListViewItemCollection items = passesLv.SelectedItems;
-			for (int i = items.Count; i-- != 0; )
-			{
-				//Insert the current item into the index after, only if the item has got
-				//space to move down.
-				ListViewItem item = items[i];
-				int index = item.Index;
-				if (index < passesLv.Items.Count - 1)
-				{
-					passesLv.Items.RemoveAt(index);
-					passesLv.Items.Insert(index + 1, item);
-				}
-			}
-
-			RenumberPasses();
-			EnableButtons();
+			passesLv.EndUpdate();
 		}
 
@@ -272,5 +326,33 @@
 			}
 		}
-		
+
+		/// <summary>
+		/// Calculates the item to insert the new dragged item before, based on
+		/// mouse coordinates.
+		/// </summary>
+		/// <param name="point">The current location of the cursor.</param>
+		/// <returns>The item to insert the new item before, or null if the item
+		/// should be appended to the list.</returns>
+		private ListViewItem GetInsertionPoint(Point point)
+		{
+			ListViewItem item = passesLv.GetItemAt(0, point.Y);
+			if (item == null)
+				return null;
+
+			bool beforeItem = point.Y < item.Bounds.Height / 2 + item.Bounds.Y;
+			if (beforeItem)
+			{
+				return item;
+			}
+			else if (item.Index == passesLv.Items.Count - 1)
+			{
+				return null;
+			}
+			else
+			{
+				return passesLv.Items[item.Index + 1];
+			}
+		}
+
 		private void okBtn_Click(object sender, EventArgs e)
 		{
Index: /trunk/eraser6/Eraser.DefaultPlugins/CustomMethodEditorForm.resx
===================================================================
--- /trunk/eraser6/Eraser.DefaultPlugins/CustomMethodEditorForm.resx	(revision 1498)
+++ /trunk/eraser6/Eraser.DefaultPlugins/CustomMethodEditorForm.resx	(revision 1499)
@@ -149,5 +149,5 @@
   </data>
   <data name="&gt;&gt;nameLbl.ZOrder" xml:space="preserve">
-    <value>11</value>
+    <value>9</value>
   </data>
   <data name="nameTxt.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
@@ -173,5 +173,5 @@
   </data>
   <data name="&gt;&gt;nameTxt.ZOrder" xml:space="preserve">
-    <value>10</value>
+    <value>8</value>
   </data>
   <data name="passesLv.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
@@ -197,11 +197,11 @@
   </data>
   <data name="&gt;&gt;passesLv.ZOrder" xml:space="preserve">
-    <value>9</value>
+    <value>7</value>
   </data>
   <data name="passesColNumber.Text" xml:space="preserve">
-    <value>Pass Number</value>
+    <value />
   </data>
   <data name="passesColNumber.Width" type="System.Int32, mscorlib">
-    <value>90</value>
+    <value>30</value>
   </data>
   <data name="passesColType.Text" xml:space="preserve">
@@ -209,5 +209,5 @@
   </data>
   <data name="passesColType.Width" type="System.Int32, mscorlib">
-    <value>135</value>
+    <value>195</value>
   </data>
   <data name="passesAddBtn.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
@@ -239,5 +239,5 @@
   </data>
   <data name="&gt;&gt;passesAddBtn.ZOrder" xml:space="preserve">
-    <value>8</value>
+    <value>6</value>
   </data>
   <data name="passesRemoveBtn.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
@@ -272,5 +272,5 @@
   </data>
   <data name="&gt;&gt;passesRemoveBtn.ZOrder" xml:space="preserve">
-    <value>7</value>
+    <value>5</value>
   </data>
   <data name="passesDuplicateBtn.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
@@ -305,70 +305,4 @@
   </data>
   <data name="&gt;&gt;passesDuplicateBtn.ZOrder" xml:space="preserve">
-    <value>6</value>
-  </data>
-  <data name="passesMoveUpBtn.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
-    <value>Top, Right</value>
-  </data>
-  <data name="passesMoveUpBtn.Enabled" type="System.Boolean, mscorlib">
-    <value>False</value>
-  </data>
-  <data name="passesMoveUpBtn.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
-    <value>NoControl</value>
-  </data>
-  <data name="passesMoveUpBtn.Location" type="System.Drawing.Point, System.Drawing">
-    <value>272, 147</value>
-  </data>
-  <data name="passesMoveUpBtn.Size" type="System.Drawing.Size, System.Drawing">
-    <value>90, 23</value>
-  </data>
-  <data name="passesMoveUpBtn.TabIndex" type="System.Int32, mscorlib">
-    <value>7</value>
-  </data>
-  <data name="passesMoveUpBtn.Text" xml:space="preserve">
-    <value>Move Up</value>
-  </data>
-  <data name="&gt;&gt;passesMoveUpBtn.Name" xml:space="preserve">
-    <value>passesMoveUpBtn</value>
-  </data>
-  <data name="&gt;&gt;passesMoveUpBtn.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;passesMoveUpBtn.Parent" xml:space="preserve">
-    <value>$this</value>
-  </data>
-  <data name="&gt;&gt;passesMoveUpBtn.ZOrder" xml:space="preserve">
-    <value>5</value>
-  </data>
-  <data name="passesMoveDownBtn.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
-    <value>Top, Right</value>
-  </data>
-  <data name="passesMoveDownBtn.Enabled" type="System.Boolean, mscorlib">
-    <value>False</value>
-  </data>
-  <data name="passesMoveDownBtn.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
-    <value>NoControl</value>
-  </data>
-  <data name="passesMoveDownBtn.Location" type="System.Drawing.Point, System.Drawing">
-    <value>272, 176</value>
-  </data>
-  <data name="passesMoveDownBtn.Size" type="System.Drawing.Size, System.Drawing">
-    <value>90, 23</value>
-  </data>
-  <data name="passesMoveDownBtn.TabIndex" type="System.Int32, mscorlib">
-    <value>8</value>
-  </data>
-  <data name="passesMoveDownBtn.Text" xml:space="preserve">
-    <value>Move Down</value>
-  </data>
-  <data name="&gt;&gt;passesMoveDownBtn.Name" xml:space="preserve">
-    <value>passesMoveDownBtn</value>
-  </data>
-  <data name="&gt;&gt;passesMoveDownBtn.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;passesMoveDownBtn.Parent" xml:space="preserve">
-    <value>$this</value>
-  </data>
-  <data name="&gt;&gt;passesMoveDownBtn.ZOrder" xml:space="preserve">
     <value>4</value>
   </data>
@@ -376,4 +310,46 @@
     <value>Bottom, Left, Right</value>
   </data>
+  <data name="&gt;&gt;passEditor.Name" xml:space="preserve">
+    <value>passEditor</value>
+  </data>
+  <data name="&gt;&gt;passEditor.Type" xml:space="preserve">
+    <value>Eraser.DefaultPlugins.CustomMethodPassEditor, Eraser.DefaultPlugins, Version=6.0.6.1498, Culture=neutral, PublicKeyToken=3ac89a0351e689b6</value>
+  </data>
+  <data name="&gt;&gt;passEditor.Parent" xml:space="preserve">
+    <value>passGrp</value>
+  </data>
+  <data name="&gt;&gt;passEditor.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="passGrp.Enabled" type="System.Boolean, mscorlib">
+    <value>False</value>
+  </data>
+  <data name="passGrp.Location" type="System.Drawing.Point, System.Drawing">
+    <value>15, 205</value>
+  </data>
+  <data name="passGrp.Size" type="System.Drawing.Size, System.Drawing">
+    <value>347, 142</value>
+  </data>
+  <data name="passGrp.TabIndex" type="System.Int32, mscorlib">
+    <value>9</value>
+  </data>
+  <data name="passGrp.Text" xml:space="preserve">
+    <value>Pass Data</value>
+  </data>
+  <data name="&gt;&gt;passGrp.Name" xml:space="preserve">
+    <value>passGrp</value>
+  </data>
+  <data name="&gt;&gt;passGrp.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;passGrp.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;passGrp.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="passEditor.Font" type="System.Drawing.Font, System.Drawing">
+    <value>Segoe UI, 9pt</value>
+  </data>
   <data name="passEditor.Location" type="System.Drawing.Point, System.Drawing">
     <value>6, 13</value>
@@ -389,5 +365,5 @@
   </data>
   <data name="&gt;&gt;passEditor.Type" xml:space="preserve">
-    <value>Eraser.DefaultPlugins.CustomMethodPassEditor, Eraser.DefaultPlugins, Version=6.0.0.1, Culture=neutral, PublicKeyToken=4411c113eac74bb2</value>
+    <value>Eraser.DefaultPlugins.CustomMethodPassEditor, Eraser.DefaultPlugins, Version=6.0.6.1498, Culture=neutral, PublicKeyToken=3ac89a0351e689b6</value>
   </data>
   <data name="&gt;&gt;passEditor.Parent" xml:space="preserve">
@@ -396,31 +372,4 @@
   <data name="&gt;&gt;passEditor.ZOrder" xml:space="preserve">
     <value>0</value>
-  </data>
-  <data name="passGrp.Enabled" type="System.Boolean, mscorlib">
-    <value>False</value>
-  </data>
-  <data name="passGrp.Location" type="System.Drawing.Point, System.Drawing">
-    <value>15, 205</value>
-  </data>
-  <data name="passGrp.Size" type="System.Drawing.Size, System.Drawing">
-    <value>347, 142</value>
-  </data>
-  <data name="passGrp.TabIndex" type="System.Int32, mscorlib">
-    <value>9</value>
-  </data>
-  <data name="passGrp.Text" xml:space="preserve">
-    <value>Pass Data</value>
-  </data>
-  <data name="&gt;&gt;passGrp.Name" xml:space="preserve">
-    <value>passGrp</value>
-  </data>
-  <data name="&gt;&gt;passGrp.Type" xml:space="preserve">
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;passGrp.Parent" xml:space="preserve">
-    <value>$this</value>
-  </data>
-  <data name="&gt;&gt;passGrp.ZOrder" xml:space="preserve">
-    <value>3</value>
   </data>
   <data name="randomizeChk.AutoSize" type="System.Boolean, mscorlib">
