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