From 3e371d5d0330fc257f062705836a34f4f4977df3 Mon Sep 17 00:00:00 2001 From: JKlingen Date: Thu, 17 May 2012 09:54:51 +0000 Subject: [PATCH] added possibility to edit language properties and to create new language files. also some cosmetics, e.g. icons git-svn-id: http://svn.code.sf.net/p/greenshot/code/trunk@1859 7dccd23d-a4a3-4e1f-8c07-b4c1b4018ab4 --- GreenshotLanguageEditor/App.xaml | 2 +- ...{Window1.xaml => EntriesEditorWindow.xaml} | 378 ++++++---- ...w1.xaml.cs => EntriesEditorWindow.xaml.cs} | 654 +++++++++--------- .../GreenshotLanguageEditor.csproj | 21 +- GreenshotLanguageEditor/Language.cs | 14 +- GreenshotLanguageEditor/MetaEditorWindow.xaml | 102 +++ .../MetaEditorWindow.xaml.cs | 65 ++ GreenshotLanguageEditor/icons/new.png | Bin 0 -> 269 bytes GreenshotLanguageEditor/icons/property.png | Bin 0 -> 769 bytes 9 files changed, 770 insertions(+), 466 deletions(-) rename GreenshotLanguageEditor/{Window1.xaml => EntriesEditorWindow.xaml} (59%) rename GreenshotLanguageEditor/{Window1.xaml.cs => EntriesEditorWindow.xaml.cs} (71%) create mode 100644 GreenshotLanguageEditor/MetaEditorWindow.xaml create mode 100644 GreenshotLanguageEditor/MetaEditorWindow.xaml.cs create mode 100644 GreenshotLanguageEditor/icons/new.png create mode 100644 GreenshotLanguageEditor/icons/property.png diff --git a/GreenshotLanguageEditor/App.xaml b/GreenshotLanguageEditor/App.xaml index f0730339c..e31e8dc1d 100644 --- a/GreenshotLanguageEditor/App.xaml +++ b/GreenshotLanguageEditor/App.xaml @@ -1,7 +1,7 @@  + StartupUri="EntriesEditorWindow.xaml"> diff --git a/GreenshotLanguageEditor/Window1.xaml b/GreenshotLanguageEditor/EntriesEditorWindow.xaml similarity index 59% rename from GreenshotLanguageEditor/Window1.xaml rename to GreenshotLanguageEditor/EntriesEditorWindow.xaml index 2744a6dd5..d8b2c167b 100644 --- a/GreenshotLanguageEditor/Window1.xaml +++ b/GreenshotLanguageEditor/EntriesEditorWindow.xaml @@ -1,151 +1,229 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/GreenshotLanguageEditor/Window1.xaml.cs b/GreenshotLanguageEditor/EntriesEditorWindow.xaml.cs similarity index 71% rename from GreenshotLanguageEditor/Window1.xaml.cs rename to GreenshotLanguageEditor/EntriesEditorWindow.xaml.cs index 311193fa1..afb32596d 100644 --- a/GreenshotLanguageEditor/Window1.xaml.cs +++ b/GreenshotLanguageEditor/EntriesEditorWindow.xaml.cs @@ -1,309 +1,347 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: http://getgreenshot.org/ - * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.ComponentModel; -using System.Xml; - -namespace GreenshotLanguageEditor { - /// - /// Interaction logic for Window1.xaml - /// - public partial class Window1 : Window { - - IDictionary languageResources = new SortedDictionary(); - public IList 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 { - get; - set; - } - - // TODO user should be able to create a new translation file using this app - // TODO possibility to edit language file meta data, such as version, languagegroup, description, etc. - - public Window1() { - - // TODO remember last selected location - - /*var dialog = new System.Windows.Forms.FolderBrowserDialog(); - dialog.ShowNewFolderButton = false; - System.Windows.Forms.DialogResult result = dialog.ShowDialog(); - string languagePath; - - - if (result == System.Windows.Forms.DialogResult.OK) { - languagePath = dialog.SelectedPath; - } else { - this.Close(); - return; - }*/ - - - string languagePath = @"C:\Users\jens\Documents\Sharpdevelop Projects\Greenshot\trunk\Greenshot\Languages\"; - - InitializeComponent(); - DataContext = this; - this.Activate(); - View = CollectionViewSource.GetDefaultView(LoadResources(languagePath)); - } - - private IList LoadResources(string languagePath) { - LanguageFiles = new List(); - foreach (LanguageFile languageFile in GreenshotLanguage.GetLanguageFiles(languagePath, "language*.xml")) { - LanguageFiles.Add(languageFile); - - 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 - LanguageFile1 = languageFile; - PopulateColumn(languageFile, 1); - } else if(LanguageFile2 == null) { - LanguageFile2 = languageFile; - PopulateColumn(languageFile, 2); - } - } - if(LanguageFile1 == null) { - MessageBox.Show("language-en-US.xml does not exist in the location selected. It is needed as reference for the translation."); - this.Close(); - } - return new List(languageResources.Values); - } - - private void PopulateColumn(LanguageFile languageFile, int columnIndex) { - ClearColumn(columnIndex); - IDictionary resources = GreenshotLanguage.ReadLanguageFile(languageFile); - foreach(string key in resources.Keys) { - LanguageEntry entry = GetOrCreateLanguageEntry(key); - if(columnIndex == 1) entry.Entry1 = resources[key]; - else if (columnIndex == 2) entry.Entry2 = resources[key]; - 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) { - // 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 - foreach(LanguageEntry e in languageResources.Values) { - if (columnIndex == 1) e.Entry1 = null; - else if (columnIndex == 2) e.Entry2 = null; - else throw new ArgumentOutOfRangeException("Argument columnIndex must be either 1 or 2"); - } - } - - private LanguageEntry GetOrCreateLanguageEntry(string key) { - LanguageEntry entry; - if (languageResources.ContainsKey(key)) { - entry = languageResources[key]; - } else { - entry = new LanguageEntry(); - entry.Key = key; - languageResources.Add(key, entry); - } - return entry; - } - - private void saveButtonClicked(object sender, RoutedEventArgs e) { - int targetColumn = GetTargetColumn((Control)sender); - LanguageFile editedFile = (LanguageFile) (targetColumn == 1 ? language1ComboBox.SelectedItem : language2ComboBox.SelectedItem); - - var dialog = new System.Windows.Forms.SaveFileDialog(); - dialog.AutoUpgradeEnabled = true; - dialog.DefaultExt = ".xml"; - dialog.InitialDirectory = Path.GetDirectoryName(editedFile.FilePath); - dialog.FileName = editedFile.FileName; - dialog.CheckFileExists = true; - System.Windows.Forms.DialogResult result = dialog.ShowDialog(); - if (result == System.Windows.Forms.DialogResult.OK) { - CreateXML(dialog.FileName, targetColumn); - } - } - - private void languageComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e) { - int targetColumn = GetTargetColumn((Control)sender); - 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); - } - - private void cancelButtonClicked(object sender, RoutedEventArgs e) { - 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); - PopulateColumn(file, targetColumn); - } - } - } - - private int GetTargetColumn(Control control) { - object tag = control.Tag; - if(tag == null && !tag.Equals("1") && !tag.Equals("2")) { - throw new ApplicationException("Please use the control's Tag property to indicate the column to interact with (1 or 2)."); - } else { - return tag.Equals("1") ? 1 : 2; - } - } - - 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) { - - ICollectionView view = (ICollectionView)LanguageGrid.ItemsSource; - IList entries = (IList)view.SourceCollection; - - using (XmlTextWriter xmlWriter = new XmlTextWriter(savePath, Encoding.UTF8)) { - xmlWriter.Formatting = Formatting.Indented; - xmlWriter.Indentation = 1; - xmlWriter.IndentChar = '\t'; - xmlWriter.WriteStartDocument(); - xmlWriter.WriteStartElement("language"); - xmlWriter.WriteAttributeString("description", "testdescription"); - xmlWriter.WriteAttributeString("ietf", "testietf"); - xmlWriter.WriteAttributeString("version", "testversion"); - xmlWriter.WriteAttributeString("languagegroup", "testlanguagegroup"); - xmlWriter.WriteStartElement("resources"); - foreach(LanguageEntry entry in entries) { - xmlWriter.WriteStartElement("resource"); - xmlWriter.WriteAttributeString("name", entry.Key); - if(targetColumn == 1) xmlWriter.WriteString(entry.Entry1); - else if(targetColumn == 2 ) xmlWriter.WriteString(entry.Entry2); - else throw new ArgumentOutOfRangeException("Argument columnIndex must be either 1 or 2"); - xmlWriter.WriteEndElement(); - } - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndDocument(); - } - } - - } - - public class LanguageEntry : IEditableObject, INotifyPropertyChanged { - private string key; - private string entry1; - private string entry2; - public event PropertyChangedEventHandler PropertyChanged; - - private void NotifyPropertyChanged(String info) { - if (PropertyChanged != null) { - PropertyChanged(this, new PropertyChangedEventArgs(info)); - } - } - - public Brush Background { - get { - if (String.IsNullOrEmpty(Entry1)) { - return Brushes.Red; - } - if (String.IsNullOrEmpty(Entry2)) { - return Brushes.Red; - } - return Brushes.White; - } - } - public string Key { - get { - return key; - } - set { - key = value; - NotifyPropertyChanged("Key"); - } - } - - public string Entry1 { - get { - return entry1; - } - set { - entry1 = value; - NotifyPropertyChanged("Entry1"); - NotifyPropertyChanged("Background"); - - } - } - - public string Entry2 { - get { - return entry2; - } - set { - entry2 = value; - NotifyPropertyChanged("Entry2"); - NotifyPropertyChanged("Background"); - } - } - - public void BeginEdit() { - - } - - public void EndEdit() { - - } - - public void CancelEdit() { - - } - } - +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Text.RegularExpressions; +using System.Xml; + +namespace GreenshotLanguageEditor { + /// + /// Interaction logic for EntriesEditorWindow.xaml + /// + public partial class EntriesEditorWindow : Window, INotifyPropertyChanged { + + private string languagePath; + IDictionary languageResources = new SortedDictionary(); + + IList languageFiles; + public IList LanguageFiles { + get {return languageFiles;} + set {languageFiles = value; NotifyPropertyChanged("languageFiles");} + } + public event PropertyChangedEventHandler PropertyChanged; + + private void NotifyPropertyChanged(String info) { + if (PropertyChanged != null) { + PropertyChanged(this, new PropertyChangedEventArgs(info)); + } + } + + // 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 { + get; + set; + } + + public EntriesEditorWindow() { + + /*var dialog = new System.Windows.Forms.FolderBrowserDialog(); + dialog.ShowNewFolderButton = false; + System.Windows.Forms.DialogResult result = dialog.ShowDialog(); + string languagePath; + + + if (result == System.Windows.Forms.DialogResult.OK) { + languagePath = dialog.SelectedPath; + } else { + this.Close(); + return; + }*/ + + languagePath = @"C:\Users\jens\Documents\Sharpdevelop Projects\Greenshot\trunk\Greenshot\Languages\"; + + InitializeComponent(); + DataContext = this; + this.Activate(); + + View = CollectionViewSource.GetDefaultView(LoadResources(languagePath)); + } + + private IList LoadResources(string languagePath) { + LanguageFiles = new BindingList(); + foreach (LanguageFile languageFile in GreenshotLanguage.GetLanguageFiles(languagePath, "language*.xml")) { + LanguageFiles.Add(languageFile); + + 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 + LanguageFile1 = languageFile; + PopulateColumn(languageFile, 1); + } else if(LanguageFile2 == null) { + LanguageFile2 = languageFile; + PopulateColumn(languageFile, 2); + } + } + if(LanguageFile1 == null) { + MessageBox.Show("language-en-US.xml does not exist in the location selected. It is needed as reference for the translation."); + this.Close(); + } + return new List(languageResources.Values); + } + + private void PopulateColumn(LanguageFile languageFile, int columnIndex) { + ClearColumn(columnIndex); + IDictionary resources = GreenshotLanguage.ReadLanguageFile(languageFile); + foreach(string key in resources.Keys) { + LanguageEntry entry = GetOrCreateLanguageEntry(key); + if(columnIndex == 1) entry.Entry1 = resources[key]; + else if (columnIndex == 2) entry.Entry2 = resources[key]; + 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) { + // 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 + foreach(LanguageEntry e in languageResources.Values) { + if (columnIndex == 1) e.Entry1 = null; + else if (columnIndex == 2) e.Entry2 = null; + else throw new ArgumentOutOfRangeException("Argument columnIndex must be either 1 or 2"); + } + } + + private LanguageEntry GetOrCreateLanguageEntry(string key) { + LanguageEntry entry; + if (languageResources.ContainsKey(key)) { + entry = languageResources[key]; + } else { + entry = new LanguageEntry(); + entry.Key = key; + languageResources.Add(key, entry); + } + return entry; + } + + private void saveButtonClicked(object sender, RoutedEventArgs e) { + int targetColumn = GetTargetColumn((Control)sender); + LanguageFile editedFile = (LanguageFile) (targetColumn == 1 ? language1ComboBox.SelectedItem : language2ComboBox.SelectedItem); + + CreateXML(editedFile.FilePath, targetColumn); + } + + private void languageComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e) { + int targetColumn = GetTargetColumn((Control)sender); + 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); + } + + private void cancelButtonClicked(object sender, RoutedEventArgs e) { + 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); + PopulateColumn(file, targetColumn); + } + } + } + + private void newButtonClicked(object sender, RoutedEventArgs e) { + int targetColumn = GetTargetColumn((Control)sender); + if((targetColumn == 1 && unsavedChangesInLanguage1) || (targetColumn == 2 && unsavedChangesInLanguage2)) { + MessageBoxResult res = MessageBox.Show("Do you really want to discard this column? Unsaved changes will be lost.", "Confirm new language file creation", MessageBoxButton.OKCancel, MessageBoxImage.Warning,MessageBoxResult.Cancel,MessageBoxOptions.None); + if(res != MessageBoxResult.OK) { + return; + } + } + LanguageFile newLang = new LanguageFile(); + newLang.FilePath = languagePath; + new MetaEditorWindow(newLang).ShowDialog(); + if(newLang.FileName != null && newLang.FileName.Length > 0) { + ClearColumn(targetColumn); + CreateXML(newLang.FilePath,targetColumn); + LanguageFiles.Add(newLang); + + LanguageFiles = LanguageFiles.OrderBy(f => f.FileName).ToList(); + if(targetColumn == 1) { + LanguageFile1 = newLang; + language1ComboBox.SelectedItem = newLang; + } + else { + LanguageFile2 = newLang; + language2ComboBox.SelectedItem = newLang; + } + PopulateColumn(newLang, targetColumn); + } + } + + private void metaButtonClicked(object sender, RoutedEventArgs e) { + int targetColumn = GetTargetColumn((Control)sender); + new MetaEditorWindow(targetColumn == 1 ? LanguageFile1 : LanguageFile2).ShowDialog(); + } + + private int GetTargetColumn(Control control) { + object tag = control.Tag; + if(tag == null && !tag.Equals("1") && !tag.Equals("2")) { + throw new ApplicationException("Please use the control's Tag property to indicate the column to interact with (1 or 2)."); + } else { + return tag.Equals("1") ? 1 : 2; + } + } + + 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) { + + LanguageFile langfile = targetColumn == 1 ? LanguageFile1 : LanguageFile2; + + ICollectionView view = (ICollectionView)LanguageGrid.ItemsSource; + IList entries = (IList)view.SourceCollection; + + using (XmlTextWriter xmlWriter = new XmlTextWriter(savePath, Encoding.UTF8)) { + xmlWriter.Formatting = Formatting.Indented; + xmlWriter.Indentation = 1; + xmlWriter.IndentChar = '\t'; + xmlWriter.WriteStartDocument(); + xmlWriter.WriteStartElement("language"); + xmlWriter.WriteAttributeString("description", langfile.Description); + xmlWriter.WriteAttributeString("ietf", langfile.IETF); + xmlWriter.WriteAttributeString("version", langfile.Version); + xmlWriter.WriteAttributeString("languagegroup", langfile.Languagegroup); + xmlWriter.WriteStartElement("resources"); + foreach(LanguageEntry entry in entries) { + xmlWriter.WriteStartElement("resource"); + xmlWriter.WriteAttributeString("name", entry.Key); + if(targetColumn == 1) xmlWriter.WriteString(entry.Entry1); + else if(targetColumn == 2 ) xmlWriter.WriteString(entry.Entry2); + else throw new ArgumentOutOfRangeException("Argument columnIndex must be either 1 or 2"); + xmlWriter.WriteEndElement(); + } + xmlWriter.WriteEndElement(); + xmlWriter.WriteEndElement(); + xmlWriter.WriteEndDocument(); + } + } + + + + } + + public class LanguageEntry : IEditableObject, INotifyPropertyChanged { + private string key; + private string entry1; + private string entry2; + public event PropertyChangedEventHandler PropertyChanged; + + private void NotifyPropertyChanged(String info) { + if (PropertyChanged != null) { + PropertyChanged(this, new PropertyChangedEventArgs(info)); + } + } + + public Brush Background { + get { + if (String.IsNullOrEmpty(Entry1)) { + return Brushes.Red; + } + if (String.IsNullOrEmpty(Entry2)) { + return Brushes.Red; + } + return Brushes.White; + } + } + public string Key { + get { + return key; + } + set { + key = value; + NotifyPropertyChanged("Key"); + } + } + + public string Entry1 { + get { + return entry1; + } + set { + entry1 = value; + NotifyPropertyChanged("Entry1"); + NotifyPropertyChanged("Background"); + + } + } + + public string Entry2 { + get { + return entry2; + } + set { + entry2 = value; + NotifyPropertyChanged("Entry2"); + NotifyPropertyChanged("Background"); + } + } + + public void BeginEdit() { + + } + + public void EndEdit() { + + } + + public void CancelEdit() { + + } + } + } \ No newline at end of file diff --git a/GreenshotLanguageEditor/GreenshotLanguageEditor.csproj b/GreenshotLanguageEditor/GreenshotLanguageEditor.csproj index 06d52c891..8a39ac508 100644 --- a/GreenshotLanguageEditor/GreenshotLanguageEditor.csproj +++ b/GreenshotLanguageEditor/GreenshotLanguageEditor.csproj @@ -78,23 +78,36 @@ App.xaml + + MetaEditorWindow.xaml + Code + - + Code - Window1.xaml + EntriesEditorWindow.xaml - + + - + + Always + Always icon-save + + Always + + + Always + diff --git a/GreenshotLanguageEditor/Language.cs b/GreenshotLanguageEditor/Language.cs index 7cb6848e7..3884f038e 100644 --- a/GreenshotLanguageEditor/Language.cs +++ b/GreenshotLanguageEditor/Language.cs @@ -27,11 +27,19 @@ using System.Xml.Linq; namespace GreenshotLanguageEditor { public class LanguageFile { public string FilePath { - get; - set; + get {return Path.Combine(FileDir,FileName);} + set { + FileDir = Path.GetDirectoryName(value); + FileName = Path.GetFileName(value); + } } + public string FileDir { + get; + set; + } public string FileName { - get {return Path.GetFileName(FilePath);} + get; + set; } public string IETF { get; diff --git a/GreenshotLanguageEditor/MetaEditorWindow.xaml b/GreenshotLanguageEditor/MetaEditorWindow.xaml new file mode 100644 index 000000000..29dc9de23 --- /dev/null +++ b/GreenshotLanguageEditor/MetaEditorWindow.xaml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/GreenshotLanguageEditor/MetaEditorWindow.xaml.cs b/GreenshotLanguageEditor/MetaEditorWindow.xaml.cs new file mode 100644 index 000000000..b7ef99627 --- /dev/null +++ b/GreenshotLanguageEditor/MetaEditorWindow.xaml.cs @@ -0,0 +1,65 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: http://getgreenshot.org/ + * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/greenshot/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +using System; +using System.ComponentModel; +using System.Collections.Generic; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Text.RegularExpressions; + +namespace GreenshotLanguageEditor +{ + /// + /// Interaction logic for LanguageMetaEditor.xaml + /// + public partial class MetaEditorWindow : Window { + + private static Regex FILENAME_PATTERN = new Regex(@"[a-z]+\-[a-z]{2}\-[A-Z]{2}.xml"); + private LanguageFile langFile = new LanguageFile(); + + + public LanguageFile LangFile { + get {return langFile;} + set {langFile = value;} + } + public MetaEditorWindow(LanguageFile langFile) { + InitializeComponent(); + this.LangFile = langFile; + this.Closing += new System.ComponentModel.CancelEventHandler(OnClosing); + } + + void OnClosing(object sender, System.ComponentModel.CancelEventArgs e) { + if(langFile.FileName != null && langFile.FileName.Length != 0 && !FILENAME_PATTERN.IsMatch(langFile.FileName)) { + MessageBox.Show("The filename is not valid, please use a file name like language-en-US.xml","Filename not valid", MessageBoxButton.OK, MessageBoxImage.Stop); + e.Cancel = true; + } + } + + void button1_Click(object sender, RoutedEventArgs e) { + this.Close(); + } + } +} \ No newline at end of file diff --git a/GreenshotLanguageEditor/icons/new.png b/GreenshotLanguageEditor/icons/new.png new file mode 100644 index 0000000000000000000000000000000000000000..6eb6b2f73173f9dd2ddb3bb55b14a9cc91cb1926 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X)_b}*hE&{2`t$$4J+o>W(!pOU7|8bL z|L5oBd;9vVn1!e7GIy|jTzF6M6oZ@Evijceb$3#Jd`ja3izYfwVdTrdU$^G@lRtMW zK0k|Q6X1Pxm}ydijzi<)&FS$Db?fT?&s)ei{r|ypvc9LLNHYi|FjRRut$Ds?+diPv O89ZJ6T-G@yGywpYk87*| literal 0 HcmV?d00001 diff --git a/GreenshotLanguageEditor/icons/property.png b/GreenshotLanguageEditor/icons/property.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e549e453e63b384c3763e2e21899541fa79b85 GIT binary patch literal 769 zcmV+c1OEJpP)w84g?ZOycSa* z{IUnlW{IXP-tI@2zlFnyuC3ujeLd7<5|QO)2%-p+$pn+xjJJ0#rRh3E!R2xp0x|sn zRx}6Fv@O%pToz* zkF9B57)nlN)A1xgn81?&cs<9E$$Oy`qsHUp=r}yuo^V4IW1s<<>P1Dlj@wjVY zVF9!Ld#I>(!}oj;vNa12AKXV>Lj!_=0E$aXAq9gN4Nh@)2gk>@6#bm4;jzd}(Y#)- z;lsR5hHsz`HD|BDS<{ZNG=$+Nx6s%l)3#UP%d%y3K&=D8Op?s)>VY5g;}$Z4}{d* zX0stDC&%!BIJCF1vGJ>dYt7$5*L6CbzdfBQ6xn+q&gSMO=H})gvL-Td>Rtjk4+5PXPu1o6JfPd&5Hh00000NkvXXu0mjfF(+j6 literal 0 HcmV?d00001