<?xml version='1.0' encoding='UTF-8' ?>
<rss version="2.0" xml:base="http://www.cincomsmalltalk.com/userblogs/antony/" xmlns:admin="http://webns.net/mvcb/" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:icbm="http://postneo.com/icbm" xmlns:includedComments="http://www.laudably.com/rss2-comments" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/">
	<channel>
		<title>The creation of a new order of things</title>
		<link>http://www.cincomsmalltalk.com/userblogs/antony/blogView</link>
		<description>The creation of a new order of things</description>
		<webMaster>antony.blakey@linkuistics.com.au</webMaster>
		<lastBuildDate>Fri, 19 Jun 2009 22:33:26 EDT</lastBuildDate>
		<image>
			<url>/images/why-small.png</url>
			<title>The creation of a new order of things</title>
			<link>http://www.cincomsmalltalk.com/userblogs/antony/blogView</link>
			<height>50</height>
			<width>81</width>
		</image>
		<admin:generatorAgent rdf:resource="/CincomSmalltalkWiki/Silt"></admin:generatorAgent>
		<admin:errorReportsTo rdf:resource="mailto:antony.blakey@linkuistics.com.au"></admin:errorReportsTo>
		<dc:language>en-us</dc:language>
		<dc:creator>Antony Blakey</dc:creator>
		<dc:rights>Copyright 2007 Antony Blakey</dc:rights>
		<dc:date>2009-06-19T22:33:26-04:00</dc:date>
		<icbm:latitude>47.2017</icbm:latitude>
		<icbm:longitude>-88.4024</icbm:longitude>
		<item>
			<title>The magnificent Brian Eno</title>
			<link>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=The_magnificent_Brian_Eno&amp;entry=3407180022</link>
			<category>general</category>
			<pubDate>Fri, 19 Dec 2008 22:53:42 EST</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>A long time hero of mine, a beautiful thinker, extraordinary ears and imagination.</p>



<p><object type="application/x-shockwave-flash" height="400" width="400" id="TSBundleWidget" data="http://bits-0.topspin.net/u/byrne/TSBundleWidget.swf?rootPath=https://app.topspin.net&showTrace=false&campaign_id=6001"><param value="always" name="allowScriptAccess"/><param name="allowfullscreen" value="true" /><param name="movie" value="http://bits-0.topspin.net/u/byrne/TSBundleWidget.swf?rootPath=https://app.topspin.net&showTrace=false&campaign_id=6001" /><param name="quality" value="high" /><param name="flashvars" value="campaign_id=6001&amp;baseurl=http://app.topspin.net&amp;width=400&amp;height=400&amp;configurl=http://bits-0.topspin.net/u/byrne/album_config_6001.xml&amp;autoplay=false" /></object></p>



<p>Get it <a href="http://www.everythingthathappens.com/">here</a></p>
</div>]]></description>
			<guid isPermaLink="false">3407180022</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIPBServlet?guid=3407180022</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/antony/blogView?guid=3407180022</pingback:target>
			<includedComments:comment-collection></includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIServlet?guid=3407180022</wfw:comment>
		</item>
		<item>
			<title>CouchDB and VW</title>
			<link>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=CouchDB_and_VW&amp;entry=3403535717</link>
			<category>general</category>
			<pubDate>Fri, 07 Nov 2008 18:35:17 EST</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>I'm in the process of moving a GLORP/Postgresql system to <a href="www.couchdb.org">CouchDB</a>. My data translates easily to a document-based model apart from a few indexing issues, such as the transitive closure of a user ->> role ->> permission system. To solve that I've enhanced CouchDB to allow deployment of separately packaged plugins, and written a plugin (in Erlang) that allows documents to be indexed using Mnesia (or SQLlite et al) and subsequently queried using dynamic graph/relational join semantics. The plugin has the same operational semantics as the map/reduce views e.g views update when read, not when data is written, views represent the MVCC snapshot current at view request time, and they are orthogonal to replication. All that remains is to figure out how to manage replication conflicts, which I could do by only allowing writes to a distinguished peer.</p>



<p>Anyway, I've successfully transfered 5G of data in GLORP/Postgresql to CouchDB using the CouchDB package in the Cincom Public Store. I had to fix a few issues and I've published my fixes. IMO the package isn't yet ready for uses other than exporting data.</p>



<p>As a benchmark - it's quicker to read the data through GLORP/Postgresql and write it into CouchDB, on the same machine, than it is to restore the same data into Postgresql from a backup.</p>
</div>]]></description>
			<guid isPermaLink="false">3403535717</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIPBServlet?guid=3403535717</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/antony/blogView?guid=3403535717</pingback:target>
			<includedComments:comment-collection></includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIServlet?guid=3403535717</wfw:comment>
		</item>
		<item>
			<title>How to load Linkuistics* (ASBAqua etc) components</title>
			<link>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=How_to_load_Linkuistics*_(ASBAqua_etc)_components&amp;entry=3399913756</link>
			<category>general</category>
			<pubDate>Fri, 26 Sep 2008 20:29:16 EDT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>Vladimir Pogorelenko emailed me asking how to reliably load ASBAqua etc from the Cincom Public Store</p>



<p>You shouldn't load any of ASBAqua, ASBLook. Instead, loading LinkuisticsLAF bundle will load the look and feel, loading LinkuisticsUI-Commando will load Commando, and LinkuisticsTools will load a few fixes to e.g. the Glorp Store replication dialog. The head versions these bundles should have correct prerequisites.</p>



<p>Remember this is OSX only.</p>
</div>]]></description>
			<guid isPermaLink="false">3399913756</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIPBServlet?guid=3399913756</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/antony/blogView?guid=3399913756</pingback:target>
			<includedComments:comment-collection>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=How_to_load_Linkuistics*_(ASBAqua_etc)_components&amp;entry=3399913756</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=How_to_load_Linkuistics*_(ASBAqua_etc)_components&amp;entry=3399913756</includedComments:puid>
					<includedComments:author>Vladimir Pogorelenko</includedComments:author>
					<includedComments:pubDate>2008-09-28T08:06:39-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Thanks for the help with bundles. And many thanks again for your fantastic work. Previously VW looks ugly on Mac OS X. And now with LinkuisticsLAF it looks excellent. I think most of developers (many of which want to try seaside development) want to use this modern interface.&lt;/p&gt;
&lt;p&gt;Commando framework is also fanstastic by it's abillities and implementation. I feel like I have dynamic smalltalk environment with powertools like in Eclipse/IDEA.&lt;/p&gt;
&lt;p&gt;And it's so simple.&lt;/p&gt;
&lt;p&gt;I'am willing to review MirrorImage next time.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Great work</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=How_to_load_Linkuistics*_(ASBAqua_etc)_components&amp;entry=3399913756</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=How_to_load_Linkuistics*_(ASBAqua_etc)_components&amp;entry=3399913756</includedComments:puid>
					<includedComments:author>Damien Pollet</includedComments:author>
					<includedComments:pubDate>2008-10-05T13:33:32-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Is there a place for bug reports ? vwnc ?&lt;/p&gt;
&lt;p&gt;I'm getting PixMap DNU #figure when quitting VW. The round OK/Cancel-like buttons don't display correctly, the middle section is blank, and since they are used in the debugger and the save dialog, it's rather problematic :)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>bug report ?</includedComments:title>
				</includedComments:comment>
			</includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIServlet?guid=3399913756</wfw:comment>
		</item>
		<item>
			<title>A VW command model and UI inspired by TextMate</title>
			<link>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</link>
			<category>general</category>
			<pubDate>Fri, 01 Aug 2008 03:11:45 EDT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p><style type='text/css'>

.ASBBlog div.code

{

	margin: 1ex 2em 1ex 2em;

	border: 1px dotted grey;

	padding: 0 1em 0 1em;

	background-color: rgb(230,230,230);

}

.ASBBlog div.callout div.label

{

	font-weight: bold;

    position: absolute;

	margin-top: -0.8em;

	padding: 0 1ex 0 1ex;

	background-color: white;

	border: 1px dotted rgb(128,64,64);

}

.ASBBlog div.callout

{

	margin: 1.5em 2em 0 2em;

	padding: 0 1em 0 1em;

	border: 1px dotted rgb(128,64,64);

	background-color: rgb(230,230,255);

}

.ASBBlog code

{

	font-family: Monaco, monospace;

	color: rgb(0,128,0);

}

</style>



<div class="ASBBlog">



<p>I've been distracted from writing a MirrorImage walkthrough by a discussion on vwnc about Pragmas. One of the final entries was <a href="http://www.cincomsmalltalk.com/userblogs/mls/blogView?showComments=true&printTitle=Whats_in_a_method&entry=3394176039">this</a> blog post by Michael. Apart from his surprising advocacy for text as UI - why not extend that argument from a single method to multiple methods, and then to the class - the comment that stood out for me was "Is it easier to pull down a menu to define an attribute on a method, or easy enough just to write some code...". Quite true. VW requires that just about everything is done with the mouse. On OSX at least, the very few keyboard shortcuts only partially work, and in any case you can't use the command key for anything but C/C/P. So all of my muscle memory on my wonderfully uniform (and configurable so) OSX works <em>against</em> me when using VW.</p>



<p>As an aside, text editing in in VW is not just poor, it's appalling. The code editor completely blows. And the implementation of error messages being inserted in the text is IMO not only a crappy idea, it's a complete PITA as implemented. In a recent vwnc thread about this it was asserted that the error message was always selected so you could just hit delete immediately after accepting in order to clear the message. Not so. I started monitoring this after being told about this 'convenience'. Most of my errors leave part of the message selected, and part not, so it's no wonder I hadn't noticed the 'convenience'.</p>



<p>All of this means that whilst on a macro level VW is wonderfully productive, on a micro-level it is anti-productive. The reverse of this situation is something like TextMate. TextMate is optimized for entering and editing text, and is amazingly, beautifully tuned for this task. What I'd like is TextMate micro-convenience and slickness in a Smalltalk environment.</p>



<p>All of that got me thinking about how to achieve some TextMate goodness in VW. And you know what? It's neither difficult nor a lot of work. Unless of course you need to maintain 100% compatibility with customers with a gazillion of mission critical GUI screens dependent on extensions and monkeypatching of the GUI framework.</p>

	

<p>I decided to start with command invocation, which I've implemented and published in the <code>LinkuisticsUI-Commando</code> bundle.</p>



<p>I've done a screencast showing the <a href='files/CommandoDemo.mp4'>system in action</a>. Instructionally its useful to watch both before you read the rest of this post, and afterwards. It's a bit cheap, especially the audio, but I'm not feeling well enough to walk to my studio and do a pro job. Also it's h.264 to lower the file size, so please forgive any minor artifacts.</p>



<h3>What is a command?</h3>



<p>In abstract, a command is the thing behind menu items, shortcut keys, text snippets, and non-semantic tab completions. The most obvious characteristic of a command is that it does something when it is invoked. Commands are applicable in a particular context e.g. 'Delete Class' might be applicable only if a class is selected. Or maybe that command could also operate without a selection by raising a class selector if there is no current selection. Commands execute in a certain context and may require information from that context (such as the currently selected class) in order to execute. The enablement of e.g. a menu item, is an indication of whether the command is applicable in the current context. Commands can be invoked in a number of ways: from a menu, or via a shortcut key, or by pressing tab at the end of a given text string in an editor, or from a list as in TextMate, which uses a nice filtering mechanism to allow commands to be quickly and concisely selected. Another benefit of list-of-commands UI is that you can easily discover all of the commands available in a given context, and check their shortcut invocations. It also allows you to disambiguate control-key shortcuts with multiple resolutions, and provides an obvious source for task/command-specific linking to help.</p>



<h3>The implementation</h3>



<p>There is a global registry of all commands known to the system in <code>Commando.Commands</code>. Commands are registered in <code>getLUICommands</code> class methods, which are discovered via reflection. There is currently no mechanism to monitor changes, so you have to manually invoke <code>Commando.findAllCommands</code> to (re-)install them, or you can use the command UI - there are commando commands registered. Each command has a name, which can be constructed from a hierarchical path. The use of a path means that the command is easier to filter and the name doesn't have to jump through linguistic hurdles to include it's context. It's also the basis for replacing the menu system by a filtered view of extant commands, which is my intention. A command can have a shortcut, which is either a control key shortcut or a tab-triggered prefix for text-based snippets. Finally, a command has to implement <code>applicableInContext: aContext</code> and <code>executeInContext: aContext</code>, the meaning of which should be obvious.</p>



<p>I haven't implemented the tab-completion mechanism yet, partly because to be be as good as TextMate it requires more extensive changes to the text editor. For example, when inserting a fragment that has placeholders you should be able to tab between the placeholders to fill them, including tabbing backwards which on my system triggers the emergency evaluator :(. Improving the text editor is on my list of things to look at.</p>



<h3>What is a context?</h3>



<p>My implementation handles all invocation in the KeyboardProcessor, whose currentConsumer is regarded as the source of the context. The context that is used is a list of objects which are created by visiting the source, it's components and it's parent in a (potentially) recursive manner. It's a trivial mechanism, but it works. You can end with VisualParts, models/applications, windows and controllers in the list.</p>



<p>My original plan was to have objects such as the <code>BrowserNavigator</code> decompose their state so that you would have individual context entries for each of the types of code model objects e.g. Classes/Protocols/Pundles etc. Commands applicable to a given code model object could then trivially operate in any UI which exposes the code model. This is related to the idea of more directly reifying the code model in the interface. It turns out that a lot of the existing UI uses <code>BrowserNavigator</code>, and given that I automatically include the RB commands, which naturally integrate with a <code>BrowserNavigator</code> context, I decided not to do any further decomposition unless I actually build a code-model-reifying UI.</p>



<h3>Menu itegration</h3>



<p>I have a rough plan for how to build menus from commands, thus replacing the menu system. It's particularly obvious when considering the OSX situation, which for native integration wants a single menu bar, but it's also applicable to menu-per-window model, and trivially replaces existing popup-context-menu  systems - it is after all a generaisation of the concept of a context menu.</p>



<p>The published version includes code that processes the RB's menus to create code model commands. The RB already has a command-based system, although that model is somewhat more declarative, which reflects the fact that <code>RBCommand</code>s are manipulated by a command definition UI.</p>



<h3>But ...</h3>



<p>The UI for this works well, but unfortunately the rest of VW isn't really setup to deal well with keyboard navigation, so often you can invoke a command using the keyboard and then you have to switch to the mouse to navigate the result. And as you can see in the screencast, even the mouse behaviour is sometimes annoyingly wrong, particularly in list selection.</p>



<p>I'd like to do something about keyboard view manipulation, and add a similar interface for navigating both to and within code model elements, but that's probably best done in the context of a different type of browser.</p>



</div>
</p></div>]]></description>
			<guid isPermaLink="false">3395013105</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIPBServlet?guid=3395013105</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/antony/blogView?guid=3395013105</pingback:target>
			<includedComments:comment-collection>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:puid>
					<includedComments:author>Claus</includedComments:author>
					<includedComments:pubDate>2008-08-01T04:13:29-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Did you have a look at Scintilla? Though I fear it is a Windows-Only CodeEditor Control. It works wonderfully in Dolphin, though.&lt;/p&gt;
&lt;p&gt;If you are at ESUG, have a look at this:&lt;/p&gt;
&lt;p&gt;http://www.esug.org/Conferences/2008/A+Moribund+Smalltalk+still+alive+and+kicking%3A+The+APIS+VisualSmalltalk+IDE?_s=2Eg0waKSz026YsTg&amp;amp;_k=B-4G1mq2&amp;amp;_n&amp;amp;24&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Outside of perhaps some Java Tools, the CodePane is the best Source Editor Control I had the pleasure to use.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Smalltalk CodeEditor</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:puid>
					<includedComments:author>Antony Blakey</includedComments:author>
					<includedComments:pubDate>2008-08-01T04:35:39-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Yes, I've used that in Dolphin. The only issue I ever had with Dolphin was the lack of documentation, which was understandable given that the economics for OA weren't really working well before they ceased development.&lt;/p&gt;
&lt;p&gt;My interest now is in OSX for development and Unix for deployment, and in any case I'd not want a platform-specific editor IN VisualWorks.&lt;/p&gt;
&lt;p&gt;It's not a huge amount of work to do a decent editor. And you could make a significant difference by replacing the editor used in a few key locations (RB and derived tools + the debugger) i.e. don't 'fix' the current ParagraphEditor at all. Sure, improvements don't flow backwards, but it would be a lot easier.&lt;/p&gt;
&lt;p&gt;Maybe we'll see that in a 2010 or 2011 release?&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: Smalltalk CodeEditor</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:puid>
					<includedComments:author>Michael Lucas-Smith</includedComments:author>
					<includedComments:pubDate>2008-08-01T10:09:35-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;This is cool. I've never been convinced that the RB has too many commands that we'd need it, but may be I'm wrong on that.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Like a CAD tool</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:puid>
					<includedComments:author>Claus</includedComments:author>
					<includedComments:pubDate>2008-08-01T10:18:02-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;I think the normal SystemBrowser CodeEditor is acceptable - not as good as it could be.&lt;/p&gt;
&lt;p&gt;Minor improvement suggestions:&lt;/p&gt;
&lt;p&gt;1. If a message is sent to either self or super, you definitely know what the messages can be.&lt;/p&gt;
&lt;p&gt;2. If the receiver is a Class, then you do know it can only understand its own class methods or the inherited ones.&lt;/p&gt;
&lt;p&gt;3. If a receiver is explicitly declared (i.e. foo := Bar new) in a method, and a message is going to be sent to that receiver within that method, it is also definitely known what messages it can understand.&lt;/p&gt;
&lt;p&gt;Pretty much everything else depends on a Type System.&lt;/p&gt;
&lt;p&gt;Of course, you could allow something like this:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;read: anArgument&lt;/p&gt;
&lt;p&gt;[...]&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;or even do this for Instance Variables and Class Variables, sorry, Shared Variables in VW-Speak, but that would mean to enhance the class definition format but still maintain backward compabitility.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Why wait so long?</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:puid>
					<includedComments:author>Claus</includedComments:author>
					<includedComments:pubDate>2008-08-01T10:19:41-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;that should be&lt;/p&gt;
&lt;p&gt;read: anArgument &amp;amp;lt;String&amp;amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Clau&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Grrr</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:puid>
					<includedComments:author>Claus</includedComments:author>
					<includedComments:pubDate>2008-08-01T10:24:01-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;ok, then in words:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;You could annotate the type of a method argument and then even do something like:&lt;/p&gt;
&lt;p&gt;read: aString [aString]&lt;/p&gt;
&lt;p&gt;(added by compiler)self assert: [aString isString].&lt;/p&gt;
&lt;p&gt;That way, you could pretty much add an implicit type checking system.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>grr^2</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:puid>
					<includedComments:author>Antony Blakey</includedComments:author>
					<includedComments:pubDate>2008-08-01T19:22:12-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;More like TextMate than a CAD Tool :)&lt;/p&gt;
&lt;p&gt;It's not about the number of commands in the RB. The published system isn't fully configured. All of the Launcher commands should be available in every context, and then when you add code snippets, and custom commands, you end up with many more commands in the list.&lt;/p&gt;
&lt;p&gt;There are two points to this. Firstly, separating the concept of the command from the menu system - the menu system should be derived from the commands, not the other way around. Secondly, providing a scalable keyboard-only way of both operating VW and navigating and exploring every operation available. So it addresses the first part of your argument about why you like pragmas-as-text-in-code. I'll deal with your C/C/P-convenience argument in a separate post.&lt;/p&gt;
&lt;p&gt;In the back of my mind is a Quicksilver-like extension. To give a trivial example: when you use one of the ivar commands without an ivar selected, the RB will bring up a selection list. I would like to see that incorporated in the Commando UI. Then the 'Find Class...' style commands could also be integrated in the same way. Thus commands could become command templates which are further parameterised using integrated exploration/selection/filtering facilities, within a GUI but completely controlled by the keyboard, and faster to use than typing. That last point is trivial in my mind, but neccessary to avoid criticism. The big advantage is in the seamless leveraging of the live code model.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: Like a CAD tool</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:puid>
					<includedComments:author>Antony Blakey</includedComments:author>
					<includedComments:pubDate>2008-08-01T19:33:10-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Claus,&lt;/p&gt;
&lt;p&gt;We'll just have to agree to disagree about the code editor. IMO it's nowhere near acceptable. And in any case, isn't this Smalltalk? The best language every invented for this stuff? Is this REALLY the best we can do after 30 years?&lt;/p&gt;
&lt;p&gt;As far as type annotations are concerned, RoelTyper already exists to do those kinds of type inference. IMO inserting type assertions on the basis of fuzzy inferencing isn't a great idea. If you want that information then it shouldn't be part of the code, it should be a visual annotation. I've usually found the inferred types in my code to be too general to be useful because there are enough reliable constraints.&lt;/p&gt;
&lt;p&gt;Furthermore, in code like this 'foo := Bar new', there is no guarantee that foo is actually a Bar. It could be anything, and that's just the tip of the iceberg. It is only a common expectation that patterns of code have a certain meaning, let alone a certain type. You need to operate on something more rigorous than expectations in order to do reliable type inferencing.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: Why wait so long?</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:puid>
					<includedComments:author>Claus</includedComments:author>
					<includedComments:pubDate>2008-08-04T07:46:58-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;What you propose is something like a Meta-Database which has a
mapping of methods (are method signatures unique?) to argument types
and return value types?&lt;/p&gt;
&lt;p&gt;About foo := Bar new. :&lt;/p&gt;
&lt;p&gt;Are there actually Factories which use "new"? Of course, this is
possible and propably useful in cases, but I would simply forbid this
in lights of having something useful to help with type checks or even
type inference.&lt;/p&gt;
&lt;p&gt;And I know realize you misunderstood me, adding the tags to the
method arguments is not something which should be inferenced, it is
something the programmer should be able to do (which basically is just
like public String getBla (Integer b){})&lt;/p&gt;
&lt;p&gt;Honestly, we had a few discussions concerning types at my former
(smalltalk) shop - and the general agreement was that there are certain
things which you simply cannot do in Smalltalk and a lot of things
which you can do because it is Smalltalk and that there are things
which you can do but never should, like trimming the first method
argument and concating it to a new string, turning it into a symbol
which then gets performed by the second method argument.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;About the code editor - it appears as if my own expectations towards
Smalltalk implementations are not as high as they should be, I do not
know why. Probably it is because you can do so much in so few lines
that there is not so much need for code write helpers.&lt;/p&gt;
&lt;p&gt;My general opinion towards a type system is that if you need static
types, you do not understand what your code does. The optional
annotations would be a great help to understand foreign code, but as I
said, it should be optional.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>So</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:puid>
					<includedComments:author>Antony Blakey</includedComments:author>
					<includedComments:pubDate>2008-08-04T08:29:47-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Claus,&lt;/p&gt;
&lt;p&gt;I'm 'proposing' anything. I've built something, and published it, but I'm not sure if you're talking about that.&lt;/p&gt;
&lt;p&gt;As far as 'bar := Foo new' is concerned, my point is that for a type inferencing system to be complete and correct it must deal with semantics of the langauage as is exists, without the layering of convention. I understand you are talking about manual annotation. I think manual annotation (as used in e.g. Lisp) is strictly useful for performance tuning. It's the worst of both worlds when used in code that is changing - your annotation can be wrong but the system can't tell you that. IMO inferencing is the only practically useful approach for Smalltalk.&lt;/p&gt;
&lt;p&gt;As for the code editor, I spend most of my Smalltalk time in the code editor, sometimes writing, more often editing. Yes, ST allows me to do more with less, but in my case that allows more output, rather than less input. I'm sure it seems less annoying if you are not on MacOSX. And as a comparison, I've been investigating Squeak for the last few days, and the fact that it recognises the command key is such a sweet joy.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: So</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:puid>
					<includedComments:author>isomer</includedComments:author>
					<includedComments:pubDate>2008-08-08T08:28:50-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;This looks really, really nice, Antony. Very well done.&lt;/p&gt;
&lt;p&gt;As an aside, Scintilla runs natively on OS X, and most other platforms. In a previous life, I wired it into VSE and even hooked up a code completion facility using their callback mechanism. Worth looking into, imo. It's a well written piece of software.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title></includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:puid>
					<includedComments:author>Claus</includedComments:author>
					<includedComments:pubDate>2008-08-09T09:35:56-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;isomer - Alright - looked it up again and, yes, my bad. So, Scintilla sounds like the perfect basis for a Source Code Editor for Visual Works.&lt;/p&gt;
&lt;p&gt;About the VS(E) part, we only discovered that Scintilla exists after having finished something similar (CodePane) for my (former) company's VS implementation.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>um</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:puid>
					<includedComments:author>Cédrick</includedComments:author>
					<includedComments:pubDate>2008-10-22T20:29:20-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Have you looked at Safaraa. It might help to have a better text editor&lt;span style="font-size: x-small;"&gt; (&lt;/span&gt;&lt;span style="white-space: pre;"&gt;&lt;span style="font-size: x-small;"&gt;http://www.squeaksource.com/Safara).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It was a gsoc project. Here is a sumup&amp;nbsp;&lt;span style="font-size: x-small;"&gt;&lt;a href="http://blog.summer.squeak.org/2008/10/safara-project-results-personal.html"&gt;http://blog.summer.squeak.org/2008/10/safara-project-results-personal.html&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title></includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</includedComments:puid>
					<includedComments:author>emp</includedComments:author>
					<includedComments:pubDate>2008-10-25T05:33:38-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;I really hate click here and there to find where some class are and then click here and there to find the code.&lt;/p&gt;
&lt;p&gt;While writing I'll like to be in a living object, and adjust it just as operating on some robot.&lt;/p&gt;
&lt;p&gt;Smalltalk could do that but didn't.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Linux Shell alike interactive developing enviroment is best for me</includedComments:title>
				</includedComments:comment>
			</includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIServlet?guid=3395013105</wfw:comment>
		</item>
		<item>
			<title>Any interest in a server-focussed reboot of VW? It seems not.</title>
			<link>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=Any_interest_in_a_server-focussed_reboot_of_VW_It_seems_not.&amp;entry=3394911085</link>
			<category>general</category>
			<pubDate>Wed, 30 Jul 2008 22:51:25 EDT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>I've had one expression of interest, but no offers of assistance, so I guess the answer is no. That's disappointing, but it does confirm my suspicion, and thus saves me wasting effort setting up a website and publicizing the project.</p>



<p>Right now I'm putting the finishing touches on a release of a TextMate-inspired command framework and invocation UI. I started this in response to Michael's comment in the pragma thread that using a menu to add an annotation to a method was a PITA. I agree. I had hoped to do a demo screencast and publish the code and an explanation last weekend, but my kids lovingly passed their 10-day-long-gastro on to me.</p>
</div>]]></description>
			<guid isPermaLink="false">3394911085</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIPBServlet?guid=3394911085</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/antony/blogView?guid=3394911085</pingback:target>
			<includedComments:comment-collection>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Any_interest_in_a_server-focussed_reboot_of_VW_It_seems_not.&amp;entry=3394911085</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Any_interest_in_a_server-focussed_reboot_of_VW_It_seems_not.&amp;entry=3394911085</includedComments:puid>
					<includedComments:author></includedComments:author>
					<includedComments:pubDate>2008-07-31T18:19:42-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;
&lt;p&gt;&lt;span style="font-size: 13px;"&gt;&lt;span style="font-family: helvetica;"&gt;Antony,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="line-height: 19px;"&gt;&lt;span style="font-size: 13px;"&gt;&lt;span style="font-family: helvetica;"&gt;I'm very interesting in your VW mutating idea. I'm following your advances in ASBAqua/ASBLook (OSX L&amp;amp;F) and LinkuisticsUI (GUI support) for months. I'm not using VW right now only because you cannot deploy desktop software on linux nor mac, the L&amp;amp;F just doesn't look good; and for windows deployment you have Dolphin which is cheaper.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: helvetica;"&gt;&lt;span style="font-size: 13px;"&gt;If you set up the website count with me, b&lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 19px;"&gt;&lt;span style="font-family: helvetica;"&gt;&lt;span style="font-size: 13px;"&gt;ut I think that all efforts&amp;nbsp;without Cincom involved would be useless.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>add 1</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Any_interest_in_a_server-focussed_reboot_of_VW_It_seems_not.&amp;entry=3394911085</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Any_interest_in_a_server-focussed_reboot_of_VW_It_seems_not.&amp;entry=3394911085</includedComments:puid>
					<includedComments:author>Antony Blakey</includedComments:author>
					<includedComments:pubDate>2008-07-31T20:47:46-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;I agree. I'm reluctantly coming to the conclusion that I'm in the wrong place. I should probably focus on a Smalltalk with a community motivated by interest rather than commercial imperatives. Unfortunately the Squeak UI puts me off, and the performance is a fraction of VWs, although Eliot's work on Cog will change that. I would need to add a UI to GST, for it to be usable for me. I should investigate Etoile.&lt;/p&gt;
&lt;p&gt;Alternatively I could a) wait for Newspeak and it's environment, which is aligned with my thoughts about direct manipulation of a reified code model and seems beautifully considered or b) switch to Ruby, with the promise of MagLev, but give up the live object environment.&lt;/p&gt;
&lt;p&gt;In the meantime though, I have a growing deployment of a commercial VW application, which is why I'm doing all of this in VW.&lt;/p&gt;
&lt;p&gt;And then, depression set in.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: all efforts without Cincom involved would be useless</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Any_interest_in_a_server-focussed_reboot_of_VW_It_seems_not.&amp;entry=3394911085</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Any_interest_in_a_server-focussed_reboot_of_VW_It_seems_not.&amp;entry=3394911085</includedComments:puid>
					<includedComments:author>Jason Grossman</includedComments:author>
					<includedComments:pubDate>2009-03-22T23:45:47-05:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;I agree with everything you say here.&lt;/p&gt;
&lt;p&gt;Etoile looks fantastic, although that's just judging by the web site, because I can't get the current version to install :-(&amp;nbsp; I'm not a real expert, but maybe that's the best place to focus efforts.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title></includedComments:title>
				</includedComments:comment>
			</includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIServlet?guid=3394911085</wfw:comment>
		</item>
		<item>
			<title>Any interest in a server-focussed reboot of VW?</title>
			<link>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=Any_interest_in_a_server-focussed_reboot_of_VW&amp;entry=3394487805</link>
			<category>general</category>
			<pubDate>Sat, 26 Jul 2008 01:16:45 EDT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p><em>This is a copy of my post on the vwnc mailing list.</em></p>



<p>My commercial interest in using VW is as a development environment for server applications. I do GUI development purely to enhance the environment itself, not to ship. I am also interested in improving VW to increase it's appeal to other developers. These two interests have lead me to develop solutions, (some not to completion), that address a number of weaknesses (IMO) in VisualWorks. Specifically GCCXML/LLVM/Clang (DLLCC/C integration), ASBAqua/ASBLook (OSX L&F), LinkuisticsUI (GUI support) and MirrorImage (version control etc).</p>



<p>I would like to enlist more resources in this mission because I don't think these issues are being addressed aggressively enough by Cincom. The non-technical issues that impede Cincom's ability to implement significant change include resource allocation, strategic imperative, and an understandable requirement to service and protect their existing revenue stream. I'm not being critical of the Cincom Smalltalk team. They have significant practical constraints, and I can only guess at the way in which the parent company views the Smalltalk product in a strategic sense.</p>



<p>Personally I think Cincom should fork/reboot VW into a server-only stream, because virtually all of the legacy issues are to do with the L&F and UI toolkit, and partly Store. WebVelocity uses this approach, and it's no coincidence that it doesn't use the VW UI, but I think a less radically partitioned product, not targeted specifically to Seaside, would be a potent thing.</p>



<p>Considering this mailing list, I can see that there is both a significant conservatism and no clear consensus on what change is both required and acceptable. I suspect the VW community is both smaller and has little of the energy/time/motivation/tools that characterize e.g. the Ruby community. It doesn't help that using VW isn't free, which is merely a fact of life.</p>



<p>Having said that however, I wonder if anyone else has both the interest and time to invest in mutating VW to produce a version that ignores the GUI and Store legacies? I'm slowly doing that but as a part-time effort it takes a long time, and just as importantly, working alone, whilst good for pursuing a vision, is intellectually impoverishing.</p>



<p>I was a guest on the Industry Misinterpretations podcast recently, and Michael suggested setting up a website for my 'NuevoVW'. I said at the time that I didn't think there was any community for what I was doing. I guess I should find out, rather than supposing.</p>



<p>Any takers?</p>


</div>]]></description>
			<guid isPermaLink="false">3394487805</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIPBServlet?guid=3394487805</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/antony/blogView?guid=3394487805</pingback:target>
			<includedComments:comment-collection></includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIServlet?guid=3394487805</wfw:comment>
		</item>
		<item>
			<title>Alternatives to pragmas?</title>
			<link>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</link>
			<category>general</category>
			<pubDate>Tue, 22 Jul 2008 01:46:53 EDT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p><style type='text/css'>

.ASBBlog div.code

{

	margin: 1ex 2em 1ex 2em;

	border: 1px dotted grey;

	padding: 0 1em 0 1em;

	background-color: rgb(230,230,230);

}

.ASBBlog div.callout div.label

{

	font-weight: bold;

    position: absolute;

	margin-top: -0.8em;

	padding: 0 1ex 0 1ex;

	background-color: white;

	border: 1px dotted rgb(128,64,64);

}

.ASBBlog div.callout

{

	margin: 1.5em 2em 0 2em;

	padding: 0 1em 0 1em;

	border: 1px dotted rgb(128,64,64);

	background-color: rgb(230,230,255);

}

.ASBBlog code

{

	font-family: Monaco, monospace;

	color: rgb(0,128,0);

}

</style>



<div class="ASBBlog">



<p>I've been involved in a discussion on vwnc about Pragmas. The gist of the discussion flips between whether they are an unneccesary complication of Smalltalk, or whether they don't do enough.</p>



<p>As a response to a 'put up or shut up', I'm going to describe two alternatives to the current VW implementation.</p>



<h3>Doing the same with less</h3>



<p>As a first, minimal idea, replace all instances like this:</p>



<div class="code"><pre>

browseLocalImplementorsOf

  &lt;menuItem: #(#LocalImplementorsOfDot #menus 'Local Implementors &Of...')

   nameKey: nil

   menu: #(#listMenu #browse)

   position: 21.015 >

	...

</pre></div>



<p>with this:</p>



<div class="code"><pre>

someMethod

  PRAGMA menuItem: #(#LocalImplementorsOfDot #menus 'Local Implementors &Of...')

         nameKey: nil

         menu: #(#listMenu #browse)

         position: 21.015.

  ...

</pre></div>



<p>Add <code>menuItem:nameKey:menu:position:</code> on the class side of PRAGMA, with an <strong>empty</strong> implementation. Don't use PRAGMA in any other context. To find instances of a pragma selector, find all sends of the selector with PRAGMA as a receiver. The enumeration of all pragmas is simply the class methods of PRAGMA (ignoring superclass methods, obviously).</p>



<p>You can use the class as a further qualifier on the selector e.g. in the previous example, do this:</p>



<div class="code"><pre>

someMethod

  MENU item: #(#LocalImplementorsOfDot #menus 'Local Implementors &Of...')

       key: nil

       menu: #(#listMenu #browse)

       position: 21.015.

  ...

</pre></div>



<p>So far this is just like the existing mechanism. One thing I haven't addressed is change management i.e. how do changes to methods containing 'pramas' get notified. However, there seems to be general consensus that the current mechanism for that isn't very good, so I'm not concerned about not replicating that. Possibly a way to be notified of all method changes containing a given binding (the class reference) would be a cleaner idea.</p>



<p>But this doesn't go far enough for me. I think a better solution would be this:</p>



<div class="code"><pre>

someMethod

  MenuSystem

       item: #(#LocalImplementorsOfDot #menus 'Local Implementors &Of...')

       key: nil

       menu: #(#listMenu #browse)

       position: 21.015

       do: [ ... ]

</pre></div>



<p>But how does this method get called? Well - that to me seems to me to be one of the essential pragma use-cases. Simply use reflection to find references to MenuSystem, qualified maybe by a set of selectors, within a given subtree (which is how Pragma works now) and call those methods. The semantics of the 'pragma' is more obvious because it's just the result of the method call.</p>



<p>This seems to me to be the most Smalltalk-ish solution.</p>



<p>What about pragmas as simple attributes? OK, how about this:</p>



<div class="code"><pre>

someMethod

  PRAGMA isTest.

  ...

</pre></div>



<p>or</p>



<div class="code"><pre>

someMethod

  IsTest.

  ...

</pre></div>



<p>The tools required to do this level of reflection are already there, and it shares with the existing implementation the qualities of requiring no extra tooling, nor any modifications to file out formats, and by extension, VC tools.</p>



<h3>A more general model</h3>



<p>Having said all of that, I've got reservations about that implementation because it pollutes the method source, and the mechanism for adding such annotations to other entities, such as classes and bindings such as shared variables, isn't very clean, although it can be done.</p>



<p>What I'd like is a way to add general annotations to methods, bindings and classes. And by general annotation, I simply mean an Object. Not just a MessageSend keyed by a selector.</p>



<p>The method source CodeTool could allow the method's annotations to mark the source view in some way (say using a test icon header for test methods). Ignoring the bootstrapping details, imagine that classes intended for use as annotations are themselves annotated as such. Then new annotations to add to a method could be selected from a list of applicable annotations - using a filter on the class side of all available annotation classes. An 'Annotation' CodeTool would not only allow annotations to be maintained, but could do so using a a UI provided by the annotation itself. Imagine a Test annotation adding a checkbox to the header of the source pane for all TestClass subclasses to toggle 'is this a test' or not.</p>



<p>Obviously this UI is applicable not only to methods, but also to classes and shared variable bindings, or in fact any binding. This is a form of dynamic Multiple Inheritance for the code model e.g. a method can be mixed in with 'TestMethod' on the fly, but it does it using a common Smalltalk composition paradigm</p>



<p>And it still leverages the existing exploration facilities - allInstances returns all the instances of a given annotation type. It would be trivial to limit this to annotations in a given subtree. The meaning of the Annotation IS the annotation. Finally, there's no reason that the annotations can't be found and 'triggered' in response to other lifecycle events, such as loading and unloaded.</p>



<p>This would require a bit more work on the file-out system, and by extension, VC tools (e.g. Store), but so far I think it's the best architecture.</p>



</div>
</p></div>]]></description>
			<guid isPermaLink="false">3394144013</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIPBServlet?guid=3394144013</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/antony/blogView?guid=3394144013</pingback:target>
			<includedComments:comment-collection>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:puid>
					<includedComments:author>Michael Lucas-Smith</includedComments:author>
					<includedComments:pubDate>2008-07-22T02:15:01-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;That approach might encourage side effects for having pragmas. Calling the pragma might actually -do- something which is not what you'd expect. You may execpt a pragma to do something at compile time, but not runtime when you call the method containing the pragma. The current pragma mechanism ensures that calling the method containing the pragma is not going to run any code to do with the pragma (tricky method wrapper approachs aside).&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Side effects?</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:puid>
					<includedComments:author>Antony Blakey</includedComments:author>
					<includedComments:pubDate>2008-07-22T02:41:52-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Michael,&lt;/p&gt;
&lt;p&gt;Well, I don't prefer the full object-annotation option, but anyway ... :)&lt;/p&gt;
&lt;p&gt;It would only encourage a side effect it there was some good reason for adding a side effect, so I wouldn't be worried about that. The key idea is that the mechanism for finding methods that have some characteristic is there without needing pragmas. What you need is adding the characteristic, which can be done in a number of ways using pre-pragma techniques.&lt;/p&gt;
&lt;p&gt;I think a more accurate criticism is that those methods &lt;strong&gt;won't&lt;/strong&gt; have side-effects, and looking at the implementation would leave you scratching your head about what the hell the method is meant to do. But that's no worse than figuring out pragma control flow at the moment. And at least you could put a comment in the implementation.&lt;/p&gt;
&lt;p&gt;Of all the source-based styles, I prefer the final Menu... one that moves the existing method body into a block in the call. I think it is the most minimal because the call actually does do something i.e. the only reflection/magic is in menu system finding methods that add menus by looking for methods that call certain methods on MenuSystem. That seems to leverage reflection in it's "purest" sense.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: Side effects?</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:puid>
					<includedComments:author>Antony Blakey</includedComments:author>
					<includedComments:pubDate>2008-07-22T02:42:55-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Oops. I meant "I &lt;strong&gt;prefer&lt;/strong&gt; the full object-annotation option"&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: Side effects?</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:puid>
					<includedComments:author>Travis Griggs</includedComments:author>
					<includedComments:pubDate>2008-07-22T03:17:06-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;This isn't really tagging any more though, is it? In the real world I live in, people like to put tags on things. It's a way of associating simple data (such is vin numbers, or price values, or whatever) with real world objects. The method tags work for me, because they're very analogous to that model. Simple data that I write on the rest of the thing.
&lt;p&gt;
If I understand correctly, you're leaning towards a model where I have to write code that &lt;i&gt;infers&lt;/i&gt; the meta data of a method. That seems less concise to me. I can infer test methods by those that send assert:, deny: and some other methods. Is this really method meta data though? Isn't it just a glorified version of 8.3 method names? Now we're using conventions and rules to filter certain methods based on their body's syntax, instead of just the signature, but does that make it any better?
&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title></includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:puid>
					<includedComments:author>Antony Blakey</includedComments:author>
					<includedComments:pubDate>2008-07-22T04:33:16-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;No it's not tagging. And in any case that argument begs the question somewhat.&lt;/p&gt;
&lt;p&gt;I think I live in the same real world as you. And in that world people like to put tags on things, and mark them with highlighter, and glue to to other things with sticky tape, and put them in a drawer for later, and so on. And yet I don't see anyone arguing for a stickytaping mechanism. IMO the argument from 'the real world' is analogical over-commitment. I don't mean to sound like an argumentative pedant, but I'm really trying to clarify these arguments.&lt;/p&gt;
&lt;p&gt;Are you just requiring metadata on methods, or do you specifically you want the tag within the source code because you feel it's analogous to writing on some real-world thing with a marker pen? I would prefer the full object annotation model for the kind of annotations you suggest.&lt;/p&gt;
&lt;p&gt;Yes, I suggest (for the first option) that you infer the metadata. What's wrong with that? Seems very DRY. Consider the CodeTool mechanism. You could have a method with a body of 'CodeTool register: self'. That method body might include some conditional logic to determine whether the tool is actually registered. The RB could find such methods and call them in order to collect all the possible code tools. We're not filtering based on syntax, but on semantics, and I think there's a world of difference there. And using the body rather than the signature DOES make it better because it provides the conflict-free extension that was the raison d'etre of pragmas.&lt;/p&gt;
&lt;p&gt;As far as infering test methods by looking for assert: et al, my suggestion was actually to say 'PRAGMA isTest'. Or you could say 'Test after: #someSetup'. The test frameworks already use convention and naming to detect test methods - is this worse? It seems better. But the purpose of those forms was to illustrate that a close correspondence with pragmas can be acheived without the use of the pragma tag. Partly that was prompted be thinking of Newspeak's elimination of primitive pragmas.&lt;/p&gt;
&lt;p&gt;But in any case, as I've said, I prefer the full object annotation idea. I think it more 'truly' builds on the idea of the system being just objects, and the code model being no different, but that's an aesthetic judgement.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: (Isn't really tagging)</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:puid>
					<includedComments:author>Wolfgang Eder</includedComments:author>
					<includedComments:pubDate>2008-07-22T06:48:50-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;With regards to building menus, it would be much simpler IMHO to just make a class Method&lt;/p&gt;
&lt;p&gt;installMenuItems&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MenuSystem item: ...&lt;/p&gt;
&lt;p&gt;To decide when to call these methods is the same problem as to decide when&lt;/p&gt;
&lt;p&gt;to evaluate the pragmas. Or even just require them to be called in postLoad, preUnload, whatever.&lt;/p&gt;
&lt;p&gt;Besides, pragmas for menu items allow for 1 method -&amp;gt; 1 menu item.&lt;/p&gt;
&lt;p&gt;Putting the code in a regular method allows for more flexibility (such as parametrisation).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Maybe I'm missing something, but I fail to see what exactly pragmas do for me&lt;/p&gt;
&lt;p&gt;(regarding building of menus).&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>About building menus</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:puid>
					<includedComments:author>Antony Blakey</includedComments:author>
					<includedComments:pubDate>2008-07-22T07:57:40-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;The problem is that you may want to extend that class. So you override the installMenuItems method, incorporating the existing code. Then someone else wants to do the same thing, and now you have conflicting overrides. And what happens when the original installMenuItems implementation is changed, but your override reflects the existing version? Pragmas were designed solve this problem by allowing you to specify the 'role' of the method, and due to the implementation, they also specify the parameters of that role.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: About building menus</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:puid>
					<includedComments:author>Antony Blakey</includedComments:author>
					<includedComments:pubDate>2008-07-22T08:13:54-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Wolgang,&lt;/p&gt;
&lt;p&gt;on reflection, I think I might have misunderstood your point. To decide when to call the methods is not the same as deciding when to 'call' the pragmas - pragmas in this case are about identifying methods, so to find, or identify a method is the correct equivalence. The issue of when to do that is the same in both cases. In fact, it's natural, using my initial 'PRAGMA sel: ...' example, to use the Pragma class unchanged (or largely - I haven't checked the details of that API for that purpose).&lt;/p&gt;
&lt;p&gt;It is true that having the code in a method allows for more parameterisation e.g. using different menus for different OS's (although that partticular case should probably be handled via a different abstraction).&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: About building menus</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:puid>
					<includedComments:author></includedComments:author>
					<includedComments:pubDate>2008-07-22T08:41:05-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Anthony,&lt;/p&gt;
&lt;p&gt;when one wants to extend a class, the method could be called&lt;/p&gt;
&lt;p&gt;installMenuItemsForFooExtension&lt;/p&gt;
&lt;p&gt;In the context of building menu items, I think it's a good idea to&lt;/p&gt;
&lt;p&gt;have some sort of MenuSystem that "collects" menu items, and allow&lt;/p&gt;
&lt;p&gt;extensions to modify the menu items built from its prerequisites.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Regarding calling pragmas, what I meant to say is this:&lt;/p&gt;
&lt;p&gt;pragmas are meant to "tag" or identify methods.&lt;/p&gt;
&lt;p&gt;The problem of when to do that (i.e. when to collect "tagged" method&lt;/p&gt;
&lt;p&gt;and rebuild the menu definitions) is the same problem as to when to&lt;/p&gt;
&lt;p&gt;call the installMenuItems* methods.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In the context of building menus, I would walk the modules (applications,&lt;/p&gt;
&lt;p&gt;parcels, whatever) in dependency order, and inside those walk all classes&lt;/p&gt;
&lt;p&gt;superclass to subclass, classes at the same level alpahbetically;&lt;/p&gt;
&lt;p&gt;and just rebuild all menu item definitions whenever something may have&lt;/p&gt;
&lt;p&gt;changed (a class added, removed, or a installMenuItems* method modified).&lt;/p&gt;
&lt;p&gt;Or, as already mentioned, to initialization manually in loaded/removing/postLoad/preUnload...&lt;/p&gt;
&lt;p&gt;I just cannot come up with a scenario where building menus this way wouldn't work.&lt;/p&gt;
&lt;p&gt;And it's Really Simple, IMHO. Thanks, Wolfgang&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title></includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Alternatives_to_pragmas&amp;entry=3394144013</includedComments:puid>
					<includedComments:author>Antony Blakey</includedComments:author>
					<includedComments:pubDate>2008-07-22T12:09:51-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Wolfgang,&lt;/p&gt;
&lt;p&gt;that all makes sense. I guess the main benefit that an annotation mechanism, be it pragmas or any other alternative has in this particular scenario, is that the user doesn't have to be aware of the naming convention, which if you extend the idea generally, would need to be coordinated. Some form of annotation OTOH marks the meaning orthogonally, in a way that makes the role obvious and provides a starting point for exploration.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title></includedComments:title>
				</includedComments:comment>
			</includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIServlet?guid=3394144013</wfw:comment>
		</item>
		<item>
			<title>Imaginary errors ...</title>
			<link>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=Imaginary_errors_...&amp;entry=3393475338</link>
			<category>general</category>
			<pubDate>Mon, 14 Jul 2008 08:02:18 EDT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>It turns out the 'Toggle Toolbar' bugs were both imaginary i.e. due to the image. Both were due to unreleased dependents or some such weirdness. When I rebuilt my image - which is trivial, and for which I am always prepared - the problems disappeared.</p>
</div>]]></description>
			<guid isPermaLink="false">3393475338</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIPBServlet?guid=3393475338</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/antony/blogView?guid=3393475338</pingback:target>
			<includedComments:comment-collection></includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIServlet?guid=3393475338</wfw:comment>
		</item>
		<item>
			<title>Class hierarchy control</title>
			<link>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=Class_hierarchy_control&amp;entry=3393464657</link>
			<category>general</category>
			<pubDate>Mon, 14 Jul 2008 05:04:17 EDT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p><style type='text/css'>

.ASBBlog div.code

{

	margin: 1ex 2em 1ex 2em;

	border: 1px dotted grey;

	padding: 0 1em 0 1em;

	background-color: rgb(230,230,230);

}

.ASBBlog div.callout div.label

{

	font-weight: bold;

    position: absolute;

	margin-top: -0.8em;

	padding: 0 1ex 0 1ex;

	background-color: white;

	border: 1px dotted rgb(128,64,64);

}

.ASBBlog div.callout

{

	margin: 1.5em 2em 0 2em;

	padding: 0 1em 0 1em;

	border: 1px dotted rgb(128,64,64);

	background-color: rgb(230,230,255);

}

.ASBBlog code

{

	font-family: Monaco, monospace;

	color: rgb(0,128,0);

}

</style>



<div class="ASBBlog">



<p>I've published versions of LinkuisticsUI/ASBAqua/ASBRB that implement a class hierarchy control as shown below. I'm going to add namespace support. Currently it's only passive, but my intention is to allow:</p>



<ul>



<li>click on a superclass will jump to the superclass in the navigator</li>



<li>control-click on a superclass will switch the method visibility setting to include that class (and hence it's subclasses). Clicking again will return to only showing the leaf methods.</li>



<li>left-click will bring up the menu that you would normally see.</li>



<li>control-left-click will bring up a menu of subclasses, which you can select from to jump to that class in the navigator.</li>



</ul>



<p>You can open an instance of this browser like this:</p>



<div class="code"><pre>

ASBRefactoringBrowser open

</pre></div>



<p>You should be aware however that it uses my GroupLayout mechanism to incorporate the control, hence the window spec has changed flavour. Therefore any extensions you have that depend on overriding the window spec of the RefactoringBrowser will not work.</p>



<p>And BTW, I've discovered a bug that has crept in somewhere (I think) in the scrollbar update that causes the 'Toggle Toolbar' menu option to break. On the existing RB, the problem is that an ASBAquaScrollbar is being created without being properly initialized, which then craps out when doing it's layout. I presume some kind of basicNew to do with cloning the window, but I'm not sure where it is.</p>



<p>A different bug in my new browser, presumably to do with my builder/canvas hacking, is that the builder gets created with a nil window reference. This also stops the 'Toggle Toolbar' menu item from working, and probably some other stuff as well. That's going to be easier to track down because at least I understand what's going on.</p>



<p><img src="files/AL.21.png"/></p>



</div>


</p></div>]]></description>
			<guid isPermaLink="false">3393464657</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIPBServlet?guid=3393464657</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/antony/blogView?guid=3393464657</pingback:target>
			<includedComments:comment-collection>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Class_hierarchy_control&amp;entry=3393464657</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Class_hierarchy_control&amp;entry=3393464657</includedComments:puid>
					<includedComments:author>Joachim Geidel</includedComments:author>
					<includedComments:pubDate>2008-07-20T04:37:07-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Thanks for making the new look and feel available! I like it very much. It's so much better than what comes with the VisualWorks distribution... sigh.&lt;/p&gt;
&lt;p&gt;However, when loading it into a VW 7.6 image, there were two methods missing: Integer&amp;gt;&amp;gt;asString and InputFieldSpec&amp;gt;&amp;gt;width. They caused exceptions in the postLoadBlock and the debugger which I opened in an attempt to debug the error. Also, MouseState&amp;gt;&amp;gt;mouseMoved uses a Symbol as the argument of do: instead of a block. This caused an error when scrolling in a list pane. Do I need another package which is not among the current prerequisites?&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Missing prerequisites?</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Class_hierarchy_control&amp;entry=3393464657</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Class_hierarchy_control&amp;entry=3393464657</includedComments:puid>
					<includedComments:author>Antony Blakey</includedComments:author>
					<includedComments:pubDate>2008-07-20T19:55:07-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Joachim,&lt;/p&gt;
&lt;p&gt;Integer&amp;gt;&amp;gt;asString is Magnitude&amp;gt;&amp;gt;asString, which is in Squeak-Extensions.&lt;/p&gt;
&lt;p&gt;InputFieldSpec&amp;gt;&amp;gt;width (was) in LinkuisticsUI-Core.&lt;/p&gt;
&lt;p&gt;Using a symbol as a block is in Squeak-Extensions (and Convenience, and I think in SymbolValue).&lt;/p&gt;
&lt;p&gt;These are obviously prereqs that no prereq engine would find. Sorry about that, and thanks for the heads-up.&lt;/p&gt;
&lt;p&gt;I'm in the middle of refactoring all of my stuff into different packages, and turning ASBAqua into a separate L&amp;amp;F from Aqua, and I haven't time to revert and republish. Could you add those prereqs and republish it?&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Missing prerequisites?</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Class_hierarchy_control&amp;entry=3393464657</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Class_hierarchy_control&amp;entry=3393464657</includedComments:puid>
					<includedComments:author>Nicholas Riley</includedComments:author>
					<includedComments:pubDate>2008-07-22T02:19:21-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Wow, not looking bad at all.&lt;/p&gt;
&lt;p&gt;Some stuff that would make it look even more correct:&lt;/p&gt;
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;get rid of the dimples between columns and put handles at the bottom of the scroll bar; that way you can regain some horizontal space&lt;/li&gt;
&lt;li&gt;squeeze/ellipsize overflowing text rather than cutting it off&lt;/li&gt;
&lt;li&gt;for the horizontal split, use a gradient as in iTunes/Mail&lt;/li&gt;
&lt;li&gt;use full-width highlights in the package list&lt;/li&gt;
&lt;li&gt;use a different appearance for the tab controls which logically groups them. Some options from NSSegmentedControl / NSTabView:&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2303/2043100395_ebe5363f06_o.png" border="0" width="979" height="483" /&gt;&lt;/p&gt;
&lt;p&gt;From what I remember of the VW UI framework none of this stuff will be all that easy, but hey, it doesn't seem like you go for easy :-)&lt;/p&gt;
&lt;p&gt;Control-clicking is supposed to be for menus... maybe option-click for the visibility toggle?&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Looking better...</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Class_hierarchy_control&amp;entry=3393464657</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Class_hierarchy_control&amp;entry=3393464657</includedComments:puid>
					<includedComments:author>Antony Blakey</includedComments:author>
					<includedComments:pubDate>2008-07-22T02:33:35-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Hi Nicholas,&lt;/p&gt;
&lt;p&gt;"put handles at the bottom of the scroll bar" - that's an OS option, and I've looked at it but I would want to pick up the OS setting because I suspect more people would object than not. I'd rather use a VW-only option to select it.&lt;/p&gt;
&lt;p&gt;"get rid of the dimples between columns" - see my comment about grouping below.&lt;/p&gt;
&lt;p&gt;"squeeze/ellipsize overflowing text rather than cutting it off" - I would need to do that consistently (including in the styled text that you can add to labels), but going too deep in the VW text handling is just too much effort.&lt;/p&gt;
&lt;p&gt;"use full-width highlights in the package list" - I've done that, but reverted the change for a reason that escapes me. I'll look at it again.&lt;/p&gt;
&lt;p&gt;"use a different appearance for the tab controls" - there are four implementations of of tab controls in ASBAqua, including three that you have shown. My previous post shows how you can select which one you want.&lt;/p&gt;
&lt;p&gt;"... which logically groups them" - VW uses a single form of tab control, and adding the OSX form of grouping to e.g. the browser, looks really awful. I've so far tried to not do to much to the specs of windows because there are overrides which inevitably collide.&lt;/p&gt;
&lt;p&gt;You're right about the clicking.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: Looking better...</includedComments:title>
				</includedComments:comment>
			</includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/antony/servlet/CommentAPIServlet?guid=3393464657</wfw:comment>
		</item>
	</channel>
</rss>
