private void AddFolderButton_Click(object p_Sender, RoutedEventArgs p_EventArgs)
        {
            // todo: CommonOpenFileDialog is from WindowsAPICodePack-Shell: analyse Nuget warnings
            CommonOpenFileDialog openDialog = new CommonOpenFileDialog {
                IsFolderPicker = true
            };

            if (openDialog.ShowDialog() == CommonFileDialogResult.Ok)
            {
                try {
                    string packedPathDir = CurrentFolder.GetItemPathString();
                    if (packedPathDir == "/")
                    {
                        packedPathDir = "";
                    }

                    var packedPath = packedPathDir + System.IO.Path.GetFileName(openDialog.FileName);

                    LoadedPackedFile.Add(openDialog.FileName, packedPath);
                    //(FileTree.Items[0] as TreeEntry).AddFileData(LoadedPackedFile.GetFileIndexDataForFile(packedPath));
                    //TreeContent_ReloadCurrentFolder();
                    RefreshTreeView(); // todo: make this not need to refresh whole tree
                } catch (Exception ex) {
                    Error(ex);
                }
                PendingChanges = true;
            }
        }
        private void ExtractToFile(TreeEntry p_TreeEntry)
        {
            string packedPath      = p_TreeEntry.IndexData.FilePath;
            string defaultFilename = packedPath.Split('/').Last();

            SaveFileDialog saveFileDialog = new SaveFileDialog {
                FileName = defaultFilename
            };

            if (saveFileDialog.ShowDialog() == true)
            {
                try {
                    LoadedPackedFile.Extract(p_TreeEntry.IndexData.FilePath, saveFileDialog.FileName);
                } catch (Exception ex) {
                    Error(ex);
                }
            }
        }
        private void SaveWithOverwriteWarning(string p_NewFileName)
        {
            if (File.Exists(p_NewFileName))
            {
                if (MessageBox.Show($"Do you really want to overwrite {p_NewFileName}?",
                                    "Overwrite?",
                                    MessageBoxButton.YesNo,
                                    MessageBoxImage.Question, MessageBoxResult.No) != MessageBoxResult.Yes)
                {
                    return;
                }
            }

            try {
                LoadedPackedFile.SaveToFile(p_NewFileName);
                PendingChanges = false;
            } catch (Exception ex) {
                Error(ex);
            }
        }
        private void ExtractToFolder(IList p_SelectedItems)
        {
            // todo: CommonOpenFileDialog is from WindowsAPICodePack-Shell: analyse Nuget warnings
            CommonOpenFileDialog folderDialog = new CommonOpenFileDialog {
                IsFolderPicker = true
            };

            if (folderDialog.ShowDialog() == CommonFileDialogResult.Ok)
            {
                foreach (var item in p_SelectedItems)
                {
                    Debug.Assert(item is TreeEntry); // should always be the case
                    TreeEntry entry = item as TreeEntry;
                    try {
                        LoadedPackedFile.Extract(entry.GetItemPathString(), System.IO.Path.Combine(folderDialog.FileName, entry.Name));
                    } catch (Exception ex) {
                        Error(ex);
                    }
                }
            }
        }
        private void RefreshTreeView()
        {
            TreeEntry root = new TreeEntry(null)
            {
                Name = LoadedPackedFile.FileName
            };

            foreach (PackedFileIndexData file in LoadedPackedFile.GetFileIndexDataList())
            {
                root.AddFileData(file);
            }
            root.Sort();
            FileTree.Items.Clear();
            FileTree.Items.Add(root);

            TreeContent.Items.Clear();
            foreach (var item in root.Items)
            {
                TreeContent.Items.Add(item);
            }

            CurrentFolder = root;
        }
        private void AddButton_Click(object p_Sender, RoutedEventArgs p_EventArgs)
        {
            OpenFileDialog openDialog = new OpenFileDialog();

            if (openDialog.ShowDialog() == true)
            {
                try {
                    string packedPathDir = CurrentFolder.GetItemPathString();
                    if (packedPathDir == "/")
                    {
                        packedPathDir = "";
                    }

                    var packedPath = packedPathDir + System.IO.Path.GetFileName(openDialog.FileName);

                    LoadedPackedFile.Add(openDialog.FileName, packedPath);
                    (FileTree.Items[0] as TreeEntry).AddFileData(LoadedPackedFile.GetFileIndexDataForFile(packedPath));
                    TreeContent_ReloadCurrentFolder();
                } catch (Exception ex) {
                    Error(ex);
                }
                PendingChanges = true;
            }
        }