package com.psddev.cms.tool.page; import java.io.IOException; import java.util.Map; import java.util.UUID; import javax.servlet.ServletException; import com.psddev.cms.tool.PageServlet; import com.psddev.cms.tool.ToolPageContext; import com.psddev.dari.db.ColorDistribution; import com.psddev.dari.db.Query; import com.psddev.dari.db.State; import com.psddev.dari.util.HuslColorSpace; import com.psddev.dari.util.ObjectUtils; import com.psddev.dari.util.RoutingFilter; @RoutingFilter.Path(application = "cms", value = "contentColors") @SuppressWarnings("serial") public class ContentColors extends PageServlet { @Override protected String getPermissionId() { return null; } @Override protected void doService(final ToolPageContext page) throws IOException, ServletException { State state = State.getInstance(Query.from(Object.class).where("_id = ?", page.param(UUID.class, "id")).first()); ColorDistribution distribution = state.as(ColorDistribution.Data.class).getDistribution(); if (distribution == null) { return; } page.writeHeader(); page.writeStart("div", "class", "widget"); page.writeStart("h1", "class", "icon icon-tint"); page.writeHtml(page.localize(ContentColors.class, "title")); page.writeEnd(); page.writeStart("h2"); page.writeHtml(page.localize(ContentColors.class, "subtitle.dominant")); page.writeEnd(); for (Map.Entry<String, Object> entry : distribution.getState().entrySet()) { String fieldName = entry.getKey(); Object percentage = entry.getValue(); if (fieldName.startsWith("o") && percentage != null) { int percentageInt = (int) (((Double) percentage) * 100); String[] parts = fieldName.split("_"); int lightness = ObjectUtils.to(int.class, parts[3]); int[] rgbNumbers = HuslColorSpace.Static.fromHUSLtoRGB( ObjectUtils.to(int.class, parts[1]), ObjectUtils.to(int.class, parts[2]), lightness); String rgb = String.format( "#%02X%02X%02X", rgbNumbers[0], rgbNumbers[1], rgbNumbers[2]); page.writeStart("div", "style", page.cssString( "background-color", rgb, "color", lightness < 50 ? "white" : null, "height", (percentageInt * 3) + "px", "line-height", (percentageInt * 3) + "px", "text-align", "center")); page.writeHtml(rgb); page.writeHtml(" ("); page.writeHtml(percentageInt); page.writeHtml("%)"); page.writeEnd(); } } page.writeEnd(); page.writeFooter(); } }