/* * Copyright (C) 2004-2014 L2J Server * * This file is part of L2J Server. * * L2J Server is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * L2J Server is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.l2jserver.gameserver.util; import java.util.Arrays; import java.util.Collection; import java.util.function.Function; import com.l2jserver.gameserver.model.PageResult; /** * A class containing useful methods for constructing HTML * @author Nos */ public class HtmlUtil { /** * Gets the HTML representation of CP gauge. * @param width the width * @param current the current value * @param max the max value * @param displayAsPercentage if {@code true} the text in middle will be displayed as percent else it will be displayed as "current / max" * @return the HTML */ public static String getCpGauge(int width, long current, long max, boolean displayAsPercentage) { return getGauge(width, current, max, displayAsPercentage, "L2UI_CT1.Gauges.Gauge_DF_Large_CP_bg_Center", "L2UI_CT1.Gauges.Gauge_DF_Large_CP_Center", 17, -13); } /** * Gets the HTML representation of HP gauge. * @param width the width * @param current the current value * @param max the max value * @param displayAsPercentage if {@code true} the text in middle will be displayed as percent else it will be displayed as "current / max" * @return the HTML */ public static String getHpGauge(int width, long current, long max, boolean displayAsPercentage) { return getGauge(width, current, max, displayAsPercentage, "L2UI_CT1.Gauges.Gauge_DF_Large_HP_bg_Center", "L2UI_CT1.Gauges.Gauge_DF_Large_HP_Center", 17, -13); } /** * Gets the HTML representation of HP Warn gauge. * @param width the width * @param current the current value * @param max the max value * @param displayAsPercentage if {@code true} the text in middle will be displayed as percent else it will be displayed as "current / max" * @return the HTML */ public static String getHpWarnGauge(int width, long current, long max, boolean displayAsPercentage) { return getGauge(width, current, max, displayAsPercentage, "L2UI_CT1.Gauges.Gauge_DF_Large_HPWarn_bg_Center", "L2UI_CT1.Gauges.Gauge_DF_Large_HPWarn_Center", 17, -13); } /** * Gets the HTML representation of HP Fill gauge. * @param width the width * @param current the current value * @param max the max value * @param displayAsPercentage if {@code true} the text in middle will be displayed as percent else it will be displayed as "current / max" * @return the HTML */ public static String getHpFillGauge(int width, long current, long max, boolean displayAsPercentage) { return getGauge(width, current, max, displayAsPercentage, "L2UI_CT1.Gauges.Gauge_DF_Large_HPFill_bg_Center", "L2UI_CT1.Gauges.Gauge_DF_Large_HPFill_Center", 17, -13); } /** * Gets the HTML representation of MP Warn gauge. * @param width the width * @param current the current value * @param max the max value * @param displayAsPercentage if {@code true} the text in middle will be displayed as percent else it will be displayed as "current / max" * @return the HTML */ public static String getMpGauge(int width, long current, long max, boolean displayAsPercentage) { return getGauge(width, current, max, displayAsPercentage, "L2UI_CT1.Gauges.Gauge_DF_Large_MP_bg_Center", "L2UI_CT1.Gauges.Gauge_DF_Large_MP_Center", 17, -13); } /** * Gets the HTML representation of EXP Warn gauge. * @param width the width * @param current the current value * @param max the max value * @param displayAsPercentage if {@code true} the text in middle will be displayed as percent else it will be displayed as "current / max" * @return the HTML */ public static String getExpGauge(int width, long current, long max, boolean displayAsPercentage) { return getGauge(width, current, max, displayAsPercentage, "L2UI_CT1.Gauges.Gauge_DF_Large_EXP_bg_Center", "L2UI_CT1.Gauges.Gauge_DF_Large_EXP_Center", 17, -13); } /** * Gets the HTML representation of Food gauge. * @param width the width * @param current the current value * @param max the max value * @param displayAsPercentage if {@code true} the text in middle will be displayed as percent else it will be displayed as "current / max" * @return the HTML */ public static String getFoodGauge(int width, long current, long max, boolean displayAsPercentage) { return getGauge(width, current, max, displayAsPercentage, "L2UI_CT1.Gauges.Gauge_DF_Large_Food_Bg_Center", "L2UI_CT1.Gauges.Gauge_DF_Large_Food_Center", 17, -13); } /** * Gets the HTML representation of Weight gauge automatically changing level depending on current/max. * @param width the width * @param current the current value * @param max the max value * @param displayAsPercentage if {@code true} the text in middle will be displayed as percent else it will be displayed as "current / max" * @return the HTML */ public static String getWeightGauge(int width, long current, long max, boolean displayAsPercentage) { return getWeightGauge(width, current, max, displayAsPercentage, Util.map(current, 0, max, 1, 5)); } /** * Gets the HTML representation of Weight gauge. * @param width the width * @param current the current value * @param max the max value * @param displayAsPercentage if {@code true} the text in middle will be displayed as percent else it will be displayed as "current / max" * @param level a number from 1 to 5 for the 5 different colors of weight gauge * @return the HTML */ public static String getWeightGauge(int width, long current, long max, boolean displayAsPercentage, long level) { return getGauge(width, current, max, displayAsPercentage, "L2UI_CT1.Gauges.Gauge_DF_Large_Weight_bg_Center" + level, "L2UI_CT1.Gauges.Gauge_DF_Large_Weight_Center" + level, 17, -13); } /** * Gets the HTML representation of a gauge. * @param width the width * @param current the current value * @param max the max value * @param displayAsPercentage if {@code true} the text in middle will be displayed as percent else it will be displayed as "current / max" * @param backgroundImage the background image * @param image the foreground image * @param imageHeight the image height * @param top the top adjustment * @return the HTML */ private static String getGauge(int width, long current, long max, boolean displayAsPercentage, String backgroundImage, String image, long imageHeight, long top) { current = Math.min(current, max); final StringBuilder sb = new StringBuilder(); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append("
"); sb.append(""); sb.append("
"); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append("
"); if (displayAsPercentage) { sb.append(""); sb.append(""); sb.append("
"); sb.append(String.format("%.2f%%", ((double) current / max) * 100)); sb.append("
"); } else { int tdWidth = (width - 10) / 2; sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append("
"); sb.append(current); sb.append("/"); sb.append(max); sb.append("
"); } sb.append("
"); sb.append("
"); return sb.toString(); } public static PageResult createPage(Collection elements, int page, int elementsPerPage, Function pagerFunction, Function bodyFunction) { return createPage(elements, elements.size(), page, elementsPerPage, pagerFunction, bodyFunction); } public static PageResult createPage(T[] elements, int page, int elementsPerPage, Function pagerFunction, Function bodyFunction) { return createPage(Arrays.asList(elements), elements.length, page, elementsPerPage, pagerFunction, bodyFunction); } public static PageResult createPage(Iterable elements, int size, int page, int elementsPerPage, Function pagerFunction, Function bodyFunction) { int pages = size / elementsPerPage; if ((elementsPerPage * pages) < size) { pages++; } final StringBuilder pagerTemplate = new StringBuilder(); if (pages > 1) { for (int i = 0; i < pages; i++) { pagerTemplate.append(pagerFunction.apply(i)); } } if (page >= pages) { page = pages - 1; } int start = 0; if (page > 0) { start = elementsPerPage * page; } final StringBuilder sb = new StringBuilder(); int i = 0; for (T element : elements) { if (i++ < start) { continue; } sb.append(bodyFunction.apply(element)); if (i >= (elementsPerPage + start)) { break; } } return new PageResult(pages, pagerTemplate, sb); } }