[ 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)