I've just finished up a couple of days of browser changes for the 4xx series. I began by taking stuff out. This actualy started before the long thread that I started in VWNC (thank you by the way, to all those who replied, especially when you played by the rules). It was as I was removing stuff that I thought about asking "I wonder what else?"
Anyway, I took out as much as I could, any of the "category" stuff. I think I got most of it. Please tell me what you find! This was a pretty quiet removal. The ability to put the browser in "category" mode had already been truncated at the interface level. The guts to do it all had still been left in though. This is a common theme in software development efforts. A "feature" is removed, but it's not really removed. The problem with this approach is that you can only dodge the tax collector so long. Every time I had to do any maintenance in the system, or improvement, this was something that I had to account for. Leaving dead software in is a "debt" that you pay for with interest as time goes on. It's like waste that grows mold. So I ripped it out.
I took it out because I wanted to add a couple of little things. I wanted to integrate or do something like RBHeirarchyExtensions that Anthony Lander has kindly provided to the community. But that didn't happen yet. That was what caused me to finally say "enough is enough" on the category stuff.
What did get added was a number of little things. I'd like to thank both David Buck and Mark Roberts for helping insipre some of them, amongst others. I'm not going to list all of the things in gory detail. I'm curious to kind of leave it unmentioned and see how long til people notice. But some are worthy of note.
One is that I put in very lame support for detecting what looks like hyperlink patterns in source code and comments. It will style them with the classical blue underline. It doesn't do anything fancy like change the mouse when it's over them or change the link if you double click on it. But you can indeed double click on it. And IF it notes that you have ExternalWebBrowser loaded, it will fire up a browser on the link. Though cheesy in it's implementation, this is one of those things where I thought initially "yeah, that'd be nice" and after having played with it for just a little bit, I'm growing much more excited about it.
Case in point. I was doing a little Cairo maintenance this evening. Trying out the newest cairo release on OS X. There's these two methods that a Cairo Surface object can respond to: finish and flush. And I always forget which does what. So I have to open a web browser. And clink on the link to the cairographics site. Follow the tab to the documentation. Then hunt and drill through the heirarchical structure til I find the two functions and relearn what they are. But now... no more:
This was one of those "oh wow, I hadn't anticipated being able to do that!" moments. This is very handy because now I can put links to the extensive documentation written for Cairo right in the code. Double click on it when I need a reminder which one does which. Very handy for me. Handy for others.
I played some with the tabs. OK. A bunch. Many of those minor changes I mentioned have to do with the tabs. And finally, I just got tired of the way the things work. We've all been burned repeatedly by the way plugin tools manage themselves in CodeModel (the CodeModel is the "lower half" of the browser). Especially code tools like RBSUnitExtensions. So I decided it was time for an API change. I really tried hard not to. Because there are quite a few people who have written tools for the RB. One of the things I came to understand was the basic model, and the roles that CodeModel, CodeToolSelectionPolicy, and CodeTool each plays. They are poorly named, but I did my best to A) reinforce what they are in the class comments and B) define the new API for adding them.
Don't fret too much, I did backwards compat stuff. When you load an old tool, if it isn't registered with the new mechanism, it will note the old API invokation and offer to integrate it with the new API for you. It should be pretty straightforward for all but the weirdest of tools. That would be RBSUnitExtensions and any others that follow the nefarious pattern of wrapping themselves around other tools. The problem with this approach is that it breaks. And it's dangerous. If that's not obvious why... I can explain in another post. I don't have a solution for RBSUnitExtensions yet. But you can bet with SUnitToo(ls) doing the exact same pattern... I will soon.