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

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

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

    https://github.com/apache/wicket/pull/143#discussion_r46211659
  
    --- Diff: 
wicket-core/src/main/java/org/apache/wicket/markup/html/image/ExternalImage.java
 ---
    @@ -0,0 +1,274 @@
    +/*
    + * 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.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<?>[] srcSet;
    +
    +   /**
    +    * 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, String src, String... srcSet)
    +   {
    +           this(id, src != null ? Model.of(src) : null, 
convertToModel(srcSet));
    +   }
    +
    +   /**
    +    * Creates an external image
    +    * 
    +    * @param id
    +    *            the component id
    +    * @param src
    +    *            the model source URL
    +    * @param srcSetModels
    +    *            a model list of URLs placed in the srcset attribute
    +    */
    +   public ExternalImage(String id, IModel<?> src, IModel<?>... 
srcSetModels)
    +   {
    +           super(id, src);
    +           this.srcSet = srcSetModels;
    +   }
    +
    +   /**
    +    * Converts a variable argument of Strings to an array of models
    +    * 
    +    * @param srcSet
    +    *            a variable argument of URLs to be converted to an array 
of models
    +    * @return an array of models
    +    */
    +   private static IModel<?>[] convertToModel(String... srcSet)
    +   {
    +           IModel<?>[] models = null;
    +           if (srcSet != null)
    +           {
    +
    +                   models = new IModel<?>[srcSet.length];
    +                   int i = 0;
    +                   for (String srcSetElement : srcSet)
    +                   {
    +                           models[i] = Model.of(srcSetElement);
    +                           i++;
    +                   }
    +           }
    +           else
    +           {
    +                   models = new IModel<?>[0];
    +           }
    +           return models;
    +   }
    +
    +   @Override
    +   protected void onComponentTag(ComponentTag tag)
    +   {
    +           super.onComponentTag(tag);
    +
    +           if ("source".equals(tag.getName()))
    +           {
    +                   buildSrcSetAttribute(tag, getSrcSet());
    +           }
    +           else
    +           {
    +                   List<IModel<?>> srcSet = getSrcSet();
    +                   checkComponentTag(tag, "img");
    +                   buildSrcAttribute(tag, getDefaultModel());
    +                   if (srcSet.size() > 1)
    +                   {
    +                           buildSrcSetAttribute(tag, srcSet);
    +                   }
    +           }
    +
    +           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)
    +   {
    +           // The first model is the one put into src attribute
    +           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, 
List<IModel<?>> srcSetModels)
    +   {
    +           int srcSetPosition = 0;
    +           for (IModel<?> srcSetModel : srcSetModels)
    +           {
    +                   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.getObject() + 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<>();
    +           }
    +           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<>();
    +           }
    +           this.sizes.clear();
    --- End diff --
    
    Ok - I improve it here and in Image / Source.


> 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