SHA256
1. Iteration of the Copy Function
2. Settings Tap 3. XML TAB
This commit is contained in:
1 parent
33153f9448
commit
abab3612f2
5 files changed
+499
-10
No files matched your search
@@ -34,6 +34,25 @@ namespace TapeCatalog
|
||||
return mb.ToString("F2");
|
||||
}
|
||||
|
||||
private void XmlFilesListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
if (XmlFilesListBox.SelectedItem is string path)
|
||||
{
|
||||
try
|
||||
{
|
||||
XmlViewerTextBox.Text = File.ReadAllText(path);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
XmlViewerTextBox.Text = $"Error reading file: {ex.Message}";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
XmlViewerTextBox.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
public MainWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
@@ -153,6 +172,62 @@ namespace TapeCatalog
|
||||
}
|
||||
}
|
||||
#endregion (SET_ARC_DIR)
|
||||
#region (SET_XML_DIR)
|
||||
private void SET_XML_DIR(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// Use the WinForms FolderBrowserDialog to select a folder for XML files
|
||||
using (var dlg = new System.Windows.Forms.FolderBrowserDialog())
|
||||
{
|
||||
dlg.Description = "Select XML folder";
|
||||
dlg.ShowNewFolderButton = true;
|
||||
var result = dlg.ShowDialog();
|
||||
if (result == System.Windows.Forms.DialogResult.OK && !string.IsNullOrWhiteSpace(dlg.SelectedPath))
|
||||
{
|
||||
XmlDirectoryTextBox.Text = dlg.SelectedPath;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion (SET_XML_DIR)
|
||||
|
||||
#region (LOAD_XML_FILES)
|
||||
private void LOAD_XML_FILES(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var xmlPath = XmlDirectoryTextBox.Text?.Trim();
|
||||
if (string.IsNullOrWhiteSpace(xmlPath) || !Directory.Exists(xmlPath))
|
||||
{
|
||||
MessageBox.Show(this, "Please select a valid XML directory first.", "Invalid XML Directory", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
string[] files;
|
||||
try
|
||||
{
|
||||
files = Directory.GetFiles(xmlPath, "*.xml", SearchOption.TopDirectoryOnly);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(this, $"Error enumerating XML files: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
return;
|
||||
}
|
||||
|
||||
XmlFilesListBox.Items.Clear();
|
||||
XmlViewerTextBox.Clear();
|
||||
foreach (var f in files)
|
||||
{
|
||||
XmlFilesListBox.Items.Add(f);
|
||||
}
|
||||
|
||||
// switch to XML tab
|
||||
foreach (var it in MainTabControl.Items)
|
||||
{
|
||||
if (it is TabItem ti && (ti.Header as string) == "XML")
|
||||
{
|
||||
MainTabControl.SelectedItem = ti;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion (LOAD_XML_FILES)
|
||||
#region (SCAN_RES_DIR)
|
||||
private void SCAN_RES_DIR(object sender, RoutedEventArgs e)
|
||||
{
|
||||
@@ -341,6 +416,144 @@ namespace TapeCatalog
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Populate CopyTreeView with directory structure from SourceTextBox
|
||||
private void POPULATE_COPY_TREE(object sender, RoutedEventArgs e)
|
||||
{
|
||||
BuildCopyTree();
|
||||
}
|
||||
|
||||
private void BuildCopyTree()
|
||||
{
|
||||
CopyTreeView.Items.Clear();
|
||||
var path = SourceTextBox.Text?.Trim();
|
||||
if (string.IsNullOrWhiteSpace(path) || !Directory.Exists(path))
|
||||
{
|
||||
MessageBox.Show(this, "Please select a valid Source directory first.", "Invalid Source", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var rootDir = new DirectoryInfo(path);
|
||||
var rootItem = CreateDirectoryNode(rootDir);
|
||||
rootItem.IsExpanded = true;
|
||||
CopyTreeView.Items.Add(rootItem);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(this, $"Error building copy tree: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
}
|
||||
|
||||
private TreeViewItem CreateDirectoryNode(DirectoryInfo dir)
|
||||
{
|
||||
var item = new TreeViewItem { Header = dir.Name, Tag = dir.FullName };
|
||||
try
|
||||
{
|
||||
foreach (var sub in dir.GetDirectories())
|
||||
{
|
||||
item.Items.Add(CreateDirectoryNode(sub));
|
||||
}
|
||||
foreach (var f in dir.GetFiles())
|
||||
{
|
||||
var fileItem = new TreeViewItem { Tag = f.FullName };
|
||||
var sp = new StackPanel { Orientation = Orientation.Horizontal };
|
||||
var cb = new CheckBox { VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 4, 0) };
|
||||
var tb = new TextBlock { Text = f.Name, VerticalAlignment = VerticalAlignment.Center };
|
||||
sp.Children.Add(cb);
|
||||
sp.Children.Add(tb);
|
||||
fileItem.Header = sp;
|
||||
item.Items.Add(fileItem);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// ignore access exceptions
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
private void COPY_SELECTED_TO_ARCHIVE(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var archivePath = ArchiveTextBox.Text?.Trim();
|
||||
if (string.IsNullOrWhiteSpace(archivePath) || !Directory.Exists(archivePath))
|
||||
{
|
||||
MessageBox.Show(this, "Please select a valid Archive directory first.", "Invalid Archive", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
var sourceRoot = SourceTextBox.Text?.Trim();
|
||||
if (string.IsNullOrWhiteSpace(sourceRoot) || !Directory.Exists(sourceRoot))
|
||||
{
|
||||
MessageBox.Show(this, "Please select a valid Source directory first.", "Invalid Source", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
var files = new List<string>();
|
||||
foreach (var it in CopyTreeView.Items)
|
||||
{
|
||||
if (it is TreeViewItem tvi)
|
||||
CollectCheckedFiles(tvi, files);
|
||||
}
|
||||
|
||||
if (files.Count == 0)
|
||||
{
|
||||
MessageBox.Show(this, "No files selected.", "Nothing to copy", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
return;
|
||||
}
|
||||
|
||||
int copied = 0, failed = 0;
|
||||
foreach (var src in files)
|
||||
{
|
||||
try
|
||||
{
|
||||
var fileDir = System.IO.Path.GetDirectoryName(src) ?? string.Empty;
|
||||
string relative;
|
||||
if (fileDir.StartsWith(sourceRoot, StringComparison.OrdinalIgnoreCase))
|
||||
relative = fileDir.Substring(sourceRoot.Length).TrimStart(System.IO.Path.DirectorySeparatorChar, System.IO.Path.AltDirectorySeparatorChar);
|
||||
else
|
||||
relative = System.IO.Path.GetFileName(fileDir);
|
||||
|
||||
var destDir = System.IO.Path.Combine(archivePath, relative);
|
||||
Directory.CreateDirectory(destDir);
|
||||
var destFile = System.IO.Path.Combine(destDir, System.IO.Path.GetFileName(src));
|
||||
File.Copy(src, destFile, true);
|
||||
copied++;
|
||||
}
|
||||
catch
|
||||
{
|
||||
failed++;
|
||||
}
|
||||
}
|
||||
|
||||
MessageBox.Show(this, $"Copy finished. Success: {copied}, Failed: {failed}", "Copy completed", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
// no-op edit to preserve patch continuity
|
||||
}
|
||||
|
||||
private void CollectCheckedFiles(TreeViewItem node, List<string> list)
|
||||
{
|
||||
if (node.Header is StackPanel sp)
|
||||
{
|
||||
foreach (var child in sp.Children)
|
||||
{
|
||||
if (child is CheckBox cb && cb.IsChecked == true)
|
||||
{
|
||||
if (node.Tag is string path && File.Exists(path))
|
||||
{
|
||||
list.Add(path);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var it in node.Items)
|
||||
{
|
||||
if (it is TreeViewItem t)
|
||||
CollectCheckedFiles(t, list);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion (VERIFY_SIZES)
|
||||
public class FileEntry : System.ComponentModel.INotifyPropertyChanged
|
||||
|
||||
Reference in new issue
Block a user