DIFF a tree?
Add some humor into your code
{
_fixFileErrorCount++ ;
bool isLastTime = (_fixFileErrorCount == _maxFixFileErrorCount) ;
bool isNextToLastTime = (_fixFileErrorCount == _maxFixFileErrorCount - 1 ) ;
bool isNextToNextLastTime = (_fixFileErrorCount == _maxFixFileErrorCount - 2 ) ;
String message = null;
if (isNextToNextLastTime)
{
message =
"FIX FILE EXCEPTION (printer on fire): " + e.Message ;
}
else if (isNextToLastTime)
{
message =
"FIX FILE EXCEPTION (I was just kidding, the printer is not on fire): " + e.Message ;
}
else if (isLastTime)
{
message =
"FIX FILE EXCEPTION (ok, maybe you should check the printer): " + e.Message ;
}
else
{
message = "FIX FILE EXCEPTION: " + e.Message ;
}
Errors.Add(message) ;
}
SQL to CSV

The main interface for SQL to CSV.
File Text Box

Here is the text control with no file selected. The icon on the left is actually a browse button, which can be clicked at any time.

Start typing, and you get intellisense-like help.

Select a file from the list.

After selecting a file, the icon for that file displays.
Easter Eggs

Yay1.

Yay2.
Extensibility++

The two buttons are added at the bottom of the main user interface. The unverified button has
already been clicked.

After opening the record, the unverified fields are highlighted.

After opening the sub-record, the unverified fields are highlighted and default values are put in.

This tab is generated by the plugin. As you can see you can change the highlight color if you wanted to.
Extensibility
Still working on SAFE OBM Manager, which will have a name change soon. The main new feature I added was extensibility through plugins. To implement plugins, I scan the plugins directory underneath the application directory. Using reflection, each assembly is loaded and scanned for types that implement the plugin interfaces. Each type is instantiated and stored for use.
Furthermore, an assembly can be uploaded to the database so next time a client connects, they will download the plugin and be up-to-date when it comes to plugins. Naturally, the last time plugins were successfully downloaded is stored on the client's computer so the entire set of plugins will not be downloaded over and over. Below is a screen shot of the plugin manager page in order to upload / delete plugin assemblies.

The plugin manager.

The "World" and "Hello" buttons were added by the dynamically loaded plugins.
SAFE OBM Manager
-

When loaded initially you will be prompted with a connect to database dialog.
-

When connected, the main form will be displayed from where you can query "header tables".
-

Here are the entire contents of our test database
-

This screen pops up when you select an entry from the "header table".
-

When new is clicked this form is created.
-

When open is clicked this form is created and the data populated.
-

Generic settings for the options dialog.
-

Here you can tell the program to forget some questions it already asked you.
-

Here are the settings for the designer. Yes that's right a designer.
-

Here is the designer. It lets you lay out the query screen and save this information back to the database. As you can see each set of controls is basically associated with a column in the database. Based on which datatype a column is determines what control is displayed for the query window. For instance, "List Name" is of type list in which you can perform a SELECT query in order to pull results into a combo box.
-

As you can see in this image, there is also support for a datetime datatype in which a BETWEEN can be used. The items in red indicate that they are not visible when in the real query window.
-

This form allows you to edit all child tables as well as header tables (without a design view). Because only header tables are displayed as the query window.
SAFE Swift Report Services
Wormy!
Burninate SAFE Swift Reports
Burninate SAFE Swift Reports

The main form for SAFE Swift Reports

The menu is built dynamically from the database

What the selection criteria looks like for a report

The selection criteria form is pseudo-generated by what is stored in the database
SAFE Swift Reports
The past two days have been hardcore programming trying to get the fat front-end of a C++ program converted to .NET. In two days we have been able to convert probably over half of the functionality and features over. The reason for hardcore converting is my company actually sold the software which was written over 5 years ago and was never really tested / completed.
I am not complaining by any means necessary, especially since we have about 2 months to get it working. I kind of actually like working under pressure and I always love starting new projects. However, I hardly ever finish any of the projects I start for some reason.
My First Firefox Extension
I created my first Firefox extension today for the HTML annotator I am working on for my job. All the extension does is install a menu item and a toolbar item. When either is clicked, it simply opens a new tab sending the URL to the annotation engine. Below are a couple of images of the extension. Getting the extension to work was fairly easy once you start with a set of skeleton code. In total it probably took me a couple of hours to get the extension to work.
I will post more information about the HTML annotator soon.

Add-ons dialog.

Firefox's toolbar

Settings dialog.