Introduction
When I logged on to CodeProject this morning, the weekly poll asked the question, "How wide is your source code?". This led to a discussion in the forums, where Vikram posted a link to this article by Sara Ford:
The article details a little hack that you can make to the registry so that one or more "guidelines" can be dispalyed in Visual Studio. (See the image above for an example of what this looks like in the editor.) So the bottom line is, the end result of this article isn't really due to my own bright idea - the only original part of this is in creating a tool to perform the registry hack for you, with minimal effort on your part.
I won't bother to rehash the content of the article here, as you can read it freely from Sara's blog. I will simply address the tool, and what went into it.
The Tool
The tool is so simple it's almost silly to review it. It took me about 10 minutes to hack together from start to finish. (Update: with all the updates listed below, I'd say there is roughly five hours of work in this now.) Basically, it allows you to select a color to set the guidelines to, and to enter a list of column addresses to place the guidelines at. Click "Apply" and the changes are made. Click "Remove" and the changes are removed. It's a no brainer.
The changes are made through some simple calls to the registry.
private void btnApply_Click(object sender, EventArgs e)
{
if (txtPreview.Text != "" && txtLocations.Text != "")
{
RegistryKey key =
Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\" +
"VisualStudio\\8.0\\Text Editor", true);
key.SetValue("Guides", txtPreview.Text);
key.Close();
}
}
private void btnRemove_Click(object sender, EventArgs e)
{
RegistryKey delKey =
Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\" +
"VisualStudio\\8.0\\Text Editor", true);
delKey.DeleteValue("Guides");
dekKey.Close();
}
The IsNumeric Problem
C# is a wonderful language, but every now and then, you wander into a situation that leaves you scratching your head in disbelief. One of the things I wanted to do was to make sure that the list of guideline locations was a comma seperated list of integers. My first thought (being an old VB programmer at heart) was to simply Split()
the string and check to see if each value was a number by asking "IsNumeric()"? But lo and behold, C# has no such function! The Char
type has a similar function, but not String
.
My first attempt (and you might have downloaded this copy, see the update below) was to Split()
the string, and then "borrow" the function by stealing from VB, like this:
private bool IsNumeric(string value)
{
return Microsoft.VisualBasic.Information.IsNumeric(value);
}
That worked just fine for the most part, then I realized that you could still enter a value such a -9, or 9.5, and it would pass muster. While those values probably wouldn't hurt anything, they weren't helping it any either, so I came up with a new plan, and the one I should have gone with in the first place, using a regular expression to validate the input. Not only did this minimize a lot of code in my program, but it works better in the end.
private bool verifyLocations(string locations)
{
Regex regex = new Regex("^(\\d|,)*\\d*$");
return regex.IsMatch(locations.Replace(" ", ""));
}
Update (Aug 14, 2006)
This article and code has been updated since the initial release. The following features and changes have been implemented:
- Error checking is now included
- The preview textbox is readonly
- The preview textbox now correctly updates when you change the guideline locations
- The registry is now explicitly closed after each transaction, as reccomended in the comments below
- A help file is included
- Settings are persisted between sessions
- Error checking is now via Regex, much less coding and no VB reference required
- Program now reads in value from registry as requested in comments below
- More comments added to the source code
- Now handles VS 2003 & VS 2005
- Help greatly expanded
- UI changed to reflect new features
- Error handling now uses the ErrorProvider model and is handled more appropriately
- Some minor spelling errors corrected
- Reduced the size of the source file
- Added tab stops
- Max. # of guidelines is now enforced
- Bugfix: Preview color now displays correctly when loading from registry
- Bugfixes:
load()
- Bugfixes: several required null checks
Known Problems
The code is pretty solid now. The only known "bug" is that I don't currently check for maximum column values - you could enter 20,000 as a column, and unless you have a monitor that wraps around the entire room, you'd never see it. This being a developer tool, I felt it was uneccessary to spell this out.
Special Thanks
To all the people who made suggestions for this tool, especially to Gordon Brandly who suggested some of the UI updates and provided the code to make this work with VS2003. Also, thanks to those of you who put in a 5 vote for this article, I really appreciate it.
Disclaimer
This tool is free and open source, so do what you want with it. Giving me some credit somewhere, for it would be nice, but not required. It does make changes to your registry, so backup your registry before using it! I take no resonsibility for any damage caused to your system by this tool.