* Updated DisplaySaveDialog
* Fixed a bug in SaveContactsHandler, when an exception was thrown when canceling file saving
* The window title displays "New file" instead of empty when creating a new file
* Commented out the code that saves a website with the "work" type (the program does not work with this type of website)
* Explicitly specified data types for some variables
* Minor code formatting

Signed-off-by: Lev Rusanov <30170278+JDM170@users.noreply.github.com>
This commit is contained in:
2025-06-13 22:29:16 +07:00
parent 9c66157599
commit a60ae3c5a2
6 changed files with 55 additions and 60 deletions

View File

@@ -8,6 +8,7 @@ namespace vCardEditor
{ {
private readonly LocalizationFile _localization; private readonly LocalizationFile _localization;
private string _currentLanguage; private string _currentLanguage;
public JsonLocalizationProvider(LocalizationFile localization, string defaultLanguage = "en") public JsonLocalizationProvider(LocalizationFile localization, string defaultLanguage = "en")
{ {
_localization = localization; _localization = localization;
@@ -20,21 +21,19 @@ namespace vCardEditor
_currentLanguage = langCode; _currentLanguage = langCode;
} }
public string this[string key] public string this[string key]
{ {
get get
{ {
if (_localization.languages.TryGetValue(_currentLanguage, out var lang)) if (_localization.languages.TryGetValue(_currentLanguage, out LanguageData lang))
{ {
if (lang.messages.TryGetValue(key, out var value)) if (lang.messages.TryGetValue(key, out string value))
return value; return value;
} }
if (_localization.languages.TryGetValue("en", out var fallbackLang)) if (_localization.languages.TryGetValue("en", out LanguageData fallbackLang))
{ {
if (fallbackLang.messages.TryGetValue(key, out var fallbackMsg)) if (fallbackLang.messages.TryGetValue(key, out string fallbackMsg))
return fallbackMsg; return fallbackMsg;
} }
@@ -42,9 +41,8 @@ namespace vCardEditor
} }
} }
public IReadOnlyDictionary<string, string> CurrentMessages => public IReadOnlyDictionary<string, string> CurrentMessages =>
_localization.languages.TryGetValue(_currentLanguage, out var lang) _localization.languages.TryGetValue(_currentLanguage, out LanguageData lang)
? lang.messages ? lang.messages
: new Dictionary<string, string>(); : new Dictionary<string, string>();

View File

@@ -23,7 +23,6 @@ namespace VCFEditor.Presenter
_repository = repository; _repository = repository;
_localization = localization; _localization = localization;
_view.LoadForm += LoadFormHandler; _view.LoadForm += LoadFormHandler;
_view.AddContact += AddContactHandler; _view.AddContact += AddContactHandler;
_view.NewFileOpened += OpenNewFileHandler; _view.NewFileOpened += OpenNewFileHandler;
@@ -321,11 +320,9 @@ namespace VCFEditor.Presenter
private void SaveContactsHandler(object sender, EventArgs e) private void SaveContactsHandler(object sender, EventArgs e)
{ {
string filename; string filename = _repository.fileName ?? _view.DisplaySaveDialog();
if (!string.IsNullOrEmpty(_repository.fileName)) if (string.IsNullOrWhiteSpace(filename))
filename = _repository.fileName; return;
else
filename = _view.DisplaySaveDialog("");
_repository.SaveContactsToFile(filename); _repository.SaveContactsToFile(filename);
} }

View File

@@ -54,7 +54,7 @@ namespace VCFEditor.Repository
if (filePaths.Count() == 0) if (filePaths.Count() == 0)
return false; return false;
foreach (var item in filePaths) foreach (string item in filePaths)
{ {
var result = LoadContactFromFile(item); var result = LoadContactFromFile(item);
Contacts.AddRange(result); Contacts.AddRange(result);
@@ -117,9 +117,7 @@ namespace VCFEditor.Repository
public void AddEmptyContact() public void AddEmptyContact()
{ {
Contact contact = new Contact(); Contacts.Add(new Contact() { isDirty = true });
contact.isDirty = true;
Contacts.Add(contact);
} }
public void SaveContactsToFile(string fileName) public void SaveContactsToFile(string fileName)
@@ -137,7 +135,7 @@ namespace VCFEditor.Repository
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
foreach (var entry in Contacts) foreach (Contact entry in Contacts)
{ {
//Do not save the deleted ones! //Do not save the deleted ones!
if (!entry.isDeleted) if (!entry.isDeleted)
@@ -221,24 +219,23 @@ namespace VCFEditor.Repository
private void SaveExtraPhones(vCard newCard, vCard card) private void SaveExtraPhones(vCard newCard, vCard card)
{ {
card.Phones.Clear(); card.Phones.Clear();
foreach (var item in newCard.Phones) foreach (vCardPhone item in newCard.Phones)
card.Phones.Add(new vCardPhone(item.FullNumber, item.PhoneType)); card.Phones.Add(new vCardPhone(item.FullNumber, item.PhoneType));
} }
private void SaveExtraField(vCard newCard, vCard card) private void SaveExtraField(vCard newCard, vCard card)
{ {
card.Notes.Clear(); card.Notes.Clear();
foreach (var item in newCard.Notes) foreach (vCardNote item in newCard.Notes)
card.Notes.Add(new vCardNote(item.Text)); card.Notes.Add(new vCardNote(item.Text));
card.Organization = newCard.Organization; card.Organization = newCard.Organization;
} }
private void SaveAddresses(vCard NewCard, vCard card) private void SaveAddresses(vCard NewCard, vCard card)
{ {
foreach (var item in NewCard.DeliveryAddresses) foreach (vCardDeliveryAddress item in NewCard.DeliveryAddresses)
{ {
var adr = card.DeliveryAddresses.Where(x => x.AddressType.FirstOrDefault() == item.AddressType.FirstOrDefault()).FirstOrDefault(); vCardDeliveryAddress adr = card.DeliveryAddresses.Where(x => x.AddressType.FirstOrDefault() == item.AddressType.FirstOrDefault()).FirstOrDefault();
if (adr != null) if (adr != null)
{ {
adr.City = item.City; adr.City = item.City;
@@ -321,6 +318,7 @@ namespace VCFEditor.Repository
private void SaveWebUrl(vCard NewCard, vCard card) private void SaveWebUrl(vCard NewCard, vCard card)
{ {
//Personal
if (NewCard.Websites.GetFirstChoice(vCardWebsiteTypes.Personal) != null) if (NewCard.Websites.GetFirstChoice(vCardWebsiteTypes.Personal) != null)
{ {
if (card.Websites.GetFirstChoice(vCardWebsiteTypes.Personal) != null) if (card.Websites.GetFirstChoice(vCardWebsiteTypes.Personal) != null)
@@ -334,19 +332,19 @@ namespace VCFEditor.Repository
card.Websites.GetFirstChoice(vCardWebsiteTypes.Personal).Url = string.Empty; card.Websites.GetFirstChoice(vCardWebsiteTypes.Personal).Url = string.Empty;
} }
//Work
if (NewCard.Websites.GetFirstChoice(vCardWebsiteTypes.Work) != null) //if (NewCard.Websites.GetFirstChoice(vCardWebsiteTypes.Work) != null)
{ //{
if (card.Websites.GetFirstChoice(vCardWebsiteTypes.Work) != null) // if (card.Websites.GetFirstChoice(vCardWebsiteTypes.Work) != null)
card.Websites.GetFirstChoice(vCardWebsiteTypes.Work).Url = NewCard.Websites.GetFirstChoice(vCardWebsiteTypes.Work).Url; // card.Websites.GetFirstChoice(vCardWebsiteTypes.Work).Url = NewCard.Websites.GetFirstChoice(vCardWebsiteTypes.Work).Url;
else // else
card.Websites.Add(new vCardWebsite(NewCard.Websites.GetFirstChoice(vCardWebsiteTypes.Work).Url, vCardWebsiteTypes.Work)); // card.Websites.Add(new vCardWebsite(NewCard.Websites.GetFirstChoice(vCardWebsiteTypes.Work).Url, vCardWebsiteTypes.Work));
} //}
else //else
{ //{
if (card.Websites.GetFirstChoice(vCardWebsiteTypes.Work) != null) // if (card.Websites.GetFirstChoice(vCardWebsiteTypes.Work) != null)
card.Websites.GetFirstChoice(vCardWebsiteTypes.Work).Url = string.Empty; // card.Websites.GetFirstChoice(vCardWebsiteTypes.Work).Url = string.Empty;
} //}
} }
public string GenerateStringFromVCard(vCard card) public string GenerateStringFromVCard(vCard card)
@@ -387,8 +385,7 @@ namespace VCFEditor.Repository
public string GenerateFileName(string fileName, int index, string extension) public string GenerateFileName(string fileName, int index, string extension)
{ {
string result = _fileHandler.GetFileNameWithExtension(fileName, index, extension); return _fileHandler.GetFileNameWithExtension(fileName, index, extension);
return result;
} }
public int SaveSplittedFiles(string FolderPath) public int SaveSplittedFiles(string FolderPath)

View File

@@ -57,23 +57,21 @@ namespace vCardEditor.Repository
public string[] GetFiles(string path, string ext) public string[] GetFiles(string path, string ext)
{ {
string[] filePaths = Directory.GetFiles(path, ext,SearchOption.TopDirectoryOnly); return Directory.GetFiles(path, ext, SearchOption.TopDirectoryOnly);
return filePaths;
} }
public string LoadJsonFromAssembly(string EmbeddedResourceName) public string LoadJsonFromAssembly(string EmbeddedResourceName)
{ {
string json; string json;
var assembly = Assembly.GetExecutingAssembly(); Assembly assembly = Assembly.GetExecutingAssembly();
using (var stream = assembly.GetManifestResourceStream(EmbeddedResourceName)) using (Stream stream = assembly.GetManifestResourceStream(EmbeddedResourceName))
{ {
if (stream == null) if (stream == null)
throw new FileNotFoundException($"Embedded resource '{EmbeddedResourceName}' not found."); throw new FileNotFoundException($"Embedded resource '{EmbeddedResourceName}' not found.");
using (var reader = new StreamReader(stream)) using (StreamReader reader = new StreamReader(stream))
json = reader.ReadToEnd(); json = reader.ReadToEnd();
} }
return json; return json;
} }
} }

View File

@@ -41,7 +41,7 @@ namespace VCFEditor.View
bool AskMessage(string msg, string caption); bool AskMessage(string msg, string caption);
void DisplayMessage(string msg, string caption); void DisplayMessage(string msg, string caption);
string DisplayOpenFileDialog(string filter); string DisplayOpenFileDialog(string filter);
string DisplaySaveDialog(string filename); string DisplaySaveDialog();
void UpdateMRUMenu(FixedList MRUList); void UpdateMRUMenu(FixedList MRUList);
void SendTextToClipBoard(string text); void SendTextToClipBoard(string text);

View File

@@ -61,15 +61,18 @@ namespace vCardEditor.View
InitializeComponent(); InitializeComponent();
resources = new ComponentResourceManager(typeof(MainForm)); resources = new ComponentResourceManager(typeof(MainForm));
tbcAddress.AddTab += (sender, e) => AddressAdded?.Invoke(sender, e); tbcAddress.AddTab += (sender, e) => AddressAdded?.Invoke(sender, e);
tbcAddress.RemoveTab += (sender, e) => AddressRemoved?.Invoke(sender, e); tbcAddress.RemoveTab += (sender, e) => AddressRemoved?.Invoke(sender, e);
tbcAddress.ModifyTab += (sender, e) => AddressModified?.Invoke(sender, e); tbcAddress.ModifyTab += (sender, e) => AddressModified?.Invoke(sender, e);
tbcAddress.TextChangedEvent += (sender, e) => TextBoxValueChanged?.Invoke(sender, e); tbcAddress.TextChangedEvent += (sender, e) => TextBoxValueChanged?.Invoke(sender, e);
btnClearFilter.Click += (sender, e) => textBoxFilter.Clear(); btnClearFilter.Click += (sender, e) => textBoxFilter.Clear();
extendedPanelPhones.ContentTextChanged += (sender, e) => TextBoxValueChanged?.Invoke(sender, e); extendedPanelPhones.ContentTextChanged += (sender, e) => TextBoxValueChanged?.Invoke(sender, e);
extendedPanelWeb.ContentTextChanged += (sender, e) => TextBoxValueChanged?.Invoke(sender, e); extendedPanelWeb.ContentTextChanged += (sender, e) => TextBoxValueChanged?.Invoke(sender, e);
extendedPanelPhones.CardInfoRemoved += (sender, e) => CardInfoRemoved?.Invoke(sender, e); extendedPanelPhones.CardInfoRemoved += (sender, e) => CardInfoRemoved?.Invoke(sender, e);
extendedPanelWeb.CardInfoRemoved += (sender, e) => CardInfoRemoved?.Invoke(sender, e); extendedPanelWeb.CardInfoRemoved += (sender, e) => CardInfoRemoved?.Invoke(sender, e);
BuildMRUMenu(); BuildMRUMenu();
} }
@@ -126,7 +129,6 @@ namespace vCardEditor.View
int RowIndex = dgContacts.CurrentCell.RowIndex; int RowIndex = dgContacts.CurrentCell.RowIndex;
if (LastRowIndex != RowIndex) if (LastRowIndex != RowIndex)
{ {
if (ChangeContactsSelected != null && dgContacts.CurrentCell != null) if (ChangeContactsSelected != null && dgContacts.CurrentCell != null)
{ {
vCard data = GetvCardFromWindow(); vCard data = GetvCardFromWindow();
@@ -151,7 +153,7 @@ namespace vCardEditor.View
ClearContactDetail(); ClearContactDetail();
Text = string.Format("{0} - vCard Editor", FileName); Text = string.Format("{0} - vCard Editor", FileName ?? "New file");
tcMainTab.Enabled = true; tcMainTab.Enabled = true;
gbNameList.Enabled = true; gbNameList.Enabled = true;
@@ -171,14 +173,14 @@ namespace vCardEditor.View
private void SetExtraInfos(vCard card) private void SetExtraInfos(vCard card)
{ {
foreach (vCardPhone item in card.Phones)
extendedPanelPhones.AddControl(item);
foreach (vCardEmailAddress item in card.EmailAddresses) foreach (vCardEmailAddress item in card.EmailAddresses)
extendedPanelWeb.AddControl(item); extendedPanelWeb.AddControl(item);
foreach (vCardWebsite item in card.Websites) foreach (vCardWebsite item in card.Websites)
extendedPanelWeb.AddControl(item); extendedPanelWeb.AddControl(item);
foreach (vCardPhone item in card.Phones)
extendedPanelPhones.AddControl(item);
} }
private void SetExtraTabFields(vCard card) private void SetExtraTabFields(vCard card)
@@ -308,6 +310,7 @@ namespace vCardEditor.View
getExtraPhones(card); getExtraPhones(card);
getExtraWeb(card); getExtraWeb(card);
getExtraData(card); getExtraData(card);
return card; return card;
} }
@@ -446,16 +449,20 @@ namespace vCardEditor.View
return filename; return filename;
} }
public string DisplaySaveDialog(string filename) public string DisplaySaveDialog()
{ {
SaveFileDialog saveFileDialog = new SaveFileDialog SaveFileDialog saveFileDialog = new SaveFileDialog
{ {
FileName = filename Title = "Save vCard file",
Filter = "Virtual Contact File|*.vcf"
}; };
string filename = null;
DialogResult result = saveFileDialog.ShowDialog(); if (saveFileDialog.ShowDialog() == DialogResult.OK)
if (result == DialogResult.OK) {
filename = saveFileDialog.FileName; filename = saveFileDialog.FileName;
Text = string.Format("{0} - vCard Editor", filename);
}
return filename; return filename;
} }
@@ -681,12 +688,10 @@ namespace vCardEditor.View
public string DisplayOpenFolderDialog() public string DisplayOpenFolderDialog()
{ {
string result = string.Empty;
FolderBrowserDialog dialog = new FolderBrowserDialog(); FolderBrowserDialog dialog = new FolderBrowserDialog();
if (dialog.ShowDialog() == DialogResult.OK) if (dialog.ShowDialog() == DialogResult.OK)
result = dialog.SelectedPath; return dialog.SelectedPath;
return string.Empty;
return result;
} }
public void LoadLocalizedUI(IReadOnlyDictionary<string, string> currentMessages) public void LoadLocalizedUI(IReadOnlyDictionary<string, string> currentMessages)
@@ -696,7 +701,7 @@ namespace vCardEditor.View
public void LoadAvailablesLangs(IEnumerable<string> availableLanguages) public void LoadAvailablesLangs(IEnumerable<string> availableLanguages)
{ {
foreach (var lang in availableLanguages) foreach (string lang in availableLanguages)
{ {
} }