blob: eced93b155659e2505d6c887cf024788d2f75b0b [file] [log] [blame]
// Copyright 2004, 2005 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.tapestry.html;
import org.apache.hivemind.ApplicationRuntimeException;
import org.apache.tapestry.*;
import org.apache.tapestry.components.ILinkComponent;
import org.apache.tapestry.form.IFormComponent;
import org.apache.tapestry.form.LinkSubmit;
import java.util.HashMap;
import java.util.Map;
/**
* Combines a link component (such as
* {@link org.apache.tapestry.link.DirectLink}) with an <img> and
* JavaScript code to create a rollover effect that works with both Netscape
* Navigator and Internet Explorer. [ <a
* href="../../../../../ComponentReference/Rollover.html">Component Reference
* </a>]
*
* @author Howard Lewis Ship
*/
public abstract class Rollover extends AbstractComponent
{
/**
* Converts an {@link IAsset}binding into a usable URL. Returns null if the
* binding does not exist or the binding's value is null.
*
* @param asset
* The asset to generate a url for.
* @return The url to the asset resource, or null if it couldn't be generated.
*/
protected String getAssetURL(IAsset asset)
{
if (asset == null)
return null;
return asset.buildURL();
}
protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
{
// No body, so we skip it all if not rewinding
// (assumes no side effects on accessors).
if (cycle.isRewinding())
return;
String imageURL = null;
String mouseOverURL = null;
String mouseOutURL = null;
boolean dynamic = false;
String imageId;
boolean linkDisabled = false;
PageRenderSupport pageRenderSupport = TapestryUtils.getPageRenderSupport(cycle, this);
Object serviceLink = cycle.getAttribute(Tapestry.LINK_COMPONENT_ATTRIBUTE_NAME);
if (serviceLink == null)
{
serviceLink = cycle.getAttribute(LinkSubmit.ATTRIBUTE_NAME);
if (serviceLink != null)
linkDisabled = ((IFormComponent) serviceLink).isDisabled();
} else
{
linkDisabled = ((ILinkComponent) serviceLink).isDisabled();
}
if (serviceLink == null)
throw new ApplicationRuntimeException(Tapestry.getMessage("Rollover.must-be-contained-by-link"), this, null, null);
if (linkDisabled)
{
imageURL = getAssetURL(getDisabled());
if (imageURL == null)
imageURL = getAssetURL(getImage());
}
else
{
imageURL = getAssetURL(getImage());
mouseOverURL = getAssetURL(getMouseOver());
mouseOutURL = getAssetURL(getMouseOut());
dynamic = (mouseOverURL != null) || (mouseOutURL != null);
}
if (imageURL == null)
throw Tapestry.createRequiredParameterException(this, "image");
writer.beginEmpty("img");
writer.attribute("src", imageURL);
if (dynamic)
{
if (mouseOverURL == null)
mouseOverURL = imageURL;
if (mouseOutURL == null)
mouseOutURL = imageURL;
imageId = writeScript(cycle, pageRenderSupport, serviceLink, mouseOverURL, mouseOutURL);
writer.attribute("id", imageId);
}
renderInformalParameters(writer, cycle);
writer.closeTag();
}
// Injected
public abstract IScript getScript();
private String writeScript(IRequestCycle cycle, PageRenderSupport pageRenderSupport,
Object link, String mouseOverImageURL, String mouseOutImageURL)
{
String imageId = pageRenderSupport.getUniqueString(getId());
String preloadedMouseOverImageURL = pageRenderSupport.getPreloadedImageReference(this, mouseOverImageURL);
String preloadedMouseOutImageURL = pageRenderSupport.getPreloadedImageReference(this, mouseOutImageURL);
Map symbols = new HashMap();
symbols.put("link", link);
symbols.put("imageId", imageId);
symbols.put("mouseOverImageURL", preloadedMouseOverImageURL);
symbols.put("mouseOutImageURL", preloadedMouseOutImageURL);
getScript().execute(this, cycle, pageRenderSupport, symbols);
return imageId;
}
public abstract IAsset getMouseOut();
public abstract IAsset getDisabled();
public abstract IAsset getMouseOver();
public abstract IAsset getImage();
}