Hi,
this is an interesting problem Philippe and I have been discussing
yesterday: he wanted that a certain component rendered html anchor
tags to all the links in order to let the web browser jump to the
right position in the page. I think this is a nice design discussion:
he suggested a first solution, that I tried to improve, but that
didn't solve the problem yet ... sorry, partly in german ...
Wäre es nicht
einfach eine
Subklasse von MAReport zu machen und dort #rendererClass zu
überschreiben, das einen Subklasse von WAHtmlRenderer zurückgibt,
welche die Methode #anchorWithUrl:do: überschreibt und dort die
entsprechenden ids ganz hinzufügt?
Daran hatte ich gar nicht gedacht. Wir hatten zuerst eine
Subklasse, ich
habs aber dann in MAReport gepusht um es dir zu schicken. Zudem
haben wir ja
auch MAColum abgeändert. Was meiner Meinung nach noch hässlicher
ist. Aber
das liesse sich ja auch elegant mit dem renderer lösen.
Ich habe jetzt noch zwei Fragen:
Wie komme ich im renderer an die ids? Im Moment sind die ja im
Report und
die müssten ja über mehrere rendering Vorgänge stabil bleiben.
You would set it from the parent component if desired, or even better
let the renderer ask its component for the anchor-id to be used.
Wie ist das mit Links, die sich nicht auf den Report
beziehen. Z.B.
actions
(edit, remove) die ev. in einer ganz neuen Seite resultieren würden
(z.B
wegen #call:). Dort würde ich ja auch überall den anchor hinzufügen
obwohl
es in der Zielseite ev. gar nicht existiert. Hast du eine Idee wie
ich das
verhindern kann?
Okay, what about this idea? Use a customized renderer that uses a
dynamic variable (subclass of WADynamicVariable) to determine what
anchor has to be appended and that will not change anything if this
value is nil.
BlaBla>>renderContentOn: html
SW2DynamicAnchorTarget
use: 'theSuperAnchor'
while: [ html render: self report ].
SW2HtmlRenderer>>anchorWithUrl: aUrl do: aString
SW2DynamicAnchorTarget value in: [ :value |
uper
anchorWithUrl: (value isNil
ifTrue: [ aUrl ]
ifFalse: [ aUrl , '#' , value ])
do: aString.
I think like this you can do anything you need to do? If you can iron
out this concept (maybe using the new Seaside brush rendering
framework) this would be something that should go into Seaside
itself, I suspect.
Moreover, I think this is an excellent example how the design of your
code can be improved by discussing and rethinking a problem several
times. In fact, the above code avoids the need to change 30 methods
in a non generic fashion and even allows it to be reused in different
contexts.
Cheers,
Lukas
--
Lukas Renggli
http://www.lukas-renggli.ch