diff --git a/src/com/massivecraft/massivecore/pager/Msonifier.java b/src/com/massivecraft/massivecore/pager/Msonifier.java new file mode 100644 index 00000000..d3b717ee --- /dev/null +++ b/src/com/massivecraft/massivecore/pager/Msonifier.java @@ -0,0 +1,8 @@ +package com.massivecraft.massivecore.pager; + +import com.massivecraft.massivecore.mson.Mson; + +public interface Msonifier +{ + public Mson toMson(T item, int index); +} diff --git a/src/com/massivecraft/massivecore/pager/Pager.java b/src/com/massivecraft/massivecore/pager/Pager.java index cd5cb7ad..532f1071 100644 --- a/src/com/massivecraft/massivecore/pager/Pager.java +++ b/src/com/massivecraft/massivecore/pager/Pager.java @@ -1,5 +1,8 @@ package com.massivecraft.massivecore.pager; +import com.massivecraft.massivecore.cmd.MassiveCommand; +import com.massivecraft.massivecore.mson.Mson; + import java.util.Collection; import java.util.List; @@ -29,4 +32,10 @@ public interface Pager public String getMessageInvalid(); public List getPageTxt(int number, String title, Stringifier stringifier); + // -------------------------------------------- // + // MSON + // -------------------------------------------- // + + public List getPageMson(int number, String title, Msonifier msonifier, MassiveCommand command, List args); + } diff --git a/src/com/massivecraft/massivecore/pager/PagerAbstract.java b/src/com/massivecraft/massivecore/pager/PagerAbstract.java index 1cc97c47..bca31306 100644 --- a/src/com/massivecraft/massivecore/pager/PagerAbstract.java +++ b/src/com/massivecraft/massivecore/pager/PagerAbstract.java @@ -3,6 +3,8 @@ package com.massivecraft.massivecore.pager; import java.util.ArrayList; import java.util.List; +import com.massivecraft.massivecore.cmd.MassiveCommand; +import com.massivecraft.massivecore.mson.Mson; import com.massivecraft.massivecore.util.Txt; public abstract class PagerAbstract implements Pager @@ -35,14 +37,11 @@ public abstract class PagerAbstract implements Pager // Return null if the page number is invalid if (!this.isValid(number)) return null; - // Create return value - List ret = new ArrayList(); - // Forge list from collection List items = null; if (this.getItems() instanceof List) { - items = (List)this.getItems(); + items = (List) this.getItems(); } else { @@ -60,10 +59,7 @@ public abstract class PagerAbstract implements Pager } // Pick them - ret.addAll(items.subList(from, to)); - - // Return return value - return ret; + return items.subList(from, to); } // -------------------------------------------- // @@ -72,23 +68,12 @@ public abstract class PagerAbstract implements Pager public String getMessageEmpty() { - return Txt.parse("Sorry, no pages available."); + return Txt.getMessageEmpty().toPlain(true); } public String getMessageInvalid() { - if (this.size() == 0) - { - return this.getMessageEmpty(); - } - else if (this.size() == 1) - { - return Txt.parse("Invalid, there is only one page.", this.size()); - } - else - { - return Txt.parse("Invalid, page must be between 1 and %d.", this.size()); - } + return Txt.getMessageInvalid(this.size()).toPlain(true); } @Override @@ -96,11 +81,37 @@ public abstract class PagerAbstract implements Pager { List ret = new ArrayList(); - ret.add(Txt.titleize(title + Txt.parse("") + " " + number + "/" + this.size())); + List msons = getPageMson(number, title, new Msonifier(){ + + @Override + public Mson toMson(T item, int index) + { + return Mson.mson(stringifier.toString(item, index)); + } + + }, null, null); + + for (Mson mson : msons) + { + ret.add(mson.toPlain(true)); + } + + return ret; + } + + // -------------------------------------------- // + // Mson + // -------------------------------------------- // + + public List getPageMson(int number, String title, Msonifier msonifier, MassiveCommand command, List args) + { + List ret = new ArrayList(); + + ret.add(Txt.titleizeMson(title, this.size(), number, command, args)); if (this.isEmpty()) { - ret.add(this.getMessageEmpty()); + ret.add(Txt.getMessageEmpty()); return ret; } @@ -108,20 +119,20 @@ public abstract class PagerAbstract implements Pager if (pageItems == null) { - ret.add(this.getMessageInvalid()); + ret.add(Txt.getMessageInvalid(this.size())); return ret; } int index = (number - 1) * this.getItemsPerPage(); for (T pageItem : pageItems) { - if (stringifier != null) + if (msonifier != null) { - ret.add(stringifier.toString(pageItem, index)); + ret.add(msonifier.toMson(pageItem, index)); } else { - ret.add(pageItem.toString()); + ret.add(Mson.mson(pageItem.toString())); } index++; } @@ -129,5 +140,4 @@ public abstract class PagerAbstract implements Pager return ret; } - } diff --git a/src/com/massivecraft/massivecore/util/Txt.java b/src/com/massivecraft/massivecore/util/Txt.java index 9b926b22..749aec22 100644 --- a/src/com/massivecraft/massivecore/util/Txt.java +++ b/src/com/massivecraft/massivecore/util/Txt.java @@ -21,6 +21,10 @@ import org.bukkit.inventory.meta.ItemMeta; import com.massivecraft.massivecore.Predictate; import com.massivecraft.massivecore.PredictateStartsWithIgnoreCase; +import com.massivecraft.massivecore.cmd.MassiveCommand; +import com.massivecraft.massivecore.mson.Mson; + +import static com.massivecraft.massivecore.mson.Mson.mson; public class Txt { @@ -452,37 +456,201 @@ public class Txt return parse("")+center; } - public static ArrayList getPage(List lines, int pageHumanBased, String title) + public static Mson getMessageEmpty() + { + return mson("Sorry, no pages available.").color(ChatColor.YELLOW); + } + + public static Mson getMessageInvalid(int size) + { + if (size == 0) + { + return getMessageEmpty(); + } + else if (size == 1) + { + return mson("Invalid, there is only one page.").color(ChatColor.RED); + } + else + { + return Mson.format("Invalid, page must be between 1 and %d.", size).color(ChatColor.RED); + } + } + + public static List getPage(List lines, int pageHumanBased, String title) { return getPage(lines, pageHumanBased, title, PAGEHEIGHT_PLAYER); } - public static ArrayList getPage(List lines, int pageHumanBased, String title, CommandSender sender) + public static List getPage(List lines, int pageHumanBased, String title, CommandSender sender) { return getPage(lines, pageHumanBased, title, (sender instanceof Player) ? Txt.PAGEHEIGHT_PLAYER : Txt.PAGEHEIGHT_CONSOLE); } - public static ArrayList getPage(List lines, int pageHumanBased, String title, int pageheight) + public static List getPage(List lines, int pageHumanBased, String title, int pageheight) { ArrayList ret = new ArrayList(); int pageZeroBased = pageHumanBased - 1; int pagecount = (int)Math.ceil(((double)lines.size()) / pageheight); - ret.add(titleize(title+parse("")+" "+pageHumanBased+"/"+pagecount)); + title = titleize(title + parse("") + " " + pageHumanBased + "/" + pagecount); + ret.add(title); if (pagecount == 0) { - ret.add(parse("Sorry. No Pages available.")); + ret.add(getMessageEmpty().toPlain(true)); return ret; } else if (pageZeroBased < 0 || pageHumanBased > pagecount) { - ret.add(parse("Invalid page. Must be between 1 and "+pagecount)); + ret.add(getMessageInvalid(pagecount).toPlain(true)); return ret; } + + return createPage(lines, pageHumanBased, title, pageheight); + } + + public static Mson titleizeMson(String str, int pagecount, int pageHumanBased, MassiveCommand command, List args) + { + if (command == null) return mson(titleize(str + parse("") + " " + pageHumanBased + "/" + pagecount)); + + // Math + String title = str + " " + "[<<] [<]" + pageHumanBased + "/" + pagecount + "[>] [>>]"; + String center = ".[ " + title + " ]."; + int centerlen = center.length(); + int pivot = titleizeLine.length() / 2; + int eatLeft = (centerlen / 2) - titleizeBalance; + int eatRight = (centerlen - eatLeft) + titleizeBalance; + + // Mson + Mson centerMson = mson( + mson(".[ ").color(ChatColor.GOLD), + mson(str + " ").color(ChatColor.DARK_GREEN), + getFlipSection(pagecount, pageHumanBased, args, command), + mson(" ].").color(ChatColor.GOLD) + ); + + if (eatLeft < pivot) + { + Mson ret = mson( + mson(titleizeLine.substring(0, pivot - eatLeft)).color(ChatColor.GOLD), + centerMson, + mson(titleizeLine.substring(pivot + eatRight)).color(ChatColor.GOLD) + ); + + return ret; + } + else + { + return centerMson; + } + } + + private static Mson getFlipSection(int pagecount, int pageHumanBased, List args, MassiveCommand command) + { + // Construct Mson + Mson start = mson("[<<] ").color(ChatColor.GRAY); + Mson backward = mson("[<] ").color(ChatColor.GRAY); + Mson forward = mson(" [>]").color(ChatColor.GRAY); + Mson end = mson(" [>>]").color(ChatColor.GRAY); + + // Set flip page backward commands + if (pageHumanBased > 1) + { + start = setFlipPageCommand(start, pageHumanBased, 1, args, command); + backward = setFlipPageCommand(backward, pageHumanBased, pageHumanBased - 1, args, command); + } + + // Set flip page forward commands + if (pagecount > pageHumanBased) + { + forward = setFlipPageCommand(forward, pageHumanBased, pageHumanBased + 1, args, command); + end = setFlipPageCommand(end, pageHumanBased, pagecount, args, command); + } + + Mson flipMson = mson( + start, + backward, + mson(pageHumanBased + "/" + pagecount).color(ChatColor.YELLOW), + forward, + end + ); + + return flipMson; + } + + private static Mson setFlipPageCommand(Mson mson, int pageHumanBased, int destinationPage, List args, MassiveCommand command) + { + String number = String.valueOf(destinationPage); + String oldNumber = String.valueOf(pageHumanBased); + String tooltip = "Click to %s."; + String commandLine; + + mson = mson.color(ChatColor.AQUA); + + if (args != null && args.contains(oldNumber)) + { + List arguments = new ArrayList(args); + arguments.set(arguments.indexOf(oldNumber), number); + + commandLine = command.getCommandLine(arguments); + } + else + { + commandLine = command.getCommandLine(number); + } + + return mson.command(commandLine).tooltip(Txt.parse(tooltip, commandLine)); + } + + public static List getPageMson(List lines, int pageHumanBased, String title, MassiveCommand command, List args) + { + return getPageMson(lines, pageHumanBased, title, PAGEHEIGHT_PLAYER, command, args); + } + + public static List getPageMson(List lines, int pageHumanBased, String title, CommandSender sender, MassiveCommand command, List args) + { + return getPageMson(lines, pageHumanBased, title, (sender instanceof Player) ? Txt.PAGEHEIGHT_PLAYER : Txt.PAGEHEIGHT_CONSOLE, command, args); + } + + public static List getPageMson(List lines, int pageHumanBased, String title, int pageheight, MassiveCommand command, List args) + { + // reduce pageheight in favor of flipsection + pageheight--; + + ArrayList ret = new ArrayList(); + int pageZeroBased = pageHumanBased - 1; + int pagecount = (int)Math.ceil(((double)lines.size()) / pageheight); + + Mson msonTitle = Txt.titleizeMson(title, pagecount, pageHumanBased, command, args); + ret.add(msonTitle); + + if (pagecount == 0) + { + ret.add(getMessageEmpty()); + return ret; + } + else if (pageZeroBased < 0 || pageHumanBased > pagecount) + { + ret.add(getMessageInvalid(pagecount)); + return ret; + } + + List page = createPage(lines, pageHumanBased, msonTitle, pageheight); + page.add(getFlipSection(pagecount, pageHumanBased, args, command)); + + return page; + } + + private static List createPage(List lines, int pageHumanBased, T title, int pageheight) + { + ArrayList ret = new ArrayList(); + int pageZeroBased = pageHumanBased - 1; + + ret.add(title); int from = pageZeroBased * pageheight; - int to = from+pageheight; + int to = from + pageheight; if (to > lines.size()) { to = lines.size();