virtual public void RemoveFakeItem() { if (!HasFakeItem()) { return; } var visibleRows = GetRows(); int index = TreeViewController.GetIndexOfID(visibleRows, m_FakeItem.id); if (index != -1) { visibleRows.RemoveAt(index); } m_FakeItem = null; }
void Init(TreeViewState state) { if (state == null) { throw new ArgumentNullException("state", "Invalid TreeViewState: it is null"); } m_TreeView = new TreeViewController(null, state); m_DataSource = new TreeViewControlDataSource(m_TreeView, this); m_GUI = new TreeViewControlGUI(m_TreeView, this); m_Dragging = new TreeViewControlDragging(m_TreeView, this); m_TreeView.Init(new Rect(), m_DataSource, m_GUI, m_Dragging); m_TreeView.searchChanged += SearchChanged; m_TreeView.selectionChangedCallback += SelectionChanged; m_TreeView.itemSingleClickedCallback += SingleClickedItem; m_TreeView.itemDoubleClickedCallback += DoubleClickedItem; m_TreeView.contextClickItemCallback += ContextClickedItem; m_TreeView.contextClickOutsideItemsCallback += ContextClicked; m_TreeView.expandedStateChanged += ExpandedStateChanged; m_TreeView.keyboardInputCallback += KeyEvent; m_TreeViewKeyControlID = GUIUtility.GetPermanentControlID(); }
public TreeViewControlGUI(TreeViewController treeView, TreeView owner) : base(treeView) { this.m_Owner = owner; }
public TreeViewControlDataSource(TreeViewController treeView, TreeView owner) : base(treeView) { this.m_Owner = owner; base.showRootItem = false; }
public void HandleUnusedMouseEventsForItem(Rect rect, TreeViewItem item, int row) { int itemControlID = TreeViewController.GetItemControlID(item); Event current = Event.current; EventType typeForControl = current.GetTypeForControl(itemControlID); switch (typeForControl) { case EventType.MouseDown: if (rect.Contains(Event.current.mousePosition)) { if (Event.current.button == 0) { GUIUtility.keyboardControl = this.m_KeyboardControlID; this.Repaint(); if (Event.current.clickCount == 2) { if (this.itemDoubleClickedCallback != null) { this.itemDoubleClickedCallback(item.id); } } else { List <int> newSelection = this.GetNewSelection(item, true, false); bool flag = this.dragging != null && newSelection.Count != 0 && this.dragging.CanStartDrag(item, newSelection, Event.current.mousePosition); if (flag) { this.m_DragSelection = newSelection; DragAndDropDelay dragAndDropDelay = (DragAndDropDelay)GUIUtility.GetStateObject(typeof(DragAndDropDelay), itemControlID); dragAndDropDelay.mouseDownPosition = Event.current.mousePosition; } else { this.m_DragSelection.Clear(); if (this.m_AllowRenameOnMouseUp) { this.m_AllowRenameOnMouseUp = (this.state.selectedIDs.Count == 1 && this.state.selectedIDs[0] == item.id); } this.SelectionClick(item, false); } GUIUtility.hotControl = itemControlID; } current.Use(); } else if (Event.current.button == 1) { bool keepMultiSelection = true; this.SelectionClick(item, keepMultiSelection); } } return; case EventType.MouseUp: if (GUIUtility.hotControl == itemControlID) { bool flag2 = this.m_DragSelection.Count > 0; GUIUtility.hotControl = 0; this.m_DragSelection.Clear(); current.Use(); if (rect.Contains(current.mousePosition)) { Rect renameRect = this.gui.GetRenameRect(rect, row, item); List <int> selectedIDs = this.state.selectedIDs; if (this.m_AllowRenameOnMouseUp && selectedIDs != null && selectedIDs.Count == 1 && selectedIDs[0] == item.id && renameRect.Contains(current.mousePosition) && !EditorGUIUtility.HasHolddownKeyModifiers(current)) { this.BeginNameEditing(0.5f); } else if (flag2) { this.SelectionClick(item, false); } } } return; case EventType.MouseMove: IL_2C: if (typeForControl == EventType.DragUpdated || typeForControl == EventType.DragPerform) { bool firstItem = row == 0; if (this.dragging != null && this.dragging.DragElement(item, rect, firstItem)) { GUIUtility.hotControl = 0; } return; } if (typeForControl != EventType.ContextClick) { return; } if (rect.Contains(current.mousePosition)) { if (this.contextClickItemCallback != null) { this.contextClickItemCallback(item.id); } } return; case EventType.MouseDrag: if (GUIUtility.hotControl == itemControlID && this.dragging != null && this.m_DragSelection.Count > 0) { DragAndDropDelay dragAndDropDelay2 = (DragAndDropDelay)GUIUtility.GetStateObject(typeof(DragAndDropDelay), itemControlID); if (dragAndDropDelay2.CanStartDrag() && this.dragging.CanStartDrag(item, this.m_DragSelection, dragAndDropDelay2.mouseDownPosition)) { this.dragging.StartDrag(item, this.m_DragSelection); GUIUtility.hotControl = 0; } current.Use(); } return; } goto IL_2C; }
public bool IsLastClickedPartOfRows() { IList <TreeViewItem> rows = this.data.GetRows(); return(rows.Count != 0 && TreeViewController.GetIndexOfID(rows, this.state.lastClickedID) >= 0); }
// This method is called from TreeView and handles: // - Where the dragged items are dropped (above, below or upon) // - Auto expansion of collapsed items when hovering over them // - Setting up the render markers for drop location (horizontal lines) // 'targetItem' is null when not hovering over any target Item, if so the rest of the arguments are invalid public virtual bool DragElement(TreeViewItem targetItem, Rect targetItemRect, int row) { bool perform = Event.current.type == EventType.DragPerform; // Are we dragging outside any items if (targetItem == null) { // If so clear any drop markers if (m_DropData != null) { m_DropData.ClearPerEventState(); } // And let client decide what happens when dragging outside items DragAndDrop.visualMode = DoDrag(null, null, perform, DropPosition.Below); if (DragAndDrop.visualMode != DragAndDropVisualMode.None && perform) { FinalizeDragPerformed(true); } return(false); } DropPosition dropPosition; if (!TryGetDropPosition(targetItem, targetItemRect, row, out dropPosition)) { return(false); } TreeViewItem parentItem = null; TreeViewItem dropRelativeToItem = targetItem; bool didChangeTargetToAncector = false; DropPosition originalDropPosition = dropPosition; switch (dropPosition) { case DropPosition.Upon: // Parent change: Client must decide what happens when dropping upon: e.g: insert last or first in child list parentItem = dropRelativeToItem; break; case DropPosition.Below: case DropPosition.Above: // Sibling change if (getIndentLevelForMouseCursor != null) { int cursorDepth = getIndentLevelForMouseCursor(); HandleSiblingInsertionAtAvailableDepthsAndChangeTargetIfNeeded(ref dropRelativeToItem, row, ref dropPosition, cursorDepth, out didChangeTargetToAncector); } else { if (dropPosition == DropPosition.Below && m_TreeView.data.IsExpanded(dropRelativeToItem) && dropRelativeToItem.hasChildren) { // When hovering between an expanded parent and its first child then make sure we change state to match that dropPosition = DropPosition.Above; dropRelativeToItem = dropRelativeToItem.children[0]; } } parentItem = dropRelativeToItem.parent; break; default: Debug.LogError("Unhandled enum. Report a bug."); break; } if (perform) { DragAndDropVisualMode mode = DragAndDropVisualMode.None; // Try Drop upon target item if (dropPosition == DropPosition.Upon) { mode = DoDrag(dropRelativeToItem, dropRelativeToItem, true, dropPosition); } // Drop between items if (mode == DragAndDropVisualMode.None && parentItem != null) { mode = DoDrag(parentItem, dropRelativeToItem, true, dropPosition); } // Finalize drop if (mode != DragAndDropVisualMode.None) { FinalizeDragPerformed(false); } else { DragCleanup(true); m_TreeView.NotifyListenersThatDragEnded(null, false); } } else // DragUpdate { if (m_DropData == null) { m_DropData = new DropData(); } m_DropData.ClearPerEventState(); // Try drop on top of items if (dropPosition == DropPosition.Upon) { int itemControlID = TreeViewController.GetItemControlID(dropRelativeToItem); HandleAutoExpansion(itemControlID, dropRelativeToItem, targetItemRect); var mode = DoDrag(dropRelativeToItem, dropRelativeToItem, false, dropPosition); if (mode != DragAndDropVisualMode.None) { m_DropData.dropTargetControlID = itemControlID; DragAndDrop.visualMode = mode; } } // Drop between items else if (dropRelativeToItem != null && parentItem != null) { var mode = DoDrag(parentItem, dropRelativeToItem, false, dropPosition); if (mode != DragAndDropVisualMode.None) { drawRowMarkerAbove = dropPosition == DropPosition.Above; m_DropData.rowMarkerControlID = TreeViewController.GetItemControlID(dropRelativeToItem); m_DropData.insertionMarkerYPosition = originalDropPosition == DropPosition.Above ? targetItemRect.y : targetItemRect.yMax; m_DropData.insertRelativeToSibling = dropRelativeToItem; if (didChangeTargetToAncector) { m_DropData.ancestorControlID = TreeViewController.GetItemControlID(dropRelativeToItem); } DragAndDrop.visualMode = mode; } } } Event.current.Use(); return(true); }
public TreeViewGUI(TreeViewController treeView) { this.m_TreeView = treeView; }
public virtual bool IsRevealed(int id) { IList <TreeViewItem> rows = this.GetRows(); return(TreeViewController.GetIndexOfID(rows, id) >= 0); }
public virtual bool DragElement(TreeViewItem targetItem, Rect targetItemRect, int row) { bool flag = Event.current.type == EventType.DragPerform; bool result; TreeViewDragging.DropPosition dropPosition; if (targetItem == null) { if (this.m_DropData != null) { this.m_DropData.dropTargetControlID = 0; this.m_DropData.rowMarkerControlID = 0; } DragAndDrop.visualMode = this.DoDrag(null, null, flag, TreeViewDragging.DropPosition.Below); if (DragAndDrop.visualMode != DragAndDropVisualMode.None && flag) { this.FinalizeDragPerformed(true); } result = false; } else if (!this.TryGetDropPosition(targetItem, targetItemRect, row, out dropPosition)) { result = false; } else { TreeViewItem treeViewItem = null; switch (dropPosition) { case TreeViewDragging.DropPosition.Upon: treeViewItem = targetItem; break; case TreeViewDragging.DropPosition.Below: if (this.m_TreeView.data.IsExpanded(targetItem) && targetItem.hasChildren) { treeViewItem = targetItem; targetItem = targetItem.children[0]; dropPosition = TreeViewDragging.DropPosition.Above; } else { treeViewItem = targetItem.parent; } break; case TreeViewDragging.DropPosition.Above: treeViewItem = targetItem.parent; break; } DragAndDropVisualMode dragAndDropVisualMode = DragAndDropVisualMode.None; if (flag) { if (dropPosition == TreeViewDragging.DropPosition.Upon) { dragAndDropVisualMode = this.DoDrag(targetItem, targetItem, true, dropPosition); } if (dragAndDropVisualMode == DragAndDropVisualMode.None && treeViewItem != null) { dragAndDropVisualMode = this.DoDrag(treeViewItem, targetItem, true, dropPosition); } if (dragAndDropVisualMode != DragAndDropVisualMode.None) { this.FinalizeDragPerformed(false); } else { this.DragCleanup(true); this.m_TreeView.NotifyListenersThatDragEnded(null, false); } } else { if (this.m_DropData == null) { this.m_DropData = new TreeViewDragging.DropData(); } this.m_DropData.dropTargetControlID = 0; this.m_DropData.rowMarkerControlID = 0; int itemControlID = TreeViewController.GetItemControlID(targetItem); this.HandleAutoExpansion(itemControlID, targetItem, targetItemRect); if (dropPosition == TreeViewDragging.DropPosition.Upon) { dragAndDropVisualMode = this.DoDrag(targetItem, targetItem, false, dropPosition); } if (dragAndDropVisualMode != DragAndDropVisualMode.None) { this.m_DropData.dropTargetControlID = itemControlID; DragAndDrop.visualMode = dragAndDropVisualMode; } else if (targetItem != null && treeViewItem != null) { dragAndDropVisualMode = this.DoDrag(treeViewItem, targetItem, false, dropPosition); if (dragAndDropVisualMode != DragAndDropVisualMode.None) { this.drawRowMarkerAbove = (dropPosition == TreeViewDragging.DropPosition.Above); this.m_DropData.rowMarkerControlID = itemControlID; DragAndDrop.visualMode = dragAndDropVisualMode; } } } Event.current.Use(); result = true; } return(result); }
public TreeViewControlDragging(TreeViewController treeView, TreeView owner) : base(treeView) { m_Owner = owner; }
// We only override DrawIconAndLabel (and not OnRowGUI) so the user only have to care about item content rendering; and not drag marker rendering, renaming and foldout button protected override void OnContentGUI(Rect rect, int row, TreeViewItem item, string label, bool selected, bool focused, bool useBoldFont, bool isPinging) { // We do not support pinging in the TreeView (to simplify api) if (isPinging) { return; } // Make sure the GUI contents for each row is starting with its own controlID unique to its item. This prevents key-focus of a control (e.g a float field) // to jump from row to row when mouse scrolling (due to culling of rows and the assigning of controlIDs in call-order) GUIUtility.GetControlID(TreeViewController.GetItemControlID(item), FocusType.Passive); if (m_Owner.m_OverriddenMethods.hasRowGUI) { var args = new RowGUIArgs { rowRect = rect, row = row, item = item, label = label, selected = selected, focused = focused, isRenaming = IsRenaming(item.id), }; // For multi column header we call OnRowGUI for each cell with the cell rect if (m_Owner.multiColumnHeader != null) { //args.columnInfo = m_ColumnInfo; var visibleColumns = m_Owner.multiColumnHeader.state.visibleColumns; if (m_CellRects == null || m_CellRects.Length != visibleColumns.Length) { m_CellRects = new Rect[visibleColumns.Length]; } var columns = m_Owner.multiColumnHeader.state.columns; var columnRect = args.rowRect; for (int i = 0; i < visibleColumns.Length; ++i) { var columnData = columns[visibleColumns[i]]; columnRect.width = columnData.width; m_CellRects[i] = columnRect; // Use cell margins for all columns except the column with the tree view foldouts // since that column assumes full cell rect for rename overlay placement if (columnIndexForTreeFoldouts != visibleColumns[i]) { m_CellRects[i].x += cellMargin; m_CellRects[i].width -= 2 * cellMargin; } columnRect.x += columnData.width; } args.columnInfo = new RowGUIArgs.MultiColumnInfo(m_Owner.multiColumnHeader.state, m_CellRects); } m_Owner.RowGUI(args); } else { // Default item gui base.OnContentGUI(rect, row, item, label, selected, focused, useBoldFont, false); } }
public TreeViewControlGUI(TreeViewController treeView, TreeView owner) : base(treeView) { m_Owner = owner; cellMargin = MultiColumnHeader.DefaultGUI.columnContentMargin; }
virtual protected void DoItemGUI(Rect rect, int row, TreeViewItem item, bool selected, bool focused, bool useBoldFont) { EditorGUIUtility.SetIconSize(new Vector2(k_IconWidth, k_IconWidth)); // If not set we see icons scaling down if text is being cropped int itemControlID = TreeViewController.GetItemControlID(item); bool isRenamingThisItem = IsRenaming(item.id); bool showFoldout = m_TreeView.data.IsExpandable(item); // Adjust edit field if needed (on repaint since on layout rect.width is invalid when using GUILayout) if (isRenamingThisItem && Event.current.type == EventType.Repaint) { GetRenameOverlay().editFieldRect = GetRenameRect(rect, row, item); } string label = item.displayName; if (isRenamingThisItem) { selected = false; label = ""; } if (Event.current.type == EventType.Repaint) { // Draw background (can be overridden) DrawItemBackground(rect, row, item, selected, focused); // Draw selection if (selected && drawSelection) { selectionStyle.Draw(rect, false, false, true, focused); } bool hasDragHandling = m_TreeView.dragging != null; if (hasDragHandling) { // Draw drop marker if (m_TreeView.dragging.GetDropTargetControlID() == itemControlID && m_TreeView.data.CanBeParent(item)) { Styles.lineStyle.Draw(GetDropTargetRect(rect), GUIContent.none, true, true, false, false); } // Ancestor item marker is rendered after all rows in RowEndGUI - extra visual helper marker when previous sibling is far away from the cursor var dragging = m_TreeView.dragging as TreeViewDragging; if (dragging != null && dragging.GetAncestorControlID() == itemControlID && dragging.insertRelativeToSibling != null) { m_DraggingAncestorMarkerRect = rect; m_DraggingAncestorMarkerRect.xMin += extraInsertionMarkerIndent + GetContentIndent(item); m_DraggingAncestorMarkerRect.y = rect.yMax - insertionRelativeToSiblingStyle.fixedHeight * 0.5f; } } } // Do additional ui controls (menu button, prefab arrow etc) OnAdditionalGUI(rect, row, item, selected, focused); // Do row content (icon, label, controls etc) OnContentGUI(rect, row, item, label, selected, focused, useBoldFont, false); // Do foldout if (showFoldout) { DoFoldout(rect, item, row); } EditorGUIUtility.SetIconSize(Vector2.zero); }
// This method is called from TreeView and handles: // - Where the dragged items are dropped (above, below or upon) // - Auto expansion of collapsed items when hovering over them // - Setting up the render markers for drop location (horizontal lines) // 'targetItem' is null when not hovering over any target Item, if so the rest of the arguments are invalid public virtual bool DragElement(TreeViewItem targetItem, Rect targetItemRect, int row) { bool perform = Event.current.type == EventType.DragPerform; // Are we dragging outside any items if (targetItem == null) { // If so clear any drop markers if (m_DropData != null) { m_DropData.dropTargetControlID = 0; m_DropData.rowMarkerControlID = 0; } // And let client decide what happens when dragging outside items DragAndDrop.visualMode = DoDrag(null, null, perform, DropPosition.Below); if (DragAndDrop.visualMode != DragAndDropVisualMode.None && perform) { FinalizeDragPerformed(true); } return(false); } DropPosition dropPosition; if (!TryGetDropPosition(targetItem, targetItemRect, row, out dropPosition)) { return(false); } TreeViewItem parentItem = null; switch (dropPosition) { case DropPosition.Upon: { // Client must decide what happens when dropping upon: e.g: insert last or first in child list parentItem = targetItem; } break; case DropPosition.Below: { // When hovering between an expanded parent and its first child then make sure we change state to match that if (m_TreeView.data.IsExpanded(targetItem) && targetItem.hasChildren) { parentItem = targetItem; targetItem = targetItem.children[0]; dropPosition = DropPosition.Above; } else { // Drop as next sibling to target parentItem = targetItem.parent; } } break; case DropPosition.Above: { parentItem = targetItem.parent; } break; default: Assert.IsTrue(false, Constants.UnhandledEnum); break; } DragAndDropVisualMode mode = DragAndDropVisualMode.None; if (perform) { // Try Drop on top of element if (dropPosition == DropPosition.Upon) { mode = DoDrag(targetItem, targetItem, true, dropPosition); } // Fall back to dropping on parent (drop between elements) if (mode == DragAndDropVisualMode.None && parentItem != null) { mode = DoDrag(parentItem, targetItem, true, dropPosition); } // Finalize drop if (mode != DragAndDropVisualMode.None) { FinalizeDragPerformed(false); } else { DragCleanup(true); m_TreeView.NotifyListenersThatDragEnded(null, false); } } else // DragUpdate { if (m_DropData == null) { m_DropData = new DropData(); } m_DropData.dropTargetControlID = 0; m_DropData.rowMarkerControlID = 0; int itemControlID = TreeViewController.GetItemControlID(targetItem); HandleAutoExpansion(itemControlID, targetItem, targetItemRect); // Try drop on top of element if (dropPosition == DropPosition.Upon) { mode = DoDrag(targetItem, targetItem, false, dropPosition); } if (mode != DragAndDropVisualMode.None) { m_DropData.dropTargetControlID = itemControlID; DragAndDrop.visualMode = mode; } // Fall back to dropping on parent (drop between elements) else if (targetItem != null && parentItem != null) { mode = DoDrag(parentItem, targetItem, false, dropPosition); if (mode != DragAndDropVisualMode.None) { drawRowMarkerAbove = dropPosition == DropPosition.Above; m_DropData.rowMarkerControlID = itemControlID; DragAndDrop.visualMode = mode; } } } Event.current.Use(); return(true); }
public LazyTreeViewDataSource(TreeViewController treeView) : base(treeView) { }
public TreeViewDragging(TreeViewController treeView) { m_TreeView = treeView; }
virtual protected void DoItemGUI(Rect rect, int row, TreeViewItem item, bool selected, bool focused, bool useBoldFont) { EditorGUIUtility.SetIconSize(new Vector2(k_IconWidth, k_IconWidth)); // If not set we see icons scaling down if text is being cropped float indent = GetFoldoutIndent(item); int itemControlID = TreeViewController.GetItemControlID(item); bool isDropTarget = false; if (m_TreeView.dragging != null) { isDropTarget = m_TreeView.dragging.GetDropTargetControlID() == itemControlID && m_TreeView.data.CanBeParent(item); } bool isRenamingThisItem = IsRenaming(item.id); bool showFoldout = m_TreeView.data.IsExpandable(item); // Adjust edit field if needed (on repaint since on layout rect.width is invalid when using GUILayout) if (isRenamingThisItem && Event.current.type == EventType.Repaint) { GetRenameOverlay().editFieldRect = GetRenameRect(rect, row, item); } string label = item.displayName; if (isRenamingThisItem) { selected = false; label = ""; } if (Event.current.type == EventType.Repaint) { // Draw background (can be overridden) DrawItemBackground(rect, row, item, selected, focused); // Draw selection if (selected) { selectionStyle.Draw(rect, false, false, true, focused); } // Draw drop marker if (isDropTarget) { Styles.lineStyle.Draw(GetDropTargetRect(rect), GUIContent.none, true, true, false, false); } // Show insertion marker below this item (rendered end of rows) if (m_TreeView.dragging != null && m_TreeView.dragging.GetRowMarkerControlID() == itemControlID) { float yPos = (m_TreeView.dragging.drawRowMarkerAbove ? rect.y : rect.yMax) - insertionStyle.fixedHeight * 0.5f; m_DraggingInsertionMarkerRect = new Rect(rect.x + indent + extraInsertionMarkerIndent + foldoutStyleWidth + lineStyle.margin.left, yPos, rect.width - indent, rect.height); } } // Do row content (icon, label, controls etc) OnContentGUI(rect, row, item, label, selected, focused, useBoldFont, false); // Do foldout if (showFoldout) { DoFoldout(rect, item, row); } EditorGUIUtility.SetIconSize(Vector2.zero); }
public TreeViewGUI(TreeViewController treeView, bool useHorizontalScroll) { this.m_TreeView = treeView; this.m_UseHorizontalScroll = useHorizontalScroll; }
public virtual bool DragElement(TreeViewItem targetItem, Rect targetItemRect, bool firstItem) { bool flag = Event.current.type == EventType.DragPerform; bool result; if (targetItem == null) { if (this.m_DropData != null) { this.m_DropData.dropTargetControlID = 0; this.m_DropData.rowMarkerControlID = 0; } DragAndDrop.visualMode = this.DoDrag(null, null, flag, TreeViewDragging.DropPosition.Below); if (DragAndDrop.visualMode != DragAndDropVisualMode.None && flag) { this.FinalizeDragPerformed(true); } result = false; } else { Vector2 mousePosition = Event.current.mousePosition; bool flag2 = this.m_TreeView.data.CanBeParent(targetItem); Rect rect = targetItemRect; float num = (!flag2) ? (targetItemRect.height * 0.5f) : this.m_TreeView.gui.halfDropBetweenHeight; if (firstItem) { rect.yMin -= num; } rect.yMax += num; if (!rect.Contains(mousePosition)) { result = false; } else { TreeViewDragging.DropPosition dropPosition; if (mousePosition.y >= targetItemRect.yMax - num) { dropPosition = TreeViewDragging.DropPosition.Below; } else if (firstItem && mousePosition.y <= targetItemRect.yMin + num) { dropPosition = TreeViewDragging.DropPosition.Above; } else { dropPosition = ((!flag2) ? TreeViewDragging.DropPosition.Above : TreeViewDragging.DropPosition.Upon); } TreeViewItem treeViewItem = null; switch (dropPosition) { case TreeViewDragging.DropPosition.Upon: treeViewItem = targetItem; break; case TreeViewDragging.DropPosition.Below: if (this.m_TreeView.data.IsExpanded(targetItem) && targetItem.hasChildren) { treeViewItem = targetItem; targetItem = targetItem.children[0]; dropPosition = TreeViewDragging.DropPosition.Above; } else { treeViewItem = targetItem.parent; } break; case TreeViewDragging.DropPosition.Above: treeViewItem = targetItem.parent; break; } DragAndDropVisualMode dragAndDropVisualMode = DragAndDropVisualMode.None; if (flag) { if (dropPosition == TreeViewDragging.DropPosition.Upon) { dragAndDropVisualMode = this.DoDrag(targetItem, targetItem, true, dropPosition); } if (dragAndDropVisualMode == DragAndDropVisualMode.None && treeViewItem != null) { dragAndDropVisualMode = this.DoDrag(treeViewItem, targetItem, true, dropPosition); } if (dragAndDropVisualMode != DragAndDropVisualMode.None) { this.FinalizeDragPerformed(false); } else { this.DragCleanup(true); this.m_TreeView.NotifyListenersThatDragEnded(null, false); } } else { if (this.m_DropData == null) { this.m_DropData = new TreeViewDragging.DropData(); } this.m_DropData.dropTargetControlID = 0; this.m_DropData.rowMarkerControlID = 0; int itemControlID = TreeViewController.GetItemControlID(targetItem); this.HandleAutoExpansion(itemControlID, targetItem, targetItemRect, num, mousePosition); if (dropPosition == TreeViewDragging.DropPosition.Upon) { dragAndDropVisualMode = this.DoDrag(targetItem, targetItem, false, dropPosition); } if (dragAndDropVisualMode != DragAndDropVisualMode.None) { this.m_DropData.dropTargetControlID = itemControlID; DragAndDrop.visualMode = dragAndDropVisualMode; } else if (targetItem != null && treeViewItem != null) { dragAndDropVisualMode = this.DoDrag(treeViewItem, targetItem, false, dropPosition); if (dragAndDropVisualMode != DragAndDropVisualMode.None) { this.drawRowMarkerAbove = (dropPosition == TreeViewDragging.DropPosition.Above); this.m_DropData.rowMarkerControlID = itemControlID; DragAndDrop.visualMode = dragAndDropVisualMode; } } } Event.current.Use(); result = true; } } return(result); }