using System;
using System.Windows;
using System.Windows.Forms;
using JD.Kernel.Classes;
using JD.Kernel.StaticHelpers;
using JD.LogService;
using JD.Threading.Dispatch;
using MessageBox = System.Windows.MessageBox;
namespace JD.MessageService
{
///
/// Default message service implementation that pops dialogs.
///
public class GuiMessageService : IMessageService, IDisposable
{
#region Variables
private static Window m_mainForm;
private TrayBalloon m_balloon;
#endregion
#region Constructor
public void Dispose()
{
DisposableHelper.SafeDispose(m_balloon);
}
#endregion
#region Properties
///
/// The main application form. Set this so that message boxes know their parent.
///
public static System.Windows.Window MainForm
{
get
{
return m_mainForm;
}
set
{
m_mainForm = value;
}
}
private TrayBalloon Balloon
{
get
{
Throw.InvalidOperationIf(m_balloon == null, "Message service is not initialized");
return m_balloon;
}
}
#endregion
#region Methods
///
/// Initializes the resources of the message service (should be called in the Main thread).
///
public void Initialize()
{
Throw.InvalidOperationIf(m_balloon != null, "Cannot initialize twice");
m_balloon = new TrayBalloon();
}
public void Show(LogCategory category, string message, string caption)
{
MessageBoxImage icon = GetMessageBoxIconFromCategory(category);
SafeThreadCall(delegate
{
MessageBox.Show(
message,
caption,
MessageBoxButton.OK,
icon,
MessageBoxResult.OK);
});
}
private static MessageBoxImage GetMessageBoxIconFromCategory(LogCategory category)
{
switch (category)
{
case LogCategory.Message:
return MessageBoxImage.Information;
case LogCategory.Warning:
return MessageBoxImage.Warning;
case LogCategory.Error:
return MessageBoxImage.Error;
default:
throw new NotImplementedException("Code path not implemented!");
}
}
public MessageBoxResult AskQuestion(string question, string caption, MessageBoxImage icon, MessageBoxButton buttons, MessageBoxResult defaultResult)
{
MessageBoxResult result = MessageBoxResult.Cancel;
SafeThreadCall(delegate
{
result = MessageBox.Show(question, caption, buttons, icon, defaultResult);
});
return result;
}
public MessageDialog.Button ShowMessageDialog(MessageDialog dialog)
{
MessageDialog.Button result = null;
SafeThreadCall(delegate
{
var parentWindow = (IWin32Window)MainForm;
result = TaskDialog.Show(parentWindow, dialog);
});
return result;
}
public string ShowInputBox(string question, string caption, string defaultValue, MessageService.ValidationPredicate validationPredicate)
{
string result = null;
SafeThreadCall(delegate
{
using (InputBox inputBox = new InputBox(question, caption, defaultValue))
{
string errorMessage = null;
do
{
inputBox.ShowDialog((IWin32Window)MainForm, errorMessage);
if (inputBox.Result == null || validationPredicate == null || (errorMessage = validationPredicate(inputBox.Result)) == null)
{
result = inputBox.Result;
break;
}
}
while (true);
}
});
return result;
}
public IBalloon ShowBalloon(TimeSpan timeout, string title, string text, ToolTipIcon icon, Action clickAction)
{
return Balloon.Show(timeout, title, text, icon, clickAction);
}
private static void SafeThreadCall(System.Action action)
{
GuiDispatcher.Current.Dispatch(action);
}
#endregion
}
}