I''ve been using the Addkeyword method to add syntax highlighting dynamically, and find that this method seems to take an unreasonable amount of time.
Inserting say 130 keywords takes around 10 seconds even on a 3GHz machine. Strangely, adding the same keywords a second time takes virtually no time. Is the control performing some sort of horrible insertion sort? Is there a way to stop it until all the keywords have been loaded?
Is there a quick way to remove all keywords, or do I have to remove them one at a time?
Thanks for any advice.
David Loomes
GP
Gurucharan Patwal
Syncfusion Team
December 4, 2003 10:10 PM UTC
Hi David,
We are unable to be specific, but one of the possible reasons could be that EditControl "refreshes" it''s internal data structures for each Add and Remove keywords call. Looks like a "suspend refresh" property will be of a big help in the EditControl. We will try our best to add such a property in our future releases.
Regards,
Guru Patwal
Syncfusion, Inc.
DL
David Loomes
December 5, 2003 08:32 AM UTC
Guru,
Thanks for the info. I did some more testing and I''m afraid the figures aren''t very good.
Adding the first 5 keywords takes around 30ms on a 3.2GHz P4! As keywords are added, the time to add each new one rises linearly, so that by the time there are 100 keywords, adding another 5 to the list takes 300ms. Once the list has reached 130, each new keyword requires >100ms.
The net result is the time taken to build a keyword list with N entries increase with N^2. The order in which the keywords are added makes no noticeable difference.
I''m afraid this behaviour isn''t terribly useful.
David Loomes
GP
Gurucharan Patwal
Syncfusion Team
December 5, 2003 08:26 PM UTC
Hi David,
Thanks for the additional information. We do realise that this needs to be addressed at the earliest and have considered it as a high priority issue. I will keep updated regarding the developments as we investigate this. We appreciate your patience and understanding in this matter.
Regards,
Guru Patwal
Syncfusion, Inc.
DL
David Loomes
December 6, 2003 05:03 PM UTC
Guru,
a related problem. To get round the time taken to add keywords, I tried generating a complete INI file dynamically, and using the ''FromStream'' function to load the stream.
This works with the required speed, but extended characters (Chinese, Japanese etc) are not recognised. Odd, since they work correctly if added individually via AddKeyword.
It would be nice if your guys could sort this out too.
David Loomes
GP
Gurucharan Patwal
Syncfusion Team
December 8, 2003 07:15 PM UTC
Hi David,
Thanks for your feedback on these finer issues. We will look into the problem in handling the extended characters as well. We appreciate your continued interest in Syncfusion products.
Regards,
Guru Patwal.
Syncfusion, Inc.
ME
Marco Ensing
February 2, 2004 06:22 PM UTC
What is the current status on this issue with respect to the lattest release
Marco
AD
Administrator
Syncfusion Team
February 3, 2004 08:49 PM UTC
Hi Marco,
I have requested the development team for information on the status of this issue, and will update you as soon as they get back to me. Thanks for your patience and cooperation.
Regards,
Guru Patwal
Syncfusion, Inc.
ME
Marco Ensing
February 5, 2004 08:20 PM UTC
I''ve implemented the suggested workaround as a memory stream. Works great. No complaints. But I can image that new users might find the writing of the workaround cumbersome.
Here is the code for anybody out there looking for it:
Create a default .ini file and compile it into the assembly as a resource.
assume:
Terms.ini file has your initial settings.
executingAssembly = Assembly.GetExecutingAssembly();
internal System.IO.Stream ExtendIniFile(System.Collections.ICollection terms)
{
System.IO.Stream iniStream = executingAssembly.GetManifestResourceStream("YourAssembly.Terms.ini");
//Build the extension
string extension;
System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
foreach (string item in terms)
{
stringBuilder.AppendFormat("Keyword={0}\n", item);
}
extension = stringBuilder.ToString();
//Memory stream is initial lenght + extension
System.IO.MemoryStream memoryStream = new System.IO.MemoryStream((int) iniStream.Length + (int) extension.Length);
System.IO.BinaryReader reader = new System.IO.BinaryReader(iniStream);
byte[] buffer = reader.ReadBytes((int) iniStream.Length);
memoryStream.Write(buffer, 0, (int) iniStream.Length);
byte[] buffer2 = System.Text.Encoding.Default.GetBytes(extension);
memoryStream.Write(buffer2, 0, (int) extension.Length);
memoryStream.Flush();
//For quick testing
FileStream fs = new FileStream(@"C:\RESULT.INI", FileMode.OpenOrCreate);
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default);
memoryStream.WriteTo(sw.BaseStream);
sw.Close();
memoryStream.Position = 0;
return memoryStream;
}
And the EditControl is initialized with
this.editControl1.UseSettingStream(this.resourceHandler.ExtendIniFile(dataService.getTermLookupTable().Keys));
I don''t know too much about streams but it does the Job. I''m not too sure yet about the used encoding and if that influences the editControl.
Regards,
Marco
AD
Administrator
Syncfusion Team
February 5, 2004 09:16 PM UTC
Hi Marco,
Thanks for sharing this information with us. We apreciate your continued interest in Syncfusion products.
Regards,
Guru Patwal
Syncfusion, Inc.