private void DeleteTreeViewEntryItemModel(TreeViewEntryItemModel item, bool first = true)
        {
            if (item == this.RootTreeViewEntryItem || item == null)
            {
                return;
            }
            var lockObject = item.Parent == null ? TreeViewEntryItemModel.RootLockObject : item.Parent;
            IList <TreeViewEntryItemModel> children;

            lock (lockObject)
            {
                this.ItemsMap.Remove(item.Path);
                if (item.NodeType == NodeType.File)
                {
                    lock (TreeViewEntryItemModel.RootLockObject)
                    {
                        this.NumberOfFiles--;
                    }
                }
                children = new List <TreeViewEntryItemModel>(item.Children);
            }
            foreach (var child in children)
            {
                this.DeleteTreeViewEntryItemModel(child, false);
            }
            if (first)
            {
                item.Delete();
            }
        }
        // running in Indexing or UI thread
        public void RefreshFromNode(INode node, string path, bool expandAllNodes)
        {
            // node == null -> search returned no results at all
            if (node == null)
            {
                this.HandleNoResultsFound(path);
                return;
            }
            TreeViewEntryItemModel treeViewEntryItem = this.FindTreeViewEntryItemByPath(node.Path);

            if (treeViewEntryItem == null)
            {
                bool isSelected = node.Path == this.PathOfItemToSelectOnRefresh;
                treeViewEntryItem = this.CreateTreeViewEntryItemModelWithNodeParents(node, isSelected, expandAllNodes);
            }
            else
            {
                this.UpdateNode(treeViewEntryItem, node);
                // also refresh parents (icons can change)
                var parent = treeViewEntryItem.Parent;
                while (parent != null)
                {
                    parent.RefreshNode();
                    parent = parent.Parent;
                }
            }
            if (expandAllNodes)
            {
                treeViewEntryItem.IsExpanded = true;
            }
            this.RefreshFromIntermediateNode(node, treeViewEntryItem, expandAllNodes);
            this.OnPropertyChanged("TreeViewItems");
        }
 public void StartEditingTreeItem(TreeViewEntryItemModel item)
 {
     if (!this.HandleUnsavedFileManipulation(item))
     {
         return;
     }
     item.IsBeingEdited = true;
 }
 private bool HandleUnsavedFileManipulation(TreeViewEntryItemModel selectedItem)
 {
     if (selectedItem != null && selectedItem.NodeType == NodeType.File && this.IseIntegrator.OpenFiles.Contains(selectedItem.Path) && !this.IseIntegrator.IsFileSaved(selectedItem.Path))
     {
         this.IseIntegrator.GoToFile(selectedItem.Path);
         MessageBoxHelper.ShowInfo("Please save your changes or close the file first.");
         return(false);
     }
     return(true);
 }
        public void MoveTreeItem(TreeViewEntryItemModel movedItem, TreeViewEntryItemModel destinationItem, string rootDirectory)
        {
            if (movedItem == destinationItem || movedItem == null)
            {
                return;
            }
            if (!this.HandleUnsavedFileManipulation(movedItem))
            {
                return;
            }
            string destPath = destinationItem != null ? destinationItem.Path : rootDirectory;

            if (!MessageBoxHelper.ShowConfirmMessage(String.Format("Please confirm you want to move '{0}' to '{1}'.", movedItem.Path, destPath)))
            {
                return;
            }
            try
            {
                string newPath;
                // moved to the empty place, i.e. to the workspace directory
                if (destinationItem == null)
                {
                    newPath = this.GenerateNewPathForDir(rootDirectory, movedItem.Name);
                }
                else if (destinationItem.NodeType == NodeType.File)
                {
                    newPath = this.GenerateNewPath(destinationItem.Path, movedItem.Name);
                }
                else if (destinationItem.NodeType == NodeType.Directory)
                {
                    newPath = this.GenerateNewPathForDir(destinationItem.Path, movedItem.Name);
                }
                else
                {
                    return;
                }
                this.FilesPatternProvider.RemoveAdditionalPath(movedItem.Path);
                this.FilesPatternProvider.AddAdditionalPath(newPath);
                bool closed = this.IseIntegrator.CloseFile(movedItem.Path);
                FileSystemOperationsService.RenameFileOrDirectory(movedItem.Path, newPath);
                if (closed)
                {
                    this.IseIntegrator.GoToFile(newPath);
                }
                if (destinationItem != null)
                {
                    destinationItem.IsExpanded = true;
                }
            }
            catch (Exception e)
            {
                this.PathOfItemToSelectOnRefresh = null;
                MessageBoxHelper.ShowError("Failed to move: " + e.Message);
            }
        }
        public void OpenItem(TreeViewEntryItemModel item, string searchText)
        {
            if (this.IseIntegrator == null)
            {
                throw new InvalidOperationException("IseIntegrator has not ben set yet.");
            }
            if (item == null)
            {
                return;
            }

            if (item.Node.NodeType == NodeType.File)
            {
                bool wasOpen = (this.IseIntegrator.SelectedFilePath == item.Node.Path);
                if (!wasOpen)
                {
                    this.IseIntegrator.GoToFile(item.Node.Path);
                }
                else
                {
                    this.IseIntegrator.SetFocusOnCurrentTab();
                }
                if (searchText != null && searchText.Length > 2)
                {
                    EditorInfo    editorInfo = (wasOpen ? this.IseIntegrator.GetCurrentLineWithColumnIndex() : null);
                    TokenPosition tokenPos   = TokenLocator.LocateNextToken(item.Node.Path, searchText, editorInfo);
                    if (tokenPos.MatchLength > 2)
                    {
                        this.IseIntegrator.SelectText(tokenPos.Line, tokenPos.Column, tokenPos.MatchLength);
                    }
                    else if (string.IsNullOrEmpty(this.IseIntegrator.SelectedText))
                    {
                        tokenPos = TokenLocator.LocateSubtoken(item.Node.Path, searchText);
                        if (tokenPos.MatchLength > 2)
                        {
                            this.IseIntegrator.SelectText(tokenPos.Line, tokenPos.Column, tokenPos.MatchLength);
                        }
                    }
                }
            }
            else if (item.Node.NodeType == NodeType.Function)
            {
                var node = ((PowershellItemNode)item.Node);
                this.IseIntegrator.GoToFile(node.FilePath);
                this.IseIntegrator.SelectText(node.PowershellItem.StartLine, node.PowershellItem.StartColumn, node.Name.Length);
            }
            else if (item.Node.NodeType == NodeType.Directory)
            {
                item.IsExpanded = !item.IsExpanded;
            }
        }
 public TreeViewEntryItemModel(INode node, TreeViewEntryItemModel parent, bool isSelected)
 {
     var lockObject = this.Parent == null ? RootLockObject : this.Parent;
     lock (lockObject)
     {
         this.State = new TreeViewEntryItemModelState(false, isSelected);
         this.DocumentHierarchyNode = node;
         this.Parent = parent;
         this.Children = new TreeViewEntryItemObservableSet();
         if (this.Parent != null)
         {
             this.Parent.Children.Add(this);
         }
     }
 }
Exemple #8
0
        public TreeViewEntryItemModel(INode node, TreeViewEntryItemModel parent, bool isSelected)
        {
            var lockObject = this.Parent == null ? RootLockObject : this.Parent;

            lock (lockObject)
            {
                this.State = new TreeViewEntryItemModelState(false, isSelected);
                this.DocumentHierarchyNode = node;
                this.Parent   = parent;
                this.Children = new TreeViewEntryItemObservableSet();
                if (this.Parent != null)
                {
                    this.Parent.Children.Add(this);
                }
            }
        }
        // TODO: this seems to suffer from race conditions
        private void RefreshFromIntermediateNode(INode node, TreeViewEntryItemModel treeViewEntryItem, bool expandAllNodes)
        {
            if (node == null || treeViewEntryItem == null)
            {
                return;
            }
            IList <INode> nodeChildren;

            lock (node)
            {
                nodeChildren = new List <INode>(node.Children);
            }
            // delete old items
            IList <TreeViewEntryItemModel> itemsToDelete = treeViewEntryItem.Children.Where(item => !nodeChildren.Contains(item.Node)).ToList();

            foreach (TreeViewEntryItemModel item in itemsToDelete)
            {
                this.DeleteTreeViewEntryItemModel(item);
            }

            // add new items
            foreach (INode docHierarchyChild in nodeChildren)
            {
                TreeViewEntryItemModel newTreeViewItem;
                lock (treeViewEntryItem)
                {
                    newTreeViewItem = treeViewEntryItem.Children
                                      .FirstOrDefault(treeViewChild => docHierarchyChild.Equals(treeViewChild.Node));
                    if (newTreeViewItem == null)
                    {
                        bool isSelected = docHierarchyChild.Path == this.PathOfItemToSelectOnRefresh;
                        newTreeViewItem = this.CreateTreeViewEntryItemModel(docHierarchyChild, treeViewEntryItem, isSelected);
                    }
                    else
                    {
                        this.UpdateNode(newTreeViewItem, docHierarchyChild);
                    }
                    if (expandAllNodes)
                    {
                        newTreeViewItem.IsExpanded = true;
                    }
                }
                this.RefreshFromIntermediateNode(docHierarchyChild, newTreeViewItem, expandAllNodes);
            }
        }
        private TreeViewEntryItemModel CreateTreeViewEntryItemModelWithNodeParents(INode node, bool isSelected, bool expandAllNodes)
        {
            if (node == null)
            {
                return(null);
            }
            var itemParent = node.Parent == null ? null : this.CreateTreeViewEntryItemModelWithNodeParents(node.Parent, false, expandAllNodes);
            TreeViewEntryItemModel item = this.FindTreeViewEntryItemByPath(node.Path);

            if (item == null)
            {
                item = this.CreateTreeViewEntryItemModel(node, itemParent, isSelected);
            }
            if (expandAllNodes)
            {
                item.IsExpanded = true;
            }
            return(item);
        }
 public TreeViewEntryItemModel(INode node, TreeViewEntryItemModel parent, bool isSelected)
 {
     if (node == null)
     {
         throw new ArgumentNullException("node");
     }
     var lockObject = Parent == null ? RootLockObject : Parent;
     lock (lockObject)
     {
         State = new TreeViewEntryItemModelState(false, isSelected);
         DocumentHierarchyNode = node;
         Parent = parent;
         Children = new TreeViewEntryItemObservableSet();
         if (Parent != null)
         {
             Parent.Children.Add(this);
         }
     }
 }
        public void AddNewTreeItem(TreeViewEntryItemModel parent, NodeType nodeType)
        {
            if (this.DocumentHierarchyFactory == null)
            {
                return;
            }
            if (parent == null)
            {
                parent = this.RootTreeViewEntryItem;
            }
            parent.IsExpanded = true;
            INode newNode = this.DocumentHierarchyFactory.CreateTemporaryNode(parent.Node, nodeType);

            if (newNode == null)
            {
                return;
            }
            var newItem = this.CreateTreeViewEntryItemModel(newNode, parent, true);

            newItem.IsBeingEdited = true;
            newItem.IsBeingAdded  = true;
        }
        private TreeViewEntryItemModel CreateTreeViewEntryItemModel(INode node, TreeViewEntryItemModel parent, bool isSelected)
        {
            if (node == null)
            {
                return(null);
            }
            var lockObject = parent == null ? TreeViewEntryItemModel.RootLockObject : parent;

            lock (lockObject)
            {
                var item = new TreeViewEntryItemModel(node, parent, isSelected);
                this.ItemsMap[node.Path] = item;
                if (node.NodeType == NodeType.File)
                {
                    lock (TreeViewEntryItemModel.RootLockObject)
                    {
                        this.NumberOfFiles++;
                    }
                }
                return(item);
            }
        }
        public void EndTreeEdit(string newValue, bool save, TreeViewEntryItemModel selectedItem, bool addFileExtension)
        {
            if (selectedItem == null)
            {
                return;
            }
            selectedItem.IsBeingEdited = false;

            if (selectedItem.NodeType == NodeType.File && addFileExtension && !String.IsNullOrEmpty(newValue) && !this.FilesPatternProvider.DoesFileMatch(newValue))
            {
                newValue += ".ps1";
            }
            if (selectedItem.IsBeingAdded)
            {
                selectedItem.IsBeingAdded = false;
                this.EndAddingTreeItem(newValue, save, selectedItem);
            }
            else
            {
                this.EndRenamingTreeItem(newValue, save, selectedItem);
            }
        }
        public void DeleteTreeItem(TreeViewEntryItemModel selectedItem)
        {
            if (selectedItem == null)
            {
                return;
            }
            if (!this.HandleUnsavedFileManipulation(selectedItem))
            {
                return;
            }
            int numFilesInside = 0;

            try
            {
                numFilesInside = Directory.GetFileSystemEntries(selectedItem.Path).Count();
            }
            catch (Exception)
            {
                // ignore - this only has impact on message
            }
            string message = numFilesInside == 0 ?
                             String.Format("'{0}' will be deleted permanently.", selectedItem.Path) :
                             String.Format("'{0}' will be deleted permanently (together with {1} items inside).", selectedItem.Path, numFilesInside);

            if (MessageBoxHelper.ShowConfirmMessage(message))
            {
                try
                {
                    this.IseIntegrator.CloseFile(selectedItem.Path);
                    this.FilesPatternProvider.RemoveAdditionalPath(selectedItem.Path);
                    FileSystemOperationsService.DeleteFileOrDirectory(selectedItem.Path);
                }
                catch (Exception e)
                {
                    MessageBoxHelper.ShowError("Failed to delete: " + e.Message);
                }
            }
        }
        private void EndRenamingTreeItem(string newValue, bool save, TreeViewEntryItemModel selectedItem)
        {
            if (!save || String.IsNullOrEmpty(newValue) || selectedItem == null)
            {
                return;
            }

            try
            {
                string oldPath = selectedItem.Path;
                string newPath = this.GenerateNewPath(selectedItem.Path, newValue);
                bool   closed  = this.IseIntegrator.CloseFile(oldPath);
                FileSystemOperationsService.RenameFileOrDirectory(oldPath, newPath);
                if (closed)
                {
                    this.IseIntegrator.GoToFile(newPath);
                }
            }
            catch (Exception e)
            {
                this.PathOfItemToSelectOnRefresh = null;
                MessageBoxHelper.ShowError("Failed to rename: " + e.Message);
            }
        }
        // TODO: this seems to suffer from race conditions
        private void RefreshFromIntermediateNode(INode node, TreeViewEntryItemModel treeViewEntryItem, bool expandAllNodes)
        {
            if (node == null || treeViewEntryItem == null)
            {
                return;
            }
            IList<INode> nodeChildren;
            lock (node)
            {
                nodeChildren = new List<INode>(node.Children);
            }
            // delete old items
            IList<TreeViewEntryItemModel> itemsToDelete = treeViewEntryItem.Children.Where(item => !nodeChildren.Contains(item.Node)).ToList();
            foreach (TreeViewEntryItemModel item in itemsToDelete) {
                this.DeleteTreeViewEntryItemModel(item);
            }

            // add new items
            foreach (INode docHierarchyChild in nodeChildren)
            {
                TreeViewEntryItemModel newTreeViewItem;
                lock (treeViewEntryItem)
                {
                     newTreeViewItem = treeViewEntryItem.Children
                        .FirstOrDefault(treeViewChild => docHierarchyChild.Equals(treeViewChild.Node));
                    if (newTreeViewItem == null)
                    {
                        bool isSelected = docHierarchyChild.Path == this.PathOfItemToSelectOnRefresh;
                        newTreeViewItem = this.CreateTreeViewEntryItemModel(docHierarchyChild, treeViewEntryItem, isSelected);
                    }
                    else
                    {
                        this.UpdateNode(newTreeViewItem, docHierarchyChild);
                    }
                    if (expandAllNodes)
                    {
                        newTreeViewItem.IsExpanded = true;
                    }
                }
                this.RefreshFromIntermediateNode(docHierarchyChild, newTreeViewItem, expandAllNodes);
            }
        }
        /// <summary>
        /// Finds the provided object in an ItemsControl's children and selects it
        /// </summary>
        /// <param name="parentContainer">The parent container whose children will be searched for the selected item</param>
        /// <param name="itemToSelect">The item to select</param>
        /// <returns>True if the item is found and selected, false otherwise</returns>
        private static bool ExpandAndSelectItemContainer(ItemsControl parentContainer, TreeViewEntryItemModel itemToSelect)
        {
            IList<TreeViewItem> applicableParents = new List<TreeViewItem>();
            //check all items at the current level
            foreach (TreeViewEntryItemModel item in parentContainer.Items)
            {
                if (itemToSelect.Path.StartsWith(item.Path))
                {
                    var currentContainer = parentContainer.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
                    //if the data item matches the item we want to select, set the corresponding
                    //TreeViewItem IsSelected to true
                    if (item == itemToSelect && currentContainer != null)
                    {
                        currentContainer.IsSelected = true;
                        currentContainer.BringIntoView();

                        //the item was found
                        return true;
                    }
                    else
                    {
                        applicableParents.Add(currentContainer);
                    }
                }

            }

            //if we get to this point, the selected item was not found at the current level, so we must check the children
            foreach (TreeViewItem currentContainer in applicableParents)
            {
                //if children exist
                if (currentContainer != null && currentContainer.Items.Count > 0)
                {
                    //keep track of if the TreeViewItem was expanded or not
                    bool wasExpanded = currentContainer.IsExpanded;

                    //expand the current TreeViewItem so we can check its child TreeViewItems
                    currentContainer.IsExpanded = true;

                    //if the TreeViewItem child containers have not been generated, we must listen to
                    //the StatusChanged event until they are
                    if (currentContainer.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
                    {
                        //store the event handler in a variable so we can remove it (in the handler itself)
                        EventHandler eh = null;
                        eh = delegate
                        {
                            if (currentContainer.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
                            {
                                if (ExpandAndSelectItemContainer(currentContainer, itemToSelect) == false)
                                {
                                    //The assumption is that code executing in this EventHandler is the result of the parent not
                                    //being expanded since the containers were not generated.
                                    //since the itemToSelect was not found in the children, collapse the parent since it was previously collapsed
                                    currentContainer.IsExpanded = false;
                                }

                                //remove the StatusChanged event handler since we just handled it (we only needed it once)
                                currentContainer.ItemContainerGenerator.StatusChanged -= eh;
                            }
                        };
                        currentContainer.ItemContainerGenerator.StatusChanged += eh;
                    }
                    else //otherwise the containers have been generated, so look for item to select in the children
                    {
                        if (ExpandAndSelectItemContainer(currentContainer, itemToSelect) == false)
                        {
                            //restore the current TreeViewItem's expanded state
                            currentContainer.IsExpanded = wasExpanded;
                        }
                        else //otherwise the node was found and selected, so return true
                        {
                            return true;
                        }
                    }
                }
            }

            //no item was found
            return false;
        }
 private void UpdateNode(TreeViewEntryItemModel treeViewEntryItem, INode node)
 {
     treeViewEntryItem.UpdateNode(node);
 }
        private void EndRenamingTreeItem(string newValue, bool save, TreeViewEntryItemModel selectedItem)
        {
            if (!save || String.IsNullOrEmpty(newValue))
            {
                return;
            }

            try
            {
                string oldPath = selectedItem.Path;
                string newPath = GenerateNewPath(selectedItem.Path, newValue);
                bool closed = IseIntegrator.CloseFile(oldPath);
                FileSystemOperationsService.RenameFileOrDirectory(oldPath, newPath);
                if (closed)
                {
                    IseIntegrator.GoToFile(newPath);
                }
            }
            catch (Exception e)
            {
                PathOfItemToSelectOnRefresh = null;
                MessageBoxHelper.ShowError("Failed to rename: " + e.Message);
            }
        }
 /// <summary>
 /// Searches a TreeView for the provided object and selects it if found
 /// </summary>
 /// <param name="treeView">The TreeView containing the item</param>
 /// <param name="item">The item to search and select</param>
 public static void ExpandAndSelectItem(this TreeView treeView, TreeViewEntryItemModel item)
 {
     ExpandAndSelectItemContainer(treeView, item);
 }
 public void DeleteTreeItem(TreeViewEntryItemModel selectedItem)
 {
     if (selectedItem == null)
     {
         return;
     }
     if (!HandleUnsavedFileManipulation(selectedItem))
     {
         return;
     }
     int numFilesInside = 0;
     try
     {
         numFilesInside = Directory.GetFileSystemEntries(selectedItem.Path).Count();
     }
     catch (Exception)
     {
         // ignore - this only has impact on message
     }
     string message = numFilesInside == 0 ?
         String.Format("'{0}' will be deleted permanently.", selectedItem.Path) :
         String.Format("'{0}' will be deleted permanently (together with {1} items inside).", selectedItem.Path, numFilesInside);
     if (MessageBoxHelper.ShowConfirmMessage(message))
     {
         try
         {
             IseIntegrator.CloseFile(selectedItem.Path);
             FilesPatternProvider.RemoveAdditionalPath(selectedItem.Path);
             FileSystemOperationsService.DeleteFileOrDirectory(selectedItem.Path);
         }
         catch (Exception e)
         {
             MessageBoxHelper.ShowError("Failed to delete: " + e.Message);
         }
     }
 }
 private bool HandleUnsavedFileManipulation(TreeViewEntryItemModel selectedItem)
 {
     if (selectedItem.NodeType == NodeType.File && IseIntegrator.OpenFiles.Contains(selectedItem.Path) && !IseIntegrator.IsFileSaved(selectedItem.Path))
     {
         IseIntegrator.GoToFile(selectedItem.Path);
         MessageBoxHelper.ShowInfo("Please save your changes or close the file first.");
         return false;
     }
     return true;
 }
 private void UpdateNode(TreeViewEntryItemModel treeViewEntryItem, INode node)
 {
     treeViewEntryItem.UpdateNode(node);
 }
 public void StartEditingTreeItem(TreeViewEntryItemModel item)
 {
     if (!HandleUnsavedFileManipulation(item))
     {
         return;
     }
     item.IsBeingEdited = true;
 }
        private void EndAddingTreeItem(string newValue, bool save, TreeViewEntryItemModel selectedItem)
        {
            if (selectedItem == null)
            {
                return;
            }
            if (!save || String.IsNullOrEmpty(newValue))
            {
                this.DocumentHierarchyFactory.RemoveTemporaryNode(selectedItem.Node);
                this.DeleteTreeViewEntryItemModel(selectedItem);
                return;
            }
            var   newPath = this.GenerateNewPath(selectedItem.Path, newValue);
            INode newNode = null;

            if (this.FindTreeViewEntryItemByPath(newPath) != null)
            {
                this.DocumentHierarchyFactory.RemoveTemporaryNode(selectedItem.Node);
                this.DeleteTreeViewEntryItemModel(selectedItem);
                MessageBoxHelper.ShowError("Item '" + newPath + "' already exists.");
                return;
            }
            if (selectedItem.NodeType == NodeType.Directory)
            {
                try
                {
                    newNode = this.DocumentHierarchyFactory.UpdateTemporaryNode(selectedItem.Node, newPath);
                    var parent = selectedItem.Parent;
                    this.DeleteTreeViewEntryItemModel(selectedItem);
                    selectedItem = this.CreateTreeViewEntryItemModel(newNode, parent, true);
                    this.FilesPatternProvider.AddAdditionalPath(newPath);
                    FileSystemOperationsService.CreateDirectory(newPath);
                }
                catch (Exception e)
                {
                    if (newNode != null)
                    {
                        newNode.Remove();
                    }
                    if (selectedItem != null)
                    {
                        this.DeleteTreeViewEntryItemModel(selectedItem);
                    }
                    this.PathOfItemToSelectOnRefresh = null;
                    MessageBoxHelper.ShowError("Failed to create directory '" + newPath + "': " + e.Message);
                }
            }
            else if (selectedItem.NodeType == NodeType.File)
            {
                try
                {
                    newNode = this.DocumentHierarchyFactory.UpdateTemporaryNode(selectedItem.Node, newPath);
                    var parent = selectedItem.Parent;
                    this.DeleteTreeViewEntryItemModel(selectedItem);
                    selectedItem = this.CreateTreeViewEntryItemModel(newNode, parent, true);
                    this.FilesPatternProvider.AddAdditionalPath(newPath);
                    FileSystemOperationsService.CreateFile(newPath);
                    this.IseIntegrator.GoToFile(newPath);
                }
                catch (Exception e)
                {
                    if (newNode != null)
                    {
                        newNode.Remove();
                    }
                    if (selectedItem != null)
                    {
                        this.DeleteTreeViewEntryItemModel(selectedItem);
                    }
                    this.PathOfItemToSelectOnRefresh = null;
                    MessageBoxHelper.ShowError("Failed to create file '" + newPath + "': " + e.Message);
                }
            }
        }
        public void EndTreeEdit(string newValue, bool save, TreeViewEntryItemModel selectedItem, bool addFileExtension)
        {
            if (selectedItem == null)
            {
                return;
            }
            selectedItem.IsBeingEdited = false;

            if (selectedItem.NodeType == NodeType.File && addFileExtension && !String.IsNullOrEmpty(newValue) && !FilesPatternProvider.DoesFileMatch(newValue))
            {
                newValue += ".ps1";
            }
            if (selectedItem.IsBeingAdded)
            {
                selectedItem.IsBeingAdded = false;
                EndAddingTreeItem(newValue, save, selectedItem);
            }
            else
            {
                EndRenamingTreeItem(newValue, save, selectedItem);
            }
        }
 private void EndAddingTreeItem(string newValue, bool save, TreeViewEntryItemModel selectedItem)
 {
     if (!save || String.IsNullOrEmpty(newValue))
     {
         DocumentHierarchyFactory.RemoveTemporaryNode(selectedItem.Node);
         DeleteTreeViewEntryItemModel(selectedItem);
         return;
     }
     var newPath = GenerateNewPath(selectedItem.Path, newValue);
     INode newNode = null;
     if (FindTreeViewEntryItemByPath(newPath) != null)
     {
         DocumentHierarchyFactory.RemoveTemporaryNode(selectedItem.Node);
         DeleteTreeViewEntryItemModel(selectedItem);
         MessageBoxHelper.ShowError("Item '" + newPath + "' already exists.");
         return;
     }
     if (selectedItem.NodeType == NodeType.Directory)
     {
         try
         {
             newNode = DocumentHierarchyFactory.UpdateTemporaryNode(selectedItem.Node, newPath);
             var parent = selectedItem.Parent;
             DeleteTreeViewEntryItemModel(selectedItem);
             selectedItem = CreateTreeViewEntryItemModel(newNode, parent, true);
             FilesPatternProvider.AddAdditionalPath(newPath);
             FileSystemOperationsService.CreateDirectory(newPath);
         }
         catch (Exception e)
         {
             if (newNode != null)
             {
                 newNode.Remove();
             }
             if (selectedItem != null)
             {
                 DeleteTreeViewEntryItemModel(selectedItem);
             }
             PathOfItemToSelectOnRefresh = null;
             MessageBoxHelper.ShowError("Failed to create directory '" + newPath + "': " + e.Message);
         }
     }
     else if (selectedItem.NodeType == NodeType.File)
     {
         try
         {
             newNode = DocumentHierarchyFactory.UpdateTemporaryNode(selectedItem.Node, newPath);
             var parent = selectedItem.Parent;
             DeleteTreeViewEntryItemModel(selectedItem);
             selectedItem = CreateTreeViewEntryItemModel(newNode, parent, true);
             FilesPatternProvider.AddAdditionalPath(newPath);
             FileSystemOperationsService.CreateFile(newPath);
             IseIntegrator.GoToFile(newPath);
         }
         catch (Exception e)
         {
             if (newNode != null)
             {
                 newNode.Remove();
             }
             if (selectedItem != null)
             {
                 DeleteTreeViewEntryItemModel(selectedItem);
             }
             PathOfItemToSelectOnRefresh = null;
             MessageBoxHelper.ShowError("Failed to create file '" + newPath + "': " + e.Message);
         }
     }
 }
 public TreeViewEntryItemModel CreateTreeViewEntryItemModel(INode node, TreeViewEntryItemModel parent, bool isSelected)
 {
     if (node == null)
     {
         return null;
     }
     var lockObject = parent == null ? TreeViewEntryItemModel.RootLockObject : parent;
     lock (lockObject)
     {
         var item = new TreeViewEntryItemModel(node, parent, isSelected, this.iconProvider);
         this.itemsMap[node.Path] = item;
         if (node.NodeType == NodeType.File)
         {
             lock (TreeViewEntryItemModel.RootLockObject)
             {
                 this.NumberOfFiles++;
             }
         }
         return item;
     }
 }
 public void MoveTreeItem(TreeViewEntryItemModel movedItem, TreeViewEntryItemModel destinationItem, string rootDirectory)
 {
     if (movedItem == destinationItem)
     {
         return;
     }
     if (!HandleUnsavedFileManipulation(movedItem))
     {
         return;
     }
     string destPath = destinationItem != null ? destinationItem.Path : rootDirectory;
     if (!MessageBoxHelper.ShowConfirmMessage(String.Format("Please confirm you want to move '{0}' to '{1}'.", movedItem.Path, destPath)))
     {
         return;
     }
     try
     {
         string newPath;
         // moved to the empty place, i.e. to the workspace directory
         if (destinationItem == null)
         {
             newPath = GenerateNewPathForDir(rootDirectory, movedItem.Name);
         }
         else if (destinationItem.NodeType == NodeType.File)
         {
             newPath = GenerateNewPath(destinationItem.Path, movedItem.Name);
         }
         else if (destinationItem.NodeType == NodeType.Directory)
         {
             newPath = GenerateNewPathForDir(destinationItem.Path, movedItem.Name);
         }
         else
         {
             return;
         }
         FilesPatternProvider.RemoveAdditionalPath(movedItem.Path);
         FilesPatternProvider.AddAdditionalPath(newPath);
         bool closed = IseIntegrator.CloseFile(movedItem.Path);
         FileSystemOperationsService.RenameFileOrDirectory(movedItem.Path, newPath);
         if (closed)
         {
             IseIntegrator.GoToFile(newPath);
         }
         if (destinationItem != null)
         {
             destinationItem.IsExpanded = true;
         }
     }
     catch (Exception e)
     {
         PathOfItemToSelectOnRefresh = null;
         MessageBoxHelper.ShowError("Failed to move: " + e.Message);
     }
 }
 public void AddNewTreeItem(TreeViewEntryItemModel parent, NodeType nodeType)
 {
     if (DocumentHierarchyFactory == null)
     {
         return;
     }
     if (parent == null)
     {
         parent = RootTreeViewEntryItem;
     }
     parent.IsExpanded = true;
     INode newNode = DocumentHierarchyFactory.CreateTemporaryNode(parent.Node, nodeType);
     if (newNode == null)
     {
         return;
     }
     var newItem = CreateTreeViewEntryItemModel(newNode, parent, true);
     newItem.IsBeingEdited = true;
     newItem.IsBeingAdded = true;
 }
        public void OpenItem(TreeViewEntryItemModel item, string searchText)
        {
            if (IseIntegrator == null)
            {
                throw new InvalidOperationException("IseIntegrator has not ben set yet.");
            }
            if (item == null)
            {
                return;
            }

            if (item.Node.NodeType == NodeType.File)
            {
                bool wasOpen = (IseIntegrator.SelectedFilePath == item.Node.Path);
                if (!wasOpen)
                {
                    IseIntegrator.GoToFile(item.Node.Path);
                }
                else
                {
                    IseIntegrator.SetFocusOnCurrentTab();
                }
                if (searchText != null && searchText.Length > 2)
                {
                    EditorInfo editorInfo = (wasOpen ? IseIntegrator.GetCurrentLineWithColumnIndex() : null);
                    TokenPosition tokenPos = TokenLocator.LocateNextToken(item.Node.Path, searchText, editorInfo);
                    if (tokenPos.MatchLength > 2)
                    {
                        IseIntegrator.SelectText(tokenPos.Line, tokenPos.Column, tokenPos.MatchLength);
                    }
                    else if (string.IsNullOrEmpty(IseIntegrator.SelectedText))
                    {
                        tokenPos = TokenLocator.LocateSubtoken(item.Node.Path, searchText);
                        if (tokenPos.MatchLength > 2)
                        {
                            IseIntegrator.SelectText(tokenPos.Line, tokenPos.Column, tokenPos.MatchLength);
                        }
                    }
                }
            }
            else if (item.Node.NodeType == NodeType.Function)
            {
                var node = ((PowershellItemNode)item.Node);
                IseIntegrator.GoToFile(node.FilePath);
                IseIntegrator.SelectText(node.PowershellItem.StartLine, node.PowershellItem.StartColumn, node.Name.Length);
            }
            else if (item.Node.NodeType == NodeType.Directory)
            {
                item.IsExpanded = !item.IsExpanded;
            }
        }
 public void DeleteTreeViewEntryItemModel(TreeViewEntryItemModel item, bool first = true)
 {
     if (item == this.RootTreeViewEntryItem || item == null)
     {
         return;
     }
     var lockObject = item.Parent == null ? TreeViewEntryItemModel.RootLockObject : item.Parent;
     IList<TreeViewEntryItemModel> children;
     lock (lockObject)
     {
         this.itemsMap.Remove(item.Path);
         if (item.NodeType == NodeType.File)
         {
             lock (TreeViewEntryItemModel.RootLockObject)
             {
                 this.NumberOfFiles--;
             }
         }
         children = new List<TreeViewEntryItemModel>(item.Children);
     }
     foreach (var child in children)
     {
         this.DeleteTreeViewEntryItemModel(child, false);
     }
     if (first)
     {
         item.Delete();
     }
 }
 private TreeViewEntryItemModel CreateTreeViewEntryItemModel(INode node, TreeViewEntryItemModel parent, bool isSelected)
 {
     var lockObject = parent == null ? TreeViewEntryItemModel.RootLockObject : parent;
     lock (lockObject)
     {
         var item = new TreeViewEntryItemModel(node, parent, isSelected);
         ItemsMap[node.Path] = item;
         if (node.NodeType == NodeType.File)
         {
             lock (TreeViewEntryItemModel.RootLockObject)
             {
                 NumberOfFiles++;
             }
         }
         return item;
     }
 }