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;
}
}
}