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)