/** * Copyright 2014 55 Minutes (http://www.55minutes.com) * * 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 fiftyfive.wicket.basic; import fiftyfive.util.TruncateHelper; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.util.string.Strings; /** * A Label that truncates its output to the specified maximum number of * characters. * <p> * The string value is tested and truncated <em>before</em> the string * is escaped into HTML entities. After the string is truncated <em>then</em> * the resulting value is escaped. The * {@link #setEscapeModelStrings escapeModelStrings} property is honored, so * you just as with a normal Label, you can disable escaping entirely if you * want. * <p> * Note that if you provide a {@link #setPlaceholder placeholder}, the * truncation logic will <em>not</em> be applied to the placeholder value. * <p> * Although the default truncation algorithm should be sufficient, you can * customize it if you wish by setting the * {@link #setTruncateHelper truncateHelper} property. Refer to * {@link TruncateHelper#truncate TruncateHelper.truncate()} for complete * details on how the default truncation rules are applied. * <p> * Usage: * <pre class="example"> * <span wicket:id="label">Dummy</span> * * add(new TruncatedLabel("label", 50, "My really long string that needs to be cut down to size."));</pre> * <p> * Produces: * <pre class="example"> * <span>My really long string that needs to be cut down…</span></pre> * * @since 2.0 */ public class TruncatedLabel extends LabelWithPlaceholder { private int length; private TruncateHelper helper = new TruncateHelper(); /** * @see LabelWithPlaceholder#LabelWithPlaceholder(String) */ public TruncatedLabel(final String id, int length) { this(id, length, (IModel) null); } /** * @see LabelWithPlaceholder#LabelWithPlaceholder(String, String) */ public TruncatedLabel(final String id, int length, String label) { this(id, length, new Model(label)); } /** * @see LabelWithPlaceholder#LabelWithPlaceholder(String, IModel) */ public TruncatedLabel(final String id, int length, IModel<?> model) { super(id, model); this.length = length; } // Override to change return type. @Override public TruncatedLabel setPlaceholder(String valueIfEmpty) { return (TruncatedLabel) super.setPlaceholder(valueIfEmpty); } // Override to change return type. @Override public TruncatedLabel setPlaceholder(IModel<?> valueIfEmpty) { return (TruncatedLabel) super.setPlaceholder(valueIfEmpty); } /** * Returns a truncated version of {@link #getDefaultModelObjectAsString()}. */ @Override protected String internalGetDefaultModelObjectAsString() { boolean origEscape = getEscapeModelStrings(); // We want to truncate the original, unescaped string. So temporarily // set escaping to false, get the string, then return the escaping flag // back to its original value. setEscapeModelStrings(false); String value = getDefaultModelObjectAsString(); setEscapeModelStrings(origEscape); // Do the truncation String trunc = getTruncateHelper().truncate(value, this.length); // Escape the truncated value if desired. if(trunc != null && origEscape) { trunc = Strings.escapeMarkup(trunc, false, false).toString(); } return trunc; } public TruncateHelper getTruncateHelper() { return this.helper; } /** * Sets the TruncateHelper that will be used to shorten the string * value. Use the properties of the helper object to customize the * truncation algorithm. The default helper is the one provided by * the TruncateHelper empty constructor. * * @see TruncateHelper#TruncateHelper */ public TruncatedLabel setTruncateHelper(TruncateHelper helper) { this.helper = helper; return this; } }