/* * Copyright (c) CovertJaguar, 2014 http://railcraft.info * * This code is the property of CovertJaguar * and may only be used with explicit written * permission unless otherwise specified on the * license page at http://railcraft.info/wiki/info:license. */ package mods.railcraft.common.gui.tooltips; import com.google.common.base.Splitter; import com.google.common.collect.ForwardingList; import java.util.ArrayList; import java.util.List; import mods.railcraft.common.plugins.forge.LocalizationPlugin; import mods.railcraft.common.util.misc.Game; /** * * @author CovertJaguar <http://www.railcraft.info/> */ public class ToolTip extends ForwardingList<ToolTipLine> { private static final Splitter lineSplitter = Splitter.on("\n").trimResults(); private static final Splitter keyValueSplitter = Splitter.on('=').trimResults(); private final List<ToolTipLine> delegate = new ArrayList<ToolTipLine>(); private final long delay; private long mouseOverStart; public ToolTip() { this.delay = 0; } public ToolTip(int delay) { this.delay = delay; } @Override protected final List<ToolTipLine> delegate() { return delegate; } public boolean add(String line) { return add(new ToolTipLine(line)); } public void onTick(boolean mouseOver) { if (delay == 0) return; if (mouseOver) { if (mouseOverStart == 0) mouseOverStart = System.currentTimeMillis(); } else mouseOverStart = 0; } public boolean isReady() { if (delay == 0) return true; if (mouseOverStart == 0) return false; return System.currentTimeMillis() - mouseOverStart >= delay; } public void refresh() { } public List<String> convertToStrings() { List<String> tips = new ArrayList<String>(size()); for (ToolTipLine line : this) { tips.add(line.text); } return tips; } public static ToolTip buildToolTip(String tipTag, String... vars) { if (!LocalizationPlugin.hasTag(tipTag)) return null; try { ToolTip toolTip = new ToolTip(750); String text = LocalizationPlugin.translate(tipTag); for (String var : vars) { List<String> pair = keyValueSplitter.splitToList(var); text = text.replace(pair.get(0), pair.get(1)); } for (String tip : lineSplitter.split(text)) { toolTip.add(new ToolTipLine(tip)); } return toolTip; } catch (RuntimeException ex) { Game.logThrowable("Failed to parse tooltip: " + tipTag, ex); throw ex; } } }