using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; 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; namespace Dominion.NET_WPF.Controls { /// /// Interaction logic for ucChooser.xaml /// public partial class ucChooser : UserControl { public static readonly RoutedEvent ChooserOKClickEvent = EventManager.RegisterRoutedEvent( "ChooserOKClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ucChooser)); public event RoutedEventHandler ChooserOKClick { add { AddHandler(ChooserOKClickEvent, value); } remove { RemoveHandler(ChooserOKClickEvent, value); } } private DominionBase.Players.Player _Player = null; private DominionBase.Choice _Choice = null; private DominionBase.ChoiceResult _ChoiceResult = null; private List _SupplyControls = new List(); public ucChooser() { InitializeComponent(); ((INotifyCollectionChanged)lbReorder.Items).CollectionChanged += new NotifyCollectionChangedEventHandler(lbReorder_CollectionChanged); } public DominionBase.Players.Player Player { get { return _Player; } set { _Player = value; } } public DominionBase.ChoiceResult ChoiceResult { get { return _ChoiceResult; } private set { _ChoiceResult = value; } } public DominionBase.Choice Choice { get { return _Choice; } set { _Choice = value; } } public List SupplyControls { private get { return _SupplyControls; } set { _SupplyControls = value; } } public Boolean IsReady { set { this.ChoiceResult = null; if (!value) { _Player = null; _Choice = null; _ChoiceResult = null; _SupplyControls.Clear(); } if (value && _Choice != null) { cbAutoClick.Visibility = bButtonDiv.Visibility = System.Windows.Visibility.Visible; bAll.Visibility = bNone.Visibility = System.Windows.Visibility.Visible; bOK.IsEnabled = (_Choice.Minimum == 0); tbText.Text = String.Empty; wrapPanel1.Visibility = System.Windows.Visibility.Visible; wrapPanel1.Children.Clear(); bReorder.Visibility = bCardPool.Visibility = lbCardPool.Visibility = System.Windows.Visibility.Collapsed; lbReorder.DataContext = null; bHidden.Visibility = System.Windows.Visibility.Collapsed; lbHidden.DataContext = null; if (_Choice.EventArgs is DominionBase.Players.AttackedEventArgs) { DominionBase.Players.AttackedEventArgs aea = _Choice.EventArgs as DominionBase.Players.AttackedEventArgs; tbText.Text = String.Format("{1} played {2}{0}", System.Environment.NewLine, aea.Attacker, aea.AttackCard); } foreach (SupplyControl sc in this.SupplyControls) sc.Clickability = SupplyVisibility.Plain; tbText.Text += String.Format("{0}, {1}", this.Player, Utilities.RenderText(Choice.Text)); switch (_Choice.ChoiceType) { case DominionBase.ChoiceType.Options: this.ChoiceResult = new DominionBase.ChoiceResult(new List()); foreach (String option in _Choice.Options) { ToggleButton toggleButton = (ToggleButton)CreateButton(false); ((TextBlock)((ToggleButton)toggleButton).Content).Text = Utilities.RenderText(option); toggleButton.Tag = option; wrapPanel1.Children.Add(toggleButton); } break; case DominionBase.ChoiceType.Cards: this.ChoiceResult = new DominionBase.ChoiceResult(new DominionBase.Cards.CardCollection()); if (!_Choice.IsOrdered) { foreach (DominionBase.Cards.Card card in _Choice.Cards) { if (card.CardType == DominionBase.Cards.Universal.TypeClass.Dummy) { Border bDivider = new Border() { BorderBrush = Brushes.BlueViolet, BorderThickness = new Thickness(2), Margin = new Thickness(4) }; wrapPanel1.Children.Add(bDivider); } else { ucICardButton icb = (ucICardButton)CreateButton(true); icb.ICard = card; icb.Tag = card; wrapPanel1.Children.Add(icb); } } } else { wrapPanel1.Visibility = System.Windows.Visibility.Collapsed; switch (Choice.Visibility) { case DominionBase.Piles.Visibility.All: bReorder.Visibility = System.Windows.Visibility.Visible; if (_Choice.Cards.Count() == _Choice.Minimum) { ViewModel.CardListViewModel clvm = new ViewModel.CardListViewModel(); clvm.ShowCards(Choice.Cards, Choice.Visibility); lbReorder.DataContext = clvm; } else { bCardPool.Visibility = lbCardPool.Visibility = System.Windows.Visibility.Visible; ViewModel.CardListViewModel clvmReorder = new ViewModel.CardListViewModel(); clvmReorder.ShowCards(new DominionBase.Cards.CardCollection(), Choice.Visibility); lbReorder.DataContext = clvmReorder; ViewModel.CardListViewModel clvmPool = new ViewModel.CardListViewModel(); clvmPool.ShowCards(Choice.Cards, Choice.Visibility); lbCardPool.DataContext = clvmPool; } if (lbReorder.Items.Count >= _Choice.Minimum && lbReorder.Items.Count <= _Choice.Maximum) bOK.IsEnabled = true; else bOK.IsEnabled = false; break; case DominionBase.Piles.Visibility.None: bHidden.Visibility = System.Windows.Visibility.Visible; ViewModel.CardListViewModel clvmHidden = new ViewModel.CardListViewModel(); clvmHidden.ShowCards(Choice.Cards, Choice.Visibility); lbHidden.DataContext = clvmHidden; if (lbHidden.Items.Count >= _Choice.Minimum && lbHidden.Items.Count <= _Choice.Maximum) bOK.IsEnabled = true; else bOK.IsEnabled = false; break; } // "All" & "None" aren't valid for this case, either cbAutoClick.Visibility = bButtonDiv.Visibility = System.Windows.Visibility.Collapsed; bAll.Visibility = bNone.Visibility = System.Windows.Visibility.Collapsed; } break; case DominionBase.ChoiceType.Supplies: TextBlock tbSupplyNotification = new TextBlock(); tbSupplyNotification.Text = "<-- Select a Supply pile to the left"; tbSupplyNotification.FontSize = 14; wrapPanel1.Children.Add(tbSupplyNotification); foreach (SupplyControl sc in this.SupplyControls) { if (_Choice.Supplies.Values.Contains(sc.Supply)) { if (_Choice.CardSource.CardType == DominionBase.Cards.Seaside.TypeClass.Embargo || _Choice.CardSource.CardType == DominionBase.Cards.Prosperity.TypeClass.Contraband) sc.Clickability = SupplyVisibility.Selectable; else sc.Clickability = SupplyVisibility.Gainable; sc.SupplyClick += SupplyControl_SupplyClick; } else sc.Clickability = SupplyVisibility.NotClickable; } break; case DominionBase.ChoiceType.SuppliesAndCards: foreach (DominionBase.Cards.Card card in _Choice.Cards) { ucICardButton icb = (ucICardButton)CreateButton(true); icb.ICard = card; icb.Tag = card; wrapPanel1.Children.Add(icb); } TextBlock tbSupplyCardNotification = new TextBlock(); tbSupplyCardNotification.Text = "<-- Select a Supply pile to the left"; if (_Choice.Cards.Count() > 0) tbSupplyCardNotification.Text += " or a card above"; tbSupplyCardNotification.FontSize = 14; wrapPanel1.Children.Add(tbSupplyCardNotification); foreach (SupplyControl sc in this.SupplyControls) { if (_Choice.Supplies.Values.Contains(sc.Supply)) { if (_Choice.CardSource.CardType == DominionBase.Cards.Intrigue.TypeClass.WishingWell) sc.Clickability = SupplyVisibility.Selectable; else sc.Clickability = SupplyVisibility.Gainable; sc.SupplyClick += SupplyControl_SupplyClick; } else sc.Clickability = SupplyVisibility.NotClickable; } break; } if (wrapPanel1.Visibility == System.Windows.Visibility.Visible) { if (_Choice.Minimum == 0) bNone.Visibility = Visibility.Visible; else bNone.Visibility = Visibility.Collapsed; if (_Choice.Maximum >= wrapPanel1.Children.Count) bAll.Visibility = Visibility.Visible; else bAll.Visibility = Visibility.Collapsed; if (bAll.Visibility == System.Windows.Visibility.Collapsed && bNone.Visibility == System.Windows.Visibility.Collapsed) bButtonDiv.Visibility = System.Windows.Visibility.Collapsed; else bButtonDiv.Visibility = System.Windows.Visibility.Visible; } if (wMain.Settings != null) cbAutoClick.IsChecked = wMain.Settings.Chooser_AutomaticallyClickWhenSatisfied; // Automatic chooser clicking! if (wMain.Settings != null && wMain.Settings.Chooser_AutomaticallyRevealMoat && _Choice.EventArgs is DominionBase.Players.AttackedEventArgs && _Choice.ChoiceType == DominionBase.ChoiceType.Cards && _Choice.Text == "Reveal a card?" && _Choice.Cards.Any(c => c.CardType == DominionBase.Cards.Base.TypeClass.Moat)) { ucICardButton icbMoat = wrapPanel1.Children.OfType().FirstOrDefault( icb => icb.ICard is DominionBase.Cards.Card && icb.ICard.CardType == DominionBase.Cards.Base.TypeClass.Moat); if (icbMoat != null) { cbAutoClick.IsChecked = true; icbMoat.IsChecked = true; toggleButton_Checked(icbMoat, null); } } else if (wMain.Settings != null && wMain.Settings.Chooser_AutomaticallyRevealProvince && _Choice.EventArgs == null && _Choice.CardSource.CardType == DominionBase.Cards.Cornucopia.TypeClass.Tournament && _Choice.ChoiceType == DominionBase.ChoiceType.Options && _Choice.Text == "Do you want to reveal a Province from your hand?") { ToggleButton tbYes = wrapPanel1.Children.OfType().FirstOrDefault( tb => ((TextBlock)((ToggleButton)tb).Content).Text == "Yes"); if (tbYes != null) { cbAutoClick.IsChecked = true; tbYes.IsChecked = true; toggleButton_Checked(tbYes, null); } } } } } private void SupplyControl_SupplyClick(object sender, RoutedEventArgs e) { DominionBase.Piles.Supply supply = (e.Source as SupplyControl).Supply; bOK.IsEnabled = false; this.ChoiceResult = new DominionBase.ChoiceResult(supply); if (this.ChoiceResult != null) bOK.IsEnabled = true; if (bOK.IsEnabled && this.ChoiceResult.Supply != null && cbAutoClick.IsChecked == true) bOK_Click(bOK, null); } void toggleButton_Checked(object sender, RoutedEventArgs e) { bool? isChecked = false; Object tag = null; if (sender is ToggleButton) { ToggleButton tb = sender as ToggleButton; isChecked = tb.IsChecked; tag = tb.Tag; } else if (sender is ucICardButton) { ucICardButton icb = sender as ucICardButton; isChecked = icb.IsChecked; tag = icb.Tag; } bOK.IsEnabled = false; switch (Choice.ChoiceType) { case DominionBase.ChoiceType.Options: if (this.ChoiceResult == null) this.ChoiceResult = new DominionBase.ChoiceResult(new List()); String option = tag as String; if (isChecked == true) this.ChoiceResult.Options.Add(option); else if (this.ChoiceResult.Options.Contains(option)) this.ChoiceResult.Options.Remove(option); if (this.ChoiceResult.Options.Count >= Choice.Minimum && this.ChoiceResult.Options.Count <= Choice.Maximum) bOK.IsEnabled = true; break; case DominionBase.ChoiceType.Cards: case DominionBase.ChoiceType.SuppliesAndCards: //case DominionBase.ChoiceType.Pile: if (this.ChoiceResult == null) this.ChoiceResult = new DominionBase.ChoiceResult(new DominionBase.Cards.CardCollection()); DominionBase.Cards.Card card = tag as DominionBase.Cards.Card; if (isChecked == true) this.ChoiceResult.Cards.Add(card); else if (this.ChoiceResult.Cards.Contains(card)) this.ChoiceResult.Cards.Remove(card); if (this.ChoiceResult.Cards.Count >= Choice.Minimum && this.ChoiceResult.Cards.Count <= Choice.Maximum) bOK.IsEnabled = true; break; case DominionBase.ChoiceType.Supplies: if (isChecked == true) this.ChoiceResult = new DominionBase.ChoiceResult(tag as DominionBase.Piles.Supply); else this.ChoiceResult = null; if (this.ChoiceResult != null) bOK.IsEnabled = true; break; } foreach (ToggleButton control in wrapPanel1.Children.OfType()) { TextBlock textBlock = control.Content as TextBlock; String option = control.Tag as String; if (Choice.IsOrdered) { textBlock.Visibility = System.Windows.Visibility.Visible; String ordinal = String.Empty; switch (Choice.ChoiceType) { case DominionBase.ChoiceType.Options: if (this.ChoiceResult.Options.Contains(option)) ordinal = Utilities.Ordinal(this.ChoiceResult.Options.IndexOf(option) + 1); break; } if (ordinal != String.Empty) textBlock.Text = String.Format("{0}: {1}", ordinal, Utilities.RenderText(option)); else textBlock.Text = Utilities.RenderText(option); } } foreach (ucICardButton control in wrapPanel1.Children.OfType()) { DominionBase.Cards.Card card = control.Tag as DominionBase.Cards.Card; if (Choice.IsOrdered) { String ordinal = String.Empty; switch (Choice.ChoiceType) { case DominionBase.ChoiceType.Cards: //case DominionBase.ChoiceType.Pile: if (this.ChoiceResult.Cards.Contains(card)) control.Order = this.ChoiceResult.Cards.IndexOf(card) + 1; else control.Order = 0; break; } } } if (bOK.IsEnabled && (this.ChoiceResult.Supply != null || (this.ChoiceResult.Cards != null && this.ChoiceResult.Cards.Count == Choice.Maximum) || (this.ChoiceResult.Options != null && this.ChoiceResult.Options.Count == Choice.Maximum) ) && cbAutoClick.IsChecked == true) bOK_Click(bOK, null); } private void SetToolTip(FrameworkElement element, DominionBase.ICard card) { ToolTip tt = new System.Windows.Controls.ToolTip(); ToolTipCard ttc = new ToolTipCard(); tt.Content = ttc; ToolTipService.SetShowOnDisabled(element, true); ToolTipService.SetHasDropShadow(element, true); if (wMain.Settings != null) { if (wMain.Settings.ToolTipShowDuration == ToolTipShowDuration.Off) ToolTipService.SetIsEnabled(element, false); else { ToolTipService.SetIsEnabled(element, true); ToolTipService.SetShowDuration(element, (int)wMain.Settings.ToolTipShowDuration); } } ToolTipService.SetInitialShowDelay(element, 2000); ToolTipService.SetBetweenShowDelay(element, 250); ttc.ICard = card; element.ToolTip = tt; } private FrameworkElement CreateButton(Boolean isICard) { if (isICard) { ucICardButton icb = new ucICardButton(); icb.ICardButtonClick += new RoutedEventHandler(toggleButton_Checked); icb.IsOrdered = Choice.IsOrdered; return icb; } else { ToggleButton tb = new ToggleButton(); tb.Content = new TextBlock(); ((TextBlock)tb.Content).TextWrapping = TextWrapping.Wrap; tb.Margin = new Thickness(5, 0, 5, 0); tb.Padding = new Thickness(10, 0, 10, 0); tb.Height = double.NaN; tb.Width = double.NaN; tb.MinHeight = 40; tb.MinWidth = 40; tb.MaxHeight = 100; tb.MaxWidth = 200; tb.Click += new RoutedEventHandler(toggleButton_Checked); return tb; } } private void bOK_Click(object sender, RoutedEventArgs e) { (sender as Button).IsEnabled = false; if (this.ChoiceResult == null) this.ChoiceResult = new DominionBase.ChoiceResult(); if (bReorder.Visibility == System.Windows.Visibility.Visible) { this.ChoiceResult = new DominionBase.ChoiceResult(new DominionBase.Cards.CardCollection()); // Must add the cards back in reverse order foreach (ViewModel.CardViewModel cvm in (lbReorder.DataContext as ViewModel.CardListViewModel).Cards.Reverse()) this.ChoiceResult.Cards.Add((DominionBase.Cards.Card)cvm.ICard); } else if (bHidden.Visibility == System.Windows.Visibility.Visible) { this.ChoiceResult = new DominionBase.ChoiceResult(new DominionBase.Cards.CardCollection()); // Must add the cards back in reverse order foreach (ViewModel.CardViewModel cvm in (lbHidden.DataContext as ViewModel.CardListViewModel).Cards.Reverse()) this.ChoiceResult.Cards.Add((DominionBase.Cards.Card)cvm.ICard); } foreach (SupplyControl sc in this.SupplyControls) sc.SupplyClick -= SupplyControl_SupplyClick; RaiseEvent(new RoutedEventArgs(ChooserOKClickEvent)); (sender as Button).IsEnabled = true; } private void bNone_Click(object sender, RoutedEventArgs e) { cbAutoClick.IsChecked = false; foreach (FrameworkElement control in wrapPanel1.Children) { if (sender is ToggleButton) { ToggleButton tb = sender as ToggleButton; tb.IsChecked = false; } else if (sender is ucICardButton) { ucICardButton icb = sender as ucICardButton; icb.IsChecked = false; } toggleButton_Checked(control, null); } bOK_Click(bOK, null); } private void bAll_Click(object sender, RoutedEventArgs e) { cbAutoClick.IsChecked = false; foreach (FrameworkElement control in wrapPanel1.Children) { if (control is ToggleButton) (control as ToggleButton).IsChecked = false; else if (control is ucICardButton) (control as ucICardButton).IsChecked = false; toggleButton_Checked(control, null); } foreach (FrameworkElement control in wrapPanel1.Children) { if (control is ToggleButton) (control as ToggleButton).IsChecked = true; else if (control is ucICardButton) (control as ucICardButton).IsChecked = true; toggleButton_Checked(control, null); } bOK_Click(bOK, null); } void lbReorder_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (_Choice == null) return; if ((sender as ItemCollection).Count >= _Choice.Minimum && (sender as ItemCollection).Count <= _Choice.Maximum) bOK.IsEnabled = true; else bOK.IsEnabled = false; } } }