From e8837fcfbf7f8dad0169fc5dd3341559101d2497 Mon Sep 17 00:00:00 2001 From: Edu Serna <4188725+eduserna@users.noreply.github.com> Date: Sun, 25 Mar 2018 15:57:21 +0200 Subject: [PATCH] Add Search functionality --- MainForm.Designer.cs | 121 +++++++++++++++++---------- MainForm.cs | 46 +++++++++- ReadMe.txt | 4 +- XSDDiagrams/Rendering/Diagram.cs | 78 ++++++++++++++++- XSDDiagrams/Rendering/DiagramItem.cs | 8 +- 5 files changed, 205 insertions(+), 52 deletions(-) diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index c6b1942..58a5009 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -21,10 +21,10 @@ namespace XSDDiagram this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openURLToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.saveDiagramToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.validateXMLFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.generateSampleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.inferXSDFromXMLToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveDiagramToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.generateSampleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.validateXMLFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.recentFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.closeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); @@ -61,10 +61,14 @@ namespace XSDDiagram this.toolStripButtonShowDocumentation = new System.Windows.Forms.ToolStripButton(); this.toolStripButtonTogglePanel = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripTextBoxSearch = new System.Windows.Forms.ToolStripTextBox(); + this.toolStripButtonSearch = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripButtonAbout = new System.Windows.Forms.ToolStripButton(); this.splitContainerMain = new System.Windows.Forms.SplitContainer(); this.tabControlView = new System.Windows.Forms.TabControl(); this.tabPageDiagram = new System.Windows.Forms.TabPage(); + this.panelDiagram = new XSDDiagram.DiagramControlContainer(); this.splitContainerDiagramElement = new System.Windows.Forms.SplitContainer(); this.tabControlElement = new System.Windows.Forms.TabControl(); this.tabPageElementAttibutes = new System.Windows.Forms.TabPage(); @@ -104,7 +108,6 @@ namespace XSDDiagram this.expandOneLevelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.textBoxElementPath = new System.Windows.Forms.TextBox(); this.toolTip = new System.Windows.Forms.ToolTip(this.components); - this.panelDiagram = new XSDDiagram.DiagramControlContainer(); this.menuStripMain.SuspendLayout(); this.statusStripMain.SuspendLayout(); this.toolStripMain.SuspendLayout(); @@ -176,6 +179,13 @@ namespace XSDDiagram this.openURLToolStripMenuItem.Text = "Open &URL..."; this.openURLToolStripMenuItem.Click += new System.EventHandler(this.openURLToolStripMenuItem_Click); // + // inferXSDFromXMLToolStripMenuItem + // + this.inferXSDFromXMLToolStripMenuItem.Name = "inferXSDFromXMLToolStripMenuItem"; + this.inferXSDFromXMLToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.inferXSDFromXMLToolStripMenuItem.Text = "Infer XSD from XML..."; + this.inferXSDFromXMLToolStripMenuItem.Click += new System.EventHandler(this.inferXSDFromXMLToolStripMenuItem_Click); + // // saveDiagramToolStripMenuItem // this.saveDiagramToolStripMenuItem.Image = global::XSDDiagram.Properties.Resources.SaveGreen; @@ -185,13 +195,6 @@ namespace XSDDiagram this.saveDiagramToolStripMenuItem.Text = "&Export Diagram..."; this.saveDiagramToolStripMenuItem.Click += new System.EventHandler(this.saveDiagramToolStripMenuItem_Click); // - // validateXMLFileToolStripMenuItem - // - this.validateXMLFileToolStripMenuItem.Name = "validateXMLFileToolStripMenuItem"; - this.validateXMLFileToolStripMenuItem.Size = new System.Drawing.Size(204, 22); - this.validateXMLFileToolStripMenuItem.Text = "&Validate XML File..."; - this.validateXMLFileToolStripMenuItem.Click += new System.EventHandler(this.validateXMLFileToolStripMenuItem_Click); - // // generateSampleToolStripMenuItem // this.generateSampleToolStripMenuItem.Name = "generateSampleToolStripMenuItem"; @@ -200,12 +203,12 @@ namespace XSDDiagram this.generateSampleToolStripMenuItem.Visible = false; this.generateSampleToolStripMenuItem.Click += new System.EventHandler(this.generateSampleToolStripMenuItem_Click); // - // inferXSDFromXMLToolStripMenuItem + // validateXMLFileToolStripMenuItem // - this.inferXSDFromXMLToolStripMenuItem.Name = "inferXSDFromXMLToolStripMenuItem"; - this.inferXSDFromXMLToolStripMenuItem.Size = new System.Drawing.Size(204, 22); - this.inferXSDFromXMLToolStripMenuItem.Text = "Infer XSD from XML..."; - this.inferXSDFromXMLToolStripMenuItem.Click += new System.EventHandler(this.inferXSDFromXMLToolStripMenuItem_Click); + this.validateXMLFileToolStripMenuItem.Name = "validateXMLFileToolStripMenuItem"; + this.validateXMLFileToolStripMenuItem.Size = new System.Drawing.Size(204, 22); + this.validateXMLFileToolStripMenuItem.Text = "&Validate XML File..."; + this.validateXMLFileToolStripMenuItem.Click += new System.EventHandler(this.validateXMLFileToolStripMenuItem_Click); // // recentFilesToolStripMenuItem // @@ -267,7 +270,7 @@ namespace XSDDiagram this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.windowsExplorerRegistrationToolStripMenuItem}); this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem"; - this.toolsToolStripMenuItem.Size = new System.Drawing.Size(48, 20); + this.toolsToolStripMenuItem.Size = new System.Drawing.Size(47, 20); this.toolsToolStripMenuItem.Text = "&Tools"; // // windowsExplorerRegistrationToolStripMenuItem @@ -309,7 +312,7 @@ namespace XSDDiagram // this.nextTabToolStripMenuItem.Name = "nextTabToolStripMenuItem"; this.nextTabToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Tab))); - this.nextTabToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.nextTabToolStripMenuItem.Size = new System.Drawing.Size(240, 22); this.nextTabToolStripMenuItem.Text = "&Next Tab"; this.nextTabToolStripMenuItem.Click += new System.EventHandler(this.nextTabToolStripMenuItem_Click); // @@ -318,7 +321,7 @@ namespace XSDDiagram this.previousTabToolStripMenuItem.Name = "previousTabToolStripMenuItem"; this.previousTabToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.Tab))); - this.previousTabToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.previousTabToolStripMenuItem.Size = new System.Drawing.Size(240, 22); this.previousTabToolStripMenuItem.Text = "&Previous Tab"; this.previousTabToolStripMenuItem.Click += new System.EventHandler(this.previousTabToolStripMenuItem_Click); // @@ -374,6 +377,9 @@ namespace XSDDiagram this.toolStripButtonShowDocumentation, this.toolStripButtonTogglePanel, this.toolStripSeparator4, + this.toolStripTextBoxSearch, + this.toolStripButtonSearch, + this.toolStripSeparator3, this.toolStripButtonAbout}); this.toolStripMain.Location = new System.Drawing.Point(0, 24); this.toolStripMain.Name = "toolStripMain"; @@ -567,6 +573,30 @@ namespace XSDDiagram this.toolStripSeparator4.Name = "toolStripSeparator4"; this.toolStripSeparator4.Size = new System.Drawing.Size(6, 25); // + // toolStripTextBoxSearch + // + this.toolStripTextBoxSearch.AcceptsReturn = true; + this.toolStripTextBoxSearch.Name = "toolStripTextBoxSearch"; + this.toolStripTextBoxSearch.Size = new System.Drawing.Size(100, 25); + this.toolStripTextBoxSearch.ToolTipText = "Search elements showed in the Diagram"; + this.toolStripTextBoxSearch.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.toolStripTextBoxSearch_KeyPress); + // + // toolStripButtonSearch + // + this.toolStripButtonSearch.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonSearch.Image = global::XSDDiagram.Properties.Resources.Search; + this.toolStripButtonSearch.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonSearch.Name = "toolStripButtonSearch"; + this.toolStripButtonSearch.Size = new System.Drawing.Size(23, 22); + this.toolStripButtonSearch.Text = "toolStripButton1"; + this.toolStripButtonSearch.ToolTipText = "Search"; + this.toolStripButtonSearch.Click += new System.EventHandler(this.toolStripButtonSearch_Click); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(6, 25); + // // toolStripButtonAbout // this.toolStripButtonAbout.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; @@ -620,6 +650,23 @@ namespace XSDDiagram this.tabPageDiagram.Text = "Diagram"; this.tabPageDiagram.UseVisualStyleBackColor = true; // + // panelDiagram + // + this.panelDiagram.AllowDrop = true; + this.panelDiagram.AutoScroll = true; + this.panelDiagram.BackColor = System.Drawing.Color.WhiteSmoke; + this.panelDiagram.CausesValidation = false; + this.panelDiagram.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelDiagram.Location = new System.Drawing.Point(0, 0); + this.panelDiagram.Margin = new System.Windows.Forms.Padding(0); + this.panelDiagram.Name = "panelDiagram"; + this.panelDiagram.Size = new System.Drawing.Size(650, 499); + this.panelDiagram.TabIndex = 0; + this.panelDiagram.VirtualPoint = new System.Drawing.Point(0, 0); + this.panelDiagram.VirtualSize = new System.Drawing.Size(10, 10); + this.panelDiagram.DragDrop += new System.Windows.Forms.DragEventHandler(this.panelDiagram_DragDrop); + this.panelDiagram.DragEnter += new System.Windows.Forms.DragEventHandler(this.panelDiagram_DragEnter); + // // splitContainerDiagramElement // this.splitContainerDiagramElement.Dock = System.Windows.Forms.DockStyle.Fill; @@ -898,14 +945,14 @@ namespace XSDDiagram this.removeAllToolStripMenuItem, this.expandOneLevelToolStripMenuItem}); this.contextMenuStripDiagram.Name = "contextMenuStripDiagram"; - this.contextMenuStripDiagram.Size = new System.Drawing.Size(266, 142); + this.contextMenuStripDiagram.Size = new System.Drawing.Size(265, 142); this.contextMenuStripDiagram.Opened += new System.EventHandler(this.contextMenuStripDiagram_Opened); // // gotoXSDFileToolStripMenuItem // this.gotoXSDFileToolStripMenuItem.Image = global::XSDDiagram.Properties.Resources.Move; this.gotoXSDFileToolStripMenuItem.Name = "gotoXSDFileToolStripMenuItem"; - this.gotoXSDFileToolStripMenuItem.Size = new System.Drawing.Size(265, 22); + this.gotoXSDFileToolStripMenuItem.Size = new System.Drawing.Size(264, 22); this.gotoXSDFileToolStripMenuItem.Text = "&Goto XSD File"; this.gotoXSDFileToolStripMenuItem.Click += new System.EventHandler(this.gotoXSDFileToolStripMenuItem_Click); // @@ -913,7 +960,7 @@ namespace XSDDiagram // this.expandToolStripMenuItem.Image = global::XSDDiagram.Properties.Resources.Expand; this.expandToolStripMenuItem.Name = "expandToolStripMenuItem"; - this.expandToolStripMenuItem.Size = new System.Drawing.Size(265, 22); + this.expandToolStripMenuItem.Size = new System.Drawing.Size(264, 22); this.expandToolStripMenuItem.Text = "E&xpand / Collapse [SPACE or RIGHT]"; this.expandToolStripMenuItem.Click += new System.EventHandler(this.expandToolStripMenuItem_Click); // @@ -921,20 +968,20 @@ namespace XSDDiagram // this.removeFromDiagramToolStripMenuItem.Image = global::XSDDiagram.Properties.Resources.Minus; this.removeFromDiagramToolStripMenuItem.Name = "removeFromDiagramToolStripMenuItem"; - this.removeFromDiagramToolStripMenuItem.Size = new System.Drawing.Size(265, 22); + this.removeFromDiagramToolStripMenuItem.Size = new System.Drawing.Size(264, 22); this.removeFromDiagramToolStripMenuItem.Text = "&Remove From Diagram [DEL]"; this.removeFromDiagramToolStripMenuItem.Click += new System.EventHandler(this.removeFromDiagramToolStripMenuItem_Click); // // toolStripMenuItem3 // this.toolStripMenuItem3.Name = "toolStripMenuItem3"; - this.toolStripMenuItem3.Size = new System.Drawing.Size(262, 6); + this.toolStripMenuItem3.Size = new System.Drawing.Size(261, 6); // // addAllToolStripMenuItem // this.addAllToolStripMenuItem.Image = global::XSDDiagram.Properties.Resources.PlusPlus; this.addAllToolStripMenuItem.Name = "addAllToolStripMenuItem"; - this.addAllToolStripMenuItem.Size = new System.Drawing.Size(265, 22); + this.addAllToolStripMenuItem.Size = new System.Drawing.Size(264, 22); this.addAllToolStripMenuItem.Text = "Add &All"; this.addAllToolStripMenuItem.Click += new System.EventHandler(this.toolStripButtonAddAllToDiagram_Click); // @@ -942,7 +989,7 @@ namespace XSDDiagram // this.removeAllToolStripMenuItem.Image = global::XSDDiagram.Properties.Resources.Delete; this.removeAllToolStripMenuItem.Name = "removeAllToolStripMenuItem"; - this.removeAllToolStripMenuItem.Size = new System.Drawing.Size(265, 22); + this.removeAllToolStripMenuItem.Size = new System.Drawing.Size(264, 22); this.removeAllToolStripMenuItem.Text = "&Remove All"; this.removeAllToolStripMenuItem.Click += new System.EventHandler(this.toolStripButtonRemoveAllFromDiagram_Click); // @@ -950,7 +997,7 @@ namespace XSDDiagram // this.expandOneLevelToolStripMenuItem.Image = global::XSDDiagram.Properties.Resources.Expand; this.expandOneLevelToolStripMenuItem.Name = "expandOneLevelToolStripMenuItem"; - this.expandOneLevelToolStripMenuItem.Size = new System.Drawing.Size(265, 22); + this.expandOneLevelToolStripMenuItem.Size = new System.Drawing.Size(264, 22); this.expandOneLevelToolStripMenuItem.Text = "&Expand All One Level"; this.expandOneLevelToolStripMenuItem.Click += new System.EventHandler(this.expandOneLevelToolStripMenuItem_Click); // @@ -969,23 +1016,6 @@ namespace XSDDiagram this.toolTip.OwnerDraw = true; this.toolTip.ShowAlways = true; // - // panelDiagram - // - this.panelDiagram.AllowDrop = true; - this.panelDiagram.AutoScroll = true; - this.panelDiagram.BackColor = System.Drawing.Color.WhiteSmoke; - this.panelDiagram.CausesValidation = false; - this.panelDiagram.Dock = System.Windows.Forms.DockStyle.Fill; - this.panelDiagram.Location = new System.Drawing.Point(0, 0); - this.panelDiagram.Margin = new System.Windows.Forms.Padding(0); - this.panelDiagram.Name = "panelDiagram"; - this.panelDiagram.Size = new System.Drawing.Size(650, 499); - this.panelDiagram.TabIndex = 0; - this.panelDiagram.VirtualPoint = new System.Drawing.Point(0, 0); - this.panelDiagram.VirtualSize = new System.Drawing.Size(10, 10); - this.panelDiagram.DragDrop += new System.Windows.Forms.DragEventHandler(this.panelDiagram_DragDrop); - this.panelDiagram.DragEnter += new System.Windows.Forms.DragEventHandler(this.panelDiagram_DragEnter); - // // MainForm // this.AllowDrop = true; @@ -1123,6 +1153,9 @@ namespace XSDDiagram private System.Windows.Forms.ToolStripMenuItem expandToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem generateSampleToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem inferXSDFromXMLToolStripMenuItem; + private System.Windows.Forms.ToolStripButton toolStripButtonSearch; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripTextBox toolStripTextBoxSearch; } } diff --git a/MainForm.cs b/MainForm.cs index c7701bb..5f2094d 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -546,7 +546,11 @@ namespace XSDDiagram resultElement.ShowChildElements = true; } else - resultElement.ShowChildElements ^= true; + { + this.diagram.ClearSearch(); + resultElement.ShowChildElements ^= true; + } + //UpdateDiagram(); //this.panelDiagram.ScrollTo(this.diagram.ScalePoint(resultElement.Location), true); @@ -1496,7 +1500,10 @@ namespace XSDDiagram element.ShowChildElements = true; } else + { + this.diagram.ClearSearch(); element.ShowChildElements ^= true; + } UpdateDiagram(); this.panelDiagram.ScrollTo(this.diagram.ScalePoint(element.Location), true); } @@ -1682,12 +1689,49 @@ namespace XSDDiagram UpdateDiagram(); } + private void toolStripButtonSearch_Click(object sender, EventArgs e) + { + Search(); + } + + private void toolStripTextBoxSearch_KeyPress(object sender, KeyPressEventArgs e) + { + if ((int)e.KeyChar == (int)Keys.Enter) + { + Search(); + e.Handled = true; + } + } + + + private void Search() + { + var searchedItem = this.diagram.Search(toolStripTextBoxSearch.Text); + if (searchedItem != null) + { + SelectDiagramElement(searchedItem); + UpdateDiagram(); + this.panelDiagram.ScrollTo(this.diagram.ScalePoint(searchedItem.Location), true); + this.toolStripStatusLabel1.Text = "Search: '" + toolStripTextBoxSearch.Text + "' (" + this.diagram.ActualSearchHit + " of " + this.diagram.SearchHits + " hits)"; + } + else + { + this.toolStripStatusLabel1.Text = "Find: Can't find the text '" + toolStripTextBoxSearch.Text + "'"; + } + } + + private void MainForm_KeyUp(object sender, KeyEventArgs e) { if (e.Control && (e.KeyCode == Keys.D0 || e.KeyCode == Keys.NumPad0)) { this.toolStripComboBoxZoom.SelectedIndex = 8; } + else if (e.Control && (e.KeyCode == Keys.F)) + { + this.toolStripTextBoxSearch.SelectAll(); + this.toolStripTextBoxSearch.Focus(); + } } diff --git a/ReadMe.txt b/ReadMe.txt index f537784..8d623ae 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -20,6 +20,7 @@ FEATURES: - Registration in the Windows Explorer contextual menu (for Windows administrator only) - Drag'n drop a xsd file or url on the main window header - Command line image generation +- Find showed elements in Diagram QUICK START: @@ -138,7 +139,7 @@ TODO LIST: CHANGES: -version 1.2alpha (2017-09-??) +version 1.2alpha (2018-03-??) - Add infer XSD from XML menu. - Fix a null reference exception in the documentation (Thanks Mario M.). - Add the namespace in the command line option -r (Thanks Kevin). @@ -147,6 +148,7 @@ version 1.2alpha (2017-09-??) - Fix the URL escaping in the import (https://github.com/dgis/xsddiagram/issues/11). - Add the attributes of an element with the option -a for text output only. - Fix bad case sensitivity to reference the elements (https://github.com/dgis/xsddiagram/issues/15). +- Add search functionality of showed elements (shortcut Ctrl+F) version 1.1 (2016-07-08) - Fix SVG page size. diff --git a/XSDDiagrams/Rendering/Diagram.cs b/XSDDiagrams/Rendering/Diagram.cs index 2ee1053..348fb57 100644 --- a/XSDDiagrams/Rendering/Diagram.cs +++ b/XSDDiagrams/Rendering/Diagram.cs @@ -9,6 +9,7 @@ // Authors: // Regis Cosnier (Initial developer) // Paul Selormey (Refactoring) +// Edu Serna (Add Search Functionality) using System; using System.Drawing; @@ -40,6 +41,9 @@ namespace XSDDiagram.Rendering private IDictionary _elementsByName; private List _rootElements; private DiagramItem _selectedElement; + private String _lastSearchText; + private int _lastSearchHitElementIndex; + private List _lastSearchHitElements; private XMLSchema.any _fakeAny; @@ -58,6 +62,10 @@ namespace XSDDiagram.Rendering _rootElements = new List(); _selectedElement = null; _elementsByName = new Dictionary(); // StringComparer.OrdinalIgnoreCase); + _lastSearchText = String.Empty; + _lastSearchHitElementIndex = 0; + _lastSearchHitElements = new List(); + } #endregion @@ -83,6 +91,9 @@ namespace XSDDiagram.Rendering public List RootElements { get { return _rootElements; } } public DiagramItem SelectedElement { get { return _selectedElement; } } + public int SearchHits { get { return _lastSearchHitElements.Count; } } + public int ActualSearchHit { get { return _lastSearchHitElementIndex + 1; } } + #endregion #region Public Events @@ -115,7 +126,8 @@ namespace XSDDiagram.Rendering public DiagramItem AddElement(DiagramItem parentDiagramElement, XMLSchema.element childElement, string nameSpace) { - if (childElement != null) + ClearSearch(); + if (childElement != null) { DiagramItem childDiagramElement = new DiagramItem(); @@ -221,7 +233,8 @@ namespace XSDDiagram.Rendering XMLSchema.complexType childElement, bool isReference, string nameSpace) { - if (childElement != null) + ClearSearch(); + if (childElement != null) { DiagramItem childDiagramElement = new DiagramItem(); childDiagramElement.Diagram = this; @@ -338,7 +351,8 @@ namespace XSDDiagram.Rendering XMLSchema.group childGroup, DiagramItemGroupType type, string nameSpace) { - if (childGroup != null) + ClearSearch(); + if (childGroup != null) { DiagramItem childDiagramGroup = new DiagramItem(); childDiagramGroup.ItemType = DiagramItemType.group; @@ -403,6 +417,7 @@ namespace XSDDiagram.Rendering public void Remove(DiagramItem element) { + ClearSearch(); if (element.Parent == null) _rootElements.Remove(element); else @@ -415,6 +430,7 @@ namespace XSDDiagram.Rendering public void RemoveAll() { + ClearSearch(); _rootElements.Clear(); } @@ -436,6 +452,58 @@ namespace XSDDiagram.Rendering _elementsByName.Clear(); _rootElements.Clear(); _selectedElement = null; + ClearSearch(); + } + + public void ClearSearch() + { + _lastSearchText = String.Empty; + _lastSearchHitElements.Clear(); + } + + public DiagramItem Search(String text) + { + if (String.IsNullOrEmpty(text)) return null; + text = text.ToLowerInvariant(); + if (text == _lastSearchText) + { + _lastSearchHitElementIndex++; + if (_lastSearchHitElementIndex >= _lastSearchHitElements.Count) + { + _lastSearchHitElementIndex = 0; + } + return _lastSearchHitElements[_lastSearchHitElementIndex]; + } + else + { + _lastSearchHitElementIndex = 0; + _lastSearchHitElements.Clear(); + Search(text, _rootElements); + if (_lastSearchHitElements.Count == 0) + { + return null; + } + else + { + _lastSearchText = text; + return _lastSearchHitElements[_lastSearchHitElementIndex]; + } + } + } + + private void Search(String text, IList items) + { + foreach (var item in items) + { + if (item.Name.ToLowerInvariant().Contains(text)) + { + _lastSearchHitElements.Add(item); + } + if (item.HasChildElements && item.ShowChildElements) + { + Search(text, item.ChildElements); + } + } } public void Layout(Graphics g) @@ -526,7 +594,8 @@ namespace XSDDiagram.Rendering public void ExpandChildren(DiagramItem parentDiagramElement) { - if (parentDiagramElement.ItemType == DiagramItemType.element || parentDiagramElement.ItemType == DiagramItemType.type) + ClearSearch(); + if (parentDiagramElement.ItemType == DiagramItemType.element || parentDiagramElement.ItemType == DiagramItemType.type) { DiagramItem diagramElement = parentDiagramElement; if (diagramElement.TabSchema is XMLSchema.element) @@ -852,6 +921,7 @@ namespace XSDDiagram.Rendering private void ExpandOneLevel(DiagramItem parentItem) { + ClearSearch(); foreach (DiagramItem item in parentItem.ChildElements) { this.ExpandOneLevel(item); diff --git a/XSDDiagrams/Rendering/DiagramItem.cs b/XSDDiagrams/Rendering/DiagramItem.cs index 3ed1727..19bad24 100644 --- a/XSDDiagrams/Rendering/DiagramItem.cs +++ b/XSDDiagrams/Rendering/DiagramItem.cs @@ -262,8 +262,12 @@ namespace XSDDiagram.Rendering return _showChildElements; } set - { - _showChildElements = value; + { + if (_showChildElements != value) + { + _showChildElements = value; + this._diagram.ClearSearch(); + } } }