private void ResetMouseState () { clicked_item = null; box_select_start = Point.Empty; BoxSelectRectangle = Rectangle.Empty; prev_selection = null; box_select_mode = BoxSelect.None; checking = false; // Clean these bits in case the mouse buttons were // released before firing ItemDrag dragged_item_index = -1; drag_begin = new Point (-1, -1); }
private void ItemsMouseDown (object sender, MouseEventArgs me) { owner.OnMouseDown (owner.TranslateMouseEventArgs (me)); if (owner.items.Count == 0) return; bool box_selecting = false; Size item_size = owner.ItemSize; Point pt = new Point (me.X, me.Y); for (int i = 0; i < owner.items.Count; i++) { Rectangle item_rect = new Rectangle (owner.GetItemLocation (i), item_size); if (!item_rect.Contains (pt)) continue; // Actual item in 'i' position ListViewItem item = owner.GetItemAtDisplayIndex (i); if (item.CheckRectReal.Contains (pt)) { // Don't modify check state if we have only one image // and if we are in 1.1 profile only take into account // double clicks if (owner.StateImageList != null && owner.StateImageList.Images.Count < 2 ) return; // Generate an extra ItemCheck event when we got two clicks // (Match weird .Net behaviour) if (me.Clicks == 2) item.Checked = !item.Checked; item.Checked = !item.Checked; checking = true; return; } if (owner.View == View.Details) { bool over_text = item.TextBounds.Contains (pt); if (owner.FullRowSelect) { clicked_item = item; bool over_item_column = (me.X > owner.Columns[0].X && me.X < owner.Columns[0].X + owner.Columns[0].Width); if (!over_text && over_item_column && owner.MultiSelect) box_selecting = true; } else if (over_text) clicked_item = item; else owner.SetFocusedItem (i); } else clicked_item = item; break; } if (clicked_item != null) { bool changed = !clicked_item.Selected; if (me.Button == MouseButtons.Left || (XplatUI.State.ModifierKeys == Keys.None && changed)) owner.SetFocusedItem (clicked_item.DisplayIndex); if (owner.MultiSelect) { bool reselect = (!owner.LabelEdit || changed); if (me.Button == MouseButtons.Left || (XplatUI.State.ModifierKeys == Keys.None && changed)) owner.UpdateMultiSelection (clicked_item.DisplayIndex, reselect); } else { clicked_item.Selected = true; } if (owner.VirtualMode && changed) { // Broken event - It's not fired from Item.Selected also ListViewVirtualItemsSelectionRangeChangedEventArgs args = new ListViewVirtualItemsSelectionRangeChangedEventArgs (0, owner.items.Count - 1, false); owner.OnVirtualItemsSelectionRangeChanged (args); } // Report clicks only if the item was clicked. On MS the // clicks are only raised if you click an item clicks = me.Clicks; if (me.Clicks > 1) { if (owner.CheckBoxes) clicked_item.Checked = !clicked_item.Checked; } else if (me.Clicks == 1) { if (owner.LabelEdit && !changed) BeginEdit (clicked_item); // this is probably not the correct place to execute BeginEdit } drag_begin = me.Location; dragged_item_index = clicked_item.Index; } else { if (owner.MultiSelect) box_selecting = true; else if (owner.SelectedItems.Count > 0) owner.SelectedItems.Clear (); } if (box_selecting) { Keys mods = XplatUI.State.ModifierKeys; if ((mods & Keys.Shift) != 0) box_select_mode = BoxSelect.Shift; else if ((mods & Keys.Control) != 0) box_select_mode = BoxSelect.Control; else box_select_mode = BoxSelect.Normal; box_select_start = pt; prev_selection = owner.SelectedIndices.List.Clone () as IList; } }