using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
namespace Tango.MachineStudio.DB.Controls
{
public class TableGrid : Grid
{
public TableGrid()
{
ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Auto) });
ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) });
this.Loaded += TableGrid_Loaded;
}
private void TableGrid_Loaded(object sender, RoutedEventArgs e)
{
InvalidateGrid();
}
protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved)
{
base.OnVisualChildrenChanged(visualAdded, visualRemoved);
}
protected override Size ArrangeOverride(Size arrangeSize)
{
return base.ArrangeOverride(arrangeSize);
}
private void InvalidateGrid()
{
RowDefinitions.Clear();
RowDefinitions.Add(new RowDefinition() { Height = new GridLength(50, GridUnitType.Pixel) });
int currentRow = 0;
for (int i = 0; i < Children.Count; i++)
{
SetRow(Children[i], currentRow);
if (i % 2 != 0)
{
SetColumn(Children[i], 1);
(Children[i] as FrameworkElement).Margin = new Thickness(20, 0, 0, 0);
currentRow++;
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using MaterialDesignThemes.Wpf;
using Tango.MachineStudio.Common.Notifications;
using Tango.MachineStudio.UI.Windows;
using System.Windows.Media;
using Tango.Core;
using System.Collections.ObjectModel;
using Tango.SharedUI;
using System.Collections.Concurrent;
namespace Tango.MachineStudio.UI.Notifications
{
/// <summary>
/// Represents the default Machine Studio <see cref="INotificationProvider">Notification Provider</see>.
/// </summary>
/// <seealso cref="Tango.Core.ExtendedObject" />
/// <seealso cref="Tango.MachineStudio.Common.Notifications.INotificationProvider" />
public class DefaultNotificationProvider : ExtendedObject, INotificationProvider
{
private int _message_count = 0;
/// <summary>
/// The view types
/// </summary>
private static List<Type> viewTypes;
/// <summary>
/// Gets the collection of active task items.
/// </summary>
public ObservableCollection<TaskItem> TaskItems { get; private set; }
/// <summary>
/// Gets the collection of active bar items.
/// </summary>
public ObservableCollection<BarItem> BarItems { get; private set; }
/// <summary>
/// Gets a value indicating whether there are any queued task items.
/// </summary>
public bool HasTaskItems
{
get { return TaskItems.Count > 0; }
}
/// <summary>
/// The current task item
/// </summary>
private TaskItem _currentTaskItem;
/// <summary>
/// Gets the current displayed task item.
/// </summary>
public TaskItem CurrentTaskItem
{
get { return _currentTaskItem; }
set { _currentTaskItem = value; RaisePropertyChangedAuto(); RaisePropertyChanged(nameof(HasTaskItems)); }
}
/// <summary>
/// Initializes a new instance of the <see cref="DefaultNotificationProvider"/> class.
/// </summary>
public DefaultNotificationProvider()
{
TaskItems = new ObservableCollection<TaskItem>();
BarItems = new ObservableCollection<BarItem>();
}
/// <summary>
/// Display a message box.
/// </summary>
/// <param name="icon">The icon.</param>
/// <param name="iconColor">Color of the icon.</param>
/// <param name="message">The message.</param>
/// <param name="hasCancel">if set to <c>true</c> displays the cancel button.</param>
/// <returns></returns>
public bool? ShowMessageBox(PackIconKind icon, Brush iconColor, string message, bool hasCancel)
{
MainWindow.Instance.shadowGrid.Visibility = Visibility.Visible;
_message_count++;
var result = new MessageBoxWindow()
{
Owner = Application.Current.MainWindow,
Message = message,
IconKind = icon,
IconColor = iconColor,
HasCancel = hasCancel
}.ShowDialog();
_message_count--;
if (_message_count == 0)
{
MainWindow.Instance.shadowGrid.Visibility = Visibility.Hidden;
}
return result;
}
/// <summary>
/// Creates a new instance of the specified View type and displays it as a modal dialog.
/// </summary>
/// <typeparam name="View">The type of the view.</typeparam>
/// <typeparam name="VM">The type of the view model.</typeparam>
/// <param name="onAccept">Accept button callback.</param>
/// <param name="onCancel">Cancel button callback.</param>
public void ShowModalDialog<View, VM>(Action<VM> onAccept, Action onCancel) where View : FrameworkElement where VM : DialogViewVM
{
var view = Activator.CreateInstance<View>();
DialogWindow dialog = new DialogWindow();
dialog.Owner = Application.Current.MainWindow;
dialog.InnerContent = view;
MainWindow.Instance.shadowGrid.Visibility = Visibility.Visible;
view.Loaded += (x, y) =>
{
VM context = view.DataContext as VM;
dialog.DataContext = context;
Action onAcceptAction = null;
Action onCancelAction = null;
onAcceptAction = new Action(() =>
{
dialog.Close();
onAccept(context);
context.Accepted -= onAcceptAction;
context.Canceled -= onCancelAction;
});
onCancelAction = new Action(() =>
{
dialog.Close();
if (onCancel != null)
{
onCancel();
}
context.Accepted -= onAcceptAction;
context.Canceled -= onCancelAction;
});
context.Accepted += onAcceptAction;
context.Canceled += onCancelAction;
context.OnShow();
};
dialog.ShowDialog();
MainWindow.Instance.shadowGrid.Visibility = Visibility.Hidden;
}
/// <summary>
/// Shows the specified view with the specified view model as it's data context.
/// </summary>
/// <typeparam name="VM">The type of the mm.</typeparam>
/// <typeparam name="View">The type of the view.</typeparam>
/// <param name="vm">The view model.</param>
/// <param name="view">The view.</param>
/// <param name="onAccept">The accept action.</param>
/// <param name="onCancel">The cancel action.</param>
public void ShowModalDialog<VM, View>(VM vm, Action<VM> onAccept, Action onCancel) where View : FrameworkElement where VM : DialogViewVM
{
var view = Activator.CreateInstance<View>();
DialogWindow dialog = new DialogWindow();
dialog.Owner = Application.Current.MainWindow;
dialog.InnerContent = view;
MainWindow.Instance.shadowGrid.Visibility = Visibility.Visible;
view.Loaded += (x, y) =>
{
VM context = vm;
dialog.DataContext = context;
Action onAcceptAction = null;
Action onCancelAction = null;
onAcceptAction = new Action(() =>
{
dialog.Close();
onAccept(context);
context.Accepted -= onAcceptAction;
context.Canceled -= onCancelAction;
});
onCancelAction = new Action(() =>
{
dialog.Close();
if (onCancel != null)
{
onCancel();
}
context.Accepted -= onAcceptAction;
context.Canceled -= onCancelAction;
});
context.Accepted += onAcceptAction;
context.Canceled += onCancelAction;
context.OnShow();
};
dialog.ShowDialog();
MainWindow.Instance.shadowGrid.Visibility = Visibility.Hidden;
}
/// <summary>
/// Shows the specified view with the specified view model as it's data context.
/// </summary>
/// <typeparam name="VM">The type of the mm.</typeparam>
/// <typeparam name="View">The type of the view.</typeparam>
/// <param name="vm">The view model.</param>
/// <param name="view">The view.</param>
/// <param name="onAccept">The accept action.</param>
/// <param name="onCancel">The cancel action.</param>
public void ShowModalDialog<VM, View>(VM vm, View view, Action<VM> onAccept, Action onCancel) where View : FrameworkElement where VM : DialogViewVM
{
DialogWindow dialog = new DialogWindow();
dialog.Owner = Application.Current.MainWindow;
dialog.InnerContent = view;
MainWindow.Instance.shadowGrid.Visibility = Visibility.Visible;
view.Loaded += (x, y) =>
{
VM context = vm;
dialog.DataContext = context;
Action onAcceptAction = null;
Action onCancelAction = null;
onAcceptAction = new Action(() =>
{
dialog.Close();
onAccept(context);
context.Accepted -= onAcceptAction;
context.Canceled -= onCancelAction;
});
onCancelAction = new Action(() =>
{
dialog.Close();
if (onCancel != null)
{
onCancel();
}
context.Canceled -= onCancelAction;
context.Accepted -= onAcceptAction;
});
context.Accepted += onAcceptAction;
context.Canceled += onCancelAction;
context.OnShow();
};
dialog.ShowDialog();
MainWindow.Instance.shadowGrid.Visibility = Visibility.Hidden;
}
/// <summary>
/// Creates a new view by a naming convention of the specified view model type.
/// </summary>
/// <typeparam name="VM">The type of the view model.</typeparam>
/// <param name="onAccept">Accept button callback.</param>
/// <param name="onCancel">Cancel button callback.</param>
/// <exception cref="NullReferenceException">Could not locate view " + viewName</exception>
public void ShowModalDialog<VM>(Action<VM> onAccept, Action onCancel) where VM : DialogViewVM
{
String viewName = typeof(VM).Name.Replace("VM", "");
if (viewTypes == null)
{
viewTypes = AppDomain.CurrentDomain.GetAssemblies().Where(x => x.FullName.Contains("MachineStudio")).SelectMany(x => x.GetTypes()).ToList();
}
var viewType = viewTypes.SingleOrDefault(x => x.Name == viewName);
if (viewType == null)
{
throw new NullReferenceException("Could not locate view " + viewName);
}
var view = Activator.CreateInstance(viewType) as FrameworkElement;
DialogWindow dialog = new DialogWindow();
dialog.Owner = Application.Current.MainWindow;
dialog.InnerContent = view;
MainWindow.Instance.shadowGrid.Visibility = Visibility.Visible;
view.Loaded += (x, y) =>
{
VM context = view.DataContext as VM;
if (context == null)
{
context = Activator.CreateInstance<VM>();
}
dialog.DataContext = context;
Action onCancelAction = null;
Action onAcceptAction = null;
onAcceptAction = new Action(() =>
{
dialog.Close();
onAccept(context);
context.Canceled -= onCancelAction;
context.Accepted -= onAcceptAction;
});
onCancelAction = new Action(() =>
{
dialog.Close();
if (onCancel != null)
{
onCancel();
}
context.Canceled -= onCancelAction;
context.Accepted -= onAcceptAction;
});
context.Accepted += onAcceptAction;
context.Canceled += onCancelAction;
context.OnShow();
};
dialog.ShowDialog();
MainWindow.Instance.shadowGrid.Visibility = Visibility.Hidden;
}
/// <summary>
/// Creates a new view by a naming convention of the specified view model type.
/// </summary>
/// <typeparam name="VM">The type of the view model.</typeparam>
/// <param name="onAccept">Accept button callback.</param>
public void ShowModalDialog<VM>(Action<VM> onAccept) where VM : DialogViewVM
{
ShowModalDialog<VM>(onAccept, null);
}
/// <summary>
/// Shows an error message box.
/// </summary>
/// <param name="message">The message.</param>
public void ShowError(string message)
{
ShowMessageBox(PackIconKind.AlertOctagon, Brushes.Red, message, false);
}
/// <summary>
/// Shows an information message box.
/// </summary>
/// <param name="message">The message.</param>
public void ShowInfo(string message)
{
ShowMessageBox(PackIconKind.CommentAlertOutline, Brushes.Black, message, false);
}
/// <summary>
/// Shows a question message box.
/// </summary>
/// <param name="message">The message.</param>
/// <returns></returns>
public bool ShowQuestion(string message)
{
return ShowMessageBox(PackIconKind.CommentQuestionOutline, Brushes.Black, message, true).Value;
}
/// <summary>
/// Shows warning message box.
/// </summary>
/// <param name="message">The message.</param>
public void ShowWarning(string message)
{
ShowMessageBox(PackIconKind.AlertOutline, Brushes.DarkOrange, message, false);
}
/// <summary>
/// Shows a question message box with an error icon.
/// </summary>
/// <param name="message">The message.</param>
/// <returns></returns>
public bool ShowErrorQuestion(string message)
{
return ShowMessageBox(PackIconKind.CommentAlertOutline, Brushes.DarkOrange, message, true).Value;
}
/// <summary>
/// Pushes the specified task item to the queue.
/// </summary>
/// <param name="taskItem">The task item.</param>
public void PushTaskItem(TaskItem taskItem)
{
InvokeUI(() =>
{
TaskItems.Add(taskItem);
CurrentTaskItem = taskItem;
});
}
/// <summary>
/// Create and push a new task item from the specified message.
/// </summary>
/// <param name="message">The message.</param>
/// <returns></returns>
public TaskItem PushTaskItem(string message)
{
TaskItem item = new TaskItem(this);
item.Message = message;
PushTaskItem(item);
return item;
}
/// <summary>
/// Removed the specified task item from the queue.
/// </summary>
/// <param name="taskItem">The task item.</param>
public void PopTaskItem(TaskItem taskItem)
{
Task.Delay(1000).ContinueWith((x) =>
{
InvokeUI(() =>
{
TaskItems.Remove(taskItem);
if (TaskItems.Count > 0)
{
CurrentTaskItem = TaskItems.Last();
}
RaisePropertyChanged(nameof(HasTaskItems));
});
});
}
/// <summary>
/// Pushes the specified bar item.
/// </summary>
/// <param name="barItem">The bar item.</param>
/// <returns></returns>
public BarItem PushBarItem(BarItem barItem)
{
BarItems.Add(barItem);
return barItem;
}
/// <summary>
/// Creates and push a new bar item from the specified framework element.
/// </summary>
/// <param name="element">The element.</param>
/// <returns></returns>
public BarItem PushBarItem(FrameworkElement element)
{
BarItem item = new BarItem(this);
item.Element = element;
PushBarItem(item);
return item;
}
/// <summary>
/// Removed the specified bar item.
/// </summary>
/// <param name="barItem">The bar item.</param>
public void PopBarItem(BarItem barItem)
{
BarItems.Remove(barItem);
}
/// <summary>
/// Shows a dialog with a text input field and returns the response.
/// </summary>
/// <param name="message">The message.</param>
/// <param name="hint">Text field hint.</param>
/// <param name="defaultResponse">Optional default response.</param>
/// <returns></returns>
public string ShowTextInput(string message, string hint, string defaultResponse = null)
{
MainWindow.Instance.shadowGrid.Visibility = Visibility.Visible;
TextInputBoxWindow dlg = new TextInputBoxWindow()
{
Owner = Application.Current.MainWindow,
Message = message,
IconKind = PackIconKind.Pencil,
IconColor = Brushes.DimGray,
Hint = hint,
Response = defaultResponse
};
var result = dlg.ShowDialog();
MainWindow.Instance.shadowGrid.Visibility = Visibility.Hidden;
return (result.Value ? dlg.Response : null);
}
}
}