Modified PaginationTools to have colored console output.

This commit is contained in:
MarioE 2013-07-10 23:14:42 -04:00
parent 7c3ffee48c
commit 7509204c4c

View file

@ -14,258 +14,303 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
namespace TShockAPI { namespace TShockAPI
public static class PaginationTools { {
public delegate Tuple<string, Color> LineFormatterDelegate(object lineData, int lineIndex, int pageNumber); public static class PaginationTools
{
#region [Nested: Settings Class] public delegate Tuple<string, Color> LineFormatterDelegate(object lineData, int lineIndex, int pageNumber);
public class Settings {
public bool IncludeHeader { get; set; } #region [Nested: Settings Class]
public class Settings
private string headerFormat; {
public string HeaderFormat public bool IncludeHeader { get; set; }
{
get { return this.headerFormat; } private string headerFormat;
set public string HeaderFormat
{ {
if (value == null) get { return this.headerFormat; }
throw new ArgumentNullException(); set
{
this.headerFormat = value; if (value == null)
} throw new ArgumentNullException();
}
this.headerFormat = value;
public Color HeaderTextColor { get; set; } }
public bool IncludeFooter { get; set; } }
private string footerFormat; public Color HeaderTextColor { get; set; }
public string FooterFormat public bool IncludeFooter { get; set; }
{
get { return this.footerFormat; } private string footerFormat;
set public string FooterFormat
{ {
if (value == null) get { return this.footerFormat; }
throw new ArgumentNullException(); set
{
this.footerFormat = value; if (value == null)
} throw new ArgumentNullException();
}
this.footerFormat = value;
public Color FooterTextColor { get; set; } }
public string NothingToDisplayString { get; set; } }
public LineFormatterDelegate LineFormatter { get; set; }
public Color LineTextColor { get; set; } public Color FooterTextColor { get; set; }
public string NothingToDisplayString { get; set; }
private int maxLinesPerPage; public LineFormatterDelegate LineFormatter { get; set; }
public Color LineTextColor { get; set; }
public int MaxLinesPerPage
{ private int maxLinesPerPage;
get { return this.maxLinesPerPage; }
set public int MaxLinesPerPage
{ {
if (value <= 0) get { return this.maxLinesPerPage; }
throw new ArgumentException("The value has to be greater than zero."); set
{
this.maxLinesPerPage = value; if (value <= 0)
} throw new ArgumentException("The value has to be greater than zero.");
}
this.maxLinesPerPage = value;
private int pageLimit; }
}
public int PageLimit
{ private int pageLimit;
get { return this.pageLimit; }
set public int PageLimit
{ {
if (value < 0) get { return this.pageLimit; }
throw new ArgumentException("The value has to be greater than or equal to zero."); set
{
this.pageLimit = value; if (value < 0)
} throw new ArgumentException("The value has to be greater than or equal to zero.");
}
this.pageLimit = value;
}
public Settings() }
{
this.IncludeHeader = true;
this.headerFormat = "Page {0} of {1}"; public Settings()
this.HeaderTextColor = Color.Green; {
this.IncludeFooter = true; this.IncludeHeader = true;
this.footerFormat = "Type /<command> {0} for more."; this.headerFormat = "Page {0} of {1}";
this.FooterTextColor = Color.Yellow; this.HeaderTextColor = Color.Green;
this.NothingToDisplayString = null; this.IncludeFooter = true;
this.LineFormatter = null; this.footerFormat = "Type /<command> {0} for more.";
this.LineTextColor = Color.White; this.FooterTextColor = Color.Yellow;
this.maxLinesPerPage = 4; this.NothingToDisplayString = null;
this.pageLimit = 0; this.LineFormatter = null;
} this.LineTextColor = Color.White;
} this.maxLinesPerPage = 4;
#endregion this.pageLimit = 0;
}
public static void SendPage( }
TSPlayer player, int pageNumber, IEnumerable dataToPaginate, int dataToPaginateCount, Settings settings = null) #endregion
{
if (settings == null) public static void SendPage(
settings = new Settings(); TSPlayer player, int pageNumber, IEnumerable dataToPaginate, int dataToPaginateCount, Settings settings = null)
{
if (dataToPaginateCount == 0) if (settings == null)
{ settings = new Settings();
if (settings.NothingToDisplayString != null)
player.SendMessage(settings.NothingToDisplayString, settings.HeaderTextColor); if (dataToPaginateCount == 0)
{
return; if (settings.NothingToDisplayString != null)
} {
if (player is TSServerPlayer)
int pageCount = ((dataToPaginateCount - 1) / settings.MaxLinesPerPage) + 1; {
if (settings.PageLimit > 0 && pageCount > settings.PageLimit) player.SendSuccessMessage(settings.NothingToDisplayString);
pageCount = settings.PageLimit; }
if (pageNumber > pageCount) else
pageNumber = pageCount; {
player.SendMessage(settings.NothingToDisplayString, settings.HeaderTextColor);
if (settings.IncludeHeader) }
player.SendMessage(string.Format(settings.HeaderFormat, pageNumber, pageCount), settings.HeaderTextColor); }
return;
int listOffset = (pageNumber - 1) * settings.MaxLinesPerPage; }
int offsetCounter = 0;
int lineCounter = 0; int pageCount = ((dataToPaginateCount - 1) / settings.MaxLinesPerPage) + 1;
foreach (object lineData in dataToPaginate) if (settings.PageLimit > 0 && pageCount > settings.PageLimit)
{ pageCount = settings.PageLimit;
if (lineData == null) if (pageNumber > pageCount)
continue; pageNumber = pageCount;
if (offsetCounter++ < listOffset)
continue; if (settings.IncludeHeader)
if (lineCounter++ == settings.MaxLinesPerPage) {
break; if (player is TSServerPlayer)
{
string lineMessage; player.SendSuccessMessage(string.Format(settings.HeaderFormat, pageNumber, pageCount));
Color lineColor = settings.LineTextColor; }
if (lineData is Tuple<string, Color>) else
{ {
var lineFormat = (Tuple<string, Color>)lineData; player.SendMessage(string.Format(settings.HeaderFormat, pageNumber, pageCount), settings.HeaderTextColor);
lineMessage = lineFormat.Item1; }
lineColor = lineFormat.Item2; }
}
else if (settings.LineFormatter != null) int listOffset = (pageNumber - 1) * settings.MaxLinesPerPage;
{ int offsetCounter = 0;
try int lineCounter = 0;
{ foreach (object lineData in dataToPaginate)
Tuple<string, Color> lineFormat = settings.LineFormatter(lineData, offsetCounter, pageNumber); {
if (lineFormat == null) if (lineData == null)
continue; continue;
if (offsetCounter++ < listOffset)
lineMessage = lineFormat.Item1; continue;
lineColor = lineFormat.Item2; if (lineCounter++ == settings.MaxLinesPerPage)
} break;
catch (Exception ex)
{ string lineMessage;
throw new InvalidOperationException( Color lineColor = settings.LineTextColor;
"The method referenced by LineFormatter has thrown an exception. See inner exception for details.", ex); if (lineData is Tuple<string, Color>)
} {
} var lineFormat = (Tuple<string, Color>)lineData;
else lineMessage = lineFormat.Item1;
{ lineColor = lineFormat.Item2;
lineMessage = lineData.ToString(); }
} else if (settings.LineFormatter != null)
{
if (lineMessage != null) try
player.SendMessage(lineMessage, lineColor); {
} Tuple<string, Color> lineFormat = settings.LineFormatter(lineData, offsetCounter, pageNumber);
if (lineFormat == null)
if (lineCounter == 0) continue;
{
if (settings.NothingToDisplayString != null) lineMessage = lineFormat.Item1;
player.SendMessage(settings.NothingToDisplayString, settings.HeaderTextColor); lineColor = lineFormat.Item2;
} }
else if (settings.IncludeFooter && pageNumber + 1 <= pageCount) catch (Exception ex)
{ {
player.SendMessage(string.Format(settings.FooterFormat, pageNumber + 1, pageNumber, pageCount), settings.FooterTextColor); throw new InvalidOperationException(
} "The method referenced by LineFormatter has thrown an exception. See inner exception for details.", ex);
} }
}
public static void SendPage(TSPlayer player, int pageNumber, IList dataToPaginate, Settings settings = null) else
{ {
PaginationTools.SendPage(player, pageNumber, dataToPaginate, dataToPaginate.Count, settings); lineMessage = lineData.ToString();
} }
public static List<string> BuildLinesFromTerms( if (lineMessage != null)
IEnumerable terms, Func<object, string> termFormatter = null, string separator = ", ", int maxCharsPerLine = 80) {
{ if (player is TSServerPlayer)
List<string> lines = new List<string>(); {
StringBuilder lineBuilder = new StringBuilder(); Console.WriteLine(lineMessage);
foreach (object term in terms) }
{ else
if (term == null && termFormatter == null) {
continue; player.SendMessage(lineMessage, lineColor);
}
string termString; }
if (termFormatter != null) }
{
try if (lineCounter == 0)
{ {
termString = termFormatter(term); if (settings.NothingToDisplayString != null)
{
if (termString == null) if (player is TSServerPlayer)
continue; {
} player.SendSuccessMessage(settings.NothingToDisplayString);
catch (Exception ex) }
{ else
throw new ArgumentException( {
"The method represented by termFormatter has thrown an exception. See inner exception for details.", ex); player.SendMessage(settings.NothingToDisplayString, settings.HeaderTextColor);
} }
} }
else }
{ else if (settings.IncludeFooter && pageNumber + 1 <= pageCount)
termString = term.ToString(); {
} if (player is TSServerPlayer)
{
bool goesOnNextLine = (lineBuilder.Length + termString.Length > maxCharsPerLine); player.SendInfoMessage(string.Format(settings.FooterFormat, pageNumber + 1, pageNumber, pageCount));
if (!goesOnNextLine) }
{ else
if (lineBuilder.Length > 0) {
lineBuilder.Append(separator); player.SendMessage(string.Format(settings.FooterFormat, pageNumber + 1, pageNumber, pageCount), settings.FooterTextColor);
lineBuilder.Append(termString); }
} }
else }
{
// A separator should always be at the end of a line as we know it is followed by another line. public static void SendPage(TSPlayer player, int pageNumber, IList dataToPaginate, Settings settings = null)
lineBuilder.Append(separator); {
lines.Add(lineBuilder.ToString()); PaginationTools.SendPage(player, pageNumber, dataToPaginate, dataToPaginate.Count, settings);
lineBuilder.Clear(); }
lineBuilder.Append(termString); public static List<string> BuildLinesFromTerms(
} IEnumerable terms, Func<object, string> termFormatter = null, string separator = ", ", int maxCharsPerLine = 80)
} {
if (lineBuilder.Length > 0) List<string> lines = new List<string>();
lines.Add(lineBuilder.ToString()); StringBuilder lineBuilder = new StringBuilder();
foreach (object term in terms)
return lines; {
} if (term == null && termFormatter == null)
continue;
public static bool TryParsePageNumber(
List<string> commandParameters, int expectedParamterIndex, TSPlayer errorMessageReceiver, out int pageNumber) string termString;
{ if (termFormatter != null)
pageNumber = 1; {
if (commandParameters.Count <= expectedParamterIndex) try
return true; {
termString = termFormatter(term);
string pageNumberRaw = commandParameters[expectedParamterIndex];
if (!int.TryParse(pageNumberRaw, out pageNumber) || pageNumber < 1) if (termString == null)
{ continue;
if (errorMessageReceiver != null) }
errorMessageReceiver.SendErrorMessage(string.Format("\"{0}\" is not a valid page number.", pageNumberRaw)); catch (Exception ex)
{
pageNumber = 1; throw new ArgumentException(
return false; "The method represented by termFormatter has thrown an exception. See inner exception for details.", ex);
} }
}
return true; else
} {
} termString = term.ToString();
}
bool goesOnNextLine = (lineBuilder.Length + termString.Length > maxCharsPerLine);
if (!goesOnNextLine)
{
if (lineBuilder.Length > 0)
lineBuilder.Append(separator);
lineBuilder.Append(termString);
}
else
{
// A separator should always be at the end of a line as we know it is followed by another line.
lineBuilder.Append(separator);
lines.Add(lineBuilder.ToString());
lineBuilder.Clear();
lineBuilder.Append(termString);
}
}
if (lineBuilder.Length > 0)
lines.Add(lineBuilder.ToString());
return lines;
}
public static bool TryParsePageNumber(
List<string> commandParameters, int expectedParamterIndex, TSPlayer errorMessageReceiver, out int pageNumber)
{
pageNumber = 1;
if (commandParameters.Count <= expectedParamterIndex)
return true;
string pageNumberRaw = commandParameters[expectedParamterIndex];
if (!int.TryParse(pageNumberRaw, out pageNumber) || pageNumber < 1)
{
if (errorMessageReceiver != null)
errorMessageReceiver.SendErrorMessage(string.Format("\"{0}\" is not a valid page number.", pageNumberRaw));
pageNumber = 1;
return false;
}
return true;
}
}
} }