All pastes #234588 Raw Edit

Unnamed

public text v1 · immutable
·published 2006-11-02 18:24 UTC
rendered paste body
Index: ListView.cs
===================================================================
--- ListView.cs	(Revision 67259)
+++ ListView.cs	(Arbeitskopie)
@@ -1302,6 +1302,10 @@
 			ListViewItem last_clicked_item;
 			bool hover_processed = false;
 			bool checking = false;
+			
+			LabelEditTextBox edit_text_box;
+			internal ListViewItem edit_item;
+			LabelEditEventArgs edit_args;
 
 			public ItemControl (ListView owner)
 			{
@@ -1491,8 +1495,11 @@
 						owner.OnDoubleClick (EventArgs.Empty);
 						if (owner.CheckBoxes)
 							ToggleCheckState (clicked_item);
-					} else if (me.Clicks == 1)
+					} else if (me.Clicks == 1) {
 						owner.OnClick (EventArgs.Empty);
+						if (!changed)
+							BeginEdit (clicked_item); // this is probably not the correct place to execute BeginEdit
+					}
 				} else {
 					if (owner.MultiSelect) {
 						Keys mods = XplatUI.State.ModifierKeys;
@@ -1591,6 +1598,64 @@
 				box_select_mode = BoxSelect.None;
 				checking = false;
 			}
+			
+			internal void LabelEditFinished (object sender, EventArgs e)
+			{
+				EndEdit (edit_item);
+			}
+			
+			internal void BeginEdit (ListViewItem item)
+			{
+				if (edit_item != null)
+					EndEdit (edit_item);
+				
+				if (edit_text_box == null) {
+					edit_text_box = new LabelEditTextBox ();
+					edit_text_box.BorderStyle = BorderStyle.FixedSingle;
+					edit_text_box.EditingFinished += new EventHandler (LabelEditFinished);
+					Controls.Add (edit_text_box);
+				}
+				
+				item.EnsureVisible();
+				
+				edit_text_box.Bounds = item.GetBounds (ItemBoundsPortion.Label);
+				edit_text_box.Width += 4;
+				
+				edit_text_box.Text = item.Text;
+				edit_text_box.Visible = true;
+				edit_text_box.Focus ();
+				edit_text_box.SelectAll ();
+				
+				edit_args = new LabelEditEventArgs (owner.Items.IndexOf(edit_item));
+				owner.OnBeforeLabelEdit (edit_args);
+				
+				if (edit_args.CancelEdit)
+					EndEdit (item);
+				
+				edit_item = item;
+			}
+			
+			internal void EndEdit (ListViewItem item)
+			{
+				if (edit_text_box != null && edit_text_box.Visible) {
+					edit_text_box.Visible = false;
+				}
+				
+				if (edit_item != null && edit_item == item) {
+					owner.OnAfterLabelEdit (edit_args);
+					
+					if (!edit_args.CancelEdit) {
+						if (edit_args.Label != null)
+							edit_item.Text = edit_args.Label;
+						else
+							edit_item.Text = edit_text_box.Text;
+					}
+					
+				}
+				
+				
+				edit_item = null;
+			}
 
 			internal override void OnPaintInternal (PaintEventArgs pe)
 			{
@@ -1664,6 +1729,8 @@
 
 		private void HorizontalScroller (object sender, EventArgs e)
 		{
+			item_control.EndEdit (item_control.edit_item);
+			
 			// Avoid unnecessary flickering, when button is
 			// kept pressed at the end
 			if (h_marker != h_scroll.Value) {
@@ -1680,6 +1747,8 @@
 
 		private void VerticalScroller (object sender, EventArgs e)
 		{
+			item_control.EndEdit (item_control.edit_item);
+			
 			// Avoid unnecessary flickering, when button is
 			// kept pressed at the end
 			if (v_marker != v_scroll.Value) {
Index: ListViewItem.cs
===================================================================
--- ListViewItem.cs	(Revision 67259)
+++ ListViewItem.cs	(Arbeitskopie)
@@ -338,6 +338,9 @@
 		#region Public Instance Methods
 		public void BeginEdit ()
 		{
+			if (owner != null && owner.LabelEdit) {
+				owner.item_control.BeginEdit (this);
+			}
 			// FIXME: TODO
 			// if (owner != null && owner.LabelEdit 
 			//    && owner.Activation == ItemActivation.Standard)