diff --git a/Model/Search/SearchRule.cs b/Model/Search/SearchRule.cs index c6bc915..8a1d65d 100644 --- a/Model/Search/SearchRule.cs +++ b/Model/Search/SearchRule.cs @@ -287,12 +287,14 @@ namespace NBTExplorer.Model.Search if (double.Parse(Value) == tag.ToTagDouble()) { if (!matchedNodes.Contains(childNode)) matchedNodes.Add(childNode); + return true; } break; case TagType.TAG_STRING: if (Value == tag.ToTagString()) { if (!matchedNodes.Contains(childNode)) matchedNodes.Add(childNode); + return true; } break; } diff --git a/SearchWorker.cs b/SearchWorker.cs index e57771c..5c01337 100644 --- a/SearchWorker.cs +++ b/SearchWorker.cs @@ -9,6 +9,7 @@ namespace NBTExplorer DataNode RootNode { get; set; } IEnumerator State { get; set; } + bool TerminateOnDiscover { get; set; } void InvokeDiscoverCallback (DataNode node); void InvokeProgressCallback (DataNode node); @@ -25,12 +26,18 @@ namespace NBTExplorer public DataNode RootNode { get; set; } public IEnumerator State { get; set; } + public bool TerminateOnDiscover { get; set; } public abstract void InvokeDiscoverCallback (DataNode node); public abstract void InvokeProgressCallback (DataNode node); public abstract void InvokeCollapseCallback (DataNode node); public abstract void InvokeEndCallback (DataNode node); + protected NameValueSearchState () + { + TerminateOnDiscover = true; + } + public bool TestNode (DataNode node) { bool mName = SearchName == null; @@ -101,9 +108,12 @@ namespace NBTExplorer TagDataNode tagNode = node as TagDataNode; if (tagNode != null) { + InvokeProgressCallback(node); + if (_state.TestNode(tagNode)) { InvokeDiscoverCallback(node); - yield return node; + if (_state.TerminateOnDiscover) + yield return node; } /*bool mName = _state.SearchName == null; @@ -139,6 +149,11 @@ namespace NBTExplorer } } + private void InvokeProgressCallback (DataNode node) + { + _state.InvokeProgressCallback(node); + } + private void InvokeDiscoverCallback (DataNode node) { _state.InvokeDiscoverCallback(node); diff --git a/Windows/CancelSearchForm.Designer.cs b/Windows/CancelSearchForm.Designer.cs index 5b476ab..5e4216e 100644 --- a/Windows/CancelSearchForm.Designer.cs +++ b/Windows/CancelSearchForm.Designer.cs @@ -28,24 +28,35 @@ private void InitializeComponent () { this._buttonCancel = new System.Windows.Forms.Button(); + this._searchPathLabel = new System.Windows.Forms.Label(); this.SuspendLayout(); // // _buttonCancel // this._buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this._buttonCancel.Location = new System.Drawing.Point(124, 57); + this._buttonCancel.Location = new System.Drawing.Point(167, 57); this._buttonCancel.Name = "_buttonCancel"; this._buttonCancel.Size = new System.Drawing.Size(75, 23); this._buttonCancel.TabIndex = 0; this._buttonCancel.Text = "Cancel"; this._buttonCancel.UseVisualStyleBackColor = true; // + // _searchPathLabel + // + this._searchPathLabel.Location = new System.Drawing.Point(12, 19); + this._searchPathLabel.Name = "_searchPathLabel"; + this._searchPathLabel.Size = new System.Drawing.Size(385, 23); + this._searchPathLabel.TabIndex = 1; + this._searchPathLabel.Text = "..."; + this._searchPathLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // // CancelSearchForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this._buttonCancel; - this.ClientSize = new System.Drawing.Size(322, 92); + this.ClientSize = new System.Drawing.Size(409, 92); + this.Controls.Add(this._searchPathLabel); this.Controls.Add(this._buttonCancel); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.MaximizeBox = false; @@ -59,5 +70,6 @@ #endregion private System.Windows.Forms.Button _buttonCancel; + private System.Windows.Forms.Label _searchPathLabel; } } \ No newline at end of file diff --git a/Windows/CancelSearchForm.cs b/Windows/CancelSearchForm.cs index 5bef05c..9ef2466 100644 --- a/Windows/CancelSearchForm.cs +++ b/Windows/CancelSearchForm.cs @@ -8,5 +8,11 @@ namespace NBTExplorer.Windows { InitializeComponent(); } + + public string SearchPathLabel + { + get { return _searchPathLabel.Text; } + set { _searchPathLabel.Text = value; } + } } } diff --git a/Windows/CancelSearchForm.resx b/Windows/CancelSearchForm.resx index 1af7de1..7080a7d 100644 --- a/Windows/CancelSearchForm.resx +++ b/Windows/CancelSearchForm.resx @@ -112,9 +112,9 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 \ No newline at end of file diff --git a/Windows/FindReplace.Designer.cs b/Windows/FindReplace.Designer.cs index 93618be..c8a7c56 100644 --- a/Windows/FindReplace.Designer.cs +++ b/Windows/FindReplace.Designer.cs @@ -517,12 +517,14 @@ // _buttonReplaceAll // this._buttonReplaceAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this._buttonReplaceAll.Enabled = false; this._buttonReplaceAll.Location = new System.Drawing.Point(376, 415); this._buttonReplaceAll.Name = "_buttonReplaceAll"; this._buttonReplaceAll.Size = new System.Drawing.Size(75, 23); this._buttonReplaceAll.TabIndex = 4; this._buttonReplaceAll.Text = "Replace All"; this._buttonReplaceAll.UseVisualStyleBackColor = true; + this._buttonReplaceAll.Click += new System.EventHandler(this._buttonReplaceAll_Click); // // _buttonCancel // @@ -533,6 +535,7 @@ this._buttonCancel.TabIndex = 5; this._buttonCancel.Text = "Cancel"; this._buttonCancel.UseVisualStyleBackColor = true; + this._buttonCancel.Click += new System.EventHandler(this._buttonCancel_Click); // // FindReplace // diff --git a/Windows/FindReplace.cs b/Windows/FindReplace.cs index a42d1f5..35de689 100644 --- a/Windows/FindReplace.cs +++ b/Windows/FindReplace.cs @@ -172,6 +172,7 @@ namespace NBTExplorer.Windows RootNode = _mainSearchRoot, DiscoverCallback = SearchDiscoveryCallback, CollapseCallback = SearchCollapseCallback, + ProgressCallback = SearchProgressCallback, EndCallback = SearchEndCallback, }; } @@ -179,6 +180,20 @@ namespace NBTExplorer.Windows SearchNextNode(); } + private void _buttonReplaceAll_Click (object sender, EventArgs e) + { + _searchState = new ContainerRuleSearchStateWin(_main) { + RuleTags = _findController.Root, + RootNode = _mainSearchRoot, + DiscoverCallback = SearchDiscoveryReplaceAllCallback, + CollapseCallback = SearchCollapseCallback, + EndCallback = SearchEndCallback, + TerminateOnDiscover = false, + }; + + SearchNextNode(); + } + private void SearchNextNode () { if (_searchState == null) @@ -212,6 +227,22 @@ namespace NBTExplorer.Windows _currentFindNode = node; } + private void SearchDiscoveryReplaceAllCallback (DataNode node) + { + _mainController.SelectNode(node); + _mainController.ExpandSelectedNode(); + + _currentFindNode = node; + + ReplaceCurrent(); + } + + private void SearchProgressCallback (DataNode node) + { + if (node is TagCompoundDataNode && !string.IsNullOrEmpty(node.NodeName) && node.NodeName != _searchForm.SearchPathLabel) + _searchForm.SearchPathLabel = node.NodeName; + } + private void SearchCollapseCallback (DataNode node) { _mainController.CollapseBelow(node); @@ -230,6 +261,11 @@ namespace NBTExplorer.Windows private DataNode _currentFindNode; private void _buttonReplace_Click (object sender, EventArgs e) + { + ReplaceCurrent(); + } + + private void ReplaceCurrent () { TagCompoundDataNode node = _currentFindNode as TagCompoundDataNode; if (node == null) @@ -253,6 +289,11 @@ namespace NBTExplorer.Windows _mainController.RefreshTreeNode(node); } + private void _buttonCancel_Click (object sender, EventArgs e) + { + Close(); + } + private void _tbFindEdit_Click (object sender, EventArgs e) { //_findController.EditSelection(); @@ -262,8 +303,6 @@ namespace NBTExplorer.Windows { _replaceController.EditSelection(); } - - } public abstract class ContainerRuleSearchState : ISearchState @@ -272,12 +311,18 @@ namespace NBTExplorer.Windows public DataNode RootNode { get; set; } public IEnumerator State { get; set; } + public bool TerminateOnDiscover { get; set; } public abstract void InvokeDiscoverCallback (DataNode node); public abstract void InvokeProgressCallback (DataNode node); public abstract void InvokeCollapseCallback (DataNode node); public abstract void InvokeEndCallback (DataNode node); + protected ContainerRuleSearchState () + { + TerminateOnDiscover = true; + } + public bool TestNode (DataNode node) { if (RuleTags == null) diff --git a/Windows/FindReplace.resx b/Windows/FindReplace.resx index f4117de..adfa65b 100644 --- a/Windows/FindReplace.resx +++ b/Windows/FindReplace.resx @@ -125,7 +125,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABA - QgAAAk1TRnQBSQFMAgEBFAEAAWgBAQFoAQEBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA + QgAAAk1TRnQBSQFMAgEBFAEAAYABAQGAAQEBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA AwABYAMAAQEBAAEYBgABSP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AOEAA/8D/AP6GPgD+QP6A/wMAAP9 A/oS+AP5A/0D/2kAA/4D+QPxAboBogGKAbYBhgFWAbYBhgFWAbYBhgFWAbYBhgFWAbYBhgFWAbYBhgFW AbYBhgFWAbYBhgFWAbwBpAGNA/cMAAP8A/YD8wG8AcoBzQFVAZUBowFVAZUBowHQAdcB2QPzA/UD+wP/ @@ -443,48 +443,48 @@ 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 - JyzdqdCmE/4ZAAAAAElFTkSuQmCC + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAI8SURBVDhPzZHda1JxHMYPdddFFLRgXUaEsCC6ChYRvSBR + xECL3HpjtIvAQcTSkTIqp1bOjS5qDFNn5k6ohKRuNmfbXNpYLI6Wc6eV6RHPyzwObZdedR4zor+gfvDh + PDzf53N1iP/nXTOJsh6j6Lw+KOY777J1fHuMFTf4uxOd2Da1X+/inbyiS8fwOluZfxasfPO//VF84Bap + S4ZCGiCjww0bbOE0ZHnvsuzcTYq3kOUcGd2kPbFq1jVdXem25AKOcC0DkNHhhg22cOAS7V3zTrWR5j0z + 1eyLaC1Dxqqr/TZm1ujhkugAMjrcsEEHBy7RdjaYHya5Ndeb2ifgiW1+URlXQ/bXFerxKzFhIsszVq+w + cN6wEhzyrs8a3MKU2VOODo4zKbhEq9xfHw9vfLVPVijgjlSzZ3SpwLBPjOsdXBAM+cR5dFbvn+4hySfg + EntP+vNmF0OPBjY+Wn1i4hEpxpX3Pk+aSCHeb2dDALnRTazP/e76nuSX4BL7T085L+vTnOVl+Z3GxoYH + nPz0jZG12K2nuTmdoxQByOhw046xIXQXNKkCXOKAIik7pFwSeq0MpbWVIn1jxZDBxS10DKQj911cEiCj + w01rL0WwPdiR4OE2fmXbqeeKI1dooVPPMLdHSx/ME+yieuT78gl1hgbI6DTSDRts4TRk6W2V2NWyTyk/ + rHzvP9bNMMdVbP3o1WKhXUX5ADI63LDBFk7TJbZIbGsWeyRaJVokdkhsb7JTYrcEbthgCwfuP30E8RMF + 76m+HADFNQAAAABJRU5ErkJggg== iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIGSURBVDhPY6AZ2LWY2XnXYsa9ILxzMVM8VBg/2DKfQQLK - ZNg2j3Hf+9cTv395NuHPtgWMu6DCKGpQwMY5TAmb5jLu2zSXefnG2cweIPbvdzP/v71T+BchxrwcJA5S - C9WGABtmMu7//mry//cP278f3KB7HsT/9qL//8vzsT/WzWRcfXCNzvm31xuALur6D5KDakOA1ZOZDtw/ - Ef7j6ZXE/69uFf/fv0rjwvuHzf9vnwz8tA/Ifnmz4D9IDqQGpBaqDQGWT2SwWt7PuHLPCuWbJ7dZvHh0 - KfU/CN85Hfz/4cXk/yAxkBxIDUgtVBsmWNjF7LKgm+nQ4U1WH64d9fgPwiA2SAwkB1WGCWa3MljPaWNc - vWOl0c2Tm+1fXjns8h+Eb5zwB9PHNlu/3LFE6yZIDUgtVBsCTK1nOnL3RPSPWye9/18/5vJ/6SThyye3 - mH6+dy4MzAaJ3Tjh8f/cUZ8fILVQbQjQV8F09M5pl/+nD5n9WNQtdKW/knHD2cNmP+6fD/wPkgOJgeRA - akB8qDYEaC9gSGnJYTzRksu4Hsj2BtE3jtv/fXrF5z9IHCYGZadAtaECK0MGKSiToTKZ8djdM/Z/7x62 - /1mZxHgKKoyiBhvgBWJFIFb3s2eoqMvkuADC9iYMiSAxIFYGYgEgZgRirIADiMWAGGQLNiwOxFxAjNMA - EgEDAwCTAhzV5uBYSQAAAABJRU5ErkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIHSURBVDhPY6AZ2LWY2XnXYsa9ILxzMVM8VBg/2DKfQQLK + ZNg2j3Hf+9f93z8+7v2zbQHjLqgwihoUsHEOU8KmuYz7Ns1lXr5xNrMHiP373cz/r27m/UWIMS8HiYPU + QrUhwIaZjPu/v5r8//3D9u8HN+ieB/G/vej///JM9I91MxlXH1yjc/7tlYbvX551/QfJQbUhwOrJTAfu + nwj/8fRK4v9Xt4r/71+lceH9w+b/t08GftoHZL+8WfAfJAdSA1IL1YYAyycyWC3vZ1y5Z4XyzZPbLF48 + upT6H4TvnA7+//Bi8n+QGEgOpAakFqoNEyzsYnZZ0M106PAmqw/Xjnr8B2EQGyQGkoMqwwSzWxms57Qx + rt6x0ujmyc32L68cdvkPwjdO+IPpY5utX+5YonUTpAakFqoNAabWMx25eyL6x62T3v+vH3P5v3SS8OWT + W0w/3zsXBmaDxG6c8Ph/+qjPD5BaqDYE6KtgOnrntMv/E4fMfizqFrrSX8m44dRhsx/3zwf+B8mBxEBy + IDUgPlQbArQXMKS05DCeaMllXA9ke4Poq0fs/z694vMfJA4Tg7JToNpQgZUhgxSUyVCZzHjs1kn7v3cP + 2P+sTGI8BRVGUYMN8AKxIhCr+9kzVNRlclwAYXsThkSQGBArA7EAEDMCMVbAAcRiQAyyBRsWB2IuIMZp + AImAgQEAGUocntp9HGkAAAAASUVORK5CYII= @@ -734,12 +734,12 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFzSURBVDhPrdFPRINxHMfx7+MZHTtGhy6dOqfrFKOS0qGS - Sf8oIx1SjCbbOtRSJLaU0Q6tZ2yasY3ZypJFZTrUqcNsUVGyUowO+bXP/J6f57k9Uw9vD7/f5/VcHvqX - J+skU3baZDubkjfVnGbKa9PeYQvDOdHpeEPrtaPt6P1kg5Uznlp+W4cu9RwbbGE4J0pPyt333r6c9gOh - pS5RcMGs+wC2MJwTpSZM80VlrvQcdzG1hHtAFHX0iHOELQznRMkx2Ve5C/2wQpipFcJ2UX5/VpwjbGE4 - J4pb5b3v2wD7uvSJMp5hUdzVr7vDFoZzophV9ldu/OwjtyMCDNsttbey2Km7wxaGc6LIqBz4vNplb9kt - EbD2rQ1bGM6JQiPyYfl8m72k1w2FLQznRMEhSXmt/qKn5KqhsIXhnCgwKEUeE272EFsxFLYwnBN5e6VU - KepgxeNlQ2ELwzm1zLRLB2sW6aKeYGDxgcZqTdWa6wwG9i8P0S9ka92cta2x/QAAAABJRU5ErkJggg== + Sf8oIx1SjCbbOtRSJLaU0Q6tjU0zno3ZypJFZZJuHWaLipKVRnTIr33m9/w8z+2Zenh7+P0+r+fy0L88 + WSeZstMm29mUvKnmNFNem/YOWxjOiU7HG1qvHW1H7ycbrJzx1PLbOnSp59hgC8M5UXpS7r739uW0Hwgv + dYmCC2bdB7CF4ZwoNWGaL4bmSs+Ki6kl3AOimKNHnCNsYTgnSo7Jvspt+IcVIkytELGL8vuz4hxhC8M5 + kWKV977vAqxy6RNlPMMixdWvu8MWhnOiuFX2f9342UduRwQYsVtq79Bip+4OWxjOiaKjcuDzape9ZbdE + wNq3NmxhOCcKj8iH5fNt9pJeNxS2MJwTBYek0Gv1Fz0lVw2FLQznRIFBKfqYcLOH+IqhsIXhnMjbK6VK + MQcrHi8bClsYzqllpl06WLNIF/UEA4sPNFZrqtZcZzCwf3mIfgFEYd2QbOcxhgAAAABJRU5ErkJggg== \ No newline at end of file