Good results with Visual Studio 2008 so far

I installed the 90-day trial of Visual Studio 2008 Professional and have just finished getting Paint.NET to work in it. So far, here’s what I’ve run in to, good and bad:

  • The new version of the C# compiler (csc.exe) produces slightly smaller binaries in a few cases. This is good.
  • It can also understand “Vista icons”. That is, you can embed a 256×256 icon with PNG compression into an EXE. With Visual Studio 2005 you could have a 256×256 icon but not the PNG compression or you’d get a compiler error.
  • Apparently the order in which items is returned via reflection has changed. This in itself is fine, but it has exposed a logic bug in my IndirectUI code! It’s a rather subtle bug that is very obvious once you understand it. This was a case where things were accidentally working because “A” had a superset of the properties that “B” had, and my system was always taking the first item’s list of properties and using it for both (which was the bug). Now for some reason, “B” comes before “A”, so “A” is only getting the 2 properties that “B” specifies instead of the 7 that “A” is stating. Oops.
  • They fixed the build parallelism bug that was really biting me! In Visual Studio 2005, the part of the build which created MSI’s using the built-in “Setup Wizard” project type would not block the rest of your build which was properly flagged as dependeing on it, from building. This caused a major race condition for building the MSI and then building the self-extracting EXE that bundled it. To work around that I had to set the maximum build tasks to 1. Now it works great!

These are all good for me. Faster build times and smaller files to distribute.

Follow up for Slashdot and Source Code Release

First off, welcome Slashdot readers! 🙂 http://developers.slashdot.org/developers/07/12/15/1332207.shtml

I just got done approving all your comments after waking up from a nice 10 hour sleep (yay weekends). Many are supporting, some are not so kind. I’m approving any comment that is non-spam (“free casino games!”), although if there are cuss words I am redacting those portions with asterisks. I’m not trying to censor discussion that I disagree with, in other words.

Anyway, to clarify: I am not closing Paint.NET’s source code. I am still releasing the source code for Paint.NET v3.20. I have the zip file right here (well, 7z file ;)) and I just have to wake up first (not want decaf!) and do uploadings and e-mails and HTML stuff to publish it. The only thing being removed is the installer, and the translated string resource files. The license has changed to move the resource assets under a Creative Commons license. That’s all. I believe this keeps 99% of what 99% of people are interested in, while closing the doors that enable the 0.0001% jerks out there to easily exploit things (“I have to write my own installer? Wah boohoo, I’ll find another target.”) I’ve kept track of some of the “easy exploit” vectors and have found ways to either legally prevent them, or to make the work required to loophole them enough that lazy people will give up quickly. Also, please remember that this is the Internet and I can change my mind later. This isn’t the ten commandments chiseled in to stone tablets 🙂 I could very well decide it’s too much effort to do this, and find a different way to address the problem. Maybe I’m just blowing off steam.

The goal is not to prevent any open use of the source code. Some have suggested that I should sue the guy, but I’ve already dealt with him so that isn’t necessary. Some have suggested that I should have used the GPL or BSD license, but that wouldn’t be possible because first, I don’t like GPL (let’s please not start a battle about it). Second, it would restrict some of the freedoms that I do want to allow: honest incorporation of portions of Paint.NET’s code into another software without licensing stipulations (for starters). Third, I don’t have complete executive privilege here. Portions of Paint.NET are incorporated from elsewhere (with permission of course), or are even owned by Microsoft from way back in the day, and I cannot change those parts of the licensing without consent (or by doing a full rewrite). Nor do I want to chase everyone down to get this consent when I can achieve my goals easier by doing something else. So I have moved the resource assets to a CC license which means if you really want to rip-off Paint.NET then you have to rewrite all the text and redo all the graphics. At that point you have proven you are either not lazy, or that you have OCD, or something. By which time I’ve released 4.0 and you are way behind again.

There was a comment about the Mono guys and their porting efforts. I don’t believe this will hinder them, nor is it a goal of mine to do so. I’ve e-mailed with Miguel de Icaza on occasion with the specific intent of making sure that it is possible for them to port Paint.NET. They wouldn’t be able to make much use of Paint.NET’s installer code anyway because it is very Windows-specific. And they probably won’t need to edit the resource files and can just use them as-is. If/when we find problems in the licensing that impede this, then we can adjust the license for the next release. Or I can provide them with permission to do what they need to do. This is iterative development folks, isn’t that what everyone likes?

To address why I didn’t publish the guy’s name, website, etc. The reason is that I honestly believe there are some extenuating circumstances that are not fully known. From what I have read, some believe the guy is disabled, or is being purposefully defamed by someone who has a grudge against him. The other possibilities that I have considered is that he is mentally deranged in some way – split personality, schizophrenia, etc. This would be congruent with the weird e-mails I’ve had with him in the past. He has been seen under or claiming different last names. In any case, there would be no benefit other than revenge for publishing this information.

Paint.NET v3.20 (Final) is now available!

Please digg this article: Paint.NET v3.20 new version now available!

Alright, you can either get it from the website, http://www.getpaint.net, or via the built-in updater from the Help menu (“Check for Updates”). Thanks are due to everyone for all the alpha and beta testing help. Enjoy! And now I’m hungry so I’m gonna go eat or something.

New in this release since v3.10:

  • Rectangle Select tool can now draw selections based on a Fixed Size or Fixed Ratio
  • The selection combination mode is now accessible from the toolbar (Replace, Add (union), Subtract, Invert (“xor”)).
  • The “flood mode” for the Magic Wand and Paint Bucket tool are now accessible from the toolbar (Continuous, or Global)
  • Reorganized the Effects menu so that all effects are classified under submenus named Artistic, Blurs, Distort, Noise, Photo, Render, and Stylize.
  • Improved rendering quality for the Motion Blur effect.
  • Enhanced the Radial Blur effect so that the center of blurring can be chosen, as well as the quality.
  • Enhanced the Zoom Blur effect so that the center of zooming can be chosen.
  • Enhanced the Bulge distortion effect so that the center of “bulging” can be chosen.
  • Enhanced the Frosted Glass distortion effect in several ways: 1) performance has been improved from between 1,000% to 10,000% depending on image size and property settings, 2) the scatter radius can now be set up to 200 pixels, 3) a “minimum” scatter radius can be chosen, 4) a smoothness setting is now available.
  • Enhanced the Tile Reflection distortion effect by adding a Quality property.
  • Enhanced the Twist distortion effect by 1) allowing counter-clockwise twisting, 2) allowing the size of the twisted area to be configured, 3) allowing the location/center of twisting to be chosen.
  • Enhanced the Add Noise effect by adding a “coverage” property.
  • New Mandelbrot Fractal and Julia Fractal render effects.
  • New IndirectUI system for plugin authors so that they can develop much more sophisticated effect configuration dialogs with a fraction of the amount of work that used to be required.
  • If an effect plugin crashes, it is much more likely that Paint.NET will be able to recover from the error. The option to restart Paint.NET will then be provided as a recommended course of action.
  • If an effect plugin fails to load, or is blocked from loading, then a “View Plugin Load Errors…” item will be added to the File menu which can be clicked on to show the error and/or diagnostic information.
  • Improved the cursors for the Magic Wand and Paint Bucket tools.
  • Ctrl+Alt+0 now works for View->Actual Size (aka, “Zoom to 100%”), which is a shortcut key that other software uses (e.g., Photoshop).
  • Updates are now installed faster by only creating one System Restore point instead of two (it used to implicitly create one for uninstall, then one for the reinstall).
  • Lots of little bug fixes.

Paint.NET v3.20 … soon! And updated licensing details

All the translations are ready to go, and there was only 1 bug that had to be fixed which you can read about on the forum if you really want to. Now I just have to finish updating the help content. I’m hoping to have the final release of 3.20 available tonight or tomorrow.

Well, that and I have to finish drafting this update to the Paint.NET licensing. I had a discussion with Dioni, who manages the translations of Paint.NET, about the licensing of both the regular release and the source code release. I believe we have come to a good decision about how to change the licensing that won’t affect normal users and that will have minimal or insignificant impact on those who are interested in the source code.

There are 4 types of abuses of Paint.NET, or even simple hazards of otherwise legitimate use, that I want to protect against:

  1. Blatant and insulting “Backspaceware”, as detailed in my two previous fuming posts on the matter (first post, second post).
  2. Paint.NET being sold on eBay, or in an otherwise similar fashion. This includes burned on to a CD by itself and sold for shipping costs, or the typical selling of “information” (“Ooh I know where to get this awesome thing, send me $5 and I’ll tell you!”), or even charging for a mirrored download link. Yes, I’ve seen all of these.
  3. Renamed and resold versions of Paint.NET, such as Office ONE Paint. I find this to be inappropriate, but far less offensive than the aforementioned backspaceware, and so I’m calling it out separately. I believe it’s even within the rights of the Paint.NET license, so I have not pursued it. However, I still don’t like it and want to prevent it going forward.
  4. Honest and appropriate derivative works that are still using Paint.NET’s Internet resources accidentally. For example, the Help menu item, “Send feedback” should not have paint.net AT hotmail.com in the source code release. Otherwise I’ll get crash logs from forked projects. Also, the auto-updater will not be functional because I don’t want derivative projects to be pinging my server, nor do I want those users to get new versions of Paint.NET offered to them (which will uninstall their non-Paint.NET software). Derivative works must not be confused with Paint.NET, or vice versa.

Here are some of the things I do not want to hinder or prevent:

  1. Normal installation and use of Paint.NET. I don’t want any of Paint.NET’s licensing to “follow” or “infect” any files that are opened, modified, or saved with Paint.NET.
  2. Legitimate educational study of the source code.
  3. Legitimate and honest adoption of portions of Paint.NET source code in to other software. For example, I’m totally fine with someone using the code for Gaussian Blur.
  4. Translation of Paint.NET to another language, by way of releasing a language pack. Note that I am not opposed to someone charging for a language pack – I personally think that’d be weird, but it’s not really a concern of mine.
  5. Free-of-charge distribution of unmodified Paint.NET through channels such as websites or magazine/book CD-ROM’s. This includes the fact that I don’t want to be required to approve every website that wishes to do this. Just do it.

So, here are the changes to Paint.NET and its licensing:

  1. The source code for the installer will not be released. This also includes the project files for creating the MSI.
  2. The text / string and icon / graphic resources, which is *.resources and *.resx as well as all embedded graphics files within PaintDotNet.Resources.dll, will now be licensed under the Creative Commons Attribution-Noncommercial-No Derivate Works 3.0 United States License. An exception is provided for releasing a non-English translation of the text/string resources. I am having to be careful here so that people don’t think I’m trying to force images loaded or saved with Paint.NET to be “infected” with this license.
  3. The non-English translations will not be included in the released source code. This does not affect normal use of Paint.NET – the compiled translations will still be included there.
  4. Any place where URL’s or e-mails are included in the source code will be erased, along with a compiler-error inducing text such as, “You need to provide a URL or e-mail address here.” (Note: This has been in place for several releases, but I’m including it for completeness)
  5. The auto-update functionality will be disabled somehow in the released source code. Most likely this will be done by using the aforementioned “URL erasing”.
  6. The installer that is released will have text during installation that clearly spells out, “Paint.NET is FREE OF CHARGE. If you paid money for it (other than to donate at the Paint.NET website, of course) then we recommend that you get a refund!” (Note: This was in place for v3.20 from the beginning, I’m just including it for completeness)

I believe these will correctly prevent what I don’t want, while still protecting what I want to allow. There are still loophole opportunities in these provisions, but the goal is that any rhetorical loophole will present a huge barrier in the amount of work required to “jump through it”. For example, even though the RESX files are no longer released you can still generate them from the publicly available RESOURCES files. But the RESOURCES file doesn’t allow derivative works, so you’d have to rewrite all the UI text for Paint.NET anyway. And you wouldn’t be able to re-use any of the icons or graphics. Or, maybe you’d decide that you wanted to release a scam version in another language using the translation excuse. Well, then you’ll only be able to target a fraction of the market anyway. Etc. etc.

Paint.NET v3.20 Release Candidate 1 is now available

You can get it either from the website, http://www.getpaint.net, or from within Paint.NET itself via the auto-updater. Note: Make sure you have “Also check for beta releases” enabled. You can access this option by going to Help -> Check for Updates, and then clicking on the “Options” button.

The number of fixes in this release is very small, and that’s a good indicator that we’re almost ready for the final release. I’m hoping to have that out by Friday, in fact.

Please be sure to report any compatibility problems with plugins.

Changes:

  • Note: New features will be displayed in English through the Alpha and Beta release(s). The final release will include full translations for the other supported languages.
  • Fixed: If a floating tool window (Colors, History, Layers, Tools) was not docked/snapped, and the screen resolution was lowered or a Remote Desktop session was initiated, then the window would stay off screen and be “lost”. It is now moved to keep it on-screen.
  • Fixed: An issue for plugin developers where Effect`1.Render(3) was incorrectly throwing an exception when indirectly called through Effect.Render(6). This was preventing an updated version of the “Film Noir” plugin from working, even though its code was correct.
  • Integrated updated translations for Spanish, French, Japanese, Korean, Portuguese (Brazil), and Chinese (Simplified). An updated German translation will be present in the final release.

Tips For Dealing With Backspaceware

Prior to my previous blog post, I had sent the “author” of the Paint.NET rip-off an e-mail asking and telling him to remove the software, and why. People suggested that I sue him, but I didn’t think it was necessary to start with that. I am happy to report that I have been successful at having the software taken down and discontinued. So as another tip for freeware authors, I am going to document how I dealt with the situation.

NOTE: This does not constitute, and should not be taken as, legal advice. I am merely documenting what I did as an example of what worked for me, and my thoughts on the matter.

1. I fumed for a few hours. Don’t underestimate the power of letting yourself cool off before sending e-mails. On a side note, I also try to avoid sending e-mail at all until I’m at least past my first cup of coffee in the morning. I am not a morning person, and I found myself sending out snappy replies!

2. I sent him the following e-mail. Notice that I did not attack or insult him, and stuck mostly to a strict “just the facts” writing style. I made no threats of legal action, nor any promise that I would not take legal action. That last part is key – you don’t want to promise yourself into a corner by way of a technicality. Maybe they remove the scam software, only to put it up the next week with a new name (“oh hey look it has an exclamation mark at the end, it’s a totally different name!”).

<Name Removed>,

So we meet again. Once again (this is the 3rd time at least) you are blatantly violating the licensing and copyright of Paint.NET, and ripping off plugins from the Paint.NET forum. The software in question is called “<Name Removed>” located here:

<URL Removed>

You have also plagiarized content from the Paint.NET website, and have removed the copyright and permission notice from what you are distributing. Not only that, but your software removes Paint.NET when you install it and also tries to use the same installation directory (C:\Program Files\Paint.NET). It incorrectly claims to be based on “PaintDotNet” which is a program that does not exist (it’s called Paint.NET). Throughout the program itself it also claims to be Paint.NET (“Choose Tool Defaults”, for instance).

I also don’t think the various plugin authors will be happy to hear that you are blatantly ripping off their plugins without their permission, and without giving them any credit. This is a blatant violation of United States copyright law, and is not just a matter of etiquette.

So, this is another cease-and-desist notice. You must remove the “<Name Removed>” software from your website immediately, and also discontinue the product. I will check back on Thursday and if this is done then I will consider the matter settled.

-Rick Brewster

Here’s the response I got the next day (which was Wednesday)

program will be removed sometime today

It actually took until the next day for it to be removed, but whatever.

3. I found various download sites that were hosting it, such as SoftPedia and Foto-Freeware, and sent them a notice about the software. In fact, I used the links on the page for “Report Spyware” and “Send us update information,” anything that I thought would end up being read by a human being and taken seriously. I informed them that it was a rip-off of Paint.NET and was violating copyright laws, etc. and that they should kindly take it down. Remember, these guys want to be on your side and they deal with a LOT of software updates every day, so it makes NO sense to let any of your anger bleed into your conversations with them. Both of the sites I just mentioned were very understanding and accommodating, and removed the software quickly (thanks!).

4. Since the software was still on download.com, I requested members of the forum to submit civil, articulate reviews stating that it was copyright violation, rip-off, etc. etc. (Yes this means that if you go dig on the forum you will indeed find out more about the culprit’s name, etc.) Thankfully, the reviews they have submitted are tasteful and do not attack download.com itself. Here’s an excerpt from one of them:

“CNET- if you do not remove this illegal and distasteful software from your servers, your reputation among the software community will forever be associated with the aid of copyright violators and warez downloads. Don’t allow your name, which has heretofore been known as a great source of software, become a synonym for theft.”

Unfortunately, their policy on copyright violation is heavily weighed down, no doubt by their lawyers. I have to send an infringement notice by regular mail. It’s ridiculous. Please just let me send you an e-mail and let it escalate through your customer support staff. Or, since I have an account on upload.com so I can manage my own freeware listing, give me an e-mail or contact form for this type of stuff.

Update: The offending software has been pulled from download.com.

Since I started with a [mostly] civil tone and was patient about compliance, I probably saved at least $5,000 in legal costs (that’s a very uneducated guess, mind you). I didn’t see the need to start by threatening a lawsuit, especially because only three things can occur then: 1) they comply, or 2) they don’t comply, and successfully call your bluff and their backspaceware is still online, or 3) they don’t comply, and you have to spend lots of money on lawyer stuff and actually sue them.

By not threatening legal action up-front you leave your options open while you consult with friends and real legal advice as to what you should do. Do not assume the person you are dealing with is a mature, intelligent, respectful adult. You have to treat them like a teenager who would like nothing better than to flaunt in your face the fact that they are pissing you off and that there’s nothing you can do about it. Threatening a lawsuit will just make them more excited!

Freeware Authors: Beware of “Backspaceware”

Update, 2007-12-15 @ 1pm PST: Welcome Slashdot readers! Please see my other blog posts on the matter before jumping to make a comment: the first, second, third, and fourth.

Paint.NET’s license is very generous, and I even release the source code. All free of charge. Unfortunately it gets taken advantage of every once in awhile by scum who are trying to profit from the work of others. I like to call this backspaceware*. They download the source code for something, load it up in to Visual Studio (or whatever), hit the
backspace key over the software’s name and credits, type in a new name and author, and re-release it. They send it to all the download mirror sites, and don’t always do a good job covering up their tracks.

There is currently an individual who is doing this with Paint.NET. I won’t mention them by name or link to them in order to avoid pumping up their PageRank. Basically what they’ve done is downloaded the Paint.NET v3.10 source code, renamed it and changed the credits, removed the license and copyright notice (which violates the Paint.NET license, btw), plagiarized a bunch of content from the Paint.NET website, and bundled half the plugins from the Paint.NET forum without any of the authors’ permission.

That last one really pisses me off. It’s not enough to take advantage of my generosity, he has to backstab the altruistic community as well. “My paint program supports all sorts of cool effects and file formats!!!” Yeah jerk, because you ripped off the work of 50 people by blatantly violating United States copyright law. What’s even more entertaining is that this is the third time this guy has done this! He’s also been known to do this with all sorts of other freeware applications that are nice enough to release the source code. Oh, and did I mention when you install this guy’s backspaceware that it uninstalls Paint.NET? It also tries to use the same installation directory, %PROGRAMFILES%\Paint.NET.
(Don’t worry I used a virtual PC) He didn’t even remove the LICENSE.TXT files from the plugins he stole, which correctly cite themselves as Paint.NET plugins.

Real innovative work there, bub. I hope he puts this on his resume and someone asks him about it during an interview – that would be an entertaining conversation to watch.

Manager: “So you ripped off Paint.NET and a bunch of plugins, and re-released it with your name on it?”
Him: “Yup!”
Manager: “Cool! Welcome to your new job at Clown Burger. Make sure to ask customers if they want fries with that.”
Him: “I get free lunch right?”

I went and searched through my Inbox for his name because I wanted to find the e-mails I sent him the last two times he did this. What I also found was that awhile ago I actually gave this scumface technical support when he was having trouble installing Paint.NET! It’s so nice that he’s turned around and dumped on my face to show his appreciation.

To combat this and a few other similar instances that have happened over the years, I believe I will change the way that I release the source code for Paint.NET. As a stopgap before the v3.20 release, the version 3.10 source code is no longer available, starting immediately, while I finalize on this decision. It just feels like it’s a disaster waiting to happen with the way I’ve been releasing it so far.

Here are the changes I’m thinking of:

  1. I will no longer be releasing the source code for the installer.
  2. I will no longer be releasing the source code for PaintDotNet.Resources.dll, which has the code for loading resources as well as all the graphics (icons, logo, etc.)
  3. I will no longer be releasing the text and graphic resources in the source code distribution (RESX files, icons, logos). This includes the translations to non-English languages.
  4. I am still contemplating how much of PaintDotNet.exe I want to release. Especially parts such as the updater and core parts of the main UI that I’ve spent a lot of creative energy on.

The goal is to dramatically increase the amount of work required to release a backspaceware version of Paint.NET. The first one clearly does this. The 2nd and 3rd make it much harder to change names, credits, and logos. The 4th one makes it much more difficult to rip off the UI or “shell” of Paint.NET.

Plugin authors often need something to debug with, and I still want to ensure that people can study the source code for educational or honestly innovative purposes. These consumers of the source code don’t need access to the resource files: you can just use the PaintDotNet.Resources.dll and PaintDotNet.Strings.3.resources that ship with the regular download. However, by making it more difficult to commit a “backspace violation”, I am hoping to put an end to this and other lazy copycat schmucks.

A lot of software implements copy protection to save profits, but I’ve never really believed in the stuff. It’s unfortunate that I have to investigate these measures in order to help protect myself and others from lazy ripoff jerks.

* Someone else suggested “thief-ware”, but I think that implies at least a little planning and cunning. I believe that “backspace”-ware correctly infers the level of simple laziness and lack of any real skill.

Paint.NET v3.20 Beta 2 is now available

You can get it either from the website, http://www.getpaint.net, or from within Paint.NET itself via the auto-updater. Note: Make sure you have “Also check for beta releases” enabled. You can access this option by going to Help -> Check for Updates, and then clicking on the “Options” button.

Please be sure to report any compatibility problems with plugins.

Enjoy! I’m off to go finish Assassin’s Creed on my PS3.

Changes:

  • Note: New features will be displayed in English through the Alpha and Beta release(s). The final release will include full translations for the other supported languages.
  • Fixed: Drawing a “Fixed Size” selection was resulting in a rectangle that was 1 pixel too wide, and 1 pixel too tall
  • Fixed: A small layout glitch in the toolbar that was hiding the “Fixed Size” units selector
  • Fixed: A layout glitch in the Red Eye Removal dialog that caused it to show a scroll bar when it wasn’t necessary
  • Fixed: Header’s etched line control rendering in XP with the Luna visual style
  • Fixed: A few rare crash bugs
  • Fixed: Some corner-case glitches and crashes in the new IndirectUI and property system

Software Development Tip: Write and Maintain a “UI Map”

If the software you work on ever ends up with more than a few dialogs or a non-trivial navigation flow, then you should create a document that I call the “UI Map”. This document is quite simple to create, and the work you put in to it will pay off many, many times over. A UI Map is basically just a Word file (or pick your favorite editor, or wiki, etc.) that documents every single dialog and major state that your application can be in.

For the version 3.0 release of Paint.NET I finally created one of these at the behest of the translation team I’ve been working with, and I’m glad I did! The primary goal of this for them is to document every localizable piece of text in Paint.NET. For the new versions that I put out, it’s important to keep this document up-to-date and to spell out what is new or changed, as well as what text can be localized versus what text is supplied by the operating system (or framework, or user, etc.). Sometimes there are differences between how the UI appears in XP versus Vista (or versus 2000, 95, 98, Lunix, take your pick), and if those affect localization (or whatever your audience is interested in) then it should be noted in this document as well.

It’s very convenient for translators to be able to test that their translation does not cause layout or other visual errors, such as clipped text or worse. (And to point the finger in the right direction, it is not actually the translation that causes the error. It merely helps to expose the bug that was already there! :)) This will give them a visual tool to work with, and also makes it really easy for them to connect the text they’ve translated with where it shows up in the UI! That last part is very important, because usually a translator just sees this:

<data
name=BlockedPluginException.PluginIsNowBuiltIn>

<value>This plugin is now built-in to Paint.NET, so the old plugin DLL has been blocked from loading. You may safely delete this plugin DLL.</value>

</data>

If I hadn’t written the code myself, then I’d have no idea where to find this text in the UI and clueless when it came to validate that it showed up properly (no clipped text, scrunched layout, etc.) It won’t kill you to spend a few minutes to tell them exactly how to reach that text in the UI.

Maintaining this document with every new version also forces me to touch and re-touch every part of the UI, which is important to increase confidence in a release. I’m not always the most diligent when it comes to testing things (shh, don’t tell anyone!) and so this is a very good exercise to require myself to do. In the new Paint.NET v3.20 release I have completely reorganized the Effects menu and revamped most of the effects’ user interfaces using the new IndirectUI system. I even found a bug while I was updating the UI map!*

Notice the scrollbar and the clipped text? Yeah, oops is right. No doubt there will be more bugs like this once I do a test pass with the other languages.

Having a UI map also makes sure that you don’t forget about any part of your UI. Remember that out-of-the-way error dialog you added three days before you shipped? Yeah, that one! On a fully professional project with a large team you might think this is taken care of by the design and documentation process, and you’d be completely wrong. The UI map can also help new developers on your project to get a quick visual tour of the application. Or new managers. Or higher-up managers or marketing folks. A document like this can serve as a valuable quick-summary for all of them, or even as a reference book. There is just so much value in having a UI map.

To get started, I use the outlining feature in Word. This way I can use the indentation level as an implicit navigation guide within the application. Here’s an abbreviated excerpt from the Paint.NET UI Map that shows how I’ve documented part of the File menu (up through “New” and “Open”), with screenshots resized in order to fit more appropriately on the blog. I start out by explaining the specific purpose of the document as well as certain constraints that are important. For example, it is implied from the 2nd paragraph that if text is cut off at 800×600, but looks fine at 1024×768, then that is not something of concern.

(Also, as another tip, I highly recommend using Kenny Kerr’s
WindowClippings program for making the screenshots look super professional. It captures the glass and drop shadow effects in Windows Vista perfectly. It’s what I use. And no, this is not a paid endorsement :))

Paint.NET v3.20 User Interface Map

This document exhaustively details the Paint.NET v3.0 user interface. It is meant primarily for translators to be able to find every location in the user interface for translation-related testing and tuning. Each part of the UI will be presented with a screenshot. The outline hierarchy implicitly shows how one can navigate to a particular part of the UI. This document is not meant to provide sufficient documentation on how to use Paint.NET and its various features. It is also not meant to be instructional on how to prepare a language pack for Paint.NET. Most error dialogs will not be detailed.

NOTE: Paint.NET’s system requirements list a screen resolution of 1024 x 768. It is important that UI elements work comfortably with a maximized window at this resolution with the Windows task bar set to one (1) unit of height. The main concern here is the help and context texts for the tools, which should not be clipped at this resolution with a maximized window. Paint.NET is not designed or optimized for smaller resolutions or window sizes (e.g. 800×600, or 1024×768 with a smaller window).

1. Application
This is the interface the user sees when they start Paint.NET. By default there are four docked floating toolform windows (aka floating windows, floating tool windows).
(screenshot removed for brevity)

1.1. through 1.4 – (removed for brevity)

1.5. Menu bar

1.5.1. File
(new for v3.20: View Plugin Load Errors…)

1.5.1.1 New
When the user creates a new image, it will be called “Untitled”. This name is localizable.

1.5.1.2 Open
This is a common Windows dialog. Most of the text on it is provided by Windows.

1.5.1.2.1. The file type drop down has some strings that are localizable:
(New for v3.10: “DirectDraw Surface (DDS)” is now a supported file type)

1.5.1.2.2 In Windows Vista, the dialog will look like this instead:

1.5.1.2.3
If the user is transferring files from a location that is not mapped to a file system path (such as from an http:// source, or from a digital camera that is not mapped to a drive letter), then they will see the following UI:

If the user cancels the transfer, they will see this while the transfer is being canceled:

If there is an error while transferring (server error, camera failure / disconnect), then this dialog will be shown. Note that the error message (“A device attached…”) is provided by the OS and/or the .NET Framework, and is not localizable. It will generally be supplied in the language that the OS and/or Framework is configured or installed for.

* To be fair, a member of the forum, “I Like Pi,” actually pointed this out first. I would have discovered this much sooner however, if I had updated my UI map two weeks ago instead of waiting until tonight!