diff options
author | Mike Krüger <mkrueger@novell.com> | 2010-04-28 20:02:40 +0400 |
---|---|---|
committer | Mike Krüger <mkrueger@novell.com> | 2010-04-28 20:02:40 +0400 |
commit | ffad5535df09ac88f1448e003595dd9819b4e12b (patch) | |
tree | 133ba5a55994ecf98969c8a104e607b0637a0a93 /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion | |
parent | 8f4a95997837049e220f6427bc2401215913ba1a (diff) |
* MonoDevelop.Ide.CodeCompletion/ListWidget.cs:
* MonoDevelop.Ide.CodeCompletion/ListWindow.cs: Optimized performance
a bit.
svn path=/trunk/monodevelop/; revision=156340
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion')
-rw-r--r-- | main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ListWidget.cs | 46 | ||||
-rw-r--r-- | main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ListWindow.cs | 16 |
2 files changed, 42 insertions, 20 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ListWidget.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ListWidget.cs index 9dad0aa547..418c81775b 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ListWidget.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ListWidget.cs @@ -151,9 +151,12 @@ namespace MonoDevelop.Ide.CodeCompletion if (countCategories) curItem++; }, delegate (Category curCategory, int item, int ypos) { - if (item == itemNumber) + if (item == itemNumber) { result = curItem; + return false; + } curItem++; + return true; }); return result; } @@ -170,9 +173,12 @@ namespace MonoDevelop.Ide.CodeCompletion curItem++; } }, delegate (Category curCategory, int item, int ypos) { - if (curItem == index) + if (curItem == index) { result = item; + return false; + } curItem++; + return true; }); return result; @@ -322,6 +328,7 @@ namespace MonoDevelop.Ide.CodeCompletion window.DrawLayout (this.Style.TextGC (StateType.Normal), (Allocation.Width - width) / 2, yPos + (Allocation.Height - height - yPos) / 2, layout); return true; } + Iterate (true, ref yPos, delegate (Category category, int ypos) { if (ypos >= winHeight - margin) return; @@ -335,8 +342,9 @@ namespace MonoDevelop.Ide.CodeCompletion window.DrawLayout (this.Style.TextGC (StateType.Insensitive), icon.Width + 4, ypos, layout); layout.SetMarkup (""); }, delegate (Category curCategory, int item, int ypos) { + if (ypos >= winHeight - margin) - return; + return false; int itemIndex = filteredItems[item]; if (InCategoryMode && curCategory != null && curCategory.CompletionCategory != null) { xpos = margin + padding + 8; @@ -345,6 +353,7 @@ namespace MonoDevelop.Ide.CodeCompletion } string markup = win.DataProvider.HasMarkup (itemIndex) ? (win.DataProvider.GetMarkup (itemIndex) ?? "<null>") : GLib.Markup.EscapeText (win.DataProvider.GetText (itemIndex) ?? "<null>"); string description = win.DataProvider.GetDescription (itemIndex); + if (string.IsNullOrEmpty (description)) { layout.SetMarkup (markup); } else { @@ -356,9 +365,10 @@ namespace MonoDevelop.Ide.CodeCompletion } int mw, mh; layout.GetPixelSize (out mw, out mh); - if (mw > Allocation.Width) { + if (mw > listWidth) { WidthRequest = listWidth = mw; - win.Resize (win.Allocation.Width + mw - Allocation.Width, win.Allocation.Height); + win.WidthRequest = win.Allocation.Width + mw - Allocation.Width; + win.QueueResize (); } string text = win.DataProvider.GetText (itemIndex); @@ -409,6 +419,7 @@ namespace MonoDevelop.Ide.CodeCompletion layout.Attributes.Dispose (); layout.Attributes = null; } + return true; }); /* int n = 0; @@ -568,7 +579,7 @@ namespace MonoDevelop.Ide.CodeCompletion filteredItems.Clear (); categories.Clear (); for (int newSelection = 0; newSelection < win.DataProvider.ItemCount; newSelection++) { - if (Matches (CompletionString, win.DataProvider.GetText (newSelection))) { + if (string.IsNullOrEmpty (CompletionString) || Matches (CompletionString, win.DataProvider.GetText (newSelection))) { CompletionCategory completionCategory = win.DataProvider.GetCompletionCategory (newSelection); GetCategory (completionCategory).Items.Add (filteredItems.Count); filteredItems.Add (newSelection); @@ -649,7 +660,7 @@ namespace MonoDevelop.Ide.CodeCompletion const int spacing = 2; delegate void CategoryAction (Category category, int yPos); - delegate void ItemAction (Category curCategory, int item, int yPos); + delegate bool ItemAction (Category curCategory, int item, int yPos); void Iterate (bool startAtPage, ref int ypos, CategoryAction catAction, ItemAction action) { @@ -665,13 +676,18 @@ namespace MonoDevelop.Ide.CodeCompletion curItem++; } - IterateItems (category, startAtPage,ref ypos, ref curItem, action); + bool result = IterateItems (category, startAtPage,ref ypos, ref curItem, action); + if (!result) + break; } } else { for (int item = 0; item < filteredItems.Count; item++) { if (!startAtPage || curItem >= page) { - if (action != null) - action (null, item, ypos); + if (action != null) { + bool result = action (null, item, ypos); + if (!result) + break; + } ypos += rowHeight; } curItem++; @@ -679,16 +695,20 @@ namespace MonoDevelop.Ide.CodeCompletion } } - void IterateItems (Category category, bool startAtPage, ref int ypos, ref int curItem, ItemAction action) + bool IterateItems (Category category, bool startAtPage, ref int ypos, ref int curItem, ItemAction action) { foreach (int item in category.Items) { if (!startAtPage || curItem >= page) { - if (action != null) - action (category, item, ypos); + if (action != null) { + bool result = action (category, item, ypos); + if (!result) + return false; + } ypos += rowHeight; } curItem++; } + return true; } } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ListWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ListWindow.cs index 80c007080f..9e2c67b59a 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ListWindow.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ListWindow.cs @@ -451,12 +451,14 @@ namespace MonoDevelop.Ide.CodeCompletion int idx = -1; List<KeyValuePair<int, string>> words = new List<KeyValuePair<int, string>> (); - for (int i = 0; i < list.filteredItems.Count; i++) { - int index = list.filteredItems[i]; - string text = DataProvider.GetText (index); - if (!ListWidget.Matches (partialWord, text)) - continue; - words.Add (new KeyValuePair <int,string> (i, text)); + if (!string.IsNullOrEmpty (partialWord)) { + for (int i = 0; i < list.filteredItems.Count; i++) { + int index = list.filteredItems[i]; + string text = DataProvider.GetText (index); + if (!ListWidget.Matches (partialWord, text)) + continue; + words.Add (new KeyValuePair <int,string> (i, text)); + } } ListWindow.WordComparer comparer = new WordComparer (list.filteredItems, partialWord); @@ -469,7 +471,7 @@ namespace MonoDevelop.Ide.CodeCompletion return idx; } - if (partialWord != null && partialWord.Length < 2) { + if (string.IsNullOrEmpty (partialWord) || partialWord.Length >= 2) { // Search for history matches. for (int i = 0; i < wordHistory.Count; i++) { string historyWord = wordHistory[i]; |