jp.javelindev.wicket.component.RssImageLink.java Source code

Java tutorial

Introduction

Here is the source code for jp.javelindev.wicket.component.RssImageLink.java

Source

/*
 * Copyright 2011 Tsutomu YANO.
 *
 * 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 jp.javelindev.wicket.component;

import com.sun.syndication.feed.synd.SyndEnclosure;
import com.sun.syndication.feed.synd.SyndEntry;
import jp.javelindev.wicket.HaseriRss;
import jp.javelindev.wicket.HaseriRss.HaseriRssException;
import jp.javelindev.wicket.WicketApplication;
import jp.javelindev.wicket.dispatcher.EventHandler;
import jp.javelindev.wicket.payload.ImageRefresh;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.markup.html.IHeaderResponse;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.HiddenField;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author Tsutomu YANO
 */
public class RssImageLink extends Panel implements IImageSource {
    private static final Logger LOGGER = LoggerFactory.getLogger(RssImageLink.class);
    private String source;
    private final String NO_IMAGE_URL = urlFor(getApplication().getSharedResources().get(RssImageLink.class,
            "noImage.jpg", getWebRequest().getLocale(), null, null, false), null).toString();
    private WebMarkupContainer imageLink;
    private HiddenField<Boolean> hidden;

    public RssImageLink(String id, IModel<Boolean> model) {
        super(id, model);
        construct();
    }

    public RssImageLink(String id) {
        super(id);
        construct();
    }

    public Boolean getModelObject() {
        return (Boolean) getDefaultModelObject();
    }

    public void setModelObject(Boolean value) {
        setDefaultModelObject(value);
    }

    public void addBehaviorToImage(Behavior... behaviors) {
        imageLink.add(behaviors);
    }

    public void addBehaviorToField(Behavior... behaviors) {
        hidden.add(behaviors);
    }

    @Override
    public void renderHead(IHeaderResponse response) {
        super.renderHead(response);
        response.renderJavaScript("function changeValue(imageId, fieldId) {\n"
                + "    var image = document.getElementById(imageId);\n "
                + "    var field = document.getElementById(fieldId);\n "
                + "    var oldClassName = image.className;\n" + "    if(field.value == 'true') {\n"
                + "        field.value = 'false';\n" + "        if(oldClassName.indexOf('now-selected') >= 0) {\n"
                + "            image.className = oldClassName.replace('now-selected', 'not-selected');\n"
                + "        } else {\n" + "            image.className = oldClassName + ' not-selected';\n"
                + "        }\n" + "    } else {\n" + "        field.value = 'true';\n"
                + "        if(oldClassName.indexOf('not-selected') >= 0) {\n"
                + "            image.className = oldClassName.replace('not-selected', 'now-selected');\n"
                + "        } else {\n" + "            image.className = oldClassName + ' now-selected';\n"
                + "        }\n" + "    }\n" + "}", "clickscript");
    }

    @SuppressWarnings("unchecked")
    final void construct() {
        setRenderBodyOnly(true);

        hidden = new HiddenField<Boolean>("linkValue", (IModel<Boolean>) this.getDefaultModel());
        hidden.setOutputMarkupId(true);
        add(hidden);

        imageLink = new WebMarkupContainer("imageLink");
        imageLink.setOutputMarkupId(true);
        add(imageLink);
        imageLink.add(new AttributeAppender("onclick", true, new AbstractReadOnlyModel<String>() {
            @Override
            public String getObject() {
                final String script = "changeValue('" + imageLink.getMarkupId() + "', '" + hidden.getMarkupId()
                        + "');";
                return script;
            }
        }, ";"));

        imageLink.add(new AttributeModifier("src", new AbstractReadOnlyModel<String>() {
            @Override
            public String getObject() {
                return getImageSource();
            }
        }));
    }

    @Override
    protected void onInitialize() {
        super.onInitialize();
        Form<?> parentForm = findParent(Form.class);
        if (parentForm == null) {
            throw new IllegalStateException(
                    "RssImageLink must be attached on a Form instance. Can not find a parent form object.");
        }
    }

    @Override
    public String getImageSource() {
        if (source == null) {
            WicketApplication application = WicketApplication.get();
            try {
                HaseriRss rss = application.getRssSource();
                SyndEntry entry = rss.getRandomEntry();
                source = ((SyndEnclosure) entry.getEnclosures().get(0)).getUrl();
            } catch (HaseriRssException ex) {
                LOGGER.error("can not retrieve a image.", ex);
                source = NO_IMAGE_URL;
            }
        }
        return source;
    }

    @EventHandler
    public void handleImageRefreshEvent(ImageRefresh<?> refresh) {
        if (Boolean.TRUE.equals(getModelObject())) {
            source = null;
            setModelObject(false);
            refresh.addComponent(imageLink);
            refresh.addComponent(hidden);
        }
    }
}