diff --git a/src/org/mcteam/ancientgates/commands/CommandList.java b/src/org/mcteam/ancientgates/commands/CommandList.java index 265961a..fd3694f 100644 --- a/src/org/mcteam/ancientgates/commands/CommandList.java +++ b/src/org/mcteam/ancientgates/commands/CommandList.java @@ -3,8 +3,10 @@ package org.mcteam.ancientgates.commands; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import org.bukkit.ChatColor; import org.mcteam.ancientgates.Conf; import org.mcteam.ancientgates.Gate; import org.mcteam.ancientgates.util.TextUtil; @@ -16,21 +18,33 @@ public class CommandList extends BaseCommand aliases.add("list"); aliases.add("ls"); + optionalParameters.add("page"); hasGateParam = false; helpDescription = "Display a list of the gates"; } - public void perform() + protected String intToTitleString(int i) + { + if ( i < 26 ) + return Conf.colorMember + "" + (char)(i+65) + ":"; + else if ( i == 26 ) + return Conf.colorMember + "0 - 9:"; + else + return Conf.colorMember + "!@#$:"; + } + + + + // pages start at 1 + // will return null if requested page not availible + protected List message(int page) { Collection gates = Gate.getAll(); if (gates.size() == 0) - { - sendMessage("There are no gates yet."); - return; - } + return null; /* sort all gates by there first character * put gates in corresponding Lists @@ -57,35 +71,141 @@ public class CommandList extends BaseCommand else // everything else first = 27; - ids.get(first).add(Conf.colorAlly + id); + ids.get(first).add(id); } - // sort all lists - for (List list : ids) - Collections.sort(list); - - sendMessage("There are currently " + gates.size() + " gates on this server: "); + /* calculating which gates will be displayed on which page. + * this is a little bit fuzzy. but hopefully it will look + * great. (tell me if there is a better way!) + */ - for (int i=0; i: a list from ids + // Integer: the number of lines neccessary for displaying the corresponding list + HashMap, Integer> lines = new HashMap, Integer>(27); + + for (List currentIds : ids) { - List currentIds = ids.get(i); - if (currentIds.size() == 0) continue; - String head; - if ( i < 26 ) - head = "" + (char)(i+65) + ":"; - else if ( i == 26 ) - head = "0 - 9:"; - else - head = "!@#$:"; - - sendMessage(Conf.colorMember + head); - sendMessage(TextUtil.implode(currentIds, Conf.colorSystem+", ")); + int characters = TextUtil.implode(currentIds, ", ").length(); + lines.put(currentIds, characters / 52 + 2); } + + int currentPage = 1; + int currentStartingCharList = 0; + boolean finishedCurrentIds = true; + + List pageMessages = new ArrayList(); + + while (currentStartingCharList < ids.size()) + { + int linesLeftOnCurrentPage = 9; + + while (linesLeftOnCurrentPage > 1 && currentStartingCharList < ids.size()) + { + List currentIds = ids.get(currentStartingCharList); + + if (currentIds.size() > 0) + { + // add header line + if (currentPage == page) + pageMessages.add(intToTitleString(currentStartingCharList)); + + //sort + Collections.sort(currentIds); + + // add ids + if (lines.get(currentIds) <= linesLeftOnCurrentPage) // all ids fit on current page + { + linesLeftOnCurrentPage -= lines.get(currentIds); + + + if (currentPage == page) + pageMessages.add(TextUtil.implode(currentIds, ", ")); + if (currentPage == page && finishedCurrentIds == false) + pageMessages.set(pageMessages.size() -2, pageMessages.get(pageMessages.size() -2) + " (more on previous page)"); + + finishedCurrentIds = true; + } + else // NOT all ids fit on current page + { + int charsAvailible = (linesLeftOnCurrentPage - 1) * 52; + int idsPos = 0; + + while (true) + { + charsAvailible -= currentIds.get(idsPos).length() + 2; + + if (charsAvailible <= 0) + break; + + idsPos++; + } + + List idsToPutOnCurrentPage = currentIds.subList(0, idsPos); + currentIds.remove(idsToPutOnCurrentPage); + + String stringToPutOnCurrentPage = TextUtil.implode(idsToPutOnCurrentPage, ", "); + + if (currentPage == page) + { + pageMessages.add(stringToPutOnCurrentPage); + pageMessages.set(pageMessages.size() -2, pageMessages.get(pageMessages.size() -2) + " (more on next page)"); + } + + lines.put(currentIds, TextUtil.implode(currentIds, ", ").length() / 52 + 2); + linesLeftOnCurrentPage -= stringToPutOnCurrentPage.length() / 52 + 2; + + finishedCurrentIds = false; + } + } + + if (finishedCurrentIds) + currentStartingCharList++; + } + + currentPage++; + } + + if (pageMessages.isEmpty()) + return null; + else + { + // not nice! TODO: find a better way to send this message! + sendMessage(ChatColor.LIGHT_PURPLE + "This is page " + ChatColor.WHITE + page + ChatColor.LIGHT_PURPLE + "/" + ChatColor.WHITE + --currentPage + ChatColor.LIGHT_PURPLE + ". There are " + gates.size() + " gates on this server: "); + return pageMessages; + } + } + + + public void perform() + { + Collection gates = Gate.getAll(); + + if (gates.size() == 0) + sendMessage("There are no gates yet."); + else + { + int page = 1; + + try + { + page = new Integer(parameters.get(0)); + } + catch (Exception e) + { + } + + List messages = message(page); + + if (messages == null) + sendMessage("The requested page is not availible"); + else + sendMessage(messages); + } } }