Perfect.

Where did you find that the name for the engine service was
engine-service:direct ?



On 9/1/06, Brian Long <[EMAIL PROTECTED]> wrote:

Hajaansh,

had the same problem myself when moving from 3 to 4, so here are the
updated
AreaLink.jwc and AreaLink.java that I use. The main difference in the use
of
property injection for the engine service.

AreaLink.jwc

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE component-specification PUBLIC
  "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
  "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd";>

<component-specification
class="com.yourProject.web.page.AreaLink"
allow-body="no"
allow-informal-parameters="yes">

<!--<inject property="directService" object="engine-service:direct"/>-->

<description>
Creates a non-contextual link.  Non-persistent state can be stored within
the link
using the context.
</description>

<parameter name="listener" required="yes" />

<parameter name="parameters" >
    <description>
    An object, or list of objects, encoded into the URL
    as service parameters.
    </description>
</parameter>

<reserved-parameter name="href"/>

</component-specification>

AreaLink.java

package com.annadaletech.yourProject.web.jwc;

import org.apache.tapestry.AbstractComponent;
import org.apache.tapestry.IActionListener;
import org.apache.tapestry.IDirect;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.Tapestry;
import org.apache.tapestry.annotations.InjectObject;
import org.apache.tapestry.engine.DirectServiceParameter;
import org.apache.tapestry.engine.IEngineService;
import org.apache.tapestry.engine.ILink;
import org.apache.tapestry.link.DirectLink;

public abstract class AreaLink extends AbstractComponent implements
IDirect
{

    public abstract Object getParameters();
    public abstract IActionListener getListener();

    @InjectObject("engine-service:direct")
    public abstract IEngineService getDirectService();

    public void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
    {
      if (cycle.isRewinding())
       return;

      Object[] parameters = DirectLink.constructServiceParameters
(getParameters());

      //IEngineService service = getDirectService();
      DirectServiceParameter dsParam = new
DirectServiceParameter(this,parameters);
      ILink link = getDirectService().getLink(false,dsParam);

      writer.beginEmpty("area");
      writer.attribute("href",link.getURL());

      renderInformalParameters(writer,cycle);
    }

    public void trigger(IRequestCycle cycle)
    {
        IActionListener listener = getListener();

        if (listener == null)
         throw Tapestry.createRequiredParameterException(this,
"listener");

        listener.actionTriggered(this, cycle);
    }

    public boolean isStateful()
    {
     return false;
    }

}

hivemodule.xml

<contribution configuration-id="tapestry.url.ServiceEncoders">
   <direct-service-encoder id="direct" stateless-extension="direct"
                                     stateful-extension="sdirect"/>
</contribution>

yourProject.application

<component-type type="AreaLink" specification-path="jwc/AreaLink.jwc" />

I hope this helps . . .

/Brian.

On 9/1/06, Hajaansh <[EMAIL PROTECTED]> wrote:
> I was wondering how to make a DirectArea component (getting callbacks on
> Image Maps) for Tapestry 4 as the implementation for Tapestry 3 does not
> work in Tapestry 4.
>
> And clues? I was looking at using the ILinkRenderer but to be honest I
am
> just getting in a muddle.
>
> Cheers,
>
> Hajaash
>
>


Reply via email to