001 package org.bukkit.help;
002
003 import org.bukkit.ChatColor;
004 import org.bukkit.command.CommandSender;
005 import org.bukkit.command.ConsoleCommandSender;
006 import org.bukkit.entity.Player;
007 import org.bukkit.util.ChatPaginator;
008
009 import java.util.Collection;
010
011 /**
012 * This help topic generates a list of other help topics. This class is useful
013 * for adding your own index help topics. To enforce a particular order, use a
014 * sorted collection.
015 * <p>
016 * If a preamble is provided to the constructor, that text will be displayed
017 * before the first item in the index.
018 */
019 public class IndexHelpTopic extends HelpTopic {
020
021 protected String permission;
022 protected String preamble;
023 protected Collection<HelpTopic> allTopics;
024
025 public IndexHelpTopic(String name, String shortText, String permission, Collection<HelpTopic> topics) {
026 this(name, shortText, permission, topics, null);
027 }
028
029 public IndexHelpTopic(String name, String shortText, String permission, Collection<HelpTopic> topics, String preamble) {
030 this.name = name;
031 this.shortText = shortText;
032 this.permission = permission;
033 this.preamble = preamble;
034 setTopicsCollection(topics);
035 }
036
037 /**
038 * Sets the contents of the internal allTopics collection.
039 *
040 * @param topics The topics to set.
041 */
042 protected void setTopicsCollection(Collection<HelpTopic> topics) {
043 this.allTopics = topics;
044 }
045
046 public boolean canSee(CommandSender sender) {
047 if (sender instanceof ConsoleCommandSender) {
048 return true;
049 }
050 if (permission == null) {
051 return true;
052 }
053 return sender.hasPermission(permission);
054 }
055
056 @Override
057 public void amendCanSee(String amendedPermission) {
058 permission = amendedPermission;
059 }
060
061 public String getFullText(CommandSender sender) {
062 StringBuilder sb = new StringBuilder();
063
064 if (preamble != null) {
065 sb.append(buildPreamble(sender));
066 sb.append("\n");
067 }
068
069 for (HelpTopic topic : allTopics) {
070 if (topic.canSee(sender)) {
071 String lineStr = buildIndexLine(sender, topic).replace("\n", ". ");
072 if (sender instanceof Player && lineStr.length() > ChatPaginator.GUARANTEED_NO_WRAP_CHAT_PAGE_WIDTH) {
073 sb.append(lineStr.substring(0, ChatPaginator.GUARANTEED_NO_WRAP_CHAT_PAGE_WIDTH - 3));
074 sb.append("...");
075 } else {
076 sb.append(lineStr);
077 }
078 sb.append("\n");
079 }
080 }
081 return sb.toString();
082 }
083
084 /**
085 * Builds the topic preamble. Override this method to change how the index
086 * preamble looks.
087 *
088 * @param sender The command sender requesting the preamble.
089 * @return The topic preamble.
090 */
091 protected String buildPreamble(CommandSender sender) {
092 return ChatColor.GRAY + preamble;
093 }
094
095 /**
096 * Builds individual lines in the index topic. Override this method to
097 * change how index lines are rendered.
098 *
099 * @param sender The command sender requesting the index line.
100 * @param topic The topic to render into an index line.
101 * @return The rendered index line.
102 */
103 protected String buildIndexLine(CommandSender sender, HelpTopic topic) {
104 StringBuilder line = new StringBuilder();
105 line.append(ChatColor.GOLD);
106 line.append(topic.getName());
107 line.append(": ");
108 line.append(ChatColor.WHITE);
109 line.append(topic.getShortText());
110 return line.toString();
111 }
112 }