[ 
https://issues.apache.org/jira/browse/WICKET-6042?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15036379#comment-15036379
 ] 

ASF GitHub Bot commented on WICKET-6042:
----------------------------------------

Github user sebfz1 commented on a diff in the pull request:

    https://github.com/apache/wicket/pull/143#discussion_r46458103
  
    --- Diff: 
wicket-core/src/main/java/org/apache/wicket/markup/html/image/ExternalImage.java
 ---
    @@ -0,0 +1,298 @@
    +/*
    + * Licensed to the Apache Software Foundation (ASF) under one or more
    + * contributor license agreements.  See the NOTICE file distributed with
    + * this work for additional information regarding copyright ownership.
    + * The ASF licenses this file to You 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.wicket.markup.html.image;
    +
    +import java.io.Serializable;
    +import java.util.ArrayList;
    +import java.util.Arrays;
    +import java.util.List;
    +
    +import org.apache.wicket.markup.ComponentTag;
    +import org.apache.wicket.markup.html.WebComponent;
    +import org.apache.wicket.markup.html.image.Image.Cors;
    +import org.apache.wicket.model.IModel;
    +import org.apache.wicket.model.Model;
    +
    +/**
    + * A component to display external images. The src / srcset information 
are hold in models
    + * 
    + * @author Tobias Soloschenko
    + *
    + */
    +public class ExternalImage extends WebComponent
    +{
    +
    +   private static final long serialVersionUID = 1L;
    +
    +   /** The x values to be used within the srcset */
    +   private List<String> xValues = null;
    +
    +   /** The sizes of the responsive images */
    +   private List<String> sizes = null;
    +
    +   /**
    +    * Cross origin settings
    +    */
    +   private Cors crossOrigin = null;
    +
    +   private IModel<List<Serializable>> srcSetModels;
    +
    +   /**
    +    * Creates an external image
    +    * 
    +    * @param id
    +    *            the component id
    +    * @param src
    +    *            the source URL
    +    */
    +   public ExternalImage(String id, Serializable src)
    +   {
    +           this(id, src, (List<Serializable>)null);
    +   }
    +
    +   /**
    +    * Creates an external image
    +    * 
    +    * @param id
    +    *            the component id
    +    * @param src
    +    *            the source URL
    +    * @param srcSet
    +    *            a list of URLs placed in the srcset attribute
    +    */
    +   public ExternalImage(String id, Serializable src, List<Serializable> 
srcSet)
    +   {
    +           this(id, Model.of(src), Model.ofList(srcSet));
    +   }
    +
    +   /**
    +    * Creates an external image
    +    * 
    +    * @param id
    +    *            the component id
    +    * @param srcModel
    +    *            the model source URL
    +    * @param srcSetModels
    +    *            a model list of URLs placed in the srcset attribute
    +    */
    +   public ExternalImage(String id, IModel<Serializable> srcModel)
    +   {
    +           this(id, srcModel, (IModel<List<Serializable>>)null);
    +   }
    +
    +   /**
    +    * Creates an external image
    +    * 
    +    * @param id
    +    *            the component id
    +    * @param srcModel
    +    *            the model source URL
    +    * @param srcSetModels
    +    *            a model list of URLs placed in the srcset attribute
    +    */
    +   public ExternalImage(String id, IModel<Serializable> srcModel,
    +           IModel<List<Serializable>> srcSetModels)
    +   {
    +           super(id, srcModel);
    +           this.srcSetModels = srcSetModels;
    +   }
    +
    +   @Override
    +   protected void onComponentTag(ComponentTag tag)
    +   {
    +           super.onComponentTag(tag);
    +
    +           if ("source".equals(tag.getName()))
    +           {
    +                   buildSrcSetAttribute(tag, getSrcSet());
    +           }
    +           else
    +           {
    +                   checkComponentTag(tag, "img");
    +                   buildSrcAttribute(tag, getDefaultModel());
    +                   buildSrcSetAttribute(tag, getSrcSet());
    +           }
    +
    +           buildSizesAttribute(tag);
    +
    +           Cors crossOrigin = getCrossOrigin();
    +           if (crossOrigin != null && Cors.NO_CORS != crossOrigin)
    +           {
    +                   tag.put("crossOrigin", crossOrigin.getRealName());
    +           }
    +   }
    +
    +   /**
    +    * Builds the src attribute
    +    *
    +    * @param tag
    +    *            the component tag
    +    * @param srcModel
    +    *            the model containing the src URL
    +    */
    +   protected void buildSrcAttribute(final ComponentTag tag, IModel<?> 
srcModel)
    +   {
    +           if (srcModel != null)
    +           {
    +                   tag.put("src", srcModel.getObject().toString());
    +           }
    +   }
    +
    +   /**
    +    * Builds the srcset attribute if multiple models are found as varargs
    +    *
    +    * @param tag
    +    *            the component tag
    +    * @param srcSetModels
    +    *            the models containing the src set URLs
    +    */
    +   protected void buildSrcSetAttribute(final ComponentTag tag,
    +           IModel<List<Serializable>> srcSetModels)
    +   {
    +           int srcSetPosition = 0;
    +           List<Serializable> srcSetItems = srcSetModels.getObject();
    +           if (srcSetItems != null)
    +           {
    +                   for (Serializable srcSetModel : srcSetItems)
    +                   {
    +                           String srcset = tag.getAttribute("srcset");
    +                           String xValue = "";
    +
    +                           // If there are xValues set process them in the 
applied order to the srcset
    +                           // attribute.
    +                           if (xValues != null)
    +                           {
    +                                   xValue = xValues.size() > 
srcSetPosition && xValues.get(srcSetPosition) != null
    +                                           ? " " + 
xValues.get(srcSetPosition)
    +                                           : "";
    +                           }
    +                           tag.put("srcset", (srcset != null ? srcset + ", 
" : "") + srcSetModel + xValue);
    +                           srcSetPosition++;
    +                   }
    +           }
    +   }
    +
    +   /**
    +    * builds the sizes attribute of the img tag
    +    *
    +    * @param tag
    +    *            the component tag
    +    */
    +   protected void buildSizesAttribute(final ComponentTag tag)
    +   {
    +           // if no sizes have been set then don't build the attribute
    +           if (sizes == null)
    +           {
    +                   return;
    +           }
    +           String sizes = "";
    +           for (String size : this.sizes)
    +           {
    +                   sizes += size + ",";
    +           }
    +           int lastIndexOf = sizes.lastIndexOf(",");
    +           if (lastIndexOf != -1)
    +           {
    +                   sizes = sizes.substring(0, lastIndexOf);
    +           }
    +           if (!"".equals(sizes))
    +           {
    +                   tag.put("sizes", sizes);
    +           }
    +   }
    +
    +   /**
    +    * @param values
    +    *            the x values to be used in the srcset
    +    */
    +   public void setXValues(String... values)
    +   {
    +           if (xValues == null)
    +           {
    +                   xValues = new ArrayList<>();
    +           }
    +           else
    +           {
    +                   xValues.clear();
    +           }
    +           xValues.addAll(Arrays.asList(values));
    +   }
    +
    +   /**
    +    * @param sizes
    +    *            the sizes to be used in the size
    +    */
    +   public void setSizes(String... sizes)
    +   {
    +           if (this.sizes == null)
    +           {
    +                   this.sizes = new ArrayList<>();
    +           }
    +           else
    +           {
    +                   this.sizes.clear();
    +           }
    +           this.sizes.addAll(Arrays.asList(sizes));
    +   }
    +
    +   /**
    +    * Gets the cross origin settings
    +    * 
    +    * @see {@link 
org.apache.wicket.markup.html.image.Image#setCrossOrigin(Cors)}
    +    *
    +    * @return the cross origins settings
    +    */
    +   public Cors getCrossOrigin()
    +   {
    +           return crossOrigin;
    +   }
    +
    +   /**
    +    * Sets the cross origin settings
    +    * 
    +    * @see {@link 
org.apache.wicket.markup.html.image.Image#setCrossOrigin(Cors)}
    +    * @param crossOrigin
    +    *            the cross origins settings to set
    +    */
    +   public void setCrossOrigin(Cors crossOrigin)
    +   {
    +           this.crossOrigin = crossOrigin;
    +   }
    +
    +   /**
    +    * Gets a list of models containing the src set values
    +    * 
    +    * @return a list of models containing the src set values
    +    */
    +   public IModel<List<Serializable>> getSrcSet()
    --- End diff --
    
    IMO: either it is named `#getSrcSetModel` and it returns the model, or it 
is named `#getSrcSet` and it returns the underlying model object :). The first 
one sound more logical...


> Implementation of ExternalImage component
> -----------------------------------------
>
>                 Key: WICKET-6042
>                 URL: https://issues.apache.org/jira/browse/WICKET-6042
>             Project: Wicket
>          Issue Type: Improvement
>          Components: wicket
>    Affects Versions: 7.1.0, 8.0.0-M1
>            Reporter: Tobias Soloschenko
>            Assignee: Tobias Soloschenko
>              Labels: features
>
> Like in the MediaComponent - Video for example 
> (https://ci.apache.org/projects/wicket/apidocs/7.x/org/apache/wicket/markup/html/media/video/Video.html)
>  the Image should be able to be configured with a String placed into the src 
> attribute.
> Possible constructor to be used for that:
> Image(String id, IModel<?> model, String... srcs) 
> As of comments the requirement changed a bit and a new implementation 
> "ExternalImage" is the target of this ticket:
> http://apache-wicket.1842946.n4.nabble.com/Image-based-on-external-url-model-object-tt4672692.html#none



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to