Пример #1
0
        private void treeView_BeforeSelect(object sender, TreeViewCancelEventArgs e)
        {
            if (e.Node is TreeNodeLocalItem)
            {
                TreeNodeLocalItem treeNodeServerFolder = (TreeNodeLocalItem)e.Node;

                treeView.BeginUpdate();
                if (ModifierKeys.HasFlag(Keys.Shift))
                {
                    SetExistingNodeSelection(treeNodeServerFolder, ModifierKeys.HasFlag(Keys.Control));
                    TreeNodeLocalItem prevItem = treeNodeServerFolder.PrevVisibleNode as TreeNodeLocalItem;
                    while (prevItem != null && !prevItem.IsMultiSelect)
                    {
                        SetExistingNodeSelection(prevItem, ModifierKeys.HasFlag(Keys.Control));
                        prevItem = prevItem.PrevVisibleNode as TreeNodeLocalItem;
                    }
                }
                else
                {
                    if (!ModifierKeys.HasFlag(Keys.Control))
                    {
                        ClearExistingNodeSelection(new string[] { treeNodeServerFolder.LocalItem });
                    }
                    SetExistingNodeSelection(treeNodeServerFolder, ModifierKeys.HasFlag(Keys.Control));
                }
                treeView.EndUpdate();
                e.Cancel = true;
                this.m_lastSelectedPath = treeNodeServerFolder.LocalItem;
                if (LastSelectedServerItemChanged != null)
                {
                    LastSelectedServerItemChanged(this, new EventArgs());
                }
            }
        }
Пример #2
0
        private void Reset()
        {
            backgroundWorker.CancelAsync();
            m_toExpand.Clear();
            treeView.BeginUpdate();
            treeView.Nodes.Clear();
            TreeNodeLocalItem root = AttachTreeNode(null, m_workspace != null ? m_workspace.Name : "wat?", new TempItemSet.TempItem());

            treeView.SelectedNode = root;
            if (m_workspace != null)
            {
                var             roots = WorkingFolder.GetWorkspaceRoots(m_workspace.Folders);
                List <ItemSpec> specs = new List <ItemSpec>();
                foreach (string s in roots)
                {
                    specs.Add(new ItemSpec(s, RecursionType.None));
                }
                var items = m_workspace.GetExtendedItems(specs.ToArray(), DeletedState.Any, ItemType.Folder);
                foreach (var i in items)
                {
                    foreach (var j in i)
                    {
                        AttachTreeNode(root, j.LocalItem, new TempItemSet.TempItem {
                            LocalPath = j.LocalItem, ServerItem = j
                        });
                    }
                }
            }
            treeView.EndUpdate();
        }
Пример #3
0
        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (BackgroundWorkEnded != null)
            {
                BackgroundWorkEnded(this, EventArgs.Empty);
            }

            if (e.Cancelled)
            {
                return;
            }

            TempItemSet[] itemSets = e.Result as TempItemSet[];
            if (itemSets != null)
            {
                treeView.BeginUpdate();
                TreeNodeLocalItem treeNodeServerFolder = null;
                foreach (TempItemSet itemSet in itemSets)
                {
                    if (itemSet.QueryPath != null)
                    {
                        if (treeNodeServerFolder != null && !FileSpec.IsSubItem(itemSet.QueryPath, treeNodeServerFolder.LocalItem))
                        {
                            treeNodeServerFolder = null;
                        }
                        TreeNodeLocalItem treeNodeServerFolder2;
                        if (TryFindNodeByServerItem(itemSet.QueryPath, treeNodeServerFolder, out treeNodeServerFolder2) && NodeNeedsExpansion(treeNodeServerFolder2))
                        {
                            treeNodeServerFolder2.Nodes.Clear();
                            foreach (TempItemSet.TempItem i in itemSet.Items)
                            {
                                AttachTreeNode(treeNodeServerFolder2, Path.GetFileName(i.LocalPath), i);
                            }
                            if (!treeNodeServerFolder2.IsExpanded && m_navigateToWhenLoaded == null)
                            {
                                treeNodeServerFolder2.Expand();
                            }
                            treeNodeServerFolder = treeNodeServerFolder2;
                        }
                    }
                }
                if (m_navigateToWhenLoaded != null)
                {
                    TreeNodeLocalItem treeNodeServerFolder3;
                    TryFindNodeByServerItem(m_navigateToWhenLoaded, null, out treeNodeServerFolder3);
                    if (treeNodeServerFolder3 != null)
                    {
                        treeNodeServerFolder3.EnsureVisible();
                        treeView.SelectedNode = treeNodeServerFolder3;
                    }
                    m_navigateToWhenLoaded = null;
                }
                treeView.EndUpdate();
            }
        }
Пример #4
0
        private TreeNodeLocalItem AttachTreeNode(TreeNode parent, string name, TempItemSet.TempItem item)
        {
            TreeNodeLocalItem node;

            if (parent == null)
            {
                //the root
                node = new TreeNodeLocalItem("", name);
            }
            else
            {
                if (item.ServerItem != null)
                {
                    if (item.ServerItem.ItemType == ItemType.Folder)
                    {
                        node = new TreeNodeLocalItem(item.ServerItem, name);
                        node.Nodes.Add(new TreeNodeWorking());
                    }
                    else if (item.ServerItem.ItemType == ItemType.File)
                    {
                        node = new TreeNodeLocalItem(item.ServerItem, name);
                    }
                    else
                    {
                        return(null);
                    }
                }
                else
                {
                    node = new TreeNodeLocalItem(item.LocalPath, name);
                    if (Directory.Exists(item.LocalPath))
                    {
                        node.Nodes.Add(new TreeNodeWorking());
                    }
                }

                if (m_selectedItems.ContainsKey(node.LocalItem))
                {
                    node.ColorSelected();
                    m_selectedItems[node.LocalItem] = node;
                }
            }

            if (parent != null)
            {
                parent.Nodes.Add(node);
            }
            else
            {
                treeView.Nodes.Add(node);
            }


            return(node);
        }
Пример #5
0
 private void treeView_BeforeExpand(object sender, TreeViewCancelEventArgs e)
 {
     if (e.Node is TreeNodeLocalItem)
     {
         TreeNodeLocalItem treeNodeServerFolder = (TreeNodeLocalItem)e.Node;
         if (NodeNeedsExpansion(e.Node))
         {
             m_toExpand.Add(treeNodeServerFolder.LocalItem);
             StartBackgroundWorkerIfNeeded();
             e.Cancel = true;
         }
     }
 }
Пример #6
0
 void PurgeSelectionReferences(TreeNodeLocalItem root)
 {
     if (root.IsMultiSelect)
     {
         m_selectedItems[root.LocalItem] = null;
     }
     foreach (TreeNode n in root.Nodes)
     {
         if (n is TreeNodeLocalItem)
         {
             PurgeSelectionReferences((TreeNodeLocalItem)n);
         }
     }
 }
Пример #7
0
 private void SetExistingNodeSelection(TreeNodeLocalItem treeNodeServerFolder, bool toggle)
 {
     if (m_selectedItems.ContainsKey(treeNodeServerFolder.LocalItem))
     {
         if (toggle)
         {
             treeNodeServerFolder.ColorUnselected();
             m_selectedItems.Remove(treeNodeServerFolder.LocalItem);
         }
     }
     else
     {
         treeNodeServerFolder.ColorSelected();
         m_selectedItems.Add(treeNodeServerFolder.LocalItem, treeNodeServerFolder);
     }
 }
Пример #8
0
        public void Navigate(string initialPath)
        {
            if (initialPath != null && initialPath.Trim().Length > 0)
            {
                initialPath = FileSpec.GetFullPath(initialPath);

                TreeNodeLocalItem foundItem = null;
                if (TryFindNodeByServerItem(initialPath, null, out foundItem))
                {
                    foundItem.EnsureVisible();
                    m_navigateToWhenLoaded = null;
                    return;
                }

                var roots = WorkingFolder.GetWorkspaceRoots(m_workspace.Folders);
                foreach (String root in roots)
                {
                    if (FileSpec.IsSubItem(initialPath, root))
                    {
                        string[] folders  = initialPath.Substring(root.Length + 1).Split('\\');
                        string   curPath  = root;
                        string   prevPath = root;
                        foundItem = null;
                        m_navigateToWhenLoaded = null;
                        for (int i = 0; i < folders.Length; i++)
                        {
                            prevPath = curPath;
                            curPath  = curPath + "\\" + folders[i];
                            if (TryFindNodeByServerItem(curPath, foundItem, out foundItem))
                            {
                                foundItem.EnsureVisible();
                            }
                            else
                            {
                                m_toExpand.Add(prevPath);
                                m_navigateToWhenLoaded = initialPath;
                            }
                        }
                        StartBackgroundWorkerIfNeeded();
                        break;
                    }
                }
            }
        }
Пример #9
0
        private int BinarySearchForNextNode(TreeNodeLocalItem node, string serverItem)
        {
            int num = node.LocalItem.Length;

            if (serverItem[num] == '\\')
            {
                num++;
            }
            int num2 = serverItem.IndexOf('\\', num);
            int num3 = ((num2 < 0) ? serverItem.Length : num2) - num;
            int i    = 0;
            int num4 = node.Nodes.Count - 1;

            while (i <= num4)
            {
                int num5 = i + (num4 - i >> 1);
                TreeNodeLocalItem treeNodeServerFolder = (TreeNodeLocalItem)node.Nodes[num5];
                int num6 = treeNodeServerFolder.LocalItem.IndexOf('\\', num);
                int num7 = ((num6 < 0) ? treeNodeServerFolder.LocalItem.Length : num6) - num;
                int num8 = string.Compare(treeNodeServerFolder.LocalItem, num, serverItem, num, Math.Min(num3, num7), StringComparison.OrdinalIgnoreCase);
                if (num8 == 0)
                {
                    if (num3 == num7)
                    {
                        return(num5);
                    }
                    num8 = num7 - num3;
                }
                if (num8 < 0)
                {
                    i = num5 + 1;
                }
                else
                {
                    num4 = num5 - 1;
                }
            }
            return(~i);
        }
Пример #10
0
 private bool TryFindNodeByServerItem(string serverItem, TreeNodeLocalItem startNode, out TreeNodeLocalItem foundNode)
 {
     foundNode = null;
     if (treeView.Nodes.Count == 0 || !(treeView.Nodes[0] is TreeNodeLocalItem))
     {
         return(false);
     }
     if (startNode == null)
     {
         TreeNodeLocalItem rootNode = (TreeNodeLocalItem)treeView.Nodes[0];
         foreach (TreeNode node in rootNode.Nodes)
         {
             if (TryFindNodeByServerItem(serverItem, (TreeNodeLocalItem)node, out foundNode))
             {
                 return(true);
             }
         }
         return(false);
     }
     else
     {
         foundNode = startNode;
     }
     while (foundNode.LocalItem.Length < serverItem.Length)
     {
         if (this.NodeNeedsExpansion(foundNode))
         {
             return(false);
         }
         int num = BinarySearchForNextNode(foundNode, serverItem);
         if (num < 0)
         {
             return(false);
         }
         foundNode = (TreeNodeLocalItem)foundNode.Nodes[num];
     }
     return(true);
 }
Пример #11
0
        private void treeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
        {
            TreeNodeLocalItem titem = e.Node as TreeNodeLocalItem;

            if (titem != null)
            {
                VisualStyleElement element = VisualStyleElement.TreeView.Item.Normal;
                if (e.State.HasFlag(TreeNodeStates.Selected) || titem.IsMultiSelect)
                {
                    element = e.Node.TreeView.Focused ? VisualStyleElement.TreeView.Item.Selected : VisualStyleElement.TreeView.Item.SelectedNotFocus;
                }
                else if (e.State.HasFlag(TreeNodeStates.Hot))
                {
                    element = VisualStyleElement.TreeView.Item.Hot;
                }

                VisualStyleRenderer vsr = new VisualStyleRenderer("Explorer::TreeView", element.Part, element.State);
                Point drawLoc           = titem.Bounds.Location;
                var   imageSize         = treeView.ImageList.ImageSize;
                drawLoc.X -= imageSize.Width;
                using (SolidBrush b = new SolidBrush(titem.BackColor))
                {
                    e.Graphics.FillRectangle(b, drawLoc.X, drawLoc.Y, titem.Bounds.Width + imageSize.Width, titem.Bounds.Height);
                }
                Rectangle textRect = vsr.GetBackgroundContentRectangle(e.Graphics, titem.Bounds);

                var pixelSize = DpiHelper.LogicalToDeviceUnits(new Size(1, 1));
                textRect.Offset(pixelSize.Width, pixelSize.Height);
                bool disabled = titem.ExItem != null ? !titem.ExItem.IsInWorkspace : false;
                vsr.DrawText(e.Graphics, textRect, titem.Text, disabled, TextFormatFlags.VerticalCenter | TextFormatFlags.LeftAndRightPadding);

                ExtendedItem item = titem.ExItem;
                if (string.IsNullOrEmpty(titem.LocalItem))
                {
                    e.Graphics.DrawIcon(TFV.Properties.Resources.TFSServer, new Rectangle(drawLoc, imageSize));
                }
                else
                {
                    bool isFolder = false;
                    if (item != null)
                    {
                        isFolder = item.ItemType == ItemType.Folder;
                    }
                    else
                    {
                        isFolder = Directory.Exists(titem.LocalItem);
                    }

                    if (isFolder)
                    {
                        e.Graphics.DrawIcon(titem.IsExpanded ? m_folderOpen : m_folderClosed, new Rectangle(drawLoc, imageSize));
                    }
                    else
                    {
                        e.Graphics.DrawIcon((item != null) ? m_addedFileIcon : m_fileIcon, new Rectangle(drawLoc, imageSize));
                    }
                }

                if (item != null)
                {
                    if (item.ChangeType.HasFlag(ChangeType.Add))
                    {
                        imageListOverlays.Draw(e.Graphics, drawLoc, 0);
                    }
                    else if (item.ChangeType.HasFlag(ChangeType.Delete))
                    {
                        imageListOverlays.Draw(e.Graphics, drawLoc, 3);
                    }
                    else if (item.ChangeType.HasFlag(ChangeType.Rollback))
                    {
                        imageListOverlays.Draw(e.Graphics, drawLoc, 8);
                    }
                    else if (item.ChangeType.HasFlag(ChangeType.Merge))
                    {
                        imageListOverlays.Draw(e.Graphics, drawLoc, 5);
                    }
                    else if (item.ChangeType.HasFlag(ChangeType.Edit))
                    {
                        imageListOverlays.Draw(e.Graphics, drawLoc, 2);
                    }

                    if (!item.IsLatest && item.IsInWorkspace)
                    {
                        imageListOverlays.Draw(e.Graphics, drawLoc, 1);
                    }
                    if (item.HasOtherPendingChange)
                    {
                        imageListOverlays.Draw(e.Graphics, drawLoc, 7);
                    }
                }
            }
        }