Newer
Older
ultramine_bukkit / src / main / java / org / bukkit / help / IndexHelpTopic.java
@vlad20012 vlad20012 on 24 Feb 2017 3 KB initial
package org.bukkit.help;

import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.ChatPaginator;

import java.util.Collection;

/**
 * This help topic generates a list of other help topics. This class is useful
 * for adding your own index help topics. To enforce a particular order, use a
 * sorted collection.
 * <p>
 * If a preamble is provided to the constructor, that text will be displayed
 * before the first item in the index.
 */
public class IndexHelpTopic extends HelpTopic
{

	protected String permission;
	protected String preamble;
	protected Collection<HelpTopic> allTopics;

	public IndexHelpTopic(String name, String shortText, String permission, Collection<HelpTopic> topics)
	{
		this(name, shortText, permission, topics, null);
	}

	public IndexHelpTopic(String name, String shortText, String permission, Collection<HelpTopic> topics, String preamble)
	{
		this.name = name;
		this.shortText = shortText;
		this.permission = permission;
		this.preamble = preamble;
		setTopicsCollection(topics);
	}

	/**
	 * Sets the contents of the internal allTopics collection.
	 *
	 * @param topics The topics to set.
	 */
	protected void setTopicsCollection(Collection<HelpTopic> topics)
	{
		this.allTopics = topics;
	}

	public boolean canSee(CommandSender sender)
	{
		if(sender instanceof ConsoleCommandSender)
		{
			return true;
		}
		if(permission == null)
		{
			return true;
		}
		return sender.hasPermission(permission);
	}

	@Override
	public void amendCanSee(String amendedPermission)
	{
		permission = amendedPermission;
	}

	public String getFullText(CommandSender sender)
	{
		StringBuilder sb = new StringBuilder();

		if(preamble != null)
		{
			sb.append(buildPreamble(sender));
			sb.append("\n");
		}

		for(HelpTopic topic : allTopics)
		{
			if(topic.canSee(sender))
			{
				String lineStr = buildIndexLine(sender, topic).replace("\n", ". ");
				if(sender instanceof Player && lineStr.length() > ChatPaginator.GUARANTEED_NO_WRAP_CHAT_PAGE_WIDTH)
				{
					sb.append(lineStr.substring(0, ChatPaginator.GUARANTEED_NO_WRAP_CHAT_PAGE_WIDTH - 3));
					sb.append("...");
				}
				else
				{
					sb.append(lineStr);
				}
				sb.append("\n");
			}
		}
		return sb.toString();
	}

	/**
	 * Builds the topic preamble. Override this method to change how the index
	 * preamble looks.
	 *
	 * @param sender The command sender requesting the preamble.
	 * @return The topic preamble.
	 */
	protected String buildPreamble(CommandSender sender)
	{
		return ChatColor.GRAY + preamble;
	}

	/**
	 * Builds individual lines in the index topic. Override this method to
	 * change how index lines are rendered.
	 *
	 * @param sender The command sender requesting the index line.
	 * @param topic  The topic to render into an index line.
	 * @return The rendered index line.
	 */
	protected String buildIndexLine(CommandSender sender, HelpTopic topic)
	{
		StringBuilder line = new StringBuilder();
		line.append(ChatColor.GOLD);
		line.append(topic.getName());
		line.append(": ");
		line.append(ChatColor.WHITE);
		line.append(topic.getShortText());
		return line.toString();
	}
}