コード例 #1
0
ファイル: ListView.cs プロジェクト: KonajuGames/SharpLang
			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);
			}
コード例 #2
0
ファイル: ListView.cs プロジェクト: KonajuGames/SharpLang
			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;
				}
			}