using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using DominionBase;
namespace Dominion.NET_WPF.Controls.GameLog
{
///
/// Interaction logic for ucGameMessage.xaml
///
public partial class ucGameMessage : LogSection
{
public ucGameMessage()
{
InitializeComponent();
SpContainer = spArea;
}
public override bool IsExpanded { get { return expTurn.IsExpanded; } set { expTurn.IsExpanded = value; } }
public override void New(string title)
{
var dp = new DockPanel();
var tbTitle = new TextBlock {Text = title};
DockPanel.SetDock(tbTitle, Dock.Left);
dp.Children.Add(tbTitle);
expTurn.Header = dp;
}
public override void TearDown()
{
base.TearDown();
spArea.Children.Clear();
}
public override void Log(params object[] items)
{
var sbFullLine = new StringBuilder();
var dpContainer = new DockPanel { LastChildFill = true };
var container = new WrapPanel { Orientation = Orientation.Horizontal };
DockPanel.SetDock(container, Dock.Left);
dpContainer.Children.Add(container);
var background = Brushes.Transparent;
var foreground = Brushes.Transparent;
foreach (var item in items)
{
if (item is Color iColor)
{
foreground = new SolidColorBrush(iColor);
}
else if (item is string iString)
{
if (string.IsNullOrEmpty(iString))
continue;
var itemTuple = GenerateElements(iString, background, foreground);
foreach (var elem in itemTuple.Item1)
container.Children.Add(elem);
sbFullLine.Append(itemTuple.Item2);
}
else if (item is int iInt)
{
var itemTuple = GenerateElements(iInt, background, foreground);
foreach (var elem in itemTuple.Item1)
container.Children.Add(elem);
sbFullLine.Append(itemTuple.Item2);
}
else if (item is DominionBase.Players.Player iPlayer)
{
var itemTuple = GenerateElements(iPlayer, background, foreground);
foreach (var elem in itemTuple.Item1)
container.Children.Add(elem);
sbFullLine.Append(itemTuple.Item2);
}
else if (item is DominionBase.Players.PlayerCollection iPlayerCol)
{
var isFirstItem = true;
foreach (var player in iPlayerCol)
{
Tuple, string> itemTuple;
if (!isFirstItem)
{
itemTuple = GenerateElements(", ", background, foreground);
foreach (var elem in itemTuple.Item1)
container.Children.Add(elem);
sbFullLine.Append(itemTuple.Item2);
}
itemTuple = GenerateElements(player, background, foreground);
foreach (var elem in itemTuple.Item1)
container.Children.Add(elem);
sbFullLine.Append(itemTuple.Item2);
isFirstItem = false;
}
}
else if (item is DominionBase.Visual.VisualPlayer iVisualPlayer)
{
var itemTuple = GenerateElements(iVisualPlayer, background, foreground);
foreach (var elem in itemTuple.Item1)
container.Children.Add(elem);
sbFullLine.Append(itemTuple.Item2);
}
else if (item is IDisplayable iDispl)
{
var itemTuple = GenerateElements(iDispl, background, foreground);
foreach (var elem in itemTuple.Item1)
container.Children.Add(elem);
sbFullLine.Append(itemTuple.Item2);
}
else if (item is IEnumerable iEDisp)
{
var itemTuple = GenerateElements(iEDisp, background, foreground);
foreach (var elem in itemTuple.Item1)
container.Children.Add(elem);
sbFullLine.Append(itemTuple.Item2);
}
}
var g = new TextBlock
{
HorizontalAlignment = HorizontalAlignment.Stretch,
Background = background
};
DockPanel.SetDock(g, Dock.Left);
container.Children.Add(g);
Utilities.Log(LogFile, sbFullLine.ToString());
spArea.Children.Add(dpContainer);
container.BringIntoView();
}
private Tuple, string> GenerateElements(string item, Brush background, SolidColorBrush foreground)
{
var elements = new List();
foreach (var elem in Utilities.RenderText(item, NET_WPF.RenderSize.Tiny, true))
{
var block = elem as TextBlock;
if (block != null)
{
block.Background = background;
block.Foreground = foreground.Color.A == 0 ? Brushes.Black : foreground;
}
DockPanel.SetDock(elem, Dock.Left);
elements.Add(elem);
}
return new Tuple, string>(elements, item.Replace("", "*").Replace("", "*"));
}
private Tuple, string> GenerateElements(int item, Brush background, SolidColorBrush foreground)
{
var elements = new List();
var tbLine = new TextBlock
{
Text = item.ToString(),
Background = background,
FontWeight = FontWeights.Bold,
Foreground = foreground.Color.A == 0 ? Brushes.Crimson : foreground
};
DockPanel.SetDock(tbLine, Dock.Left);
elements.Add(tbLine);
return new Tuple, string>(elements, item.ToString());
}
private Tuple, string> GenerateElements(IPlayer item, Brush background, SolidColorBrush foreground)
{
var elements = new List();
var tbLine = new TextBlock
{
Text = item.Name,
Background = background,
Foreground = foreground.Color.A == 0 ? Brushes.Black : foreground,
FontWeight = FontWeights.Bold
};
DockPanel.SetDock(tbLine, Dock.Left);
elements.Add(tbLine);
return new Tuple, string>(elements, item.Name);
}
private Tuple, string> GenerateElements(DominionBase.Visual.VisualPlayer item, Brush background, SolidColorBrush foreground)
{
var elements = new List();
var tbLine = new TextBlock
{
Text = item.Name,
Background = background,
Foreground = foreground.Color.A == 0 ? Brushes.Black : foreground,
FontWeight = FontWeights.Bold
};
DockPanel.SetDock(tbLine, Dock.Left);
elements.Add(tbLine);
return new Tuple, string>(elements, item.Name);
}
private Tuple, string> GenerateElements(IDisplayable item, Brush background, SolidColorBrush foreground)
{
var elements = new List();
var icon = CardIconUtilities.CreateCardIcon(item);
icon.Background = background;
DockPanel.SetDock(icon, Dock.Left);
elements.Add(icon);
return new Tuple, string>(elements, item.Name);
}
private Tuple, string> GenerateElements(IEnumerable item, Brush background, SolidColorBrush foreground)
{
var elements = new List();
var sbItem = new StringBuilder();
var itemList = item as IList ?? item.ToList();
foreach (var uc in CardIconUtilities.CreateCardIcons(itemList))
{
uc.Background = background;
DockPanel.SetDock(uc, Dock.Left);
elements.Add(uc);
var icon = uc as ucCardIcon;
if (icon != null)
{
if (icon.Count == 1)
sbItem.Append(icon.Card.Name);
else
sbItem.AppendFormat("{0}x {1}", icon.Count, icon.Card.Name);
var tbLine = new TextBlock
{
Text = ", ",
Background = background,
Foreground = foreground.Color.A == 0 ? Brushes.Black : foreground
};
DockPanel.SetDock(tbLine, Dock.Left);
elements.Add(tbLine);
sbItem.Append(", ");
}
else if (uc is ucTokenIcon ucTI)
{
sbItem.AppendFormat("({0})", ucTI.Token.LongDisplayString);
}
}
if (itemList.Any())
{
elements.RemoveAt(elements.Count - 1);
sbItem = sbItem.Remove(sbItem.Length - 2, 2);
}
return new Tuple, string>(elements, sbItem.ToString());
}
}
}