First Pass
The goals of the prototype were:
- Interoperability with FreeMind .mm files
- A bi-directional treeview similar to FreeMind's
- A hierarchical grid view of the same data, but with columns for custom attributes, inspired by OmniOutliner.
- Multiple Document editing with customizable docking (like Eclipse, Visual Studio)
- Support for my favorite FreeMind features: keyboard shortcuts, clipboard support, drag and drop, and Undo/Redo
Until then I had primarily been a web developer, so it was a bit of a stretch.
That was a pretty hefty list of features, especially for someone who had never written a WinForms? app. At first I cobbled together a prototype from several existing components, notably Suite?, [TreeViewAdv?], and [Lithium]. I eventually used TreeViewAdv? to learn how to write a tree control and adapted it into a MindMap? editor. This was a lot of work and required lots of debugging and pixel positioning. It was slow going - I had a lot to learn and it was a side project, but after 3 months, in March 2007 I had something written that could view and edit FreeMind files and had a pretty decent command layer with Undo/Redo (which was really interesting to write). At that point I was able to use MindTree instead of FreeMind for about 70% of the time.
I should admit that the code was and is very sloppy. That's what you get with a side-project where there is only one developer. I'm proud of most of it, but the naming and class hierarchies need to be re-worked, primarily in the Winston.MindTree project.
Second Pass
I realized that I didn't want to try to develop new visualizations or animation or zooming using my original approach. I thought, "I need a layout engine, badly." So I began looking elsewhere for ideas on how to proceed. I thought briefly about WPF but no one else was using it and the support for WinXP was mediocre. I thought about writing my own layout engine, and then stumbled onto Piccolo.NET?, a fantastic .NET framework for "zoomable UIs". After playing around for a couple days, I realized, "I need to rewrite my entire editor using this toolkit." That was a tough choice, but it was worth it, and it was a lot of fun. Piccolo.NET is, in my opinion, beautiful code. The project development ceased in 2005 or so, but it was so complete and easy to understand that I had no trouble writing a PiccoloMindMap? control. (Incidentally, this control has no dependencies on MindTree itself and as such it could be re-used outside of MindTree, as could the original MindMapControl? I wrote).
I ended up writing a couple of simple layout containers that turned out to be very comparable to WPF's StackPanel?, and they drive the layout and animation of the Piccolo-based MindMapEditor?.
A turning point was the day I implemented the right-click to pan and zoom. It completely transformed my user experience and, from my perspective, blew FreeMind away.
Since wrapping up that version, I haven't needed FreeMind at all. It was at that point that I set up this site so friends and family could take MindTree for a spin.
Third Pass
So, I finally took a good look at WPF. On the inside. And it's really well done (as a framework - I still don't like Vista that much). Even though no one has really written anything of consequence in it (unless you count Vista, which I don't :), I think it's definitely an amazing framework.
I couldn't resist playing around with it, and now I'm hooked. I will probably try to develop a full MindMapEditor? in WPF, but until then I think the Piccolo one will be sufficient. I'm slightly conflicted about WPF because theoretically, the previous versions could be adapted to run on Linux / Mono, but not a WPF version. Maybe a Silverlight version could be written and eventually run on Linux, but I don't know anything about that.
Assuming that WPF / WinForms? interoperability works as promised, I think I will keep the MindTree application itself in WinForms? and then write pluggable WPF elements such as Editors and Viewers.
I currently have a basic WPF prototype wired up and viewing MindTree files, but it's ugly and there is a long way to go. Also, I'm finding that WPF is not as well-suited to ZUI as I initially thought. The rendering and layout engine are there, but the controls aren't.
I'm currently writing several controls to address these issues, including a Zooming ContentControl?, a size-aware Canvas, a ScrollViewer? that can be animated, and a render-scaling Decorator. And that still doesn't get me everything I need in order to assemble an editor comparable to what I did using the Piccolo framework.
I hope to wrap up the WPF editor stuff over the holidays and then factor it into MindTree in January.
I also plan on renaming MindTree. I'm really tired of the name. The new name is much better, but I'm not going to say what it is yet.
Regarding licensing and source code, I'm a bit conflicted. I love open source and have open-sourced a ton of web stuff on CodeProject?. However, I just don't feel good about going totally open source yet. Also, I want to keep tight reins on the application for a little while longer. That's partly because the code is just plain embarrassing and I would have to clean it up before I would want anyone else looking at it. If you're really dying to look at it, though, it's not obfuscated.
The other factor worth noting is that Lindsay and I had a daughter, Claire, in October, and she's consuming a lot of my time, so I'm not sure how much I will be able to commit to this project. Still, I'm really excited about what it could develop into.
