added confirm dialog when switching or resetting language + switched to use databinding for comboboxes

git-svn-id: http://svn.code.sf.net/p/greenshot/code/trunk@1838 7dccd23d-a4a3-4e1f-8c07-b4c1b4018ab4
This commit is contained in:
JKlingen 2012-05-09 18:23:21 +00:00
commit 99ab77c10b
2 changed files with 64 additions and 23 deletions

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Window <Window
x:Class="GreenshotLanguageEditor.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="GreenshotLanguageEditor.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="800" Width="800"
@ -36,7 +36,10 @@
Name="language1ComboBox" Name="language1ComboBox"
SelectionChanged="languageComboBoxSelectionChanged" SelectionChanged="languageComboBoxSelectionChanged"
Tag="1" Tag="1"
Width="150"></ComboBox> Width="150"
ItemsSource="{Binding LanguageFiles}"
DisplayMemberPath="FileName"
SelectedItem="{Binding LanguageFile1, Mode=OneWay}"></ComboBox>
<Button <Button
Content="Save" Content="Save"
Click="saveButtonClicked" Click="saveButtonClicked"
@ -60,7 +63,10 @@
Name="language2ComboBox" Name="language2ComboBox"
SelectionChanged="languageComboBoxSelectionChanged" SelectionChanged="languageComboBoxSelectionChanged"
Tag="2" Tag="2"
Width="150"></ComboBox> Width="150"
ItemsSource="{Binding LanguageFiles}"
DisplayMemberPath="FileName"
SelectedItem="{Binding LanguageFile2, Mode=OneWay}"></ComboBox>
<Button <Button
Content="Save" Content="Save"
Click="saveButtonClicked" Click="saveButtonClicked"
@ -78,7 +84,8 @@
ItemsSource="{Binding View}" ItemsSource="{Binding View}"
AutoGenerateColumns="False" AutoGenerateColumns="False"
IsReadOnly="False" IsReadOnly="False"
IsSynchronizedWithCurrentItem="True"> IsSynchronizedWithCurrentItem="True"
CellEditEnding="cellEdited">
<DataGrid.RowStyle> <DataGrid.RowStyle>
<Style <Style
TargetType="DataGridRow"> TargetType="DataGridRow">

View file

@ -38,7 +38,21 @@ namespace GreenshotLanguageEditor {
public partial class Window1 : Window { public partial class Window1 : Window {
IDictionary<string, LanguageEntry> languageResources = new SortedDictionary<string, LanguageEntry>(); IDictionary<string, LanguageEntry> languageResources = new SortedDictionary<string, LanguageEntry>();
IList<LanguageFile> languageFiles = new List<LanguageFile>(); public IList<LanguageFile> LanguageFiles {
get;
set;
}
// maybe refactor this encapsulating column related info
bool unsavedChangesInLanguage1 = false;
bool unsavedChangesInLanguage2 = false;
public LanguageFile LanguageFile1 {
get;
set;
}
public LanguageFile LanguageFile2 {
get;
set;
}
public ICollectionView View { public ICollectionView View {
get; get;
@ -71,28 +85,24 @@ namespace GreenshotLanguageEditor {
InitializeComponent(); InitializeComponent();
DataContext = this; DataContext = this;
this.Activate(); this.Activate();
this.language1ComboBox.ItemsSource = languageFiles;
this.language1ComboBox.DisplayMemberPath = "FileName";
this.language2ComboBox.ItemsSource = languageFiles;
this.language2ComboBox.DisplayMemberPath = "FileName";
View = CollectionViewSource.GetDefaultView(LoadResources(languagePath)); View = CollectionViewSource.GetDefaultView(LoadResources(languagePath));
} }
private IList<LanguageEntry> LoadResources(string languagePath) { private IList<LanguageEntry> LoadResources(string languagePath) {
LanguageFiles = new List<LanguageFile>();
foreach (LanguageFile languageFile in GreenshotLanguage.GetLanguageFiles(languagePath, "language*.xml")) { foreach (LanguageFile languageFile in GreenshotLanguage.GetLanguageFiles(languagePath, "language*.xml")) {
languageFiles.Add(languageFile); LanguageFiles.Add(languageFile);
if ("en-US".Equals(languageFile.IETF)) { if ("en-US".Equals(languageFile.IETF)) {
// we should always start with en-US, so the grid is initialized with the probably most-complete language file as benchmark for translations // we should always start with en-US, so the grid is initialized with the probably most-complete language file as benchmark for translations
this.language1ComboBox.SelectedItem = languageFile; LanguageFile1 = languageFile;
} else if(this.language2ComboBox.SelectedItem == null) { PopulateColumn(languageFile, 1);
this.language2ComboBox.SelectedItem = languageFile; } else if(LanguageFile2 == null) {
LanguageFile2 = languageFile;
PopulateColumn(languageFile, 2);
} }
} }
if(this.language1ComboBox.SelectedItem == null) { if(LanguageFile1 == null) {
MessageBox.Show("language-en-US.xml does not exist in the location selected. It is needed as reference for the translation."); MessageBox.Show("language-en-US.xml does not exist in the location selected. It is needed as reference for the translation.");
this.Close(); this.Close();
} }
@ -108,14 +118,16 @@ namespace GreenshotLanguageEditor {
else if (columnIndex == 2) entry.Entry2 = resources[key]; else if (columnIndex == 2) entry.Entry2 = resources[key];
else throw new ArgumentOutOfRangeException("Argument columnIndex must be either 1 or 2"); else throw new ArgumentOutOfRangeException("Argument columnIndex must be either 1 or 2");
} }
if(columnIndex == 1) unsavedChangesInLanguage1 = false;
if(columnIndex == 2) unsavedChangesInLanguage2 = false;
} }
private void ClearColumn(int columnIndex) { private void ClearColumn(int columnIndex) {
// we do not throw out LanguageEntries that do not exist in selected language, // we do not throw out LanguageEntries that do not exist in selected language,
// so that en-US (loaded at startup) is always the benchmark, even when other languages are displayed // so that en-US (loaded at startup) is always the benchmark, even when other languages are displayed
foreach(LanguageEntry e in languageResources.Values) { foreach(LanguageEntry e in languageResources.Values) {
if (columnIndex == 1) e.Entry1 = ""; if (columnIndex == 1) e.Entry1 = null;
else if (columnIndex == 2) e.Entry2 = ""; else if (columnIndex == 2) e.Entry2 = null;
else throw new ArgumentOutOfRangeException("Argument columnIndex must be either 1 or 2"); else throw new ArgumentOutOfRangeException("Argument columnIndex must be either 1 or 2");
} }
} }
@ -149,18 +161,35 @@ namespace GreenshotLanguageEditor {
} }
private void languageComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e) { private void languageComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e) {
// TODO let user confirm if there are unsaved changes
int targetColumn = GetTargetColumn((Control)sender); int targetColumn = GetTargetColumn((Control)sender);
LanguageFile file = (LanguageFile)((ComboBox)sender).SelectedItem; LanguageFile file = (LanguageFile)((ComboBox)sender).SelectedItem;
if((targetColumn == 1 && file.Equals(LanguageFile1)) || (targetColumn == 2 && file.Equals(LanguageFile2))) {
// nothing changed
return;
}
if((targetColumn == 1 && unsavedChangesInLanguage1) || (targetColumn == 2 && unsavedChangesInLanguage2)) {
MessageBoxResult res = MessageBox.Show("Do you really want to switch language? Unsaved changes will be lost.", "Confirm language switch", MessageBoxButton.OKCancel, MessageBoxImage.Warning,MessageBoxResult.Cancel,MessageBoxOptions.None);
if(res != MessageBoxResult.OK) {
// cancelled by user
((ComboBox)sender).SelectedItem = (targetColumn == 1) ? LanguageFile1 : LanguageFile2;
return;
}
}
if(targetColumn == 1) LanguageFile1 = file;
else if(targetColumn == 2) LanguageFile2 = file;
PopulateColumn(file, targetColumn); PopulateColumn(file, targetColumn);
} }
private void cancelButtonClicked(object sender, RoutedEventArgs e) { private void cancelButtonClicked(object sender, RoutedEventArgs e) {
// TODO let user confirm if there are unsaved changes
int targetColumn = GetTargetColumn((Control)sender); int targetColumn = GetTargetColumn((Control)sender);
if((targetColumn == 1 && unsavedChangesInLanguage1) || (targetColumn == 2 && unsavedChangesInLanguage2)) {
MessageBoxResult res = MessageBox.Show("Do you really want to reset this column? Unsaved changes will be lost.", "Confirm language reset", MessageBoxButton.OKCancel, MessageBoxImage.Warning,MessageBoxResult.Cancel,MessageBoxOptions.None);
if(res == MessageBoxResult.OK) {
LanguageFile file = (LanguageFile)(targetColumn == 1 ? language1ComboBox.SelectedItem : language2ComboBox.SelectedItem); LanguageFile file = (LanguageFile)(targetColumn == 1 ? language1ComboBox.SelectedItem : language2ComboBox.SelectedItem);
PopulateColumn(file, targetColumn); PopulateColumn(file, targetColumn);
} }
}
}
private int GetTargetColumn(Control control) { private int GetTargetColumn(Control control) {
object tag = control.Tag; object tag = control.Tag;
@ -171,6 +200,11 @@ namespace GreenshotLanguageEditor {
} }
} }
private void cellEdited(object sender, DataGridCellEditEndingEventArgs e) {
if(e.Column.DisplayIndex == 1) unsavedChangesInLanguage1 = true;
else if(e.Column.DisplayIndex == 2) unsavedChangesInLanguage2 = true;
}
public void CreateXML(string savePath, int targetColumn) { public void CreateXML(string savePath, int targetColumn) {
ICollectionView view = (ICollectionView)LanguageGrid.ItemsSource; ICollectionView view = (ICollectionView)LanguageGrid.ItemsSource;