About OmniBrowser code :)

stéphane ducasse ducasse at iam.unibe.ch
Wed Dec 8 07:31:01 UTC 2004


>
>> 	- so if I try to understand:
>> 		A browser is described by a metaGraph.  This metaGraph is described 
>> by node and edges.
>> 		A node can be manipulated by actions
>> 		which represent what can be done on a specific node. A node will 
>> wrap the code entity.
>
> Yes. The important thing to understand is that there are actually two 
> graphs here.
>
> The "domain graph" represents the objects in the domain we are 
> browsing. The "domain nodes" wrap objects in the domain the user is 
> working with - Smalltalk code in this case. There are many kinds of 
> domain nodes; all the subclasses  of OBNode are domain nodes. The 
> edges of this graph aren't reified.
>
> The "metagraph" represents the paths through the domain graph that the 
> browser makes available to the user. When the user clicks on a domain 
> node, we look at its metanode to see what should happen in response. 
> The edges incident on that metanode represent  navigation messages 
> that we can send to the selected domain node. The domain node will 
> respond with a collection of more domain nodes, which are then 
> associated with the metanode the edge leads to.
>
> That sounds more confusing than it really is, so I'll give a more 
> concrete example. Imagine that we've just clicked on the class Date in 
> an OBSystemBrowser. The currently selected domain node is an 
> OBClassNode that wraps Date. Its metanode is touched by a single edge, 
> labelled #categories. So we send #categories to the domain node that 
> wraps Date, and get back a collection of OBMethodCategoryNodes. The 
> edge points to another metanode, which we assign to all the nodes in 
> our collection. Then we display the list of nodes in the column to the 
> right of the one containing Date. If the user then clicks on a method 
> category, we repeat the process to get a list of OBMethodNodes to 
> display in the next column.

Ok now I understand how you pass from one state to the other :)
Could you paste this text in the class comment of OBBrowser

>
>> 		It is not clear yet to me, how we represent state transition (for 
>> example, how to pass
>> 		from "we are editing a method, to the method is compiled so the 
>> browser does not have to
>> 		tell us that we will lose your code if we click on a method 
>> category for example".
>
> Hmm, Alexander asked me that question as well. I think it might be 
> best to think about it in terms of two levels of state, corresponding 
> to the metagraph and the domain graph.
>
> The metagraph is very like a state machine. Metanodes represent 
> states, and edges represent transitions between them. But you might 
> say that these are "abstract states." There could be any number of 
> nodes in the domain graph that correspond to a given metanode. The 
> currently selected domain node is the concrete state of the browser. 
> When the user does something that triggers a state change, the browser 
> sends #okToChange to all of its panels. The panels all maintain 
> secondary state that they can use to tell whether a state transition 
> is ok. Then after the change has been done, the browser sends 
> #nodeChanged to all the panels, and they update their secondary state 
> (and the display) to reflect the change.

Same remark as above :)

>> 	- why OBCodeNode, OBClassVariableNode are totally empty?
>
> This is the result of refactorings. They originally had more definite 
> purpose, but gradually lost all their methods. I left OBCodeNode in 
> because I wasn't sure that I wouldn't need to put behavior there 
> again. I had removed it and then put it back once already, and it was 
> enough of a hassle that I left it in. OBClassVariableNode is still 
> there for structural reasons. It makes more sense to me to have an 
> OBVariableNode class that both class and instance variable nodes 
> inherit from, even if it results in an empty class. The alternative - 
> having OBInstanceVariableNode inherit from OBClassVariableNode - would 
> be confusing, I think.

Put that in class comments this way we know it :)

>> 	- is OB using the systemNotifier mechanism?
>
> Yes. OBCodeBrowser registers for SCN events and refreshes its display 
> when it receives them.
:)
:))))

>> 	- why the OBMetaGraphBuilder does not have any instance methods? I 
>> understand that this is a metagraph Repository
>> 	but without methods or state I do not understand.
>
> This is more refactoring. As far as OB-Standard is concerned, this 
> class can go away, but OB-Filesystem still has extension methods on 
> it, and so I left it in until I get around to reviving OB-Filesystem.

ok. Same remark ;)

>> 	- what is an OBDefinition? Answer should also go in comments :)
>
> An OBDefinition is a way to define domain nodes. It presents the 
> domain node as text, and knows how to translate changes in the text 
> into changes in the domain. So an OBMethodDefinitionNode knows how to 
> compile methods, OBClassDefinitionNode knows how to create or alter 
> classes. Definitions also do all the associated error checking - for 
> example, OBClassDefinition is responsible for checking that a new 
> class definition doesn't overwrite some other class in the system.
>
> As for comments, yes. The comments in beta 1 haven't been updated in a 
> while. I'm working on this, but it's a lot of work, and I wanted to at 
> least get the code out there. The next release should have updated 
> comments.

Excellent. As I said I'm really impressed by your tests and the amount 
of work you did. If you need help to fix the as yet unclassified 
categories I could take one hour to fix as much as I can.

Long time ago, ned sent a enh to recategorize the methods in their 
ancestor superclass cat. SO it may be worht to dust it off. so may be 
this is already in the image.

>
>> 	- how can I open an OBHierarchyBrowser?
>
> Ok, you caught me. This isn't implemented yet. I hardly ever use 
> hierarchy browsers, so this one fell through the cracks. I'll put one 
> in the next release.

But I saw the code of a class with hierarchy but I could find a way to 
open it.
I think that people can help building tools too.

>> 	- I imagine that we really need the notion of environment to be able 
>> to scope the search
>> 	senders... in the image, and for example SystemNavigation could use 
>> such search environment
>> 	and also for the rbengine. Do you think that OBEnvironmentNode could 
>> be one candidate,
>> 	may be the namespace implementation we are doing could serve also 
>> that purpose.
>
> I agree that we need this, but I don't think OBEnvironmentNode is a 
> candidate. Its purpose is to *wrap* an environment. Right now it wraps 
> Smalltalk. I think we'd actually be in good shape if SystemNavigation 
> were more analogous to SystemOrganization. Then you could send 
> #navigation to a SystemDictionary to get a SystemNavigation that was 
> limited to the classes it contains. That would be a big step towards 
> being able to have multiple SystemDictionaries.

We will be able to manipulate soon multiple environments. So I will 
digest what you said but indeed.
and you are right I will add that to my to do list.

Stef
>
> Colin
>
>
>




More information about the Squeak-dev mailing list