SpectacleTransformer/MainForm.cs

145 lines
5.6 KiB
C#

using System;
using System.Windows.Forms;
namespace SpectacleTransformer {
public partial class MainForm : Form {
public static Language[] languages = Language.Load();
/// <summary>
/// Whether or not the specified instance URL is valid.
/// </summary>
private bool validInstance = false;
public MainForm() {
InitializeComponent();
}
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
private bool validateUri(string uriString) {
try {
Uri uri = new Uri(uriString, UriKind.Absolute);
return uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps;
} catch (UriFormatException) {
return false;
}
}
private void updateButtonStates() {
translateButton.Enabled = sourceLanguagePicker.SelectedItem != null
&& destinationLanguagePicker.SelectedItem != null
&& validInstance
&& sourceTextBox.Text.Length > 0;
}
private void MainForm_Load(object sender, EventArgs e) {
instanceUrlPicker.BeginUpdate();
foreach (string item in Properties.Settings.Default.KnownInstances) {
instanceUrlPicker.Items.Add(item);
}
if (instanceUrlPicker.Items.Contains(Properties.Settings.Default.LastSelectedInstance)) {
instanceUrlPicker.SelectedItem = Properties.Settings.Default.LastSelectedInstance;
validInstance = validateUri(instanceUrlPicker.SelectedItem.ToString());
updateButtonStates();
}
instanceUrlPicker.EndUpdate();
sourceLanguagePicker.BeginUpdate();
destinationLanguagePicker.BeginUpdate();
sourceLanguagePicker.Items.Clear();
destinationLanguagePicker.Items.Clear();
foreach (Language language in languages) {
if (language.SourceName != null) sourceLanguagePicker.Items.Add(language);
if (language.TargetName != null) destinationLanguagePicker.Items.Add(language);
}
sourceLanguagePicker.EndUpdate();
destinationLanguagePicker.EndUpdate();
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e) {
Properties.Settings.Default.Save();
}
private void instanceUrlPicker_TextChanged(object sender, EventArgs e) {
validInstance = validateUri(instanceUrlPicker.Text);
if (validInstance && instanceUrlPicker.SelectedItem != null)
Properties.Settings.Default.LastSelectedInstance = instanceUrlPicker.SelectedItem.ToString();
updateButtonStates();
}
private void sourceLanguagePicker_TextChanged(object sender, EventArgs e) {
updateButtonStates();
}
private void destinationLanguagePicker_TextChanged(object sender, EventArgs e) {
updateButtonStates();
}
private void sourceTextBox_TextChanged(object sender, EventArgs e) {
updateButtonStates();
}
private void clearButton_Click(object sender, EventArgs e) {
sourceTextBox.Clear();
destinationTextBox.Clear();
}
private void translateButton_Click(object sender, EventArgs e) {
mainTableLayoutPanel.Enabled = false;
// TODO: Use a list to allow registering various translation services
TranslationRequest tr;
Uri instanceUri = new Uri(instanceUrlPicker.Text);
if (GoogleTranslationRequest.MatchesInstance(instanceUri)) tr = new GoogleTranslationRequest(
instanceUri,
(Language)sourceLanguagePicker.SelectedItem,
(Language)destinationLanguagePicker.SelectedItem,
sourceTextBox.Text
);
else tr = new LingvaTranslationRequest(
instanceUri,
(Language)sourceLanguagePicker.SelectedItem,
(Language)destinationLanguagePicker.SelectedItem,
sourceTextBox.Text
);
translator.RunWorkerAsync(tr);
}
private void translator_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) {
try {
e.Result = ((TranslationRequest)e.Argument).Run();
} catch (Exception ex) {
MessageBox.Show(
String.Format(Properties.Resources.GenericTranslationError, ex.ToString()),
Properties.Resources.GenericTranslationErrorTitle,
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}
}
private void translator_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) {
mainTableLayoutPanel.Enabled = true;
// Null is returned when an error occurs
if (e.Result == null) return;
// Save an unknown host when the request was completed
if (!instanceUrlPicker.Items.Contains(instanceUrlPicker.Text)) {
instanceUrlPicker.Items.Add(instanceUrlPicker.Text);
instanceUrlPicker.SelectedItem = instanceUrlPicker.Text;
Properties.Settings.Default.KnownInstances.Add(instanceUrlPicker.Text);
}
destinationTextBox.Text = (string)e.Result;
}
}
}