From 28c2cf6faeaa7fa2d3d2b8ad82069fa911159053 Mon Sep 17 00:00:00 2001 From: "kenneth.skovhede@gmail.com" Date: Wed, 10 Feb 2010 22:22:49 +0000 Subject: [PATCH] Fixed issue #89. git-svn-id: https://duplicati.googlecode.com/svn/trunk@363 59da171f-624f-0410-aa54-27559c288bec --- Duplicati/GUI/Duplicati.csproj | 9 + .../HelperControls/FilterEditor.Designer.cs | 2 + Duplicati/GUI/HelperControls/FilterEditor.cs | 51 ++++- .../GUI/HelperControls/FilterEditor.resx | 177 +++++++++--------- .../Strings/FilterEditor.Designer.cs | 117 ++++++++++++ .../HelperControls/Strings/FilterEditor.resx | 138 ++++++++++++++ Duplicati/Library/Core/FilenameFilter.cs | 11 +- .../Library/Core/RegularExpressionFilter.cs | 2 + Duplicati/Library/Core/Utility.cs | 9 +- 9 files changed, 421 insertions(+), 95 deletions(-) create mode 100644 Duplicati/GUI/HelperControls/Strings/FilterEditor.Designer.cs create mode 100644 Duplicati/GUI/HelperControls/Strings/FilterEditor.resx diff --git a/Duplicati/GUI/Duplicati.csproj b/Duplicati/GUI/Duplicati.csproj index 42b0c308f..b355f0379 100644 --- a/Duplicati/GUI/Duplicati.csproj +++ b/Duplicati/GUI/Duplicati.csproj @@ -94,6 +94,11 @@ True FilterDialog.resx + + True + True + FilterEditor.resx + True True @@ -1017,6 +1022,10 @@ + + ResXFileCodeGenerator + FilterEditor.Designer.cs + ResXFileCodeGenerator WaitForOperation.Designer.cs diff --git a/Duplicati/GUI/HelperControls/FilterEditor.Designer.cs b/Duplicati/GUI/HelperControls/FilterEditor.Designer.cs index 6ef1eb69e..e83b9d6e4 100644 --- a/Duplicati/GUI/HelperControls/FilterEditor.Designer.cs +++ b/Duplicati/GUI/HelperControls/FilterEditor.Designer.cs @@ -47,6 +47,7 @@ namespace Duplicati.GUI.HelperControls this.label1 = new System.Windows.Forms.Label(); this.FilenameTester = new System.Windows.Forms.TextBox(); this.TestResults = new System.Windows.Forms.PictureBox(); + this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); this.groupBox1.SuspendLayout(); this.toolStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.TestResults)).BeginInit(); @@ -217,5 +218,6 @@ namespace Duplicati.GUI.HelperControls private System.Windows.Forms.Label label1; private System.Windows.Forms.TextBox FilenameTester; private System.Windows.Forms.PictureBox TestResults; + private System.Windows.Forms.ToolTip toolTip1; } } diff --git a/Duplicati/GUI/HelperControls/FilterEditor.cs b/Duplicati/GUI/HelperControls/FilterEditor.cs index 64e442023..7ea7b2b09 100644 --- a/Duplicati/GUI/HelperControls/FilterEditor.cs +++ b/Duplicati/GUI/HelperControls/FilterEditor.cs @@ -72,15 +72,16 @@ namespace Duplicati.GUI.HelperControls { if (FilenameTester.Text.Trim().Length == 0 || string.IsNullOrEmpty(m_basepath)) { + SetTooltipMessage(""); TestResults.Visible = false; return; } - string filename = FilenameTester.Text; if (filename.IndexOfAny(System.IO.Path.GetInvalidPathChars()) >= 0) { + SetTooltipMessage(string.Format(Strings.FilterEditor.InvalidCharsInFilenameError, filename)); TestResults.Visible = false; return; } @@ -90,15 +91,52 @@ namespace Duplicati.GUI.HelperControls if (!filename.StartsWith(m_basepath)) { + SetTooltipMessage(string.Format(Strings.FilterEditor.FilenameIsNotInRootFolder, filename, m_basepath)); TestResults.Visible = false; return; } + List parentFolders = new List(); + string folder = filename; + while (folder.Length > m_basepath.Length) + { + folder = System.IO.Path.GetDirectoryName(folder); + parentFolders.Add(Duplicati.Library.Core.Utility.AppendDirSeperator(folder)); + } + + parentFolders.Reverse(); + Library.Core.FilenameFilter fn = new Duplicati.Library.Core.FilenameFilter(GetFilterList()); - TestResults.Image = imageList1.Images[fn.ShouldInclude(m_basepath, filename) ? 0 : 1]; + Library.Core.IFilenameFilter match; + foreach(string s in parentFolders) + if (!fn.ShouldInclude(m_basepath, s, out match)) + { + SetTooltipMessage(string.Format(Strings.FilterEditor.FolderIsExcluded, s, ((Library.Core.RegularExpressionFilter)match).Expression.ToString())); + TestResults.Image = imageList1.Images[1]; + TestResults.Visible = true; + return; + } + + TestResults.Image = imageList1.Images[fn.ShouldInclude(m_basepath, filename, out match) ? 0 : 1]; + + if (match == null) + SetTooltipMessage(string.Format(Strings.FilterEditor.FileIsIncludedDefault, filename)); + else if (match.Include) + SetTooltipMessage(string.Format(Strings.FilterEditor.FileIsIncluded, filename, ((Library.Core.RegularExpressionFilter)match).Expression.ToString())); + else + SetTooltipMessage(string.Format(Strings.FilterEditor.FileIsExcluded, filename, ((Library.Core.RegularExpressionFilter)match).Expression.ToString())); + TestResults.Visible = true; } + private void SetTooltipMessage(string message) + { + toolTip1.SetToolTip(FilenameTester, message); + toolTip1.SetToolTip(label1, message); + toolTip1.SetToolTip(TestResults, message); + toolTip1.Show(message, TestResults, 5000); + } + private void listView_SelectedIndexChanged(object sender, EventArgs e) { RemoveFilterButton.Enabled = @@ -115,6 +153,7 @@ namespace Duplicati.GUI.HelperControls { while (listView.SelectedItems.Count > 0) listView.Items.Remove(listView.SelectedItems[0]); + FilenameTester_TextChanged(sender, e); } private void EditFilterButton_Click(object sender, EventArgs e) @@ -126,6 +165,7 @@ namespace Duplicati.GUI.HelperControls { listView.SelectedItems[0].Text = dlg.Filter.Value; listView.SelectedItems[0].ImageIndex = dlg.Filter.Key ? 0 : 1; + FilenameTester_TextChanged(sender, e); } } } @@ -139,6 +179,7 @@ namespace Duplicati.GUI.HelperControls listView.Items.RemoveAt(index); listView.Items.Insert(index - 1, lvi); lvi.Selected = true; + FilenameTester_TextChanged(sender, e); } } @@ -151,6 +192,7 @@ namespace Duplicati.GUI.HelperControls listView.Items.RemoveAt(index); listView.Items.Insert(index + 1, lvi); lvi.Selected = true; + FilenameTester_TextChanged(sender, e); } } @@ -163,6 +205,7 @@ namespace Duplicati.GUI.HelperControls listView.Items.RemoveAt(index); listView.Items.Insert(0, lvi); lvi.Selected = true; + FilenameTester_TextChanged(sender, e); } } @@ -175,6 +218,7 @@ namespace Duplicati.GUI.HelperControls listView.Items.RemoveAt(index); listView.Items.Insert(listView.Items.Count, lvi); lvi.Selected = true; + FilenameTester_TextChanged(sender, e); } } @@ -182,7 +226,10 @@ namespace Duplicati.GUI.HelperControls { FilterDialog dlg = new FilterDialog(new KeyValuePair(true, "")); if (dlg.ShowDialog(this) == DialogResult.OK) + { listView.Items.Add(dlg.Filter.Value, dlg.Filter.Key ? 0 : 1); + FilenameTester_TextChanged(sender, e); + } } private void FilterEditor_Load(object sender, EventArgs e) diff --git a/Duplicati/GUI/HelperControls/FilterEditor.resx b/Duplicati/GUI/HelperControls/FilterEditor.resx index 202588d1b..60a69712d 100644 --- a/Duplicati/GUI/HelperControls/FilterEditor.resx +++ b/Duplicati/GUI/HelperControls/FilterEditor.resx @@ -142,29 +142,28 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD6 - BAAAAk1TRnQBSQFMAgEBAgEAAQQBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA - AwABEAMAAQEBAAEgBgABEP8AKwABFAIBARoBLQIBAUMBLQIBAUMBLQIBAUPwAAFYAQMBAgGyAVkB4gGM - Af8BWAHhAYkB/wFKAcgBcgH/8AABWAEDAQIBsgFNAdQBbQH/AUQBywFUAf8BSgHJAXIB//AAAVgBAwEC - AbIBVQHaAXcB/wFFAcwBVgH/AUoBygFyAf/wAAFYAQMBAgGyAWEB4wGBAf8BUQHUAWMB/wFLAcsBcwH/ - 4AABPgGoATwB/gFUAdMBeQH/AVQB1AF7Af8BVQHUAXsB/wFUAdMBegH/AW0B6gGEAf8BYAHfAXMB/wFe - AeMBkAH/AUsBygFxAf8BSQHIAXAB/wFIAcYBbgH/AUgBxQFuAf8BMQIBAUwMAAFJAgIBhAJQAdMB/wJS - AdQB/wJUAdQB/wJVAdMB/wJUAdAB/wJRAcwB/wJNAccB/wJJAcMB/wJHAcIB/wJHAcIB/wI2AagB/5AA - AUEBrQFBAf4BaQHaAXwB/wFyAeQBgQH/AXgB7AGGAf8BewHwAYoB/wF4Ae8BhwH/AW8B6gGBAf8BYgHh - AXYB/wFVAdcBZwH/AUkBzgFaAf8BRAHLAVQB/wFXAeABhwH/ATECAQFMDAABSQICAYQCYgHXAf8CaQHW - Af8CdQHkAf8CfQHuAf8CfQHwAf8CcQHpAf8CXgHcAf8CTgHQAf8CSQHMAf8CSQHMAf8CQAG3Af+QAAFB - Aa4BQQH+AWIB1gGBAf8BagHfAYUB/wFxAecBjQH/AXYB7gGTAf8BewHvAYoB/wF5AfABiAH/AXEB7AGG - Af8BZgHnAYIB/wFbAd4BfQH/AVEB1wFyAf8BWAHhAYoB/wExAgEBTAwAAUkCAgGEAmMB2gH/AmoB3QH/ - AnQB6AH/AnoB8AH/AnoB8gH/AnEB7AH/AmIB4gH/AlQB2AH/Ak8B1AH/Ak8B1AH/AkABtwH/kAABVwED - AQIBsQFYAQQBAgG1AVgBBAECAbUBWAEEAQIBtQFXATIBDgHoAXYB7QGTAf8BewHvAYkB/wFXAdYBgQH/ - AVgBBAECAbUBWAEEAQIBtQFYAQQBAgG1AVgBBAECAbUBGQIBASEMAAEuAgEBRgFYAQIBBAG1AVgBAgEE - AbUBWAECAQQBtQFYAQIBBAG1AVgBAgEEAbUBWAECAQQBtQFYAQIBBAG1AVgBAgEEAbUBWAECAQQBtQFY - AQIBBAG1AVcBAgEEAbSgAAFYAQMBAgGyAW8B5QGLAf8BdgHoAYMB/wFXAdYBgQH/8AABWAEDAQIBsgFm - AdsBgQH/AW0B3gGAAf8BVgHVAX8B//AAAVgBAwECAbIBXQHSAX4B/wFiAdMBdQH/AVUB1AF9Af/wAAFV - AgIBqwE4AbkBPQH/ATgBuAE9Af8BNgG1ATkB//8A/wDaAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB - AQABAQUAAYAXAAP/AQAE/wQAAfwBPwL/BAAB/AE/Av8EAAH8AT8C/wQAAfwBPwL/BAAB/AE/Av8EAAHA - AQEBwAEDBAABwAEBAcABAwQAAcABAQHAAQMEAAHAAQEBwAEDBAAB/AE/Av8EAAH8AT8C/wQAAfwBPwL/ - BAAB/AE/Av8EAAT/BAAE/wQACw== + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC8 + BAAAAk1TRnQBSQFMAgEBAgEAARQBAAEUAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + AwABEAMAAQEBAAEgBgABEP8AKwADEwEaASwCKwFDASwCKwFDASwCKwFD8AABVQJCAbIBVwHiAYwB/wFW + AeEBiQH/AUgByAFwAf/wAAFVAkIBsgFLAdQBawH/AUIBywFSAf8BSAHJAXAB//AAAVUCQgGyAVMB2gF1 + Af8BQwHMAVQB/wFIAcoBcAH/8AABVQJCAbIBXwHjAYEB/wFPAdQBYQH/AUkBywFxAf/gAAE+AaQBPAH+ + AVIB0wF3Af8BUgHUAXkB/wFTAdQBeQH/AVIB0wF4Af8BawHqAYQB/wFeAd8BcQH/AVwB4wGQAf8BSQHK + AW8B/wFHAcgBbgH/AUYBxgFsAf8BRgHFAWwB/wMwAUwMAAFIAkMBhAJOAdMB/wJQAdQB/wJSAdQB/wJT + AdMB/wJSAdAB/wJPAcwB/wJLAccB/wJHAcMB/wJFAcIB/wJFAcIB/wI0AagB/5AAAUEBqQFBAf4BZwHa + AXoB/wFwAeQBgQH/AXYB7AGGAf8BeQHwAYoB/wF2Ae8BhwH/AW0B6gGBAf8BYAHhAXQB/wFTAdcBZQH/ + AUcBzgFYAf8BQgHLAVIB/wFVAeABhwH/AzABTAwAAUgCQwGEAmAB1wH/AmcB1gH/AnMB5AH/AnsB7gH/ + AnsB8AH/Am8B6QH/AlwB3AH/AkwB0AH/AkcBzAH/AkcBzAH/Aj4BtwH/kAABQQGqAUEB/gFgAdYBgQH/ + AWgB3wGFAf8BbwHnAY0B/wF0Ae4BkwH/AXkB7wGKAf8BdwHwAYgB/wFvAewBhgH/AWQB5wGCAf8BWQHe + AXsB/wFPAdcBcAH/AVYB4QGKAf8DMAFMDAABSAJDAYQCYQHaAf8CaAHdAf8CcgHoAf8CeAHwAf8CeAHy + Af8CbwHsAf8CYAHiAf8CUgHYAf8CTQHUAf8CTQHUAf8CPgG3Af+QAAFWAkIBsQFVAkEBtQFVAkEBtQFV + AkEBtQFXAUEBJwHoAXQB7QGTAf8BeQHvAYkB/wFVAdYBgQH/AVUCQQG1AVUCQQG1AVUCQQG1AVUCQQG1 + AxgBIQwAAy0BRgFVAkEBtQFVAkEBtQFVAkEBtQFVAkEBtQFVAkEBtQFVAkEBtQFVAkEBtQFVAkEBtQFV + AkEBtQFVAkEBtQFWAUABQgG0oAABVQJCAbIBbQHlAYsB/wF0AegBgwH/AVUB1gGBAf/wAAFVAkIBsgFk + AdsBgQH/AWsB3gGAAf8BVAHVAX0B//AAAVUCQgGyAVsB0gF8Af8BYAHTAXMB/wFTAdQBewH/8AABVAJE + AasBNgG5ATsB/wE2AbgBOwH/ATQBtQE3Af//AP8A2gABQgFNAT4HAAE+AwABKAMAAUADAAEQAwABAQEA + AQEFAAGAFwAD/wEABP8EAAH8AT8C/wQAAfwBPwL/BAAB/AE/Av8EAAH8AT8C/wQAAfwBPwL/BAABwAEB + AcABAwQAAcABAQHAAQMEAAHAAQEBwAEDBAABwAEBAcABAwQAAfwBPwL/BAAB/AE/Av8EAAH8AT8C/wQA + AfwBPwL/BAAE/wQABP8EAAs= @@ -183,22 +182,21 @@ 0 - 121, 19 + 3, 16 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAiNJREFUOE+Fk29L - U3EUx+cr6AVES+e8btVEcwUlKWZI0IOQLIaNYrJqgc7sUrlCbG0oxmrhkpRkVGQM+ocPKpoRxHJXcW61 - SX8IZBA9CXrQK/jW98BuXebqwIHfPfd8P/ec8zu3ylTB3DEXvv38Km83bthkut+fqKqUa4hvDdRi/+12 - qMl+jKaD4jzvm96DLRetqAhR753BtjErBpI+RHNXMbkaxdTHCdzKTSC2eg2R7Ch8zz2Sw9wyUH3IDM+z - HowsD2GscBnj2RAWi2lxQsL5YVxZ9qNn7hCUsNkIYNm77zahL3UCQ9lBjOQDCGqXULJ4fhrD789DXenD - 6de92Bl3gBq9CnukBh2PdsG74IY/c1IggZSqA6ZyMYnxnSflQsuTJlAjAE67YaYOrU+dOD7fjYE3PlxY - +O0vB3XATe2GxPl15hBADbWm9nCLPDgf23EnP6OLKh04k+aHNtFQqwMY5LD+Z1rxrRFQaoGA7vlOBNI+ - hDJ+jGtnddZsYVJugK2xhVIF0gKNA9mRULD3lQ1dSw4cyzXCqzl1QPRTL46uNOKg5kBb0o7mB8qfIRLA - K9ket6IzWQdXTsGpzzb43zkMAO8HGw5n6tHxQpH+DddICBepLWGBe8kC/5oF6lo1ij8K4te/dEnsiFYr - Ocwt20Sup+0vyLniZgS/m8UJI7h1tkZy1l3lEpGlNUTMknxgrlqcZ8bKyv7X78kJ857p+rTXEfwChEDw - QjpqrrIAAAAASUVORK5CYII= + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIMSURBVDhPjZPvS1NhFMf9S5bOeb0rJ5orKElRQ4JehGQx + bBSTWQvsml4ql4itDcVYLVySkowKDKEyfFHRjCCWu4lztzbpB4HsdeDf8K3vgd0aa9UDB84995zPc349 + VVUVjjfuQUekVYR6Jb8y+55gLY7c64CevIDJdEiE+uH5Q9h91VEZpD+8iIYpB4aSAcTMG5jdimHu8wzu + mjOIb91ENDuJwAuf+NC37Ob6sA2+532Y2BjFVP4aprNhvC+kRQiJ5MZxfUND38pxKBFbKYBpH3zQjMHU + AEazw5jIBREyxlA8idw8xj9ehr45iPNv+rE/4QJjrCyc0Rp0PTkA/5oXWuasQIIp3QLMmXGx8Z8v5UHr + cjMYIwB2uHGhDm3P3Diz2ouhtwFcWfspr4YtwB3jtth5O30IYIxMh2Pih/upE/dzC1ZQJYU9aXmsSgxj + LQCNbNa/jlF4VwoolkBA72o3gukAwhkN08aIxVrMz8oEWBpLKGZgLRgbsm9JQedrFT3rLpw2m+A33BYg + 9qUfpzabcMxwoT3pRMsj5VcT2UiOZG/Cge5kHTymgnNfVWgfXCUA/ycVJzL16HqpSP0lYySEi9S+ZId3 + 3Q5t2w59uxqFnbzIrW89Yjtp1IoPfcs2keup/ga5VNiF0HebCGEEty3WiM8fV7lIZGqNUZs4H12pFqFO + W1naf3ui//ucfwCJ3vHLSjlN7AAAAABJRU5ErkJggg== @@ -219,16 +217,15 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAe9JREFUOE+FU99L - U3EU3976G6SnoIcpk5rU7AebFjFBaRkRCCJEOmbqMmoOUxwLVhuBbhLLBhUVCD7aS5BPPokPQRDU7CGN - 2noI79xcbNa8n+7nyBa3280vfOB7P+dzPpxz7vlaLSZn0deHSu6rRA80HLR408+tZlodP9/ajJXLXdgI - j+FbIi5Yn7wp3AunHaYmryeCWDplE/HWo1n8eDqH8rO0oPQ4BSU1jY3gEF6dsINag9HL4zZ8uT6A7ft3 - gNkYdtNJHX4m76EYm8LnwT5Qayh7rdOFwsQoqtHbUGeidRPMzcidnBoJYis0jIznpL6dZa2s3CUPdm75 - RYR4uG5SSxZOi5UCV5DtPgvmSBWc9ju3A5sayaCiVaHcnTQiEoIyHsD3G/2iZQ5zLQtdZ+Sj4nVi88lD - 7HeUN6tQPK3ItDvAXDH41HFESE56v2MwYBnvNTcaFK5eRD42jnxiag8P9GBrbIHaegucAweSPXcMOxec - UHtPAz43MOL6g2va3dcmMbZKbX2INOD2sY28twXV3qNQfQ5gqEUHcoxRQ61hK7kcDBR77KgO2PArcAjq - 6GEB7+QYo8awSKyC68nAx/ONUHqaUPbvJRK8k/vQYRfNP1e5tposjW/iradJzAjeyf33Mf39OPh3+IsJ - WRiT8xtNQweCAHQ6FwAAAABJRU5ErkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHfSURBVDhPjVPfS1NhGPZvCbpYY1ITm5rMHxETlFYiwkCE + SIc1XYtaY00cBssNwekIm4MKCYIu8yaoq67EC0EQbHVRi5hehGebLfzROk/neccmx+PUDx54z/M+33Pe + 9/ver66uxnrnHsTbnk4B41o6A/+mqR7L/T3IhB9hazYm+D7+QLjXNkttow8hPz5eMYk4v5DAn1dJ7C6m + BMUX81DmZ5Dxe/C+2QJqDX9eumzCz3vD+D39BEhE8S81p8PB3BR2ohP4cWcQ1OoMWPaXbjsKIR9KkcdQ + 45GqCZJxicmpk37kA6NIO1r07XzSytrsc2D/4YiIEAtXTSqbhdNyRe8tZG9eBfdIFTzh9TYrtjWSSUWr + Qnk6bsRkAErQi1/3h0TLPXI7vCZ+7Dlt2H75HKctZXUFiqMJ6Q6rXLEYfOu6KCRP+rRlMGAZG5obDQq3 + e5GLBpGbnSjjmR5sjS1QW22B58ADyV5rxP4NG9SBVsDdBozZD3FXi93tkmOr1FYPkQa8RraRczagNHAJ + qtsKeBp0IMccNdQappLDwcSOy4LSsAl/veeg+s4LGJNjjhrDILEKjicTX69fgOIyY3ekvJFgTO5zl0U0 + x45yZTRZGt/EmsMsZgRjcic+pqOP46zP+T9spgnV3QfwFQAAAABJRU5ErkJggg== @@ -249,15 +246,15 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAcZJREFUOE+VU0sv - Q0EYvR4bP8HCxg+w6Fq6FhIhIiFWFpZlK7FkxaKJV6RCsChtpBpBKPqMtqlalDaVEpS6RVUrDW2jevQb - pqq9bWKSk7kz957znfPN3CrhZ7jdPmSzSaGmtlb4zGSE6uo6gdZ8iKIodHS0V+U3ih9S6Q+8JtJlYTI7 - YDRaUFEgGk+BQEKR2PfM9+x2B0J3ofIi5ICTC2cu4DkLQLexDe2sCoae3lInPAJV5iQ+P0XfQLi8EmFr - bUOgpQVmufyvCHcgPsTZh+eB2zz42uc9g3VOBb1MBt3AQKkAZQ7ev+QFODHgNuDaMgjqg1a7Ds2EUjoC - WS52EPRa8WqSIayvh1/dx5ooeRo8AndA1alydL+JkR9VDYhou5lDclJynFwgHHlnEQorE/l2uQ102S6D - z5UF7sNxULNiO7+VH1a7YHd4sHd4DJvTC71+U9oBHSFZ9J9qEDnpwstKI3xTzVCr1zA5swTl1CI0G0bW - yJIIydQHmP2cRdeBAj5zPzTjnRhUDGF4ZJQJEPnYcyPdxLxALv+0cgyzcwuYX1zF1u4RI3kvnuG/iuM6 - lJDugcvlRiGcTheKQd0nUKSyP9V/X3wBzfZGZumMH9MAAAAASUVORK5CYII= + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAG1SURBVDhPlVPBSgJRFPU3WrTpA1q4jtZSq4igaNXCpbYN + WtaqFkJWhJFUC22GqCEqysrMSMU0MhXDpNJMrdFUpFJcnLyvnpWOQQOHO2/m3XPPue8+lerr8fnC8Hp9 + 8F9cssjX9E6QpC3wvYqxXKmiWKq0xLHDDbv9pDUJEeQKZQYikvOfkX9zudxIPiRbk3ACnvQzmUgCwSg2 + NncgzptgGxxqVsItUGVelcfn3CsIsdsUTnt6EdVo4Oju/k3CFaQyBbbxOpqog6/DoSCcCyZIajU2tNpm + ApIdf3ypE/DEqM+GuxM9qA+iuA5h2qBsgSQ3KoiHnCgeq5GW2hCxDLMmKp4Gt8AVUHWqnDvoZMlPpnbI + 4gBTSEqaZoETpOU3ZuFnZUpOrPSy4YrFs38TPKYLoGbld78rZ6z9cLkD2D86x6knpDyVpICOkCRGrgTI + /n68rHYgbOyCxbKGmbllGIxmCJt21sgmC+/lKpj8mkTvoQ5hxwiEqT7odaMYG59gBJR8HrhXbmKdoOZ/ + 1jCJ+YUlLJqt2N47Y0mhmywitwXcJUvKPeC3jkePx4tGUPcJZOnPm/mfnx/Qo1STSDASFQAAAABJRU5E + rkJggg== @@ -281,13 +278,13 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAVlJREFUOE9jYCAA - pt6c+p+QGpzySWdc/2ec8/jfd7WPdENAmjseJINx3kWf/10Xu4g3BKa5+kH6/4anOf+nvMv/n3PN/X/X - aSIMQdfcAtTc+b7k/8zPhRCX4DMEprn2YQbYZpjmjg9FYHbfu8z/IDVYDUHXDLIVhGGaa15l/C9/lvy/ - 7lHE/5QTTqiGOO41+19zPfB/zf3g/233o8B+BmkE4aa3uf9BmkEaQfIFFzz/F553/++4wQi7S7z3uID9 - C9Nc9SLtf96DKLAB7ltsCcdE2IEAsAEgmyuep4A1J98M+F92J+C/7xYn4gyY9iEL7N+c+5H/E2/4/w+7 - 4Po//4YXcQYE7/T93/c6+X/WvfD/Cdf9wJp9T9uC0wFRLgAZ0PI0+n/cNR+4ZpINAIV2yHlnsM0wDHKB - z0ZHwmEAdsGDQLCTkXHtXV/iDEjemwT2KzoG2R6+KQzDBQBtp08dH0E7jQAAAABJRU5ErkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFZSURBVDhPY2AgAKbenPqfkBqc8klnXP9nnPP433e1j3RD + QJo7HiSDcd5Fn/9dF7uINwSmufpB+v+Gpzn/p7zL/59zzf1/12kiDEHX3ALU3Pm+5P/Mz4UQl+AzBKa5 + 9mEG2GaY5o4PRWB237vM/yA1WA1B1wyyFYRhmmteZfwvf5b8v+5RxP+UE06ohjjuNftfcz3wf8394P9t + 96PAfgZpBOGmt7n/QZpBGkHyBRc8/xeed//vuMEIu0u897iA/QvTXPUi7X/egyiwAe5bbAnHRNiBALAB + IJsrnqeANSffDPhfdifgv+8WJ+IMmPYhC+zfnPuR/xNv+P8Pu+D6P/+GF3EGBO/0/d/3Ovl/1r3w/wnX + /cCafU/bgtMBUS4AGdDyNPp/3DUfuGaSDQCFdsh5Z7DNMAxygc9GR8JhAHbBg0Cwk5Fx7V1f4gxI3psE + 9is6BtkevikMwwUAbadPHR9BO40AAAAASUVORK5CYII= @@ -308,14 +305,14 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAY9JREFUOE+Vk8tL - AlEUxsdaBf01bdr0zhAjTAQVe5FNGJNWGvmojRFlVqBTUFCL+hPatQhcFPSiJLNEhVKJHhIi5r6+OBNj - ZpnTwF3cmfl933fOuVfGlDz2kB0P+VTh7TvzxlQx1cK+pqqW2W7YkZUy3/aGIy1WYjq4omrMx/uwnDSC - fzRhKzsGdUCOP2H6aDjUYu5Oj5GgDtbIAKYTJrgfzFhPc9IFvLf9BXjhxQpam6826QK+e1ZwJnA2Y4Yn - Y/ufAMUlmMCl3JSwNvITUO23SesBNYxgUWAxNwl/lpMmoAp0CnFFZyphJm2CJ22Ecq/xZ4LV2BraAvXC - 2JxRjTABiksCIjye6oEjoYHjuhPsqRzcWTtaduvgPnZ/CvoiPliuun44u56HQTAbV8MQVkB90YyhsBym - k9YvWDwY/hteECF3cnY+sbAkDTDGuqELdUB13lQeFkX4MA8uqIT3hcVoQo/BqEo6XCxCdVLNkp1Lzzcl - 6T1oBBdRVI5d7nLwl6uCyK8Nq3ijin4ojKoM9AHxq1tZT9V7JgAAAABJRU5ErkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAF9SURBVDhPlZPbSgJhFIV7pm66soMZosQ0CCp2onHCmLTS + yEPdGFFmBToGBfUS3XUReJF0pCSzRIXSiA4iItYLrNoTM4kmTgMbZuBf31p77/k7Ohoeb8oLW8KslDVh + Ut7tJxwazzd9207N2MpZEMiyWM2PYrPIQXx1YL86AzauUwH4dl95tGIqaYE7M47FggPBFyd2SoJ6QPhh + TBGvld2g2vvwqAdEnnnJmYTLFSdCFc//ABSXxCTcqC1Itfs5B+ZIq24GNDASy4D12jyiVUEdgIkbpbiy + M7WwVHIgVOJgONQ0J4jltqGNd0lr82dN0gYoLgFk8ezTMHwFE3x3RvAXOgiX/eg96ETwLPgDjGQicN0O + NjkH3idBYj7PwpbWg73ugT2tg+O871cs/0nRe1GCkDs5+994uIo2cLkhWFIDYK66W4tliJgWISQNCJd5 + TBesmMgy6sX1EOqTelbt3HghKMnIsQZCRt8+dqvbJd7EJMifA2t7JesOKKtqIfoCZo5mLImpLeYAAAAA + SUVORK5CYII= @@ -339,14 +336,14 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAZJJREFUOE+Vk81L - AmEQxv2vvETWQepiHyBEGZqRkliblUmYGEQHs8yPQAMpLPSQdIq6RElBnjTJyENGdKgWywSrP2ByZnl1 - pV22FoY97Pv8nmfmnVWpFJ5o8h6Uzsh+73XnQLdShOBO6f8QFE/uVYCL1Qiyvn37dwgTzwXewLFVA2fq - S4BEb5QhPZ4COaPY5HkAs/cRXNE6zB4KEH/4Wh6CzlzkA7i1FzAtlaHTloUue5ZAmGQm+Ql4RhLCnB1+ - XhBPXIBtvwZTySpBDO4ywS277wQJBHOtJGpjBvSRMtWgrwTdlkyzDWxlPv1NEN1yEfr9d1TqgaN2CN6l - y5cHjfkMxg54wCQoxv7ZDBA8vXApPwN0sceFAWI5Q9UmACFcuk7pJBcHxVLOLAEOkWaQqlLKNggODMXW - BE+Dw8NMiG8SNxYKxcbEK1WH/rgFcW8UgJVm9JTuXOyMAASjaNF71axQOP+7nT7reRsAY9s2K3R92uET - 5U0UA8i5IR7HxYrzoB0SxZb7BRlALDasPsFI7FkS8AOfmJ+7r3cchAAAAABJRU5ErkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGSSURBVDhPlZPNSwJhEMb9r7xE1kHqYh8gRBmakZJYm5VJ + mBhEB7PMj0ADKSz0kHSKukRJQZ40ychDRnSoFssEqz9gcmZ5daVdthaGPez7/J5n5p1VqRSeaPIelM7I + fu9150C3UoTgTun/EBRP7lWAi9UIsr59+3cIE88F3sCxVQNn6kuARG+UIT2eAjmj2OR5ALP3EVzROswe + ChB/+Foegs5c5AO4tRcwLZWh05aFLnuWQJhkJvkJeEYSwpwdfl4QT1yAbb8GU8kqQQzuMsEtu+8ECQRz + rSRqYwb0kTLVoK8E3ZZMsw1sZT79TRDdchH6/XdU6oGjdgjepcuXB435DMYOeMAkKMb+2QwQPL1wKT8D + dLHHhQFiOUPVJgAhXLpO6SQXB8VSziwBDpFmkKpSyjYIDgzF1gRPg8PDTIhvEjcWCsXGxCtVh/64BXFv + FICVZvSU7lzsjAAEo2jRe9WsUDj/u50+63kbAGPbNit0fdrhE+VNFAPIuSEex8WK86AdEsWW+wUZQCw2 + rD7BSOxZEvADn5ifu693HIQAAAAASUVORK5CYII= @@ -367,15 +364,14 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAbBJREFUOE9jZEAD - oYVH/osaajKwv/zFwMzCwsDEwszAwMzE8EuMieHKlpMMexa4MqLrQeGH5B36n7/s3f+S/tf/C6e8+182 - 7QMYly77/N8lYfd/vJpBkiADCtZ8+l82GaEZZABIzCl2F3YD2qdd+g/DIEVgA6A2g2iQS7IWvf1vHb79 - f1vXSTBuaj6GMMw2ftf/+GVP/6ctewPGZXM/wg3Im/TmPwinTnz+P37ms/+hU+/+D517D2wYinecM4F+ - X/kexWaQ7SDNyZ1P/se1Pvwf1nD7f/j0B/9BFmINC5AhyM6HaU5of0RYM8jE2u6zYNNBhoA0p/U8+4+s - 2S5h1//84n2otk9aeOO/eeze/2F99/4HdV//79N44T9IISgsIvsf/I9svAv2O8hg14Kj/70azoKxmd8G - RED2z70K1giKa5C/E6tvgQ0BaYRp9k45ATYMZJFHzen/tXWH0Vwy6xKKIfGVN8EhDTKIoGZYiE4CGgIy - HeQSUBhElFz575dxGr/N6NEBMwSUcEDRB3I2KCywOhtXugYZ4l5yAux/kjXDvTP9PDjUSbIZm4tQ0jwW - BQBGf59N9yfyuQAAAABJRU5ErkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGUSURBVDhPlZPLSwJhFMX7q2oRtehBUeEiUnNhY1RSLXyQ + CVGGFiVlJFkpBS5qMRC0aBcYteiFIVJI0QvFonSR2esPOHm/+tSZpsyByzDDPb9z7v1mKipkl9p6iMH1 + Z1g9adi8T7AvZmH3v8Ky+Y4Gww7k/T+eO0z7MItZJrYufYmphsWP/wPIjTtzAL2r04eUE7j9MfCiJgb4 + dqY7JaGxqrXbmJ49YTUxeVyA1QghCOIjjGKGlT34lgeYfBlQ9S2kIaykoF6OQx1MMJhk/vqB3OwbLxJn + cidxz8wDuqbuoHHeQhtIggwVl0mQ4vhcbHDflxYT0eGJMjpBSGycS6FYXGsIwTy0J3X3rV2hSr8LzXwC + 7Z5LtLnOQI20C503CZ0rzmYncKPlCC3OKKtK1VZhkd7gBRPSWdPc3aM3DEJCLm7tDTMYGTWPReAYP5Al + WY1JIMLINds0gUqK+UZ9OQjRKQntoNN2DlV/5G9n+XFwCH04dHwUm3ahGPu3H4MgTbYwm79scX6cwCnb + elnOSokk37xCwycvE6v477beNgAAAABJRU5ErkJggg== @@ -516,6 +512,9 @@ 0 + + 130, 17 + True @@ -591,6 +590,12 @@ System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + toolTip1 + + + System.Windows.Forms.ToolTip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + FilterEditor diff --git a/Duplicati/GUI/HelperControls/Strings/FilterEditor.Designer.cs b/Duplicati/GUI/HelperControls/Strings/FilterEditor.Designer.cs new file mode 100644 index 000000000..49942478d --- /dev/null +++ b/Duplicati/GUI/HelperControls/Strings/FilterEditor.Designer.cs @@ -0,0 +1,117 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4927 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Duplicati.GUI.HelperControls.Strings { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class FilterEditor { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal FilterEditor() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Duplicati.GUI.HelperControls.Strings.FilterEditor", typeof(FilterEditor).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to The file {0} is excluded due to rule {1}. + /// + internal static string FileIsExcluded { + get { + return ResourceManager.GetString("FileIsExcluded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The file {0} is included due to rule {1}. + /// + internal static string FileIsIncluded { + get { + return ResourceManager.GetString("FileIsIncluded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The file {0} is included because no rule matched. + /// + internal static string FileIsIncludedDefault { + get { + return ResourceManager.GetString("FileIsIncludedDefault", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The filename {0} is not located in the folder {1}. + /// + internal static string FilenameIsNotInRootFolder { + get { + return ResourceManager.GetString("FilenameIsNotInRootFolder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The folder {0} is excluded due to rule {1}. + /// + internal static string FolderIsExcluded { + get { + return ResourceManager.GetString("FolderIsExcluded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The filename {0} has invalid characters. + /// + internal static string InvalidCharsInFilenameError { + get { + return ResourceManager.GetString("InvalidCharsInFilenameError", resourceCulture); + } + } + } +} diff --git a/Duplicati/GUI/HelperControls/Strings/FilterEditor.resx b/Duplicati/GUI/HelperControls/Strings/FilterEditor.resx new file mode 100644 index 000000000..fd93a8b4d --- /dev/null +++ b/Duplicati/GUI/HelperControls/Strings/FilterEditor.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The file {0} is excluded due to rule {1} + + + The file {0} is included due to rule {1} + + + The file {0} is included because no rule matched + + + The filename {0} is not located in the folder {1} + + + The folder {0} is excluded due to rule {1} + + + The filename {0} has invalid characters + + \ No newline at end of file diff --git a/Duplicati/Library/Core/FilenameFilter.cs b/Duplicati/Library/Core/FilenameFilter.cs index 84c87f76b..95030f103 100644 --- a/Duplicati/Library/Core/FilenameFilter.cs +++ b/Duplicati/Library/Core/FilenameFilter.cs @@ -227,9 +227,15 @@ namespace Duplicati.Library.Core return res; } - public bool ShouldInclude(string basepath, string filename) { + IFilenameFilter dummy; + return ShouldInclude(basepath, filename, out dummy); + } + + public bool ShouldInclude(string basepath, string filename, out IFilenameFilter match) + { + match = null; basepath = Core.Utility.AppendDirSeperator(basepath); if (!filename.StartsWith(basepath)) return false; @@ -242,7 +248,10 @@ namespace Duplicati.Library.Core //Run through each filter foreach (IFilenameFilter filter in m_filters) if (filter.Match(relpath)) + { + match = filter; return filter.Include; + } return true; } diff --git a/Duplicati/Library/Core/RegularExpressionFilter.cs b/Duplicati/Library/Core/RegularExpressionFilter.cs index cf9156921..5c40a7cec 100644 --- a/Duplicati/Library/Core/RegularExpressionFilter.cs +++ b/Duplicati/Library/Core/RegularExpressionFilter.cs @@ -48,6 +48,8 @@ namespace Duplicati.Library.Core m_include = include; } + public Regex Expression { get { return m_expression; } } + #region IFilenameFilter Members public bool Include diff --git a/Duplicati/Library/Core/Utility.cs b/Duplicati/Library/Core/Utility.cs index 8289712cb..ff0684c70 100644 --- a/Duplicati/Library/Core/Utility.cs +++ b/Duplicati/Library/Core/Utility.cs @@ -106,14 +106,11 @@ namespace Duplicati.Library.Core string f = AppendDirSeperator(lst.Dequeue()); try { - //TODO: We cannot guess if the folder has files that should be included, - //so we have to enumerate all the files foreach (string s in System.IO.Directory.GetDirectories(f)) - lst.Enqueue(s); + if (filter == null || filter.ShouldInclude(rootpath, f)) + lst.Enqueue(s); - //TODO: If anything is included from subpaths, we should report the folder itself - if (filter == null || filter.ShouldInclude(rootpath, f)) - callback(rootpath, f, EnumeratedFileStatus.Folder); + callback(rootpath, f, EnumeratedFileStatus.Folder); } catch (System.Threading.ThreadAbortException) {