using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Dominion.NET_WPF
{
///
/// Interaction logic for CardCollectionControl.xaml
///
public partial class CardCollectionControl : UserControl
{
private IEnumerable _CardPile = null;
private int _GlowSize = 20;
private String _PileName = "Pile Name";
private DominionBase.Players.PhaseEnum _PlayerPhase = DominionBase.Players.PhaseEnum.Waiting;
private DominionBase.Cards.Card _ClickedCard = null;
private Boolean _IsClickable = false;
public CardCollectionControl()
{
InitializeComponent();
this.CardSize = NET_WPF.CardSize.Medium;
this.IsClickable = false;
wpCardCollections.Margin = new Thickness(_GlowSize / 2, _GlowSize / 2, _GlowSize / 2, 0);
}
public DominionBase.Cards.Card ClickedCard
{
get { return _ClickedCard; }
}
public Boolean ExactCount { get; set; }
public Boolean IsCardsVisible { get; set; }
public Boolean IsClickable
{
get
{
return _IsClickable;
}
set
{
_IsClickable = value;
foreach (Controls.CardStackControl csc in wpCardCollections.Children.OfType())
csc.IsClickable = value;
}
}
public Boolean IsDisplaySorted { get; set;}
public Boolean IsVPsVisible { get; set; }
public CardSize CardSize { get; set; }
public IEnumerable Pile
{
private get { return _CardPile; }
set
{
_CardPile = value;
UpdateCardDisplay();
}
}
public DominionBase.Piles.Visibility PileVisibility
{
get
{
if (this.Pile is DominionBase.Piles.Pile)
return (this.Pile as DominionBase.Piles.Pile).Visibility;
else
return DominionBase.Piles.Visibility.All;
}
}
private int PileCount
{
get
{
if (this.Pile is DominionBase.Piles.Pile)
return (this.Pile as DominionBase.Piles.Pile).Count;
else
return this.Pile.Count();
}
}
private DominionBase.Cards.Card PileFirst
{
get
{
if (this.Pile is DominionBase.Piles.Pile)
return (this.Pile as DominionBase.Piles.Pile).First();
else
return this.Pile.First();
}
}
public String PileName
{
get { return _PileName; }
set
{
_PileName = value;
UpdateCardDisplay();
}
}
private void UpdateCardDisplay()
{
wpCardCollections.Children.Clear();
nPileName.Content = PileName;
if (String.IsNullOrEmpty(this.PileName))
nPileName.Visibility = System.Windows.Visibility.Collapsed;
else
nPileName.Visibility = System.Windows.Visibility.Visible;
if (ExactCount && this.Pile != null && this.PileCount > 0)
{
lCount.Visibility = System.Windows.Visibility.Visible;
lCount.Content = String.Format("({0} Card{1})", this.PileCount, this.PileCount == 1 ? "" : "s");
}
else
{
lCount.Visibility = System.Windows.Visibility.Collapsed;
}
foreach (DominionBase.Cards.CardCollection cardStack in GenerateCardStacks())
{
Controls.CardStackControl csc = new Controls.CardStackControl();
csc.CardSize = this.CardSize;
csc.ExactCount = this.ExactCount;
csc.IsCardsVisible = this.IsCardsVisible;
csc.Phase = this._PlayerPhase;
csc.PileVisibility = this.PileVisibility;
csc.CardCollection = cardStack;
if (this.IsVPsVisible && (
(cardStack[0].Category & DominionBase.Cards.Category.Victory) == DominionBase.Cards.Category.Victory ||
(cardStack[0].Category & DominionBase.Cards.Category.Curse) == DominionBase.Cards.Category.Curse))
csc.CountVPs(this.Pile);
else
csc.HideVPs();
wpCardCollections.Children.Add(csc);
}
InvalidateVisual();
}
public DominionBase.Players.PhaseEnum Phase
{
set
{
_PlayerPhase = value;
foreach (Controls.CardStackControl csc in wpCardCollections.Children.OfType())
csc.Phase = value;
}
}
private List GenerateCardStacks()
{
List cardStacks = new List();
if (this.Pile == null || this.PileCount == 0)
return cardStacks;
int count;
switch (this.PileVisibility)
{
case DominionBase.Piles.Visibility.All:
IEnumerable cards = this.Pile;
if (this.IsDisplaySorted)
cards = this.Pile.OrderBy(c => c.Name);
foreach (DominionBase.Cards.Card card in cards)
{
Type cardT = IsCardsVisible ? card.CardType : typeof(object);
if (cardStacks.Count == 0 || !card.IsStackable || (IsCardsVisible && cardStacks[cardStacks.Count - 1][0].CardType != cardT))
cardStacks.Add(new DominionBase.Cards.CardCollection());
cardStacks[cardStacks.Count - 1].AddRange(card.CardStack());
}
break;
case DominionBase.Piles.Visibility.Top:
if (this.PileCount > 0)
{
cardStacks.Add(new DominionBase.Cards.CardCollection());
count = this.PileCount - 1;
if (!this.ExactCount && count > 1)
{
Double variance = DominionBase.Utilities.Gaussian.NextGaussian();
count = count + (int)(variance * (count / 4.0));
}
for (int index = 0; index < count; index++)
cardStacks[0].Add(new DominionBase.Cards.Universal.Dummy());
cardStacks[0].Add(this.PileFirst);
}
break;
case DominionBase.Piles.Visibility.None:
if (this.PileCount > 0)
{
cardStacks.Add(new DominionBase.Cards.CardCollection());
count = this.PileCount;
if (!this.ExactCount && count > 1)
{
Double variance = DominionBase.Utilities.Gaussian.NextGaussian();
count = count + (int)(variance * (count / 4.0));
}
for (int index = 0; index < count; index++)
cardStacks[0].Add(new DominionBase.Cards.Universal.Dummy());
}
break;
}
return cardStacks;
}
}
}