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.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using DominionBase.Utilities; namespace Dominion.NET_WPF.Controls { /// /// Interaction logic for ucCardIcon.xaml /// public partial class ucCardIcon : UserControl, IDisposable { public static readonly DependencyProperty SizeProperty = DependencyProperty.Register("Objects", typeof(CardSize), typeof(ucCardIcon), new PropertyMetadata(CardSize.SmallText)); public CardSize Size { get { return (CardSize)this.GetValue(SizeProperty); } set { this.SetValue(SizeProperty, value); switch (value) { case CardSize.SmallText: dpName.Height = 16; lName.Margin = new Thickness(0, 0, 2, 0); lName.Padding = new Thickness(0); this.Padding = new Thickness(0); break; case CardSize.Text: dpName.Height = Double.NaN; lName.Margin = new Thickness(0, 0, 5, 0); lName.Padding = new Thickness(0, 2, 0, 2); this.Padding = new Thickness(5); break; } } } private DominionBase.ICard _Card = null; private int _Count = 0; private Settings _containee; private WeakucCardIcon _weakContainer = null; //private byte[] memoryLeak = null; public int Count { get { return _Count; } set { _Count = value; if (_Count < 0) _Count = 0; if (_Count > 1) { lCount.Visibility = System.Windows.Visibility.Visible; lCount.Content = String.Format("{0}x", _Count); } else { lCount.Visibility = System.Windows.Visibility.Collapsed; } } } public ucCardIcon() { InitializeComponent(); if (wMain.Settings != null) { this.Settings = wMain.Settings; //wMain.Settings.SettingsChanged += new NET_WPF.Settings.SettingsChangedEventHandler(Settings_SettingsChanged); Settings_SettingsChanged(wMain.Settings, null); } //memoryLeak = new byte[5000000]; } #region IDisposable variables, properties, & methods // Track whether Dispose has been called. private bool disposed = false; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { // Check to see if Dispose has already been called. if (!this.disposed) { // If disposing equals true, dispose all managed // and unmanaged resources. if (disposing) { // Dispose managed resources. } // Call the appropriate methods to clean up // unmanaged resources here. // If disposing is false, // only the following code is executed. _Card = null; //memoryLeak = null; if (wMain.Settings != null) { wMain.Settings.SettingsChanged -= new NET_WPF.Settings.SettingsChangedEventHandler(Settings_SettingsChanged); } // Note disposing has been done. disposed = true; } } ~ucCardIcon() { Dispose(false); } #endregion public Settings Settings { get { return _containee; } set { if (_weakContainer == null) _weakContainer = new WeakucCardIcon(this); // unsubscribe old if (_containee != null) _containee.SettingsChanged -= new Settings.SettingsChangedEventHandler(_weakContainer.Settings_SettingsChanged); _containee = value; // subscribe new if (_containee != null) _containee.SettingsChanged += new Settings.SettingsChangedEventHandler(_weakContainer.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); } } } private class WeakucCardIcon : WeakReference { public WeakucCardIcon(ucCardIcon target) : base(target) { } public void Settings_SettingsChanged(object sender, SettingsChangedEventArgs e) { ucCardIcon b = (ucCardIcon)this.Target; if (b != null) b.Settings_SettingsChanged(sender, e); else { Settings c = sender as Settings; if (c != null) { c.SettingsChanged -= new Settings.SettingsChangedEventHandler(this.Settings_SettingsChanged); } } } ~WeakucCardIcon() { } } public DominionBase.ICard Card { get { return _Card; } set { _Card = value; if (_Card != null) { this.Title = _Card.Name; lName.Background = Caching.BrushRepository.GetBrush(this.Card.Category); if ((this.Card.Category & DominionBase.Cards.Category.Attack) == DominionBase.Cards.Category.Attack) lName.Foreground = Brushes.Firebrick; if ((this.Card.Category & DominionBase.Cards.Category.Curse) == DominionBase.Cards.Category.Curse) lName.Foreground = Brushes.Snow; if ((this.Card.Category & DominionBase.Cards.Category.Reaction) == DominionBase.Cards.Category.Reaction) tbName.Effect = Caching.DropShadowRepository.GetDSE(8, Colors.White, 1d); this.Count = 1; } else { this.Title = String.Empty; this.Count = 0; } ttcCard.ICard = this.Card; } } 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; } } 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 UserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { if ((this.ToolTip as ToolTip).IsOpen) (this.ToolTip as ToolTip).IsOpen = false; } } public class CardIconUtilities { public static IEnumerable CreateCardIcons(IEnumerable cards) { List list = new List(); if (cards.Count() == 0) return list; ucCardIcon icon = null; int previousIndex = -1; for (int c = 0; c < cards.Count(); c++) { if (previousIndex < 0) { previousIndex = c; continue; } if (cards.ElementAt(previousIndex).CardType != cards.ElementAt(c).CardType) { icon = new ucCardIcon(); icon.Card = cards.ElementAt(previousIndex); icon.Count = c - previousIndex; if (icon.Card is DominionBase.Piles.Supply && (icon.Card as DominionBase.Piles.Supply).Tokens.Any(t => t.Name == "BaneToken")) list.Add(new ucTokenIcon { Token = (icon.Card as DominionBase.Piles.Supply).Tokens.First(t => t.Name == "BaneToken"), Size = CardSize.SmallText }); list.Add(icon); previousIndex = c; } } icon = new ucCardIcon(); icon.Card = cards.Last(); icon.Count = cards.Count() - previousIndex; if (icon.Card is DominionBase.Piles.Supply && (icon.Card as DominionBase.Piles.Supply).Tokens.Any(t => t.Name == "BaneToken")) list.Add(new ucTokenIcon { Token = (icon.Card as DominionBase.Piles.Supply).Tokens.First(t => t.Name == "BaneToken"), Size = CardSize.SmallText }); list.Add(icon); return list; } public static ucCardIcon CreateCardIcon(DominionBase.ICard card) { ucCardIcon icon = new ucCardIcon(); icon.Card = card; icon.Count = 1; return icon; } } }