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;
using DominionBase.Utilities;
namespace Dominion.NET_WPF.Controls
{
///
/// Interaction logic for CardStackControl.xaml
///
public partial class CardStackControl : UserControl, IDisposable
{
public static readonly RoutedEvent CardStackControlClickEvent = EventManager.RegisterRoutedEvent(
"CardStackControlClick",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(CardStackControl));
public event RoutedEventHandler CardStackControlClick
{
add { AddHandler(CardStackControlClickEvent, value); }
remove { RemoveHandler(CardStackControlClickEvent, value); }
}
private IEnumerable _CardCollection = new List();
//private DominionBase.Cards.CardCollection _CardCollection = new DominionBase.Cards.CardCollection();
private int _GlowSize = 0;
private DominionBase.Cards.Card _ClickedCard = null;
private DominionBase.Players.PhaseEnum _PlayerPhase = DominionBase.Players.PhaseEnum.Waiting;
private CardSize _CardSize = CardSize.Medium;
public Boolean IsCardsVisible { get; set; }
public DominionBase.Cards.Card ClickedCard
{
get { return _ClickedCard; }
}
public DominionBase.Players.PhaseEnum Phase
{
set
{
_PlayerPhase = value;
UpdateGlowEffectAll();
}
}
public Boolean IsClickable
{
get
{
return bImages.IsEnabled;
}
set
{
if (value)
{
bImages.IsEnabled = bName.IsEnabled = true;
bImages.Visibility = bName.Visibility = System.Windows.Visibility.Visible;
Panel.SetZIndex(bImages, 1);
Panel.SetZIndex(bName, 1);
}
else
{
bImages.IsEnabled = bName.IsEnabled = false;
bImages.Visibility = bName.Visibility = System.Windows.Visibility.Collapsed;
Panel.SetZIndex(bImages, -1);
Panel.SetZIndex(bName, -1);
}
}
}
public CardSize CardSize
{
get { return _CardSize; }
set
{
_CardSize = value;
switch (_CardSize)
{
case NET_WPF.CardSize.Text:
case NET_WPF.CardSize.SmallText:
gImages.Visibility = System.Windows.Visibility.Collapsed;
_GlowSize = 0;
break;
case NET_WPF.CardSize.Small:
gImages.Visibility = System.Windows.Visibility.Visible;
_GlowSize = 10;
break;
case NET_WPF.CardSize.Medium:
gImages.Visibility = System.Windows.Visibility.Visible;
_GlowSize = 20;
break;
}
dpMain.Margin = new Thickness(_GlowSize / 4, 0, _GlowSize / 4, 0);
gImages.Margin = new Thickness(_GlowSize / 2);
UpdateCardDisplay();
}
}
public void CountVPs(IEnumerable cards)
{
if (!(_CardCollection.ElementAt(0) is DominionBase.Cards.Card))
return;
dpVPCount.Visibility = System.Windows.Visibility.Visible;
if (_CardCollection.Count() > 0)
{
int count = ((DominionBase.Cards.Card)_CardCollection.ElementAt(0)).GetVictoryPoints(cards);
lVPCount.Content = count;
lVP.Content = StringUtility.Plural("VP", count, false);
}
else
lVPCount.Content = String.Empty;
}
public void HideVPs()
{
lVPCount.Content = String.Empty;
dpVPCount.Visibility = System.Windows.Visibility.Collapsed;
}
public CardStackControl()
{
InitializeComponent();
this.IsClickable = false;
if (wMain.Settings != null)
{
wMain.Settings.SettingsChanged += new NET_WPF.Settings.SettingsChangedEventHandler(Settings_SettingsChanged);
Settings_SettingsChanged(wMain.Settings, null);
}
}
public void Dispose()
{
if (wMain.Settings != null)
{
wMain.Settings.SettingsChanged -= new NET_WPF.Settings.SettingsChangedEventHandler(Settings_SettingsChanged);
}
}
protected virtual void Settings_SettingsChanged(object sender, SettingsChangedEventArgs e)
{
Settings settings = sender as Settings;
if (settings != null)
{
if (settings.ToolTipShowDuration == ToolTipShowDuration.Off)
ToolTipService.SetIsEnabled(this, false);
else
{
ToolTipService.SetIsEnabled(this, true);
ToolTipService.SetShowDuration(this, (int)settings.ToolTipShowDuration);
}
}
}
public IEnumerable CardCollection
{
get { return _CardCollection; }
set
{
_CardCollection = value;
UpdateCardDisplay();
}
}
public String Title
{
get { return tbName.Text; }
private set
{
tbName.Text = value;
if (String.IsNullOrEmpty(value))
lName.Visibility = System.Windows.Visibility.Hidden;
else
lName.Visibility = System.Windows.Visibility.Visible;
}
}
public DominionBase.Piles.Visibility PileVisibility { get; set; }
public Boolean ExactCount { get; set; }
private void UpdateCardDisplay()
{
Size stackOffset = new Size();
switch (this.CardSize)
{
case NET_WPF.CardSize.Text:
break;
case NET_WPF.CardSize.SmallText:
dpName.Height = 16;
lCount.Margin = new Thickness(0);
lName.Padding = new Thickness(0);
lName.Margin = new Thickness(0, 0, 2, 0);
this.Padding = new Thickness(0);
break;
case NET_WPF.CardSize.Small:
stackOffset = new Size(12, 6);
break;
case NET_WPF.CardSize.Medium:
stackOffset = new Size(24, 10);
break;
}
if (_CardCollection.Count() > 4 || (gImages.Visibility == System.Windows.Visibility.Collapsed && _CardCollection.Count() > 1))
{
lCount.Visibility = System.Windows.Visibility.Visible;
if (IsCardsVisible && PileVisibility == DominionBase.Piles.Visibility.All)
lCount.Content = String.Format("{0}x", _CardCollection.Count());
stackOffset.Width = 0.75 * stackOffset.Width;
}
else if (this.CardSize == NET_WPF.CardSize.SmallText)
{
lCount.Visibility = System.Windows.Visibility.Collapsed;
}
if (_CardCollection.Count() > 6 && stackOffset.Height > 0)
{
float verticalScale = 56f / (_CardCollection.Count() - 1);
stackOffset = new Size((int)(0.625 * stackOffset.Width * verticalScale / stackOffset.Height), (int)verticalScale);
}
if (this.PileVisibility != DominionBase.Piles.Visibility.All)
stackOffset.Width = 0;
for (int index = 0; index < _CardCollection.Count(); index++)
{
DominionBase.ICard card = _CardCollection.ElementAt(index);
if (IsCardsVisible && PileVisibility == DominionBase.Piles.Visibility.All)
{
lName.Background = Caching.BrushRepository.GetBrush(card.Category);
if ((card.Category & DominionBase.Cards.Category.Attack) == DominionBase.Cards.Category.Attack)
lName.Foreground = Brushes.Firebrick;
if ((card.Category & DominionBase.Cards.Category.Curse) == DominionBase.Cards.Category.Curse)
lName.Foreground = Brushes.Snow;
if ((card.Category & DominionBase.Cards.Category.Reaction) == DominionBase.Cards.Category.Reaction)
tbName.Effect = Caching.DropShadowRepository.GetDSE(8, Colors.White, 1d);
}
if (gImages.Visibility == System.Windows.Visibility.Visible)
{
Image newImage = new Image();
Caching.ImageRepository repo = Caching.ImageRepository.Acquire();
switch (this.CardSize)
{
case NET_WPF.CardSize.Small:
if (IsCardsVisible &&
(PileVisibility == DominionBase.Piles.Visibility.All || PileVisibility == DominionBase.Piles.Visibility.Top) &&
card.CardType != DominionBase.Cards.Universal.TypeClass.Dummy)
newImage.Source = repo.GetBitmapImage(card.Name.Replace(" ", "").Replace("'", ""), "small");
else
{
switch (card.CardBack)
{
case DominionBase.Cards.CardBack.Standard:
newImage.Source = repo.GetBitmapImage("back", "small");
break;
case DominionBase.Cards.CardBack.Red:
newImage.Source = repo.GetBitmapImage("back_red", "small");
break;
}
}
break;
case NET_WPF.CardSize.Medium:
if (IsCardsVisible &&
(PileVisibility == DominionBase.Piles.Visibility.All || PileVisibility == DominionBase.Piles.Visibility.Top) &&
card.CardType != DominionBase.Cards.Universal.TypeClass.Dummy)
newImage.Source = repo.GetBitmapImage(card.Name.Replace(" ", "").Replace("'", ""), "medium");
else
{
switch (card.CardBack)
{
case DominionBase.Cards.CardBack.Standard:
newImage.Source = repo.GetBitmapImage("back", "medium");
break;
case DominionBase.Cards.CardBack.Red:
newImage.Source = repo.GetBitmapImage("back_red", "medium");
break;
}
}
break;
}
Caching.ImageRepository.Release();
if (newImage.Source != null)
{
newImage.Width = newImage.Source.Width;
newImage.Height = newImage.Source.Height;
}
newImage.HorizontalAlignment = HorizontalAlignment.Left;
newImage.VerticalAlignment = VerticalAlignment.Top;
Panel.SetZIndex(newImage, 0);
newImage.Margin = new Thickness(index * stackOffset.Width, index * stackOffset.Height, 0, 0);
newImage.Tag = card;
gImages.Children.Add(newImage);
}
}
this.Title = String.Empty;
if (_CardCollection.Count() > 0 && IsCardsVisible)
{
if (PileVisibility == DominionBase.Piles.Visibility.All || PileVisibility == DominionBase.Piles.Visibility.Top)
{
this.Title = _CardCollection.ElementAt(_CardCollection.Count() - 1).Name;
ttcCard.ICard = _CardCollection.ElementAt(_CardCollection.Count() - 1);
}
}
UpdateGlowEffectAll();
if (!IsCardsVisible || PileVisibility != DominionBase.Piles.Visibility.All)
{
int count = _CardCollection.Count();
if (this.ExactCount || count <= 1)
this.Title = StringUtility.Plural("Card", count);
}
}
private void UpdateGlowEffectAll()
{
if (IsCardsVisible && PileVisibility == DominionBase.Piles.Visibility.All)
{
Boolean anyGlowAdded = false;
foreach (Image image in gImages.Children.OfType())
{
DominionBase.Cards.Card card = image.Tag as DominionBase.Cards.Card;
Boolean addGlow = (_PlayerPhase == DominionBase.Players.PhaseEnum.Action &&
((card.Category & DominionBase.Cards.Category.Action) == DominionBase.Cards.Category.Action ||
(card.Category & DominionBase.Cards.Category.Treasure) == DominionBase.Cards.Category.Treasure)) ||
(_PlayerPhase == DominionBase.Players.PhaseEnum.Treasure &&
(card.Category & DominionBase.Cards.Category.Treasure) == DominionBase.Cards.Category.Treasure);
UpdateGlowEffect(image, addGlow, _GlowSize, Colors.Black);
anyGlowAdded |= addGlow;
}
UpdateGlowEffect(lName, anyGlowAdded, _GlowSize, Colors.Black);
}
}
private void UpdateGlowEffect(UIElement element, Boolean addGlow, int glowSize, Color color)
{
if (addGlow)
{
element.Effect = Caching.DropShadowRepository.GetDSE(glowSize, color, 0.85);
this.IsClickable = true;
bImages.Cursor = bName.Cursor = Cursors.Hand;
}
else
{
element.Effect = null;
this.IsClickable = false;
bImages.Cursor = bName.Cursor = null;
}
}
private void b_Click(object sender, RoutedEventArgs e)
{
(sender as Button).IsEnabled = false;
_ClickedCard = (gImages.Children[gImages.Children.Count - 1] as Image).Tag as DominionBase.Cards.Card;
RaiseEvent(new RoutedEventArgs(CardStackControlClickEvent));
_ClickedCard = null;
(sender as Button).IsEnabled = true;
}
private void UserControl_MouseDown(object sender, MouseButtonEventArgs e)
{
if (wMain.Settings == null || this.ToolTip == null || !(this.ToolTip is ToolTip) || (this.ToolTip as ToolTip).Content == null ||
!((this.ToolTip as ToolTip).Content is ToolTipCard) || ((this.ToolTip as ToolTip).Content as ToolTipCard).ICard == null ||
((this.ToolTip as ToolTip).Content as ToolTipCard).ICard.CardType == DominionBase.Cards.Universal.TypeClass.Dummy)
return;
if (wMain.Settings.ShowToolTipOnRightClick && e.ChangedButton == MouseButton.Right && e.ButtonState == MouseButtonState.Pressed)
{
this.CaptureMouse();
(this.ToolTip as ToolTip).IsOpen = true;
e.Handled = true;
}
}
private void UserControl_MouseUp(object sender, MouseButtonEventArgs e)
{
if (wMain.Settings == null || this.ToolTip == null)
return;
if (wMain.Settings.ShowToolTipOnRightClick && e.ChangedButton == MouseButton.Right && e.ButtonState == MouseButtonState.Released)
{
this.ReleaseMouseCapture();
(this.ToolTip as ToolTip).IsOpen = false;
e.Handled = true;
}
}
private void b_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
//this.CaptureMouse();
}
private void b_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
//this.ReleaseMouseCapture();
}
private void UserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if ((this.ToolTip as ToolTip).IsOpen)
(this.ToolTip as ToolTip).IsOpen = false;
}
}
}