mirror of
https://github.com/abdelkader/vCardEditor
synced 2025-12-12 08:27:19 +07:00
Compare commits
43 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2c47765a5e | ||
|
|
687b2a248a | ||
|
|
71b5b7580a | ||
|
|
7a4c8e9d42 | ||
|
|
1233425972 | ||
|
|
2885f5f5cc | ||
|
|
89c06504ee | ||
|
|
adac378b13 | ||
|
|
74b5400a34 | ||
|
|
7ffb330559 | ||
|
|
3b1cfcd36b | ||
|
|
8cf9ce829c | ||
|
|
071c967e08 | ||
|
|
618e341e02 | ||
|
|
6427542051 | ||
|
|
dc9fa3143a | ||
|
|
f0742c560c | ||
|
|
e4e6a983e3 | ||
|
|
f4ede0585b | ||
|
|
83cda3c073 | ||
|
|
8d9070f483 | ||
|
|
4b33a2425d | ||
|
|
fa7f2c85d2 | ||
|
|
a40ffaca58 | ||
|
|
2325b5f986 | ||
|
|
1db99cf187 | ||
|
|
fe4c6381da | ||
|
|
437301d5bc | ||
|
|
ed4d988c1d | ||
|
|
b249d91439 | ||
|
|
7d9bfc4fe3 | ||
|
|
62deb9a13e | ||
|
|
4081142e2c | ||
|
|
dd62810160 | ||
|
|
314065c2dc | ||
|
|
a5e932b345 | ||
|
|
1e1c3cce81 | ||
|
|
dbc2615ed5 | ||
|
|
f9d016260f | ||
|
|
a03a4e8ee4 | ||
|
|
6843863778 | ||
|
|
ee95238e2d | ||
|
|
f14f5086d0 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -216,3 +216,4 @@ FakesAssemblies/
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
/contacts
|
||||
/vCardEditor/assests/icons8-save-32.png
|
||||
|
||||
57
README.md
57
README.md
@@ -1,40 +1,35 @@
|
||||
|
||||
# vCard Editor
|
||||
|
||||
[](https://ko-fi.com/B0B2KV8WP)
|
||||
|
||||
|
||||
<a href="https://github.com/abdelkader/vCardEditor/releases/latest/download/vCardEditor.exe"><img src="https://camo.githubusercontent.com/d83fa798b621f1e112646fcc4aa74fff1ff6a8b22f5fc1da5ed8f79ddb4a51cb/68747470733a2f2f62616467656e2e6e65742f6769746875622f72656c656173652f4e61657265656e2f5374726170646f776e2e6a73" alt="Latest release" data-canonical-src="https://badgen.net/github/release/Naereen/Strapdown.js" style="max-width: 100%;"></a>
|
||||
|
||||
|
||||
|
||||
|
||||
## vCard Editor
|
||||
A Simple vcf file Editor. You can export easily edit (modify, delete) entries of a vcf file with this simple tool.
|
||||
The software is still in **early stage**.
|
||||
<p align="center"><img src="https://user-images.githubusercontent.com/169070/236289228-106c1489-e01d-400c-968e-92d3e2be74ab.png" width="800"></p>
|
||||
|
||||
|
||||
## Installation
|
||||
## ✅ Features
|
||||
- [x] No need to install anything. Just head to the release section and download the last release version.
|
||||
- [x] Add/Export images
|
||||
|
||||
No need to install anything. Just head to the release section and download the last release version.
|
||||
|
||||
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||
|
||||
## Acknowledgements
|
||||
|
||||
- [Wonderful library of parsing and generating vcf format](https://github.com/drlongnecker/Thought.vCards)
|
||||
- [MVP pattern from this example](https://github.com/lennykean/NoteCards)
|
||||
|
||||
|
||||
|
||||
## Release notes
|
||||
#### 0.3
|
||||
|
||||
- Added address section.
|
||||
- refactoring and bugs fixed
|
||||
|
||||
#### 0.2
|
||||
- Updated the vCard library to https://github.com/acastroy/Thought.vCards
|
||||
- Replaced Moq with nsubstitute (Test mocking library).
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions are always welcome!
|
||||
## 📚 Tech Stack
|
||||
|
||||
- 🧰 [Wonderful library of parsing and generating vcf format](https://github.com/drlongnecker/Thought.vCards)
|
||||
- 📖 [MVP pattern from this example](https://github.com/lennykean/NoteCards)
|
||||
- 🧰 [SortableBindingList](http://timvw.be/2008/08/02/presenting-the-sortablebindinglistt-take-two/)
|
||||
- 🧰 [Custom TabControl](https://github.com/r-aghaei/TabControlWithCloseButtonAndAddButton)
|
||||
|
||||
## 📑 Release notes
|
||||
Check release text file for history.
|
||||
|
||||
## 👷 Contributing
|
||||
|
||||
Contributions are always welcome! Check ths projet or ths issue page for ideas.
|
||||
|
||||
|
||||
|
||||
9
vCardEditor/Model/Columns.cs
Normal file
9
vCardEditor/Model/Columns.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
namespace vCardEditor.Model
|
||||
{
|
||||
public enum Columns
|
||||
{
|
||||
Name = 0,
|
||||
FamilyName,
|
||||
Cellular,
|
||||
}
|
||||
}
|
||||
@@ -3,23 +3,32 @@ using Thought.vCards;
|
||||
|
||||
namespace VCFEditor.Model
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public class Contact : INotifyPropertyChanged
|
||||
{
|
||||
[DisplayName(" ")]
|
||||
public bool isSelected { get; set; }
|
||||
|
||||
|
||||
[DisplayName("Name")]
|
||||
public string Name
|
||||
{
|
||||
get { return card.FormattedName; }
|
||||
get => card.FormattedName;
|
||||
set
|
||||
{
|
||||
card.FormattedName = value;
|
||||
this.NotifyPropertyChanged("Name");
|
||||
NotifyPropertyChanged("Name");
|
||||
}
|
||||
}
|
||||
[DisplayName("F.Name")]
|
||||
public string FamilyName
|
||||
{
|
||||
get => card.FamilyName;
|
||||
}
|
||||
|
||||
[DisplayName("Cellular")]
|
||||
public string Cellular
|
||||
{
|
||||
get {
|
||||
if (card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular) != null)
|
||||
return card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular).FullNumber;
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,7 +38,10 @@ namespace VCFEditor.Model
|
||||
|
||||
[Browsable(false)]
|
||||
public bool isDirty { get; set; }
|
||||
|
||||
|
||||
[DisplayName(" ")]
|
||||
public bool isSelected { get; set; }
|
||||
|
||||
[Browsable(false)]
|
||||
public bool isDeleted { get; set; }
|
||||
|
||||
@@ -41,14 +53,11 @@ namespace VCFEditor.Model
|
||||
isDirty = false;
|
||||
}
|
||||
|
||||
#region property change event
|
||||
private void NotifyPropertyChanged(string name)
|
||||
{
|
||||
if (PropertyChanged != null)
|
||||
PropertyChanged(this, new PropertyChangedEventArgs(name));
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
|
||||
}
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
19
vCardEditor/Model/FormState.cs
Normal file
19
vCardEditor/Model/FormState.cs
Normal file
@@ -0,0 +1,19 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace vCardEditor.Model
|
||||
{
|
||||
public struct FormState
|
||||
{
|
||||
public List<Columns> Columns { get; set; }
|
||||
public int X { get; set; }
|
||||
|
||||
public int Y { get; set; }
|
||||
|
||||
public int Height { get; set; }
|
||||
|
||||
public int Width { get; set; }
|
||||
|
||||
public int splitterPosition { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Thought.vCards;
|
||||
using VCFEditor.View;
|
||||
using vCardEditor.View;
|
||||
using VCFEditor.Repository;
|
||||
using vCardEditor.Repository;
|
||||
using vCardEditor.Model;
|
||||
|
||||
using System.Linq;
|
||||
using System.IO;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace VCFEditor.Presenter
|
||||
{
|
||||
@@ -21,6 +21,8 @@ namespace VCFEditor.Presenter
|
||||
_view = view;
|
||||
_repository = repository;
|
||||
|
||||
_view.LoadForm += _view_LoadForm;
|
||||
_view.AddContact += AddContact;
|
||||
_view.NewFileOpened += NewFileOpened;
|
||||
_view.BeforeOpeningNewFile += BeforeOpeningNewFile;
|
||||
_view.SaveContactsSelected += SaveContacts;
|
||||
@@ -30,29 +32,111 @@ namespace VCFEditor.Presenter
|
||||
_view.TextBoxValueChanged += TextBoxValueChanged;
|
||||
_view.BeforeLeavingContact += BeforeLeavingContact;
|
||||
_view.CloseForm += CloseForm;
|
||||
_view.ModifyImage += ModifyImage;
|
||||
_view.ExportImage += ExportImage;
|
||||
_view.AddressAdded += _view_AddressAdded;
|
||||
_view.AddressModified += _view_AddressModified;
|
||||
_view.AddressRemoved += _view_AddressRemoved;
|
||||
_view.CopyTextToClipboardEvent += _view_CopyTextToClipboardEvent;
|
||||
|
||||
}
|
||||
|
||||
private void _view_CopyTextToClipboardEvent(object sender, EventArgs e)
|
||||
{
|
||||
if (_view.SelectedContactIndex < 0)
|
||||
return;
|
||||
|
||||
var contact = _repository.Contacts[_view.SelectedContactIndex];
|
||||
|
||||
string SerializedCard = _repository.GenerateStringFromVCard(contact.card);
|
||||
|
||||
_view.SendTextToClipBoard(SerializedCard);
|
||||
_view.DisplayMessage("vCard copied to clipboard!", "Information");
|
||||
}
|
||||
private void _view_LoadForm(object sender, EventArg<FormState> e)
|
||||
{
|
||||
e.Data = ConfigRepository.Instance.FormState;
|
||||
}
|
||||
|
||||
|
||||
private void _view_AddressRemoved(object sender, EventArg<int> e)
|
||||
{
|
||||
var contact = _repository.Contacts[_view.SelectedContactIndex];
|
||||
_repository.SetDirtyFlag(_view.SelectedContactIndex);
|
||||
|
||||
contact.card.DeliveryAddresses.RemoveAt(e.Data);
|
||||
}
|
||||
|
||||
private void _view_AddressAdded(object sender, EventArg<List<vCardDeliveryAddressTypes>> e)
|
||||
{
|
||||
var contact = _repository.Contacts[_view.SelectedContactIndex];
|
||||
_repository.SetDirtyFlag(_view.SelectedContactIndex);
|
||||
|
||||
contact.card.DeliveryAddresses.Add(new vCardDeliveryAddress( e.Data));
|
||||
}
|
||||
|
||||
private void _view_AddressModified(object sender, EventArg<List<vCardDeliveryAddressTypes>> e)
|
||||
{
|
||||
var contact = _repository.Contacts[_view.SelectedContactIndex];
|
||||
_repository.SetDirtyFlag(_view.SelectedContactIndex);
|
||||
|
||||
contact.card.DeliveryAddresses.Clear();
|
||||
contact.card.DeliveryAddresses.Add(new vCardDeliveryAddress(e.Data));
|
||||
}
|
||||
private void ExportImage(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
if (_view.SelectedContactIndex > -1)
|
||||
{
|
||||
//TODO: image can be url, or file location.
|
||||
var card = _repository.Contacts[_view.SelectedContactIndex].card;
|
||||
var image = card.Photos.FirstOrDefault();
|
||||
|
||||
if (image != null)
|
||||
{
|
||||
var newPath = Path.ChangeExtension(_repository.fileName, image.Extension);
|
||||
|
||||
string imageFile = _view.DisplaySaveDialog(newPath);
|
||||
_repository.SaveImageToDisk(imageFile, image);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ModifyImage(object sender, EventArg<string> e)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(e.Data) )
|
||||
{
|
||||
vCardPhoto photo = new vCardPhoto(e.Data);
|
||||
_repository.ModifyImage(_view.SelectedContactIndex, photo);
|
||||
}
|
||||
else
|
||||
_repository.ModifyImage(_view.SelectedContactIndex, null);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void CloseForm(object sender, EventArg<bool> e)
|
||||
{
|
||||
if (_repository.dirty && _view.AskMessage("Exit before saving?", "Exit"))
|
||||
if (_repository.dirty && _view.AskMessage("Exit without saving?", "Exit"))
|
||||
e.Data = true;
|
||||
|
||||
if (!e.Data)
|
||||
{
|
||||
var state = _view.GetFormState();
|
||||
ConfigRepository.Instance.FormState = state;
|
||||
ConfigRepository.Instance.SaveConfig();
|
||||
}
|
||||
|
||||
}
|
||||
public void BeforeLeavingContact(object sender, EventArg<vCard> e)
|
||||
{
|
||||
if (_view.SelectedContactIndex > -1)
|
||||
{
|
||||
if (_repository.dirty)
|
||||
_repository.SaveDirtyVCard(_view.SelectedContactIndex, e.Data);
|
||||
}
|
||||
_repository.SaveDirtyVCard(_view.SelectedContactIndex, e.Data);
|
||||
}
|
||||
|
||||
public void TextBoxValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
StateTextBox tb = sender as StateTextBox;
|
||||
var tb = sender as StateTextBox;
|
||||
if (tb != null && tb.oldText != tb.Text)
|
||||
_repository.SaveDirtyFlag(_view.SelectedContactIndex);
|
||||
_repository.SetDirtyFlag(_view.SelectedContactIndex);
|
||||
|
||||
}
|
||||
|
||||
@@ -62,6 +146,11 @@ namespace VCFEditor.Presenter
|
||||
_view.DisplayContacts(FilteredContacts);
|
||||
}
|
||||
|
||||
private void AddContact(object sender, EventArgs e)
|
||||
{
|
||||
_repository.AddEmptyContact();
|
||||
}
|
||||
|
||||
private void DeleteContact(object sender, EventArgs e)
|
||||
{
|
||||
_repository.DeleteContact();
|
||||
@@ -70,7 +159,7 @@ namespace VCFEditor.Presenter
|
||||
private void SaveContacts(object sender, EventArgs e)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(_repository.fileName))
|
||||
_repository.SaveContacts(_repository.fileName);
|
||||
_repository.SaveContactsToFile(_repository.fileName);
|
||||
|
||||
}
|
||||
|
||||
@@ -79,34 +168,32 @@ namespace VCFEditor.Presenter
|
||||
if (_repository.Contacts != null && _repository.dirty)
|
||||
{
|
||||
if (!_view.AskMessage("Save current file before?", "Load"))
|
||||
_repository.SaveContacts(_repository.fileName);
|
||||
_repository.SaveContactsToFile(_repository.fileName);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void NewFileOpened(object sender, EventArg<string> e)
|
||||
{
|
||||
|
||||
BeforeOpeningNewFile(sender, e);
|
||||
|
||||
string path = e.Data;
|
||||
if (string.IsNullOrEmpty(path))
|
||||
path = _view.DisplayOpenDialog();
|
||||
path = _view.DisplayOpenDialog("vCard Files|*.vcf");
|
||||
|
||||
if (!string.IsNullOrEmpty(path))
|
||||
{
|
||||
string ext = System.IO.Path.GetExtension(path);
|
||||
if (ext != ".vcf")
|
||||
string ext = _repository.GetExtension(path);
|
||||
if (!string.Equals(ext, ".vcf", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
_view.DisplayMessage("Only vcf extension accepted!", "Error");
|
||||
return;
|
||||
}
|
||||
|
||||
FixedList MRUList = ConfigRepository.Instance.Paths;
|
||||
if (!MRUList.Contains(path))
|
||||
FixedList MostRecentUsedFiles = ConfigRepository.Instance.Paths;
|
||||
if (!MostRecentUsedFiles.Contains(path))
|
||||
{
|
||||
MRUList.Enqueue(path);
|
||||
_view.UpdateMRUMenu(MRUList);
|
||||
MostRecentUsedFiles.Enqueue(path);
|
||||
_view.UpdateMRUMenu(MostRecentUsedFiles);
|
||||
}
|
||||
|
||||
_repository.LoadContacts(path);
|
||||
@@ -116,23 +203,21 @@ namespace VCFEditor.Presenter
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void ChangeContactSelected(object sender, EventArgs e)
|
||||
{
|
||||
if (_view.SelectedContactIndex > -1)
|
||||
{
|
||||
int index = _view.SelectedContactIndex;
|
||||
vCard card = _repository.Contacts[index].card;
|
||||
vCard card = _repository.Contacts[_view.SelectedContactIndex].card;
|
||||
|
||||
if (card != null)
|
||||
{
|
||||
_repository.Contacts[index].isDirty = false;
|
||||
_view.DisplayContactDetail(card, _repository.fileName);
|
||||
}
|
||||
else
|
||||
_view.ClearContactDetail();
|
||||
}
|
||||
else
|
||||
_view.ClearContactDetail();
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
// Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut
|
||||
// en utilisant '*', comme indiqué ci-dessous :
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("0.12.*")]
|
||||
[assembly: AssemblyVersion("0.4.0.*")]
|
||||
//[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
|
||||
22
vCardEditor/Properties/Resources.Designer.cs
generated
22
vCardEditor/Properties/Resources.Designer.cs
generated
@@ -19,7 +19,7 @@ namespace vCardEditor.Properties {
|
||||
// à l'aide d'un outil, tel que ResGen ou Visual Studio.
|
||||
// Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen
|
||||
// avec l'option /str ou régénérez votre projet VS.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
@@ -59,5 +59,25 @@ namespace vCardEditor.Properties {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recherche une ressource localisée de type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap Add {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("Add", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recherche une ressource localisée de type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap Close {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("Close", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,4 +117,11 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="Add" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\assests\Add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="Close" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\assests\Close.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
||||
17
vCardEditor/Releases.txt
Normal file
17
vCardEditor/Releases.txt
Normal file
@@ -0,0 +1,17 @@
|
||||
0.5
|
||||
A reworked control for adding/modifying or removing addresses.
|
||||
|
||||
0.4
|
||||
Import images/export images.
|
||||
refactoring and bugs fixed
|
||||
|
||||
0.3
|
||||
Added address section.
|
||||
refactoring and bugs fixed
|
||||
|
||||
0.2
|
||||
Updated the vCard library to https://github.com/acastroy/Thought.vCards
|
||||
Replaced Moq with nsubstitute (Test mocking library).
|
||||
|
||||
0.1
|
||||
Intial release
|
||||
@@ -17,6 +17,7 @@ namespace vCardEditor.Repository
|
||||
get { return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.xml"); }
|
||||
}
|
||||
|
||||
private const int MAX_RECENT_FILES = 5;
|
||||
private static ConfigRepository instance = null;
|
||||
[XmlIgnore]
|
||||
public static ConfigRepository Instance
|
||||
@@ -38,6 +39,9 @@ namespace vCardEditor.Repository
|
||||
[Browsable(false)]
|
||||
public FixedList Paths { get; set;}
|
||||
|
||||
[Browsable(false)]
|
||||
public FormState FormState;
|
||||
|
||||
private ConfigRepository() { }
|
||||
|
||||
|
||||
@@ -64,7 +68,7 @@ namespace vCardEditor.Repository
|
||||
/// <returns></returns>
|
||||
private static ConfigRepository LoadConfig()
|
||||
{
|
||||
ConfigRepository obj;
|
||||
ConfigRepository configData = null;
|
||||
|
||||
try
|
||||
{
|
||||
@@ -74,19 +78,22 @@ namespace vCardEditor.Repository
|
||||
XmlSerializer deserializer = new XmlSerializer(typeof(ConfigRepository));
|
||||
using (TextReader reader = new StreamReader(ConfigFileName))
|
||||
{
|
||||
obj = (ConfigRepository)deserializer.Deserialize(reader);
|
||||
obj.Paths.Size = obj.Maximum;
|
||||
configData = (ConfigRepository)deserializer.Deserialize(reader);
|
||||
configData.Paths.Size = configData.Maximum;
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
obj = new ConfigRepository();
|
||||
obj.Paths = new FixedList(5);
|
||||
configData = new ConfigRepository
|
||||
{
|
||||
Maximum = MAX_RECENT_FILES,
|
||||
Paths = new FixedList(MAX_RECENT_FILES)
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
return obj;
|
||||
return configData;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ using Thought.vCards;
|
||||
using VCFEditor.Model;
|
||||
using System.ComponentModel;
|
||||
using vCardEditor.Repository;
|
||||
using System.Collections.Generic;
|
||||
using vCardEditor.View;
|
||||
|
||||
namespace VCFEditor.Repository
|
||||
{
|
||||
@@ -14,7 +14,6 @@ namespace VCFEditor.Repository
|
||||
{
|
||||
public string fileName { get; set; }
|
||||
private IFileHandler _fileHandler;
|
||||
#region Contact Info
|
||||
/// <summary>
|
||||
/// Formatted name.
|
||||
/// </summary>
|
||||
@@ -23,17 +22,14 @@ namespace VCFEditor.Repository
|
||||
/// <summary>
|
||||
/// Keep a copy of contact list when filtering
|
||||
/// </summary>
|
||||
private BindingList<Contact> OriginalContactList = null;
|
||||
/// <summary>
|
||||
/// Contact List
|
||||
/// </summary>
|
||||
private BindingList<Contact> _contacts;
|
||||
public BindingList<Contact> Contacts
|
||||
private SortableBindingList<Contact> OriginalContactList = null;
|
||||
private SortableBindingList<Contact> _contacts;
|
||||
public SortableBindingList<Contact> Contacts
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_contacts == null)
|
||||
_contacts = new BindingList<Contact>();
|
||||
_contacts = new SortableBindingList<Contact>();
|
||||
return _contacts;
|
||||
}
|
||||
set
|
||||
@@ -41,29 +37,27 @@ namespace VCFEditor.Repository
|
||||
_contacts = value;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
public ContactRepository(IFileHandler fileHandler)
|
||||
{
|
||||
_fileHandler = fileHandler;
|
||||
}
|
||||
|
||||
public BindingList<Contact> LoadContacts(string fileName)
|
||||
public SortableBindingList<Contact> LoadContacts(string fileName)
|
||||
{
|
||||
Contacts.Clear();
|
||||
|
||||
//TODO: Clean end of line from spaces..
|
||||
this.fileName = fileName;
|
||||
string[] lines = _fileHandler.ReadAllLines(fileName);
|
||||
|
||||
StringBuilder RawContent = new StringBuilder();
|
||||
Contact contact = new Contact();
|
||||
string[] lines = _fileHandler.ReadAllLines(fileName);
|
||||
//TODO: Clean end of line from spaces..
|
||||
|
||||
//Prevent from adding contacts to existings ones.
|
||||
Contacts.Clear();
|
||||
|
||||
for (int i = 0; i < lines.Length; i++)
|
||||
{
|
||||
RawContent.AppendLine(lines[i]);
|
||||
if (lines[i].TrimEnd() == "END:VCARD")
|
||||
if (string.Equals(lines[i].TrimEnd(), "END:VCARD", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
contact.card = ParseRawContent(RawContent);
|
||||
Contacts.Add(contact);
|
||||
@@ -72,23 +66,27 @@ namespace VCFEditor.Repository
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
OriginalContactList = Contacts;
|
||||
_dirty = false;
|
||||
return Contacts;
|
||||
}
|
||||
|
||||
public void AddEmptyContact()
|
||||
{
|
||||
if (_contacts != null && _contacts.Count > 0)
|
||||
{
|
||||
Contact contact = new Contact();
|
||||
Contacts.Add(contact);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Save the contact to the file.
|
||||
/// </summary>
|
||||
/// <param name="path">Path to the new file, else if null, we overwrite the same file</param>
|
||||
public void SaveContacts(string fileName)
|
||||
public void SaveContactsToFile(string fileName)
|
||||
{
|
||||
//overwrite the same file, else save as another file.
|
||||
if (string.IsNullOrEmpty(fileName))
|
||||
fileName = this.fileName;
|
||||
|
||||
//Take a copy...
|
||||
//Take a copy if specified in the config file
|
||||
if (!ConfigRepository.Instance.OverWrite)
|
||||
{
|
||||
string backupName = GetBackupName();
|
||||
@@ -96,17 +94,22 @@ namespace VCFEditor.Repository
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
//Do not save the deleted ones...
|
||||
|
||||
foreach (var entry in Contacts)
|
||||
{
|
||||
//Do not save the deleted ones!
|
||||
if (!entry.isDeleted)
|
||||
sb.Append(generateRawContent(entry.card));
|
||||
{
|
||||
string SerializedCard = GenerateStringFromVCard(entry.card);
|
||||
sb.Append(SerializedCard);
|
||||
}
|
||||
|
||||
//Clean the flag for every contact, even the deleted ones.
|
||||
entry.isDirty = false;
|
||||
}
|
||||
|
||||
|
||||
_fileHandler.WriteAllText(fileName, sb.ToString());
|
||||
|
||||
_dirty = false;
|
||||
}
|
||||
|
||||
private string GetBackupName()
|
||||
@@ -122,37 +125,26 @@ namespace VCFEditor.Repository
|
||||
|
||||
return backupName;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Delete contacted that are selected.
|
||||
/// </summary>
|
||||
|
||||
public void DeleteContact()
|
||||
{
|
||||
if (_contacts != null && _contacts.Count > 0)
|
||||
{
|
||||
//loop from the back to prevent index mangling...
|
||||
|
||||
for (int i = _contacts.Count - 1; i > -1; i--)
|
||||
{
|
||||
if (_contacts[i].isSelected)
|
||||
{
|
||||
_contacts[i].isDeleted = true;
|
||||
_contacts.RemoveAt(i);
|
||||
_dirty = true;
|
||||
SetDirtyFlag(i);
|
||||
_contacts.RemoveAt(i);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Use the lib to parse a vcard chunk.
|
||||
/// </summary>
|
||||
/// <param name="rawContent"></param>
|
||||
/// <returns></returns>
|
||||
|
||||
private vCard ParseRawContent(StringBuilder rawContent)
|
||||
{
|
||||
vCard card = null;
|
||||
@@ -165,12 +157,7 @@ namespace VCFEditor.Repository
|
||||
|
||||
return card;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="s"></param>
|
||||
/// <returns></returns>
|
||||
|
||||
private MemoryStream GenerateStreamFromString(string s)
|
||||
{
|
||||
MemoryStream stream = new MemoryStream();
|
||||
@@ -181,11 +168,11 @@ namespace VCFEditor.Repository
|
||||
return stream;
|
||||
}
|
||||
|
||||
public BindingList<Contact> FilterContacts(string filter)
|
||||
public SortableBindingList<Contact> FilterContacts(string filter)
|
||||
{
|
||||
var list = OriginalContactList.Where(i => (i.Name.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0) &&
|
||||
!i.isDeleted);
|
||||
Contacts = new BindingList<Contact>(list.ToList());
|
||||
Contacts = new SortableBindingList<Contact>(list.ToList());
|
||||
return Contacts;
|
||||
}
|
||||
|
||||
@@ -195,7 +182,7 @@ namespace VCFEditor.Repository
|
||||
/// </summary>
|
||||
/// <param name="card"></param>
|
||||
/// <param name="index"></param>
|
||||
public void SaveDirtyFlag(int index)
|
||||
public void SetDirtyFlag(int index)
|
||||
{
|
||||
if (index > -1)
|
||||
_contacts[index].isDirty = true;
|
||||
@@ -203,18 +190,40 @@ namespace VCFEditor.Repository
|
||||
|
||||
public void SaveDirtyVCard(int index, vCard NewCard)
|
||||
{
|
||||
if (index > -1 && index < _contacts.Count-1 && _contacts[index].isDirty)
|
||||
if (index > -1 && index <= _contacts.Count-1 && _contacts[index].isDirty)
|
||||
{
|
||||
vCard card = _contacts[index].card;
|
||||
card.Title = NewCard.Title;
|
||||
card.FormattedName = NewCard.FormattedName;
|
||||
card.GivenName = NewCard.GivenName;
|
||||
card.FamilyName = NewCard.FamilyName;
|
||||
card.AdditionalNames = NewCard.AdditionalNames;
|
||||
card.FamilyName = NewCard.FamilyName;
|
||||
|
||||
SavePhone(NewCard, card);
|
||||
SaveEmail(NewCard, card);
|
||||
SaveWebUrl(NewCard, card);
|
||||
SaveAddresses(NewCard, card);
|
||||
}
|
||||
}
|
||||
|
||||
_contacts[index].isDirty = false;
|
||||
_dirty = true;
|
||||
private void SaveAddresses(vCard NewCard, vCard card)
|
||||
{
|
||||
foreach (var item in NewCard.DeliveryAddresses)
|
||||
{
|
||||
var adr = card.DeliveryAddresses.Where(x => x.AddressType.FirstOrDefault() == item.AddressType.FirstOrDefault()).FirstOrDefault();
|
||||
if (adr != null)
|
||||
{
|
||||
adr.City = item.City;
|
||||
adr.Country = item.Country;
|
||||
adr.PostalCode = item.PostalCode;
|
||||
adr.Region = item.Region;
|
||||
adr.Street = item.Street;
|
||||
}
|
||||
else
|
||||
card.DeliveryAddresses.Add(new vCardDeliveryAddress(item.Street, item.City, item.Region, item.Country,
|
||||
item.PostalCode, item.AddressType.FirstOrDefault()));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -320,12 +329,8 @@ namespace VCFEditor.Repository
|
||||
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Generate a VCard class from a string.
|
||||
/// </summary>
|
||||
/// <param name="card"></param>
|
||||
/// <returns></returns>
|
||||
private string generateRawContent(vCard card)
|
||||
|
||||
public string GenerateStringFromVCard(vCard card)
|
||||
{
|
||||
vCardStandardWriter writer = new vCardStandardWriter();
|
||||
TextWriter tw = new StringWriter();
|
||||
@@ -334,15 +339,30 @@ namespace VCFEditor.Repository
|
||||
return tw.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check if some iem in the contact list is modified
|
||||
/// </summary>
|
||||
/// <returns>true for dirty</returns>
|
||||
private bool _dirty;
|
||||
public void ModifyImage(int index, vCardPhoto photo)
|
||||
{
|
||||
if (index > -1)
|
||||
{
|
||||
SetDirtyFlag(index);
|
||||
_contacts[index].card.Photos.Clear();
|
||||
if (photo != null)
|
||||
_contacts[index].card.Photos.Add(photo);
|
||||
}
|
||||
}
|
||||
|
||||
public string GetExtension(string path)
|
||||
{
|
||||
return _fileHandler.GetExtension(path);
|
||||
}
|
||||
|
||||
public void SaveImageToDisk(string imageFile, vCardPhoto image)
|
||||
{
|
||||
_fileHandler.WriteBytesToFile(imageFile, image.GetBytes());
|
||||
}
|
||||
|
||||
public bool dirty
|
||||
{
|
||||
get { return _dirty || (_contacts != null && _contacts.Any(x => x.isDirty)); }
|
||||
set { _dirty = value; }
|
||||
get { return _contacts != null && _contacts.Any(x => x.isDirty); }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.IO;
|
||||
|
||||
|
||||
namespace vCardEditor.Repository
|
||||
{
|
||||
@@ -13,6 +10,11 @@ namespace vCardEditor.Repository
|
||||
return File.Exists(filename);
|
||||
}
|
||||
|
||||
public string GetExtension(string path)
|
||||
{
|
||||
return Path.GetExtension(path);
|
||||
}
|
||||
|
||||
public void MoveFile(string newFilename, string oldFilename)
|
||||
{
|
||||
File.Move(newFilename, oldFilename);
|
||||
@@ -27,5 +29,14 @@ namespace vCardEditor.Repository
|
||||
{
|
||||
File.WriteAllText(filename, contents);
|
||||
}
|
||||
|
||||
public void WriteBytesToFile(string imageFile, byte[] image)
|
||||
{
|
||||
using (var ms = new MemoryStream(image))
|
||||
{
|
||||
using (var fs = new FileStream(imageFile, FileMode.Create))
|
||||
ms.WriteTo(fs);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,21 +5,26 @@ using System.Text;
|
||||
using Thought.vCards;
|
||||
using VCFEditor.Model;
|
||||
using System.ComponentModel;
|
||||
using vCardEditor.View;
|
||||
|
||||
namespace VCFEditor.Repository
|
||||
{
|
||||
public interface IContactRepository
|
||||
{
|
||||
bool dirty { get; }
|
||||
string fileName { get; set; }
|
||||
BindingList<Contact> Contacts { get; set; }
|
||||
bool dirty { get; set; }
|
||||
|
||||
BindingList<Contact> LoadContacts(string fileName);
|
||||
void SaveContacts(string fileName);
|
||||
SortableBindingList<Contact> Contacts { get; set; }
|
||||
SortableBindingList<Contact> LoadContacts(string fileName);
|
||||
SortableBindingList<Contact> FilterContacts(string p);
|
||||
void SaveContactsToFile(string fileName);
|
||||
void DeleteContact();
|
||||
BindingList<Contact> FilterContacts(string p);
|
||||
void SaveDirtyFlag(int index);
|
||||
void SetDirtyFlag(int index);
|
||||
void SaveDirtyVCard(int index, vCard card);
|
||||
|
||||
void AddEmptyContact();
|
||||
void ModifyImage(int index, vCardPhoto photo);
|
||||
string GetExtension(string path);
|
||||
void SaveImageToDisk(string imageFile, vCardPhoto image);
|
||||
|
||||
string GenerateStringFromVCard(vCard card);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace vCardEditor.Repository
|
||||
namespace vCardEditor.Repository
|
||||
{
|
||||
public interface IFileHandler
|
||||
{
|
||||
@@ -11,5 +6,7 @@ namespace vCardEditor.Repository
|
||||
bool FileExist(string filename);
|
||||
string[] ReadAllLines(string filename);
|
||||
void WriteAllText(string fileName, string contents);
|
||||
string GetExtension(string path);
|
||||
void WriteBytesToFile(string imageFile, byte[] image);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,8 @@ namespace Thought.vCards
|
||||
private string postalCode;
|
||||
private string region;
|
||||
private string street;
|
||||
private string postOfficeBox;
|
||||
private string extendedAddress;
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -37,14 +39,42 @@ namespace Thought.vCards
|
||||
this.postalCode = string.Empty;
|
||||
this.region = string.Empty;
|
||||
this.street = string.Empty;
|
||||
this.postOfficeBox = string.Empty;
|
||||
this.extendedAddress = string.Empty;
|
||||
this.addressType = new List<vCardDeliveryAddressTypes>();
|
||||
}
|
||||
|
||||
public vCardDeliveryAddress(string street, string city, string region, string country, string postalCode, vCardDeliveryAddressTypes addressType)
|
||||
{
|
||||
AddressType = new List<vCardDeliveryAddressTypes>() { addressType };
|
||||
City = city;
|
||||
Country = country;
|
||||
PostalCode = postalCode;
|
||||
Region = region;
|
||||
Street = street;
|
||||
}
|
||||
|
||||
public vCardDeliveryAddress(string street, string city, string region, string country, string postalCode, string extendedAddress, string postOfficeBox, vCardDeliveryAddressTypes addressType)
|
||||
{
|
||||
AddressType = new List<vCardDeliveryAddressTypes>() { addressType };
|
||||
City = city;
|
||||
Country = country;
|
||||
PostalCode = postalCode;
|
||||
Region = region;
|
||||
Street = street;
|
||||
ExtendedAddress = extendedAddress;
|
||||
PostOfficeBox= postOfficeBox;
|
||||
}
|
||||
|
||||
public vCardDeliveryAddress(List<vCardDeliveryAddressTypes> addressType)
|
||||
{
|
||||
AddressType = addressType ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The type of postal address.
|
||||
/// </summary>
|
||||
public List<vCardDeliveryAddressTypes> AddressType
|
||||
public List<vCardDeliveryAddressTypes> AddressType
|
||||
{
|
||||
get
|
||||
{
|
||||
@@ -219,6 +249,28 @@ namespace Thought.vCards
|
||||
}
|
||||
}
|
||||
|
||||
public string ExtendedAddress
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.extendedAddress ?? string.Empty;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.extendedAddress = value;
|
||||
}
|
||||
}
|
||||
public string PostOfficeBox
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.postOfficeBox ?? string.Empty;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.postOfficeBox = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -48,7 +48,7 @@ namespace Thought.vCards
|
||||
/// </summary>
|
||||
private Uri url;
|
||||
|
||||
|
||||
public string Extension { get; }
|
||||
|
||||
private string encodedData;
|
||||
|
||||
@@ -60,12 +60,13 @@ namespace Thought.vCards
|
||||
/// An array of bytes containing the raw data from
|
||||
/// any of the supported image formats.
|
||||
/// </param>
|
||||
public vCardPhoto(byte[] buffer)
|
||||
public vCardPhoto(byte[] buffer, string imageType)
|
||||
{
|
||||
if (buffer == null)
|
||||
throw new ArgumentNullException("buffer");
|
||||
|
||||
this.data = (byte[])buffer.Clone();
|
||||
this.Extension = imageType;
|
||||
}
|
||||
|
||||
|
||||
@@ -75,13 +76,14 @@ namespace Thought.vCards
|
||||
/// <param name="url">
|
||||
/// A URL pointing to an image.
|
||||
/// </param>
|
||||
public vCardPhoto(Uri url)
|
||||
public vCardPhoto(Uri url, string imageType)
|
||||
{
|
||||
|
||||
if (url == null)
|
||||
throw new ArgumentNullException("url");
|
||||
|
||||
this.url = url;
|
||||
this.Extension = imageType;
|
||||
}
|
||||
|
||||
|
||||
@@ -110,7 +112,7 @@ namespace Thought.vCards
|
||||
/// <param name="isEncoded">
|
||||
/// Boolean true if is encoded.
|
||||
/// </param>
|
||||
public vCardPhoto(string data, bool isEncoded)
|
||||
public vCardPhoto(string data, bool isEncoded, string imageType)
|
||||
{
|
||||
|
||||
if (string.IsNullOrEmpty(data))
|
||||
@@ -119,7 +121,7 @@ namespace Thought.vCards
|
||||
}
|
||||
|
||||
this.encodedData = data;
|
||||
|
||||
this.Extension = imageType;
|
||||
}
|
||||
|
||||
|
||||
@@ -291,6 +293,7 @@ namespace Thought.vCards
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The URL of the image.
|
||||
|
||||
@@ -1225,6 +1225,12 @@ namespace Thought.vCards
|
||||
if (addressParts.Length >= 3)
|
||||
deliveryAddress.Street = addressParts[2].Trim();
|
||||
|
||||
if (addressParts.Length >= 1)
|
||||
deliveryAddress.ExtendedAddress = addressParts[1].Trim();
|
||||
|
||||
if (addressParts.Length >= 0)
|
||||
deliveryAddress.PostOfficeBox = addressParts[0].Trim();
|
||||
|
||||
if (
|
||||
(string.IsNullOrEmpty(deliveryAddress.City)) &&
|
||||
(string.IsNullOrEmpty(deliveryAddress.Country)) &&
|
||||
@@ -1661,6 +1667,7 @@ namespace Thought.vCards
|
||||
// often consist of binary data.
|
||||
|
||||
vCardCertificate certificate = new vCardCertificate();
|
||||
|
||||
certificate.Data = (byte[])property.Value;
|
||||
|
||||
// TODO: Support other key types.
|
||||
@@ -1900,6 +1907,8 @@ namespace Thought.vCards
|
||||
private void ReadInto_PHOTO(vCard card, vCardProperty property)
|
||||
{
|
||||
|
||||
string imageType = property.Subproperties.GetValue("TYPE");
|
||||
|
||||
// The PHOTO property contains an embedded (encoded) image
|
||||
// or a link to an image. A URL (linked) image is supposed
|
||||
// to be indicated with the VALUE=URI subproperty.
|
||||
@@ -1914,7 +1923,7 @@ namespace Thought.vCards
|
||||
// rather than being encoded directly in the vCard.
|
||||
|
||||
card.Photos.Add(
|
||||
new vCardPhoto(new Uri(property.ToString())));
|
||||
new vCardPhoto(new Uri(property.ToString()), imageType));
|
||||
|
||||
|
||||
}
|
||||
@@ -1922,13 +1931,15 @@ namespace Thought.vCards
|
||||
{
|
||||
if (property.Value.GetType() == typeof(string))
|
||||
{
|
||||
card.Photos.Add(new vCardPhoto((string)property.Value, true));
|
||||
card.Photos.Add(new vCardPhoto((string)property.Value, true, imageType));
|
||||
}
|
||||
else
|
||||
{
|
||||
card.Photos.Add(new vCardPhoto((byte[])property.Value));
|
||||
card.Photos.Add(new vCardPhoto((byte[])property.Value, imageType));
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1020,8 +1020,10 @@ namespace Thought.vCards
|
||||
|
||||
if (doEmbedded)
|
||||
{
|
||||
properties.Add(
|
||||
new vCardProperty("PHOTO", photo.GetBytes()));
|
||||
|
||||
var EmbeddedProperty = new vCardProperty("PHOTO", photo.GetBytes());
|
||||
EmbeddedProperty.Subproperties.Add("TYPE", "JPG");
|
||||
properties.Add(EmbeddedProperty);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
66
vCardEditor/View/AboutDialog.Designer.cs
generated
66
vCardEditor/View/AboutDialog.Designer.cs
generated
@@ -53,7 +53,8 @@
|
||||
this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4);
|
||||
this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5);
|
||||
this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.tableLayoutPanel.Location = new System.Drawing.Point(9, 9);
|
||||
this.tableLayoutPanel.Location = new System.Drawing.Point(12, 11);
|
||||
this.tableLayoutPanel.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.tableLayoutPanel.Name = "tableLayoutPanel";
|
||||
this.tableLayoutPanel.RowCount = 6;
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
|
||||
@@ -62,19 +63,20 @@
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
|
||||
this.tableLayoutPanel.Size = new System.Drawing.Size(417, 265);
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F));
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F));
|
||||
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F));
|
||||
this.tableLayoutPanel.Size = new System.Drawing.Size(556, 326);
|
||||
this.tableLayoutPanel.TabIndex = 0;
|
||||
//
|
||||
// logoPictureBox
|
||||
//
|
||||
this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image")));
|
||||
this.logoPictureBox.Location = new System.Drawing.Point(3, 3);
|
||||
this.logoPictureBox.Location = new System.Drawing.Point(4, 4);
|
||||
this.logoPictureBox.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.logoPictureBox.Name = "logoPictureBox";
|
||||
this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6);
|
||||
this.logoPictureBox.Size = new System.Drawing.Size(109, 98);
|
||||
this.logoPictureBox.Size = new System.Drawing.Size(145, 121);
|
||||
this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||
this.logoPictureBox.TabIndex = 12;
|
||||
this.logoPictureBox.TabStop = false;
|
||||
@@ -82,11 +84,11 @@
|
||||
// labelProductName
|
||||
//
|
||||
this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelProductName.Location = new System.Drawing.Point(121, 0);
|
||||
this.labelProductName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
|
||||
this.labelProductName.MaximumSize = new System.Drawing.Size(0, 17);
|
||||
this.labelProductName.Location = new System.Drawing.Point(162, 0);
|
||||
this.labelProductName.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
|
||||
this.labelProductName.MaximumSize = new System.Drawing.Size(0, 21);
|
||||
this.labelProductName.Name = "labelProductName";
|
||||
this.labelProductName.Size = new System.Drawing.Size(293, 17);
|
||||
this.labelProductName.Size = new System.Drawing.Size(390, 21);
|
||||
this.labelProductName.TabIndex = 19;
|
||||
this.labelProductName.Text = "Nom du produit";
|
||||
this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
@@ -94,11 +96,11 @@
|
||||
// labelVersion
|
||||
//
|
||||
this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelVersion.Location = new System.Drawing.Point(121, 26);
|
||||
this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
|
||||
this.labelVersion.MaximumSize = new System.Drawing.Size(0, 17);
|
||||
this.labelVersion.Location = new System.Drawing.Point(162, 32);
|
||||
this.labelVersion.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
|
||||
this.labelVersion.MaximumSize = new System.Drawing.Size(0, 21);
|
||||
this.labelVersion.Name = "labelVersion";
|
||||
this.labelVersion.Size = new System.Drawing.Size(293, 17);
|
||||
this.labelVersion.Size = new System.Drawing.Size(390, 21);
|
||||
this.labelVersion.TabIndex = 0;
|
||||
this.labelVersion.Text = "Version";
|
||||
this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
@@ -106,11 +108,11 @@
|
||||
// labelCopyright
|
||||
//
|
||||
this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelCopyright.Location = new System.Drawing.Point(121, 52);
|
||||
this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
|
||||
this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 17);
|
||||
this.labelCopyright.Location = new System.Drawing.Point(162, 64);
|
||||
this.labelCopyright.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
|
||||
this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 21);
|
||||
this.labelCopyright.Name = "labelCopyright";
|
||||
this.labelCopyright.Size = new System.Drawing.Size(293, 17);
|
||||
this.labelCopyright.Size = new System.Drawing.Size(390, 21);
|
||||
this.labelCopyright.TabIndex = 21;
|
||||
this.labelCopyright.Text = "Copyright";
|
||||
this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
@@ -118,11 +120,11 @@
|
||||
// labelCompanyName
|
||||
//
|
||||
this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelCompanyName.Location = new System.Drawing.Point(121, 78);
|
||||
this.labelCompanyName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
|
||||
this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 17);
|
||||
this.labelCompanyName.Location = new System.Drawing.Point(162, 96);
|
||||
this.labelCompanyName.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
|
||||
this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 21);
|
||||
this.labelCompanyName.Name = "labelCompanyName";
|
||||
this.labelCompanyName.Size = new System.Drawing.Size(293, 17);
|
||||
this.labelCompanyName.Size = new System.Drawing.Size(390, 21);
|
||||
this.labelCompanyName.TabIndex = 22;
|
||||
this.labelCompanyName.Text = "Nom de la société";
|
||||
this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
@@ -130,13 +132,13 @@
|
||||
// textBoxDescription
|
||||
//
|
||||
this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.textBoxDescription.Location = new System.Drawing.Point(121, 107);
|
||||
this.textBoxDescription.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
|
||||
this.textBoxDescription.Location = new System.Drawing.Point(162, 132);
|
||||
this.textBoxDescription.Margin = new System.Windows.Forms.Padding(8, 4, 4, 4);
|
||||
this.textBoxDescription.Multiline = true;
|
||||
this.textBoxDescription.Name = "textBoxDescription";
|
||||
this.textBoxDescription.ReadOnly = true;
|
||||
this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
||||
this.textBoxDescription.Size = new System.Drawing.Size(293, 126);
|
||||
this.textBoxDescription.Size = new System.Drawing.Size(390, 155);
|
||||
this.textBoxDescription.TabIndex = 23;
|
||||
this.textBoxDescription.TabStop = false;
|
||||
this.textBoxDescription.Text = "Description";
|
||||
@@ -145,24 +147,26 @@
|
||||
//
|
||||
this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.okButton.Location = new System.Drawing.Point(339, 239);
|
||||
this.okButton.Location = new System.Drawing.Point(452, 295);
|
||||
this.okButton.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.okButton.Name = "okButton";
|
||||
this.okButton.Size = new System.Drawing.Size(75, 23);
|
||||
this.okButton.Size = new System.Drawing.Size(100, 27);
|
||||
this.okButton.TabIndex = 24;
|
||||
this.okButton.Text = "&OK";
|
||||
//
|
||||
// AboutDialog
|
||||
//
|
||||
this.AcceptButton = this.okButton;
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(435, 283);
|
||||
this.ClientSize = new System.Drawing.Size(580, 348);
|
||||
this.Controls.Add(this.tableLayoutPanel);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||
this.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.MaximizeBox = false;
|
||||
this.MinimizeBox = false;
|
||||
this.Name = "AboutDialog";
|
||||
this.Padding = new System.Windows.Forms.Padding(9);
|
||||
this.Padding = new System.Windows.Forms.Padding(12, 11, 12, 11);
|
||||
this.ShowIcon = false;
|
||||
this.ShowInTaskbar = false;
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||
|
||||
@@ -120,288 +120,288 @@
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="logoPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
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
|
||||
6/8DUMTZ0FH1phIAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
||||
26
vCardEditor/View/ConfigDialog.Designer.cs
generated
26
vCardEditor/View/ConfigDialog.Designer.cs
generated
@@ -35,41 +35,45 @@
|
||||
//
|
||||
// btnClose
|
||||
//
|
||||
this.btnClose.Location = new System.Drawing.Point(253, 347);
|
||||
this.btnClose.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.btnClose.Location = new System.Drawing.Point(337, 427);
|
||||
this.btnClose.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.btnClose.Name = "btnClose";
|
||||
this.btnClose.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnClose.Size = new System.Drawing.Size(100, 28);
|
||||
this.btnClose.TabIndex = 0;
|
||||
this.btnClose.Text = "Close";
|
||||
this.btnClose.UseVisualStyleBackColor = true;
|
||||
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
|
||||
//
|
||||
// pgConfig
|
||||
//
|
||||
this.pgConfig.Location = new System.Drawing.Point(12, 12);
|
||||
this.pgConfig.Location = new System.Drawing.Point(16, 15);
|
||||
this.pgConfig.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.pgConfig.Name = "pgConfig";
|
||||
this.pgConfig.Size = new System.Drawing.Size(316, 329);
|
||||
this.pgConfig.Size = new System.Drawing.Size(421, 405);
|
||||
this.pgConfig.TabIndex = 1;
|
||||
//
|
||||
// btnCancel
|
||||
//
|
||||
this.btnCancel.Location = new System.Drawing.Point(172, 347);
|
||||
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.btnCancel.Location = new System.Drawing.Point(229, 427);
|
||||
this.btnCancel.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.btnCancel.Name = "btnCancel";
|
||||
this.btnCancel.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnCancel.Size = new System.Drawing.Size(100, 28);
|
||||
this.btnCancel.TabIndex = 0;
|
||||
this.btnCancel.Text = "Cancel";
|
||||
this.btnCancel.UseVisualStyleBackColor = true;
|
||||
this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
|
||||
//
|
||||
// ConfigDialog
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(337, 382);
|
||||
this.ClientSize = new System.Drawing.Size(449, 470);
|
||||
this.Controls.Add(this.pgConfig);
|
||||
this.Controls.Add(this.btnCancel);
|
||||
this.Controls.Add(this.btnClose);
|
||||
this.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.Name = "ConfigDialog";
|
||||
this.Text = "ConfigDialog";
|
||||
this.Text = "Configuration Dialog";
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
@@ -10,19 +10,8 @@ namespace vCardEditor.View
|
||||
public ConfigDialog()
|
||||
{
|
||||
InitializeComponent();
|
||||
ConfigRepository conf = ConfigRepository.Instance;//.Clone();
|
||||
ConfigRepository conf = ConfigRepository.Instance;//
|
||||
pgConfig.SelectedObject = conf;
|
||||
}
|
||||
|
||||
private void btnClose_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
this.Close();
|
||||
}
|
||||
|
||||
private void btnCancel_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,9 +112,9 @@
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
165
vCardEditor/View/Customs/AddAddressDialog.Designer.cs
generated
Normal file
165
vCardEditor/View/Customs/AddAddressDialog.Designer.cs
generated
Normal file
@@ -0,0 +1,165 @@
|
||||
|
||||
namespace vCardEditor.View.Customs
|
||||
{
|
||||
partial class AddAddressDialog
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.cbHome = new System.Windows.Forms.CheckBox();
|
||||
this.cbWork = new System.Windows.Forms.CheckBox();
|
||||
this.cbPostal = new System.Windows.Forms.CheckBox();
|
||||
this.cbDomestic = new System.Windows.Forms.CheckBox();
|
||||
this.btnOK = new System.Windows.Forms.Button();
|
||||
this.btnCancel = new System.Windows.Forms.Button();
|
||||
this.cbInternational = new System.Windows.Forms.CheckBox();
|
||||
this.cbCustom = new System.Windows.Forms.CheckBox();
|
||||
this.textBox1 = new System.Windows.Forms.TextBox();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// cbHome
|
||||
//
|
||||
this.cbHome.AutoSize = true;
|
||||
this.cbHome.Location = new System.Drawing.Point(12, 12);
|
||||
this.cbHome.Name = "cbHome";
|
||||
this.cbHome.Size = new System.Drawing.Size(67, 21);
|
||||
this.cbHome.TabIndex = 0;
|
||||
this.cbHome.Text = "Home";
|
||||
this.cbHome.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// cbWork
|
||||
//
|
||||
this.cbWork.AutoSize = true;
|
||||
this.cbWork.Location = new System.Drawing.Point(12, 40);
|
||||
this.cbWork.Name = "cbWork";
|
||||
this.cbWork.Size = new System.Drawing.Size(63, 21);
|
||||
this.cbWork.TabIndex = 1;
|
||||
this.cbWork.Text = "Work";
|
||||
this.cbWork.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// cbPostal
|
||||
//
|
||||
this.cbPostal.AutoSize = true;
|
||||
this.cbPostal.Location = new System.Drawing.Point(12, 67);
|
||||
this.cbPostal.Name = "cbPostal";
|
||||
this.cbPostal.Size = new System.Drawing.Size(69, 21);
|
||||
this.cbPostal.TabIndex = 2;
|
||||
this.cbPostal.Text = "Postal";
|
||||
this.cbPostal.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// cbDomestic
|
||||
//
|
||||
this.cbDomestic.AutoSize = true;
|
||||
this.cbDomestic.Location = new System.Drawing.Point(12, 94);
|
||||
this.cbDomestic.Name = "cbDomestic";
|
||||
this.cbDomestic.Size = new System.Drawing.Size(88, 21);
|
||||
this.cbDomestic.TabIndex = 3;
|
||||
this.cbDomestic.Text = "Domestic";
|
||||
this.cbDomestic.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// btnOK
|
||||
//
|
||||
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.btnOK.Location = new System.Drawing.Point(95, 187);
|
||||
this.btnOK.Name = "btnOK";
|
||||
this.btnOK.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnOK.TabIndex = 7;
|
||||
this.btnOK.Text = "OK";
|
||||
this.btnOK.UseVisualStyleBackColor = true;
|
||||
this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
|
||||
//
|
||||
// btnCancel
|
||||
//
|
||||
this.btnCancel.CausesValidation = false;
|
||||
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.btnCancel.Location = new System.Drawing.Point(176, 187);
|
||||
this.btnCancel.Name = "btnCancel";
|
||||
this.btnCancel.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnCancel.TabIndex = 8;
|
||||
this.btnCancel.Text = "Cancel";
|
||||
this.btnCancel.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// cbInternational
|
||||
//
|
||||
this.cbInternational.AutoSize = true;
|
||||
this.cbInternational.Location = new System.Drawing.Point(12, 121);
|
||||
this.cbInternational.Name = "cbInternational";
|
||||
this.cbInternational.Size = new System.Drawing.Size(108, 21);
|
||||
this.cbInternational.TabIndex = 9;
|
||||
this.cbInternational.Text = "International";
|
||||
this.cbInternational.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// cbCustom
|
||||
//
|
||||
this.cbCustom.AutoSize = true;
|
||||
this.cbCustom.Location = new System.Drawing.Point(12, 148);
|
||||
this.cbCustom.Name = "cbCustom";
|
||||
this.cbCustom.Size = new System.Drawing.Size(81, 21);
|
||||
this.cbCustom.TabIndex = 10;
|
||||
this.cbCustom.Text = "Custom:";
|
||||
this.cbCustom.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// textBox1
|
||||
//
|
||||
this.textBox1.Location = new System.Drawing.Point(90, 149);
|
||||
this.textBox1.Name = "textBox1";
|
||||
this.textBox1.Size = new System.Drawing.Size(161, 22);
|
||||
this.textBox1.TabIndex = 11;
|
||||
//
|
||||
// AddAddress
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(263, 223);
|
||||
this.Controls.Add(this.textBox1);
|
||||
this.Controls.Add(this.cbCustom);
|
||||
this.Controls.Add(this.cbInternational);
|
||||
this.Controls.Add(this.btnCancel);
|
||||
this.Controls.Add(this.btnOK);
|
||||
this.Controls.Add(this.cbDomestic);
|
||||
this.Controls.Add(this.cbPostal);
|
||||
this.Controls.Add(this.cbWork);
|
||||
this.Controls.Add(this.cbHome);
|
||||
this.Name = "AddAddress";
|
||||
this.Text = "Address Type";
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.CheckBox cbHome;
|
||||
private System.Windows.Forms.CheckBox cbWork;
|
||||
private System.Windows.Forms.CheckBox cbPostal;
|
||||
private System.Windows.Forms.CheckBox cbDomestic;
|
||||
private System.Windows.Forms.Button btnOK;
|
||||
private System.Windows.Forms.Button btnCancel;
|
||||
private System.Windows.Forms.CheckBox cbInternational;
|
||||
private System.Windows.Forms.CheckBox cbCustom;
|
||||
private System.Windows.Forms.TextBox textBox1;
|
||||
}
|
||||
}
|
||||
86
vCardEditor/View/Customs/AddAddressDialog.cs
Normal file
86
vCardEditor/View/Customs/AddAddressDialog.cs
Normal file
@@ -0,0 +1,86 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using Thought.vCards;
|
||||
|
||||
namespace vCardEditor.View.Customs
|
||||
{
|
||||
public partial class AddAddressDialog : Form
|
||||
{
|
||||
public List<vCardDeliveryAddressTypes> Addresses { get;}
|
||||
private readonly List<CheckBox> _checkBoxes;
|
||||
|
||||
public AddAddressDialog()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
_checkBoxes = Controls.OfType<CheckBox>().ToList();
|
||||
Addresses = new List<vCardDeliveryAddressTypes>();
|
||||
}
|
||||
|
||||
public AddAddressDialog(List<vCardDeliveryAddressTypes> addressCollection)
|
||||
{
|
||||
InitializeComponent();
|
||||
Addresses = addressCollection;
|
||||
_checkBoxes = Controls.OfType<CheckBox>().ToList();
|
||||
|
||||
foreach (var item in addressCollection)
|
||||
{
|
||||
switch (item.ToString())
|
||||
{
|
||||
case "Home":
|
||||
cbHome.Checked = true;
|
||||
break;
|
||||
|
||||
case "Work":
|
||||
cbWork.Checked = true;
|
||||
break;
|
||||
|
||||
case "Postal":
|
||||
cbPostal.Checked = true;
|
||||
break;
|
||||
|
||||
case "Domestic":
|
||||
cbDomestic.Checked = true;
|
||||
break;
|
||||
|
||||
case "International":
|
||||
cbInternational.Checked = true;
|
||||
break;
|
||||
case "Default":
|
||||
cbCustom.Checked = true;
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void btnOK_Click(object sender, EventArgs e)
|
||||
{
|
||||
var total = _checkBoxes
|
||||
.Where(checkBox => checkBox.Checked);
|
||||
|
||||
if (total.Count() == 0)
|
||||
{
|
||||
MessageBox.Show("One item must be checked!");
|
||||
DialogResult = DialogResult.None;
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var item in total)
|
||||
{
|
||||
var enumType = (vCardDeliveryAddressTypes)Enum.Parse(typeof(vCardDeliveryAddressTypes), item.Text, true);
|
||||
Addresses.Add(enumType);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
120
vCardEditor/View/Customs/AddAddressDialog.resx
Normal file
120
vCardEditor/View/Customs/AddAddressDialog.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
252
vCardEditor/View/Customs/AddressBox.Designer.cs
generated
Normal file
252
vCardEditor/View/Customs/AddressBox.Designer.cs
generated
Normal file
@@ -0,0 +1,252 @@
|
||||
|
||||
namespace vCardEditor.View.Customs
|
||||
{
|
||||
partial class AddressBox
|
||||
{
|
||||
/// <summary>
|
||||
/// Variable nécessaire au concepteur.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Nettoyage des ressources utilisées.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true si les ressources managées doivent être supprimées ; sinon, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Code généré par le Concepteur de composants
|
||||
|
||||
/// <summary>
|
||||
/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
|
||||
/// le contenu de cette méthode avec l'éditeur de code.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.ExtAddrValue = new vCardEditor.View.StateTextBox();
|
||||
this.ExtAdressLabel = new System.Windows.Forms.Label();
|
||||
this.StreetLabel = new System.Windows.Forms.Label();
|
||||
this.StreetValue = new vCardEditor.View.StateTextBox();
|
||||
this.POBoxLabel = new System.Windows.Forms.Label();
|
||||
this.CountryValue = new vCardEditor.View.StateTextBox();
|
||||
this.Country = new System.Windows.Forms.Label();
|
||||
this.POBoxValue = new vCardEditor.View.StateTextBox();
|
||||
this.CityLabel = new System.Windows.Forms.Label();
|
||||
this.RegionValue = new vCardEditor.View.StateTextBox();
|
||||
this.CityValue = new vCardEditor.View.StateTextBox();
|
||||
this.StateLabel = new System.Windows.Forms.Label();
|
||||
this.ZipLabel = new System.Windows.Forms.Label();
|
||||
this.ZipValue = new vCardEditor.View.StateTextBox();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// ExtAddrValue
|
||||
//
|
||||
this.ExtAddrValue.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.ExtAddrValue.Location = new System.Drawing.Point(90, 45);
|
||||
this.ExtAddrValue.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.ExtAddrValue.Name = "ExtAddrValue";
|
||||
this.ExtAddrValue.oldText = null;
|
||||
this.ExtAddrValue.Size = new System.Drawing.Size(237, 22);
|
||||
this.ExtAddrValue.TabIndex = 27;
|
||||
this.ExtAddrValue.LostFocus += new System.EventHandler(this.Value_TextChanged);
|
||||
this.ExtAddrValue.Validated += new System.EventHandler(this.Value_TextChanged);
|
||||
//
|
||||
// ExtAdressLabel
|
||||
//
|
||||
this.ExtAdressLabel.Location = new System.Drawing.Point(1, 42);
|
||||
this.ExtAdressLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.ExtAdressLabel.Name = "ExtAdressLabel";
|
||||
this.ExtAdressLabel.Size = new System.Drawing.Size(87, 23);
|
||||
this.ExtAdressLabel.TabIndex = 26;
|
||||
this.ExtAdressLabel.Text = "Ext Address:";
|
||||
this.ExtAdressLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||
//
|
||||
// StreetLabel
|
||||
//
|
||||
this.StreetLabel.Location = new System.Drawing.Point(2, 14);
|
||||
this.StreetLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.StreetLabel.Name = "StreetLabel";
|
||||
this.StreetLabel.Size = new System.Drawing.Size(65, 23);
|
||||
this.StreetLabel.TabIndex = 14;
|
||||
this.StreetLabel.Text = "Address:";
|
||||
this.StreetLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// StreetValue
|
||||
//
|
||||
this.StreetValue.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.StreetValue.Location = new System.Drawing.Point(90, 14);
|
||||
this.StreetValue.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.StreetValue.Name = "StreetValue";
|
||||
this.StreetValue.oldText = "";
|
||||
this.StreetValue.Size = new System.Drawing.Size(613, 22);
|
||||
this.StreetValue.TabIndex = 15;
|
||||
this.StreetValue.LostFocus += new System.EventHandler(this.Value_TextChanged);
|
||||
this.StreetValue.Validated += new System.EventHandler(this.Value_TextChanged);
|
||||
//
|
||||
// POBoxLabel
|
||||
//
|
||||
this.POBoxLabel.Location = new System.Drawing.Point(334, 75);
|
||||
this.POBoxLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.POBoxLabel.Name = "POBoxLabel";
|
||||
this.POBoxLabel.Size = new System.Drawing.Size(59, 23);
|
||||
this.POBoxLabel.TabIndex = 16;
|
||||
this.POBoxLabel.Text = "PO Box:";
|
||||
this.POBoxLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
|
||||
//
|
||||
// CountryValue
|
||||
//
|
||||
this.CountryValue.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.CountryValue.Location = new System.Drawing.Point(579, 76);
|
||||
this.CountryValue.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.CountryValue.Name = "CountryValue";
|
||||
this.CountryValue.oldText = null;
|
||||
this.CountryValue.Size = new System.Drawing.Size(125, 22);
|
||||
this.CountryValue.TabIndex = 25;
|
||||
this.CountryValue.LostFocus += new System.EventHandler(this.Value_TextChanged);
|
||||
this.CountryValue.Validated += new System.EventHandler(this.Value_TextChanged);
|
||||
//
|
||||
// Country
|
||||
//
|
||||
this.Country.Location = new System.Drawing.Point(505, 76);
|
||||
this.Country.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.Country.Name = "Country";
|
||||
this.Country.Size = new System.Drawing.Size(65, 23);
|
||||
this.Country.TabIndex = 24;
|
||||
this.Country.Text = "Country:";
|
||||
this.Country.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// POBoxValue
|
||||
//
|
||||
this.POBoxValue.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.POBoxValue.Location = new System.Drawing.Point(397, 75);
|
||||
this.POBoxValue.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.POBoxValue.Name = "POBoxValue";
|
||||
this.POBoxValue.oldText = null;
|
||||
this.POBoxValue.Size = new System.Drawing.Size(100, 22);
|
||||
this.POBoxValue.TabIndex = 17;
|
||||
this.POBoxValue.LostFocus += new System.EventHandler(this.Value_TextChanged);
|
||||
this.POBoxValue.Validated += new System.EventHandler(this.Value_TextChanged);
|
||||
//
|
||||
// CityLabel
|
||||
//
|
||||
this.CityLabel.Location = new System.Drawing.Point(338, 45);
|
||||
this.CityLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.CityLabel.Name = "CityLabel";
|
||||
this.CityLabel.Size = new System.Drawing.Size(32, 23);
|
||||
this.CityLabel.TabIndex = 18;
|
||||
this.CityLabel.Text = "City:";
|
||||
this.CityLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// RegionValue
|
||||
//
|
||||
this.RegionValue.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.RegionValue.Location = new System.Drawing.Point(90, 75);
|
||||
this.RegionValue.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.RegionValue.Name = "RegionValue";
|
||||
this.RegionValue.oldText = null;
|
||||
this.RegionValue.Size = new System.Drawing.Size(236, 22);
|
||||
this.RegionValue.TabIndex = 23;
|
||||
this.RegionValue.LostFocus += new System.EventHandler(this.Value_TextChanged);
|
||||
this.RegionValue.Validated += new System.EventHandler(this.Value_TextChanged);
|
||||
//
|
||||
// CityValue
|
||||
//
|
||||
this.CityValue.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.CityValue.Location = new System.Drawing.Point(397, 45);
|
||||
this.CityValue.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.CityValue.Name = "CityValue";
|
||||
this.CityValue.oldText = null;
|
||||
this.CityValue.Size = new System.Drawing.Size(127, 22);
|
||||
this.CityValue.TabIndex = 19;
|
||||
this.CityValue.LostFocus += new System.EventHandler(this.Value_TextChanged);
|
||||
this.CityValue.Validated += new System.EventHandler(this.Value_TextChanged);
|
||||
//
|
||||
// StateLabel
|
||||
//
|
||||
this.StateLabel.Location = new System.Drawing.Point(17, 74);
|
||||
this.StateLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.StateLabel.Name = "StateLabel";
|
||||
this.StateLabel.Size = new System.Drawing.Size(61, 23);
|
||||
this.StateLabel.TabIndex = 22;
|
||||
this.StateLabel.Text = "Region:";
|
||||
this.StateLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// ZipLabel
|
||||
//
|
||||
this.ZipLabel.Location = new System.Drawing.Point(533, 45);
|
||||
this.ZipLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.ZipLabel.Name = "ZipLabel";
|
||||
this.ZipLabel.Size = new System.Drawing.Size(37, 23);
|
||||
this.ZipLabel.TabIndex = 20;
|
||||
this.ZipLabel.Text = "Zip:";
|
||||
this.ZipLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
//
|
||||
// ZipValue
|
||||
//
|
||||
this.ZipValue.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.ZipValue.Location = new System.Drawing.Point(579, 46);
|
||||
this.ZipValue.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.ZipValue.Name = "ZipValue";
|
||||
this.ZipValue.oldText = null;
|
||||
this.ZipValue.Size = new System.Drawing.Size(124, 22);
|
||||
this.ZipValue.TabIndex = 21;
|
||||
this.ZipValue.LostFocus += new System.EventHandler(this.Value_TextChanged);
|
||||
this.ZipValue.Validated += new System.EventHandler(this.Value_TextChanged);
|
||||
//
|
||||
// AddressBox
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.ExtAddrValue);
|
||||
this.Controls.Add(this.ExtAdressLabel);
|
||||
this.Controls.Add(this.StreetLabel);
|
||||
this.Controls.Add(this.StreetValue);
|
||||
this.Controls.Add(this.POBoxLabel);
|
||||
this.Controls.Add(this.CountryValue);
|
||||
this.Controls.Add(this.Country);
|
||||
this.Controls.Add(this.POBoxValue);
|
||||
this.Controls.Add(this.CityLabel);
|
||||
this.Controls.Add(this.RegionValue);
|
||||
this.Controls.Add(this.CityValue);
|
||||
this.Controls.Add(this.StateLabel);
|
||||
this.Controls.Add(this.ZipLabel);
|
||||
this.Controls.Add(this.ZipValue);
|
||||
this.Name = "AddressBox";
|
||||
this.Size = new System.Drawing.Size(706, 104);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
internal StateTextBox ExtAddrValue;
|
||||
internal System.Windows.Forms.Label ExtAdressLabel;
|
||||
internal System.Windows.Forms.Label StreetLabel;
|
||||
internal StateTextBox StreetValue;
|
||||
internal System.Windows.Forms.Label POBoxLabel;
|
||||
internal StateTextBox CountryValue;
|
||||
internal System.Windows.Forms.Label Country;
|
||||
internal StateTextBox POBoxValue;
|
||||
internal System.Windows.Forms.Label CityLabel;
|
||||
internal StateTextBox RegionValue;
|
||||
internal StateTextBox CityValue;
|
||||
internal System.Windows.Forms.Label StateLabel;
|
||||
internal System.Windows.Forms.Label ZipLabel;
|
||||
internal StateTextBox ZipValue;
|
||||
}
|
||||
}
|
||||
65
vCardEditor/View/Customs/AddressBox.cs
Normal file
65
vCardEditor/View/Customs/AddressBox.cs
Normal file
@@ -0,0 +1,65 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Windows.Forms;
|
||||
using Thought.vCards;
|
||||
|
||||
namespace vCardEditor.View.Customs
|
||||
{
|
||||
public partial class AddressBox : UserControl
|
||||
{
|
||||
public event EventHandler TextChangedEvent;
|
||||
public List<vCardDeliveryAddressTypes> AddressType { get; set; }
|
||||
|
||||
|
||||
public AddressBox(string street, string city, string region, string country, string postalCode,
|
||||
string extendedAddress, string postOfficeBox, List<vCardDeliveryAddressTypes> addressType)
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
this.AddressType = addressType;
|
||||
CityValue.Text = city;
|
||||
CityValue.oldText = city;
|
||||
|
||||
CountryValue.Text = country;
|
||||
CountryValue.oldText = country;
|
||||
|
||||
ZipValue.Text = postalCode;
|
||||
ZipValue.oldText = postalCode;
|
||||
|
||||
RegionValue.Text = region;
|
||||
RegionValue.oldText = region;
|
||||
|
||||
StreetValue.Text = street;
|
||||
StreetValue.oldText = street;
|
||||
|
||||
ExtAddrValue.Text = extendedAddress;
|
||||
ExtAddrValue.oldText = extendedAddress;
|
||||
|
||||
POBoxValue.Text = postOfficeBox;
|
||||
POBoxValue.oldText = postOfficeBox;
|
||||
}
|
||||
|
||||
private void Value_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
TextChangedEvent?.Invoke(sender, e);
|
||||
}
|
||||
|
||||
public vCardDeliveryAddress getDeliveryAddress()
|
||||
{
|
||||
var deliveryAddress = new vCardDeliveryAddress
|
||||
{
|
||||
City = CityValue.Text,
|
||||
Country = CountryValue.Text,
|
||||
PostalCode = ZipValue.Text,
|
||||
Region = RegionValue.Text,
|
||||
Street = StreetValue.Text,
|
||||
ExtendedAddress = ExtAddrValue.Text,
|
||||
PostOfficeBox = POBoxValue.Text,
|
||||
AddressType = AddressType
|
||||
};
|
||||
|
||||
return deliveryAddress;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
120
vCardEditor/View/Customs/AddressBox.resx
Normal file
120
vCardEditor/View/Customs/AddressBox.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
230
vCardEditor/View/Customs/AddressTabControl.cs
Normal file
230
vCardEditor/View/Customs/AddressTabControl.cs
Normal file
@@ -0,0 +1,230 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows.Forms;
|
||||
using Thought.vCards;
|
||||
using VCFEditor.View;
|
||||
|
||||
namespace vCardEditor.View.Customs
|
||||
{
|
||||
class AddressTabControl : TabControl
|
||||
{
|
||||
public event EventHandler TextChangedEvent;
|
||||
public event EventHandler<EventArg<List<vCardDeliveryAddressTypes>>> AddTab;
|
||||
public event EventHandler<EventArg<int>> RemoveTab;
|
||||
public event EventHandler<EventArg<List<vCardDeliveryAddressTypes>>> ModifyTab;
|
||||
|
||||
public AddressTabControl()
|
||||
{
|
||||
Padding = new Point(20, 20);
|
||||
ShowToolTips = true;
|
||||
DrawMode = TabDrawMode.OwnerDrawFixed;
|
||||
|
||||
DrawItem += tbcAddress_DrawItem;
|
||||
MouseDown += tbcAddress_MouseDown;
|
||||
Selecting += tbcAddress_Selecting;
|
||||
HandleCreated += tbcAddress_HandleCreated;
|
||||
MouseDoubleClick += AddressTabControl_MouseDoubleClick;
|
||||
|
||||
}
|
||||
|
||||
public void getDeliveryAddress(vCard card)
|
||||
{
|
||||
if (TabCount < 2)
|
||||
return;
|
||||
|
||||
card.DeliveryAddresses.Clear();
|
||||
|
||||
for (int i = 0; i < TabCount - 1; i++)
|
||||
{
|
||||
if (TabPages[i].Controls.Count == 0) continue;
|
||||
AddressBox adr = TabPages[i].Controls[0] as AddressBox;
|
||||
card.DeliveryAddresses.Add(adr.getDeliveryAddress());
|
||||
}
|
||||
}
|
||||
|
||||
private void AddressTabControl_MouseDoubleClick(object sender, MouseEventArgs e)
|
||||
{
|
||||
TabPage SlectedTab;
|
||||
for (int i = 0; i < TabPages.Count - 1; ++i)
|
||||
{
|
||||
if (GetTabRect(i).Contains(e.Location))
|
||||
{
|
||||
var AddressBox = TabPages[i].Controls[0] as AddressBox;
|
||||
|
||||
var diag = new AddAddressDialog(AddressBox.AddressType);
|
||||
|
||||
if (diag.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
SlectedTab = TabPages[i];
|
||||
SelectedTab.Text = GetTabTitle(diag.Addresses);
|
||||
SelectedTab.ToolTipText = string.Join(",", diag.Addresses.ConvertAll(f => f.ToString()));
|
||||
|
||||
ModifyTab?.Invoke(sender, new EventArg<List<vCardDeliveryAddressTypes>>(diag.Addresses));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
|
||||
private const int TCM_SETMINTABWIDTH = 0x1300 + 49;
|
||||
private void tbcAddress_HandleCreated(object sender, EventArgs e)
|
||||
{
|
||||
SendMessage(Handle, TCM_SETMINTABWIDTH, IntPtr.Zero, (IntPtr)16);
|
||||
}
|
||||
|
||||
|
||||
private void tbcAddress_Selecting(object sender, TabControlCancelEventArgs e)
|
||||
{
|
||||
if (e.TabPageIndex == TabCount - 1)
|
||||
e.Cancel = true;
|
||||
}
|
||||
|
||||
|
||||
private void tbcAddress_MouseDown(object sender, MouseEventArgs e)
|
||||
{
|
||||
var lastIndex = TabCount - 1;
|
||||
if (GetTabRect(lastIndex).Contains(e.Location))
|
||||
{
|
||||
var diag = new AddAddressDialog();
|
||||
if (diag.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
vCardDeliveryAddress da = new vCardDeliveryAddress();
|
||||
da.AddressType = diag.Addresses;
|
||||
AddtabForAddress(da);
|
||||
AddTab?.Invoke(sender, new EventArg<List<vCardDeliveryAddressTypes>>(diag.Addresses));
|
||||
SelectedIndex = TabCount - 1;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
for (var i = 0; i < TabPages.Count; i++)
|
||||
{
|
||||
var tabRect = GetTabRect(i);
|
||||
tabRect.Inflate(-2, -2);
|
||||
var closeImage = Properties.Resources.Close;
|
||||
var imageRect = new Rectangle(
|
||||
(tabRect.Right - closeImage.Width),
|
||||
tabRect.Top + (tabRect.Height - closeImage.Height) / 2,
|
||||
closeImage.Width, closeImage.Height);
|
||||
|
||||
if (imageRect.Contains(e.Location))
|
||||
{
|
||||
if (MessageBox.Show("Remove tab?", "Asking", MessageBoxButtons.YesNo) == DialogResult.Yes)
|
||||
{
|
||||
TabPages.RemoveAt(i);
|
||||
SelectedIndex = 0;
|
||||
RemoveTab?.Invoke(sender, new EventArg<int>(i));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void tbcAddress_DrawItem(object sender, DrawItemEventArgs e)
|
||||
{
|
||||
if (e.Index > TabCount - 1)
|
||||
return;
|
||||
|
||||
var tabRect = GetTabRect(e.Index);
|
||||
tabRect.Inflate(-2, -2);
|
||||
|
||||
if (e.Index == TabCount - 1)
|
||||
{
|
||||
var addImage = Properties.Resources.Add;
|
||||
e.Graphics.DrawImage(addImage,
|
||||
tabRect.Left + (tabRect.Width - addImage.Width) / 2,
|
||||
tabRect.Top + (tabRect.Height - addImage.Height) / 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
var closeImage = Properties.Resources.Close;
|
||||
e.Graphics.DrawImage(closeImage,
|
||||
(tabRect.Right - closeImage.Width),
|
||||
tabRect.Top + (tabRect.Height - closeImage.Height) / 2);
|
||||
|
||||
TabPage SelectedTab = TabPages[e.Index];
|
||||
Rectangle HeaderRect = GetTabRect(e.Index);
|
||||
SolidBrush TextBrush = new SolidBrush(Color.Black);
|
||||
StringFormat sf = new StringFormat
|
||||
{
|
||||
LineAlignment = StringAlignment.Center
|
||||
};
|
||||
|
||||
if (e.State == DrawItemState.Selected)
|
||||
{
|
||||
Font BoldFont = new Font(Font.Name, Font.Size, FontStyle.Bold);
|
||||
|
||||
e.Graphics.DrawString(SelectedTab.Text, BoldFont, TextBrush, HeaderRect, sf);
|
||||
}
|
||||
else
|
||||
e.Graphics.DrawString(SelectedTab.Text , e.Font, TextBrush, HeaderRect, sf);
|
||||
|
||||
TextBrush.Dispose();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void SetAddresses(vCard card)
|
||||
{
|
||||
ClearTabs();
|
||||
AddTabForEveryAddress(card);
|
||||
}
|
||||
|
||||
private void AddTabForEveryAddress(vCard card)
|
||||
{
|
||||
foreach (var item in card.DeliveryAddresses)
|
||||
AddtabForAddress(item);
|
||||
SelectedIndex = 0;
|
||||
}
|
||||
|
||||
private void AddtabForAddress(vCardDeliveryAddress da)
|
||||
{
|
||||
string title = GetTabTitle(da.AddressType);
|
||||
|
||||
var page = new TabPage($" {title} ");
|
||||
TabPages.Insert(TabCount - 1, page);
|
||||
|
||||
var ab = new AddressBox(da.Street, da.City, da.Region, da.Country,
|
||||
da.PostalCode, da.ExtendedAddress, da.PostOfficeBox, da.AddressType);
|
||||
|
||||
ab.TextChangedEvent += (s, e) => TextChangedEvent?.Invoke(s, e);
|
||||
page.Controls.Add(ab);
|
||||
page.ToolTipText = string.Join(",", da.AddressType.ConvertAll(f => f.ToString()));
|
||||
|
||||
|
||||
}
|
||||
|
||||
private string GetTabTitle(List<vCardDeliveryAddressTypes> addressTypes)
|
||||
{
|
||||
var title = string.Empty;
|
||||
if (addressTypes.Count > 0)
|
||||
{
|
||||
title = addressTypes[0].ToString();
|
||||
if (addressTypes.Count > 1)
|
||||
title += "...";
|
||||
}
|
||||
|
||||
return title;
|
||||
}
|
||||
|
||||
private void ClearTabs()
|
||||
{
|
||||
|
||||
//Remove every tab (except "+"). We don't call Clear() as it doesn't free memory.
|
||||
while (TabCount > 1)
|
||||
TabPages[0].Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
119
vCardEditor/View/Customs/ColumnsDialog.Designer.cs
generated
Normal file
119
vCardEditor/View/Customs/ColumnsDialog.Designer.cs
generated
Normal file
@@ -0,0 +1,119 @@
|
||||
|
||||
namespace vCardEditor.View.Customs
|
||||
{
|
||||
partial class ColumnsDialog
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.cbFamilyName = new System.Windows.Forms.CheckBox();
|
||||
this.cbCellular = new System.Windows.Forms.CheckBox();
|
||||
this.cbName = new System.Windows.Forms.CheckBox();
|
||||
this.btnCancel = new System.Windows.Forms.Button();
|
||||
this.btnOK = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// cbFamilyName
|
||||
//
|
||||
this.cbFamilyName.AutoSize = true;
|
||||
this.cbFamilyName.Location = new System.Drawing.Point(12, 39);
|
||||
this.cbFamilyName.Name = "cbFamilyName";
|
||||
this.cbFamilyName.Size = new System.Drawing.Size(107, 21);
|
||||
this.cbFamilyName.TabIndex = 5;
|
||||
this.cbFamilyName.Text = "FamilyName";
|
||||
this.cbFamilyName.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// cbCellular
|
||||
//
|
||||
this.cbCellular.AutoSize = true;
|
||||
this.cbCellular.Location = new System.Drawing.Point(12, 66);
|
||||
this.cbCellular.Name = "cbCellular";
|
||||
this.cbCellular.Size = new System.Drawing.Size(77, 21);
|
||||
this.cbCellular.TabIndex = 4;
|
||||
this.cbCellular.Text = "Cellular";
|
||||
this.cbCellular.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// cbName
|
||||
//
|
||||
this.cbName.AutoSize = true;
|
||||
this.cbName.Checked = true;
|
||||
this.cbName.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
this.cbName.Enabled = false;
|
||||
this.cbName.Location = new System.Drawing.Point(12, 12);
|
||||
this.cbName.Name = "cbName";
|
||||
this.cbName.Size = new System.Drawing.Size(67, 21);
|
||||
this.cbName.TabIndex = 3;
|
||||
this.cbName.Text = "Name";
|
||||
this.cbName.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// btnCancel
|
||||
//
|
||||
this.btnCancel.CausesValidation = false;
|
||||
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.btnCancel.Location = new System.Drawing.Point(190, 119);
|
||||
this.btnCancel.Name = "btnCancel";
|
||||
this.btnCancel.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnCancel.TabIndex = 10;
|
||||
this.btnCancel.Text = "Cancel";
|
||||
this.btnCancel.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// btnOK
|
||||
//
|
||||
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.btnOK.Location = new System.Drawing.Point(109, 119);
|
||||
this.btnOK.Name = "btnOK";
|
||||
this.btnOK.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnOK.TabIndex = 9;
|
||||
this.btnOK.Text = "OK";
|
||||
this.btnOK.UseVisualStyleBackColor = true;
|
||||
this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
|
||||
//
|
||||
// ColumnsDialog
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(277, 149);
|
||||
this.Controls.Add(this.btnCancel);
|
||||
this.Controls.Add(this.btnOK);
|
||||
this.Controls.Add(this.cbFamilyName);
|
||||
this.Controls.Add(this.cbCellular);
|
||||
this.Controls.Add(this.cbName);
|
||||
this.Name = "ColumnsDialog";
|
||||
this.Text = "Columns...";
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.CheckBox cbFamilyName;
|
||||
private System.Windows.Forms.CheckBox cbCellular;
|
||||
private System.Windows.Forms.CheckBox cbName;
|
||||
private System.Windows.Forms.Button btnCancel;
|
||||
private System.Windows.Forms.Button btnOK;
|
||||
}
|
||||
}
|
||||
50
vCardEditor/View/Customs/ColumnsDialog.cs
Normal file
50
vCardEditor/View/Customs/ColumnsDialog.cs
Normal file
@@ -0,0 +1,50 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using vCardEditor.Model;
|
||||
|
||||
namespace vCardEditor.View.Customs
|
||||
{
|
||||
public partial class ColumnsDialog : Form
|
||||
{
|
||||
private readonly List<CheckBox> _checkBoxes;
|
||||
public List<Columns> Columns { get; }
|
||||
|
||||
public ColumnsDialog(List<Columns> columns)
|
||||
{
|
||||
InitializeComponent();
|
||||
_checkBoxes = Controls.OfType<CheckBox>().ToList();
|
||||
Columns = columns;
|
||||
|
||||
foreach (var item in columns)
|
||||
{
|
||||
switch (item)
|
||||
{
|
||||
case Model.Columns.FamilyName:
|
||||
cbFamilyName.Checked = true;
|
||||
break;
|
||||
case Model.Columns.Cellular:
|
||||
cbCellular.Checked = true;
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void btnOK_Click(object sender, EventArgs e)
|
||||
{
|
||||
Columns.Clear();
|
||||
|
||||
var total = _checkBoxes
|
||||
.Where(checkBox => checkBox.Checked);
|
||||
|
||||
foreach (var item in total)
|
||||
{
|
||||
var enumType = (Columns)Enum.Parse(typeof(Columns), item.Text, true);
|
||||
Columns.Add(enumType);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
120
vCardEditor/View/Customs/ColumnsDialog.resx
Normal file
120
vCardEditor/View/Customs/ColumnsDialog.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -2,15 +2,15 @@
|
||||
using System.Collections.Generic;
|
||||
using Thought.vCards;
|
||||
using VCFEditor.Model;
|
||||
using System.ComponentModel;
|
||||
using System.Windows.Forms;
|
||||
using vCardEditor.Model;
|
||||
using vCardEditor.View;
|
||||
|
||||
namespace VCFEditor.View
|
||||
{
|
||||
public interface IMainView
|
||||
{
|
||||
#region All events
|
||||
event EventHandler<EventArg<FormState>> LoadForm;
|
||||
event EventHandler AddContact;
|
||||
event EventHandler DeleteContact;
|
||||
event EventHandler BeforeOpeningNewFile;
|
||||
event EventHandler SaveContactsSelected;
|
||||
@@ -20,14 +20,25 @@ namespace VCFEditor.View
|
||||
event EventHandler<EventArg<string>> FilterTextChanged;
|
||||
event EventHandler TextBoxValueChanged;
|
||||
event EventHandler<EventArg<bool>> CloseForm;
|
||||
#endregion
|
||||
event EventHandler<EventArg<string>> ModifyImage;
|
||||
event EventHandler ExportImage;
|
||||
event EventHandler<EventArg<List<vCardDeliveryAddressTypes>>> AddressAdded;
|
||||
event EventHandler<EventArg<List<vCardDeliveryAddressTypes>>> AddressModified;
|
||||
event EventHandler<EventArg<int>> AddressRemoved;
|
||||
event EventHandler CopyTextToClipboardEvent;
|
||||
|
||||
int SelectedContactIndex { get; }
|
||||
void DisplayContacts(BindingList<Contact> contacts);
|
||||
void DisplayContacts(SortableBindingList<Contact> contacts);
|
||||
void DisplayContactDetail(vCard card, string FileName);
|
||||
void ClearContactDetail();
|
||||
bool AskMessage(string msg, string caption);
|
||||
void DisplayMessage(string msg, string caption);
|
||||
string DisplayOpenDialog();
|
||||
string DisplayOpenDialog(string filter);
|
||||
string DisplaySaveDialog(string filename);
|
||||
void UpdateMRUMenu(FixedList MRUList);
|
||||
|
||||
void SendTextToClipBoard(string text);
|
||||
|
||||
FormState GetFormState();
|
||||
}
|
||||
}
|
||||
|
||||
48
vCardEditor/View/Libs/PropertyComparer.cs
Normal file
48
vCardEditor/View/Libs/PropertyComparer.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Reflection;
|
||||
|
||||
namespace vCardEditor.View.Libs
|
||||
{
|
||||
public class PropertyComparer<T> : IComparer<T>
|
||||
{
|
||||
private readonly IComparer comparer;
|
||||
private PropertyDescriptor propertyDescriptor;
|
||||
private int reverse;
|
||||
|
||||
public PropertyComparer(PropertyDescriptor property, ListSortDirection direction)
|
||||
{
|
||||
this.propertyDescriptor = property;
|
||||
Type comparerForPropertyType = typeof(Comparer<>).MakeGenericType(property.PropertyType);
|
||||
this.comparer = (IComparer)comparerForPropertyType.InvokeMember("Default", BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.Public, null, null, null);
|
||||
this.SetListSortDirection(direction);
|
||||
}
|
||||
|
||||
#region IComparer<T> Members
|
||||
|
||||
public int Compare(T x, T y)
|
||||
{
|
||||
return this.reverse * this.comparer.Compare(this.propertyDescriptor.GetValue(x), this.propertyDescriptor.GetValue(y));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private void SetPropertyDescriptor(PropertyDescriptor descriptor)
|
||||
{
|
||||
this.propertyDescriptor = descriptor;
|
||||
}
|
||||
|
||||
private void SetListSortDirection(ListSortDirection direction)
|
||||
{
|
||||
this.reverse = direction == ListSortDirection.Ascending ? 1 : -1;
|
||||
}
|
||||
|
||||
public void SetPropertyAndDirection(PropertyDescriptor descriptor, ListSortDirection direction)
|
||||
{
|
||||
this.SetPropertyDescriptor(descriptor);
|
||||
this.SetListSortDirection(direction);
|
||||
}
|
||||
}
|
||||
}
|
||||
1253
vCardEditor/View/MainForm.Designer.cs
generated
1253
vCardEditor/View/MainForm.Designer.cs
generated
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
@@ -9,12 +8,15 @@ using Thought.vCards;
|
||||
using vCardEditor.Repository;
|
||||
using vCardEditor.Model;
|
||||
using System.Drawing;
|
||||
using System.Collections.Generic;
|
||||
using vCardEditor.View.Customs;
|
||||
|
||||
namespace vCardEditor.View
|
||||
{
|
||||
public partial class MainForm : Form, IMainView
|
||||
{
|
||||
#region event list
|
||||
public event EventHandler<EventArg<FormState>> LoadForm;
|
||||
public event EventHandler AddContact;
|
||||
public event EventHandler SaveContactsSelected;
|
||||
public event EventHandler BeforeOpeningNewFile;
|
||||
public event EventHandler DeleteContact;
|
||||
@@ -24,9 +26,16 @@ namespace vCardEditor.View
|
||||
public event EventHandler<EventArg<string>> FilterTextChanged;
|
||||
public event EventHandler TextBoxValueChanged;
|
||||
public event EventHandler<EventArg<bool>> CloseForm;
|
||||
#endregion
|
||||
public event EventHandler<EventArg<string>> ModifyImage;
|
||||
public event EventHandler<EventArg<List<vCardDeliveryAddressTypes>>> AddressAdded;
|
||||
public event EventHandler<EventArg<List<vCardDeliveryAddressTypes>>> AddressModified;
|
||||
public event EventHandler<EventArg<int>> AddressRemoved;
|
||||
public event EventHandler ExportImage;
|
||||
public event EventHandler CopyTextToClipboardEvent;
|
||||
|
||||
ComponentResourceManager resources;
|
||||
|
||||
|
||||
public int SelectedContactIndex
|
||||
{
|
||||
get
|
||||
@@ -43,23 +52,22 @@ namespace vCardEditor.View
|
||||
{
|
||||
InitializeComponent();
|
||||
resources = new ComponentResourceManager(typeof(MainForm));
|
||||
|
||||
tbcAddress.AddTab += (sender, e) => AddressAdded?.Invoke(sender, e);
|
||||
tbcAddress.RemoveTab += (sender, e) => AddressRemoved?.Invoke(sender, e);
|
||||
tbcAddress.ModifyTab += (sender, e) => AddressModified?.Invoke(sender, e);
|
||||
tbcAddress.TextChangedEvent += (sender, e) => TextBoxValueChanged?.Invoke(sender, e);
|
||||
BuildMRUMenu();
|
||||
|
||||
}
|
||||
|
||||
private void tbsOpen_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (NewFileOpened != null)
|
||||
NewFileOpened(sender, new EventArg<string>(string.Empty));
|
||||
NewFileOpened?.Invoke(sender, new EventArg<string>(string.Empty));
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void DisplayContacts(BindingList<Contact> contacts)
|
||||
public void DisplayContacts(SortableBindingList<Contact> contacts)
|
||||
{
|
||||
if (contacts != null)
|
||||
this.bsContacts.DataSource = contacts;
|
||||
bsContacts.DataSource = contacts;
|
||||
|
||||
}
|
||||
|
||||
@@ -68,23 +76,31 @@ namespace vCardEditor.View
|
||||
if (SaveContactsSelected != null)
|
||||
{
|
||||
//make sure the last changes in the textboxes is saved.
|
||||
this.Validate();
|
||||
Validate();
|
||||
SaveContactsSelected(sender, e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void tbsNew_Click(object sender, EventArgs e)
|
||||
{
|
||||
AddContact?.Invoke(sender, e);
|
||||
}
|
||||
|
||||
private void dgContacts_SelectionChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (ChangeContactsSelected != null && dgContacts.CurrentCell != null)
|
||||
ChangeContactsSelected(sender, new EventArg<vCard>(getvCard()));
|
||||
|
||||
{
|
||||
vCard data = GetvCardFromWindow();
|
||||
ChangeContactsSelected(sender, new EventArg<vCard>(data));
|
||||
}
|
||||
else
|
||||
ChangeContactsSelected(sender, new EventArg<vCard>(null));
|
||||
}
|
||||
|
||||
private void Value_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (TextBoxValueChanged != null)
|
||||
TextBoxValueChanged(sender, e);
|
||||
TextBoxValueChanged?.Invoke(sender, e);
|
||||
}
|
||||
|
||||
public void DisplayContactDetail(vCard card, string FileName)
|
||||
@@ -92,12 +108,13 @@ namespace vCardEditor.View
|
||||
if (card == null)
|
||||
throw new ArgumentException("card must be valid!");
|
||||
|
||||
this.Text = string.Format("{0} - vCard Editor", FileName);
|
||||
Text = string.Format("{0} - vCard Editor", FileName);
|
||||
gbContactDetail.Enabled = true;
|
||||
gbNameList.Enabled = true;
|
||||
|
||||
SetSummaryValue(firstNameValue, card.GivenName);
|
||||
SetSummaryValue(lastNameValue, card.FamilyName);
|
||||
SetSummaryValue(middleNameValue, card.AdditionalNames);
|
||||
SetSummaryValue(FormattedTitleValue, card.Title);
|
||||
SetSummaryValue(FormattedNameValue, card.FormattedName);
|
||||
SetSummaryValue(HomePhoneValue, card.Phones.GetFirstChoice(vCardPhoneTypes.Home));
|
||||
@@ -105,13 +122,31 @@ namespace vCardEditor.View
|
||||
SetSummaryValue(WorkPhoneValue, card.Phones.GetFirstChoice(vCardPhoneTypes.Work));
|
||||
SetSummaryValue(EmailAddressValue, card.EmailAddresses.GetFirstChoice(vCardEmailAddressType.Internet));
|
||||
SetSummaryValue(PersonalWebSiteValue, card.Websites.GetFirstChoice(vCardWebsiteTypes.Personal));
|
||||
SetAddressesValues(card.DeliveryAddresses);
|
||||
SetAddressesValues(card);
|
||||
SetPhotoValue(card.Photos);
|
||||
|
||||
}
|
||||
|
||||
#region helper methods to populate textboxes.
|
||||
|
||||
public void ClearContactDetail()
|
||||
{
|
||||
gbContactDetail.Enabled = false;
|
||||
gbNameList.Enabled = false;
|
||||
|
||||
SetSummaryValue(firstNameValue, string.Empty);
|
||||
SetSummaryValue(lastNameValue, string.Empty);
|
||||
SetSummaryValue(middleNameValue, string.Empty);
|
||||
SetSummaryValue(FormattedTitleValue, string.Empty);
|
||||
SetSummaryValue(FormattedNameValue, string.Empty);
|
||||
SetSummaryValue(HomePhoneValue, string.Empty);
|
||||
SetSummaryValue(CellularPhoneValue, string.Empty);
|
||||
SetSummaryValue(WorkPhoneValue, string.Empty);
|
||||
SetSummaryValue(EmailAddressValue, string.Empty);
|
||||
SetSummaryValue(PersonalWebSiteValue, string.Empty);
|
||||
SetAddressesValues(new vCard());
|
||||
SetPhotoValue(new vCardPhotoCollection());
|
||||
|
||||
}
|
||||
|
||||
private void SetSummaryValue(StateTextBox valueLabel, string value)
|
||||
{
|
||||
if (valueLabel == null)
|
||||
@@ -151,8 +186,7 @@ namespace vCardEditor.View
|
||||
var photo = photos[0];
|
||||
try
|
||||
{
|
||||
// Get the bytes of the photo if it has
|
||||
// not already been loaded.
|
||||
// Get the bytes of the photo if it has not already been loaded.
|
||||
if (!photo.IsLoaded)
|
||||
photo.Fetch();
|
||||
|
||||
@@ -161,78 +195,18 @@ namespace vCardEditor.View
|
||||
catch
|
||||
{
|
||||
//Empty image icon instead.
|
||||
PhotoBox.Image = ((System.Drawing.Image)(resources.GetObject("PhotoBox.Image")));
|
||||
PhotoBox.Image = (Image)resources.GetObject("PhotoBox.Image");
|
||||
}
|
||||
}
|
||||
else
|
||||
PhotoBox.Image = ((System.Drawing.Image)(resources.GetObject("PhotoBox.Image")));
|
||||
PhotoBox.Image = (Image)resources.GetObject("PhotoBox.Image");
|
||||
|
||||
}
|
||||
private void SetAddressesValues(vCardDeliveryAddressCollection addresses)
|
||||
private void SetAddressesValues(vCard card)
|
||||
{
|
||||
ClearAddressTextFields();
|
||||
|
||||
if (addresses.Any())
|
||||
{
|
||||
var HomeAddress = addresses.Where(x => x.IsHome).FirstOrDefault();
|
||||
if (HomeAddress != null)
|
||||
{
|
||||
HomeAddressValue.Text = HomeAddress.Street;
|
||||
HomeCityValue.Text = HomeAddress.City;
|
||||
HomeZipValue.Text = HomeAddress.PostalCode;
|
||||
HomeStateValue.Text = HomeAddress.Region;
|
||||
HomeCountryValue.Text = HomeAddress.Country;
|
||||
}
|
||||
|
||||
var WorkAddress = addresses.Where(x => x.IsWork).FirstOrDefault();
|
||||
if (WorkAddress != null)
|
||||
{
|
||||
WorkAddressValue.Text = WorkAddress.Street;
|
||||
WorkCityValue.Text = WorkAddress.City;
|
||||
WorkZipValue.Text = WorkAddress.PostalCode;
|
||||
WorkStateValue.Text = WorkAddress.Region;
|
||||
WorkCountryValue.Text = WorkAddress.Country;
|
||||
}
|
||||
|
||||
var PostalAddress = addresses.Where(x => x.IsPostal).FirstOrDefault();
|
||||
if (PostalAddress != null)
|
||||
{
|
||||
PostalAddressValue.Text = PostalAddress.Street;
|
||||
PostalAddressValue.Text = PostalAddress.Street;
|
||||
PostalCityValue.Text = PostalAddress.City;
|
||||
PostalZipValue.Text = PostalAddress.PostalCode;
|
||||
PostalStateValue.Text = PostalAddress.Region;
|
||||
PostalCountryValue.Text = PostalAddress.Country;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
tbcAddress.SetAddresses(card);
|
||||
}
|
||||
|
||||
private void ClearAddressTextFields()
|
||||
{
|
||||
HomeAddressValue.Clear();
|
||||
HomePOBoxValue.Clear();
|
||||
HomeCityValue.Clear();
|
||||
HomeZipValue.Clear();
|
||||
HomeStateValue.Clear();
|
||||
HomeCountryValue.Clear();
|
||||
|
||||
WorkAddressValue.Clear();
|
||||
WorkPOBoxValue.Clear();
|
||||
WorkCityValue.Clear();
|
||||
WorkZipValue.Clear();
|
||||
WorkStateValue.Clear();
|
||||
WorkCountryValue.Clear();
|
||||
|
||||
PostalAddressValue.Clear();
|
||||
PostalPOBoxValue.Clear();
|
||||
PostalCityValue.Clear();
|
||||
PostalZipValue.Clear();
|
||||
PostalStateValue.Clear();
|
||||
PostalCountryValue.Clear();
|
||||
}
|
||||
#endregion
|
||||
|
||||
private void tbsDelete_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (DeleteContact != null)
|
||||
@@ -246,19 +220,15 @@ namespace vCardEditor.View
|
||||
|
||||
private void tbsAbout_Click(object sender, EventArgs e)
|
||||
{
|
||||
AboutDialog dialog = new AboutDialog();
|
||||
dialog.ShowDialog();
|
||||
new AboutDialog().ShowDialog();
|
||||
}
|
||||
|
||||
private void textBoxFilter_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
//Save before leaving contact.
|
||||
if (BeforeLeavingContact != null)
|
||||
BeforeLeavingContact(sender, new EventArg<vCard>(getvCard()));
|
||||
BeforeLeavingContact?.Invoke(sender, new EventArg<vCard>(GetvCardFromWindow()));
|
||||
|
||||
//filter.
|
||||
if (FilterTextChanged != null)
|
||||
FilterTextChanged(sender, new EventArg<string>(textBoxFilter.Text));
|
||||
FilterTextChanged?.Invoke(sender, new EventArg<string>(textBoxFilter.Text));
|
||||
}
|
||||
|
||||
private void btnClearFilter_Click(object sender, EventArgs e)
|
||||
@@ -266,49 +236,49 @@ namespace vCardEditor.View
|
||||
textBoxFilter.Text = string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generate a vcard from differents fields
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private vCard getvCard()
|
||||
|
||||
private vCard GetvCardFromWindow()
|
||||
{
|
||||
vCard card = new vCard();
|
||||
card.Title = this.FormattedTitleValue.Text;
|
||||
card.FormattedName = this.FormattedNameValue.Text;
|
||||
|
||||
vCard card = new vCard
|
||||
{
|
||||
|
||||
Title = FormattedTitleValue.Text,
|
||||
FormattedName = FormattedNameValue.Text,
|
||||
GivenName = firstNameValue.Text,
|
||||
AdditionalNames = middleNameValue.Text,
|
||||
FamilyName = lastNameValue.Text,
|
||||
|
||||
};
|
||||
|
||||
if (!string.IsNullOrEmpty(HomePhoneValue.Text))
|
||||
card.Phones.Add(new vCardPhone(HomePhoneValue.Text, vCardPhoneTypes.Home));
|
||||
if (!string.IsNullOrEmpty(CellularPhoneValue.Text))
|
||||
card.Phones.Add(new vCardPhone(CellularPhoneValue.Text, vCardPhoneTypes.Cellular));
|
||||
if (!string.IsNullOrEmpty(WorkPhoneValue.Text))
|
||||
card.Phones.Add(new vCardPhone(WorkPhoneValue.Text, vCardPhoneTypes.Work));
|
||||
|
||||
if (!string.IsNullOrEmpty(this.EmailAddressValue.Text))
|
||||
card.EmailAddresses.Add(new vCardEmailAddress(this.EmailAddressValue.Text));
|
||||
|
||||
if (!string.IsNullOrEmpty(this.PersonalWebSiteValue.Text))
|
||||
card.Websites.Add(new vCardWebsite(this.PersonalWebSiteValue.Text));
|
||||
|
||||
|
||||
tbcAddress.getDeliveryAddress(card);
|
||||
|
||||
return card;
|
||||
}
|
||||
|
||||
private void dgContacts_RowLeave(object sender, DataGridViewCellEventArgs e)
|
||||
{
|
||||
if (BeforeLeavingContact != null)
|
||||
BeforeLeavingContact(sender, new EventArg<vCard>(getvCard()));
|
||||
vCard data = GetvCardFromWindow();
|
||||
BeforeLeavingContact?.Invoke(sender, new EventArg<vCard>(data));
|
||||
}
|
||||
|
||||
private void miQuit_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.Close();
|
||||
Close();
|
||||
}
|
||||
|
||||
#region drag&drop
|
||||
/// <summary>
|
||||
/// Make our form accept drag&drop
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
|
||||
private void MainForm_DragEnter(object sender, DragEventArgs e)
|
||||
{
|
||||
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
||||
@@ -323,43 +293,40 @@ namespace vCardEditor.View
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
NewFileOpened(sender, new EventArg<string>(FileList[0]));
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
private void BuildMRUMenu()
|
||||
{
|
||||
recentFilesMenuItem.DropDownItemClicked += (s, e) => NewFileOpened(s, new EventArg<string>(e.ClickedItem.Text));
|
||||
//Update the MRU Menu entries..
|
||||
recentFilesMenuItem.DropDownItemClicked += (s, e) =>
|
||||
{
|
||||
var evt = new EventArg<string>(e.ClickedItem.Text);
|
||||
NewFileOpened(s, evt);
|
||||
};
|
||||
|
||||
UpdateMRUMenu(ConfigRepository.Instance.Paths);
|
||||
|
||||
}
|
||||
|
||||
public void UpdateMRUMenu(FixedList MRUList)
|
||||
public void UpdateMRUMenu(FixedList MostRecentFilesList)
|
||||
{
|
||||
//No need to go further if no menu entry to load!
|
||||
if (MRUList == null || MRUList.IsEmpty())
|
||||
if (MostRecentFilesList == null || MostRecentFilesList.IsEmpty())
|
||||
return;
|
||||
|
||||
recentFilesMenuItem.DropDownItems.Clear();
|
||||
for (int i = 0; i < MRUList._innerList.Count; i++)
|
||||
recentFilesMenuItem.DropDownItems.Add(MRUList[i]);
|
||||
|
||||
for (int i = 0; i < MostRecentFilesList._innerList.Count; i++)
|
||||
recentFilesMenuItem.DropDownItems.Add(MostRecentFilesList[i]);
|
||||
|
||||
}
|
||||
|
||||
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
var evt = new EventArg<bool>(false);
|
||||
if (CloseForm != null)
|
||||
CloseForm(sender,evt);
|
||||
CloseForm?.Invoke(sender, evt);
|
||||
|
||||
e.Cancel = evt.Data;
|
||||
|
||||
ConfigRepository.Instance.SaveConfig();
|
||||
}
|
||||
|
||||
public bool AskMessage(string msg, string caption)
|
||||
@@ -374,24 +341,19 @@ namespace vCardEditor.View
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load the config dialog
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void miConfig_Click(object sender, EventArgs e)
|
||||
{
|
||||
ConfigDialog dialog = new ConfigDialog();
|
||||
dialog.ShowDialog();
|
||||
new ConfigDialog().ShowDialog();
|
||||
}
|
||||
|
||||
public void DisplayMessage(string msg, string caption)
|
||||
{
|
||||
MessageBox.Show(msg, caption);
|
||||
}
|
||||
public string DisplayOpenDialog()
|
||||
public string DisplayOpenDialog(string filter = "")
|
||||
{
|
||||
string filename = string.Empty;
|
||||
openFileDialog.Filter = filter;
|
||||
|
||||
DialogResult result = openFileDialog.ShowDialog();
|
||||
if (result == DialogResult.OK)
|
||||
@@ -400,9 +362,160 @@ namespace vCardEditor.View
|
||||
return filename;
|
||||
}
|
||||
|
||||
private void rbChangeAddress(object sender, EventArgs e)
|
||||
public string DisplaySaveDialog(string filename)
|
||||
{
|
||||
|
||||
var saveFileDialog = new SaveFileDialog();
|
||||
saveFileDialog.FileName = filename;
|
||||
|
||||
DialogResult result = saveFileDialog.ShowDialog();
|
||||
if (result == DialogResult.OK)
|
||||
filename = saveFileDialog.FileName;
|
||||
|
||||
return filename;
|
||||
}
|
||||
private void PhotoBox_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (ModifyImage != null)
|
||||
{
|
||||
var fileName = DisplayOpenDialog();
|
||||
if (!string.IsNullOrEmpty(fileName))
|
||||
{
|
||||
try
|
||||
{
|
||||
PhotoBox.Image = new Bitmap(fileName);
|
||||
var evt = new EventArg<string>(fileName);
|
||||
ModifyImage(sender, evt);
|
||||
}
|
||||
catch (ArgumentException)
|
||||
{
|
||||
MessageBox.Show($"Invalid file! : {fileName}");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void btnRemoveImage_Click(object sender, EventArgs e)
|
||||
{
|
||||
PhotoBox.Image = (Image)resources.GetObject("PhotoBox.Image");
|
||||
//Remove image from vcf
|
||||
ModifyImage(sender, new EventArg<string>(""));
|
||||
}
|
||||
|
||||
private void btnExportImage_Click(object sender, EventArgs e)
|
||||
{
|
||||
ExportImage?.Invoke(sender, e);
|
||||
}
|
||||
|
||||
private void copyToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
CopyTextToClipboardEvent?.Invoke(sender, e);
|
||||
}
|
||||
|
||||
public void SendTextToClipBoard(string text)
|
||||
{
|
||||
Clipboard.SetText(text);
|
||||
}
|
||||
|
||||
private void dgContacts_CellContextMenuStripNeeded(object sender, DataGridViewCellContextMenuStripNeededEventArgs e)
|
||||
{
|
||||
if (e.RowIndex == -1)
|
||||
{
|
||||
e.ContextMenuStrip = contextMenuStrip1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void modifiyColumnsToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
List<Columns> Columns = GetListColumnsForDataGrid();
|
||||
|
||||
var dialog = new ColumnsDialog(Columns);
|
||||
if (dialog.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
ToggleAllColumnsToInvisible();
|
||||
ToggleOnlySelected(dialog.Columns);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private List<Columns> GetListColumnsForDataGrid()
|
||||
{
|
||||
List<Columns> Columns = new List<Columns>();
|
||||
for (int i = 2; i < dgContacts.Columns.Count; i++)
|
||||
{
|
||||
if (dgContacts.Columns[i].Visible)
|
||||
{
|
||||
var name = dgContacts.Columns[i].Name;
|
||||
var enumType = (Columns)Enum.Parse(typeof(Columns), name, true);
|
||||
Columns.Add(enumType);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return Columns;
|
||||
}
|
||||
|
||||
private void ToggleOnlySelected(List<Columns> columns)
|
||||
{
|
||||
foreach (var item in columns)
|
||||
{
|
||||
switch (item)
|
||||
{
|
||||
case Columns.FamilyName:
|
||||
dgContacts.Columns["FamilyName"].Visible = true;
|
||||
break;
|
||||
case Columns.Cellular:
|
||||
dgContacts.Columns["Cellular"].Visible = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ToggleAllColumnsToInvisible()
|
||||
{
|
||||
for (int i = 2; i < dgContacts.Columns.Count; i++)
|
||||
{
|
||||
dgContacts.Columns[i].Visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
public FormState GetFormState()
|
||||
{
|
||||
|
||||
return new FormState
|
||||
{
|
||||
Columns = GetListColumnsForDataGrid(),
|
||||
X = Location.X,
|
||||
Y = Location.Y,
|
||||
Height = Size.Height,
|
||||
Width = Size.Width,
|
||||
splitterPosition = splitContainer1.SplitterDistance
|
||||
};
|
||||
}
|
||||
|
||||
private void MainForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
var evt = new EventArg<FormState>(new FormState());
|
||||
LoadForm?.Invoke(sender, evt);
|
||||
|
||||
//TODO: Better way to check if state was serialised!
|
||||
var state = evt.Data;
|
||||
if (state.Width != 0 && state.Height != 0)
|
||||
{
|
||||
Size = new Size(state.Width, state.Height);
|
||||
Location = new Point(state.X , state.Y);
|
||||
splitContainer1.SplitterDistance = state.splitterPosition;
|
||||
if (state.Columns != null)
|
||||
{
|
||||
ToggleOnlySelected(state.Columns);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
<data name="miOpen.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJJSURBVDhPvZJdSNNRGMZ30UVXFllRCAWWF94MgiKqi5Ai
|
||||
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAJJSURBVDhPvZJdSNNRGMZ30UVXFllRCAWWF94MgiKqi5Ai
|
||||
CkWxzIIkTaj5QYWxMKeuTU03NzenrnRZ23RNnVaaUVgxqBSJ0FJHialpYF+KmaGSX7/+bTFbXwRBLzwc
|
||||
eM95fuc5H6L/VkqDnTNqK3lGB99af19xUqOPKUuAfR1jpSWefp1Nz49yT/yhopILiEgsxG3u6bQwNVbr
|
||||
1udROzPDZhzWgt9C9iXpiEgwECYpRlRboWNytMrHPPe2lBlXClWX1VSW5WIuycJUKOeCVkaxKtUXXG3R
|
||||
@@ -154,7 +154,7 @@
|
||||
<data name="miAbout.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIVSURBVDhPtVJNaxNRFM1PyE+Yn1AUXLjK0uWgDWQZwUUX
|
||||
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAIVSURBVDhPtVJNaxNRFM1PyE+Yn1AUXLjK0uWgDWQZwUUX
|
||||
KsGFBEEcCkIwqBEpGiydsSo2kupsasdo7Yi2toh0sFZjG5JpiZo20/TpVOmH5njvm8BYahEXHji8+968
|
||||
c+55l4n8F0zM+rhVWkHmdg29A/PoK1Yw8uIjOp/3xpvqBgrjLeilZbjNLXxZ34bwt6jexMVCGRndQenl
|
||||
0p+NWHzPXoP3rQ3bAbQhQM0E5Np2BKprbZzrm8TIs8puE+68+r0NwwZiacCwALEBCVcAqet8JlAjk1PZ
|
||||
@@ -172,10 +172,21 @@
|
||||
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>248, 17</value>
|
||||
</metadata>
|
||||
<data name="tbsNew.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAERSURBVDhPrZDbSgJRGIXnpewd6jXsjSQvIrwoI0RQMChU
|
||||
0iiDPCGiE3ZCRkvR8VzTeBhnyR5/ccaZNnPhB4t9sdf6Ln5hb8QeathNJFVFKF5C8DqL4ksDVHWGDf7j
|
||||
LHyPg6NjviSaFqlu5yQYR+KpupaIkrMknCxT3Y7v/NYYb0ITK1c3BarbWWhLQ7IR0cTKReyZ6lZ0XYei
|
||||
ztHpK4bAc+h1FgQijzSxMptrGIxVSO0xX3AaStFki7bUMVFmaMm/eJMGfIH/MkGzLep0AXn4h/r3CJV3
|
||||
mS9gn2bY4UY/UzQ7E9TqfeTFtnuB+XAfzSHKr11kSl/uBebDiZ89ZCst3OUkdwL28sIVsE83ock+EIQV
|
||||
2Mz2wxeg6/UAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="tbsOpen.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJHSURBVDhPxZBdSNNhFMb/F110ZZEVhVBgeeHNICiiuggp
|
||||
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAJHSURBVDhPxZBdSNNhFMb/F110ZZEVhVBgeeHNICiiuggp
|
||||
olAUyyxI0oSaH1QYC3N+tKnp5ubm1JUua5uuqdNKMwr7kApFItTUkWZqVhSVYmao5Nevvy7UoYR3HXh4
|
||||
4XCe33nOKyy3lAY7l9RWMo0O/raWXxEyo5spVYTNvOGyfIRPfW+ptOkXqaPl6T83hcRmExSdgzAz3NVm
|
||||
YWyoYla/B+1M9JtxWLPpaH22JORIjI6gKAMB0jyEimIdo4OlbuaprwVMOOMovammpDADc34qppwUrmnl
|
||||
@@ -191,7 +202,7 @@
|
||||
<data name="tbsSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIySURBVDhPrZLfS5NRGMfff6H7boIuuq2pMZyL1eAt11CW
|
||||
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAIySURBVDhPrZLfS5NRGMfff6H7boIuuq2pMZyL1eAt11CW
|
||||
DcOKsB9vpFmaLtNExco0av6CbIVLJ61Wk3BSkT/AFCkRZSpZmrmiJQ41xSaCwdfznL15XEUX0Reem5f3
|
||||
8znnec4j/Zc8fxYGla91CS3eRTx0z6OpMYS7jmnU1X6B/VYA18snUVoyjsKCt8jLHcH5c36ouCQR2NUJ
|
||||
1Nas4G9ZXlmFKbULh1Kf8lJxSfI+WeCCyopv6q+/h+DQ/DJ2WV5Ao1FgPegRAveDOS4oLfmq/h6dn/DH
|
||||
@@ -207,7 +218,7 @@
|
||||
<data name="tbsDelete.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAL4SURBVDhPjZFrSJNRHMaPpptu653ZErUsl1JmSVgZ6afU
|
||||
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAL4SURBVDhPjZFrSJNRHMaPpptu653ZErUsl1JmSVgZ6afU
|
||||
eU0plCwRMrEL1Eya6bygJHPeG5aadLFppSUaOkwtL2VmdlHsYiDZly5fJIvYdG454uk927oYfeiBP+ec
|
||||
5zy/5+XlkH/peUXozvFyyYXxEsk787B76lmvSRMhW68TIr9GCGO1fmu0LOTQlDoAM/1rMCFzgGaVLcaO
|
||||
LAP16F0zIcqedV54vj8ObFGxFbOIDQRPXQnA3FMRpk7b42lkCLQ3LmLA3w8v0vgYSvBAj7cYhvZGGJpq
|
||||
@@ -226,7 +237,7 @@
|
||||
<data name="tbsAbout.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIVSURBVDhPtVJNaxNRFM1PyE+Yn1AUXLjK0uWgDWQZwUUX
|
||||
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAIVSURBVDhPtVJNaxNRFM1PyE+Yn1AUXLjK0uWgDWQZwUUX
|
||||
KsGFBEEcCkIwqBEpGiydsSo2kupsasdo7Yi2toh0sFZjG5JpiZo20/TpVOmH5njvm8BYahEXHji8+968
|
||||
c+55l4n8F0zM+rhVWkHmdg29A/PoK1Yw8uIjOp/3xpvqBgrjLeilZbjNLXxZ34bwt6jexMVCGRndQenl
|
||||
0p+NWHzPXoP3rQ3bAbQhQM0E5Np2BKprbZzrm8TIs8puE+68+r0NwwZiacCwALEBCVcAqet8JlAjk1PZ
|
||||
@@ -241,6 +252,28 @@
|
||||
<metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>353, 17</value>
|
||||
</metadata>
|
||||
<data name="btnExportImage.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
|
||||
EwAACxMBAJqcGAAAAZFJREFUOE/NkMtKAlEAhn2Ctq26qmPavTdp3b4Iih6gnqMyoqCw0hIru5hJmFlI
|
||||
FBE0pNXo2IzO1YNZGK3+xtOIC81t/fBvDnzf+c+x/J+MREi690BHx5qA4ts7bYEUIas6VmMsEiyHpctn
|
||||
OHeVqO1IbzGxWoZPCVzBH4GmE6hGK7CYV9A654c7cofFiyf07KpgAnLUxGoZChM49zUqyEkKrZCTwb/m
|
||||
qGAhfIv5WBKOgALGr8DEahk8KcBVEayLuHwUkM6K4DICnjiewmc3D5gNPVKY2ZHrBQOhAvqPdDrR4c+D
|
||||
8YmwV+oVYNsSYDXK+IxzA7ZvNxD0H+voOzR6oKE3qNE1zj31R2jOrsI2n1QvqMJj8SJmrouYThBMXRUw
|
||||
GVcxca5gPCpjNCRR2OptJDBv/vj8QrlcRqlUAiEEmqZBkiSIooiXDE/h7q18vaA6+zeY53lwHEfhro0G
|
||||
guqbm8GpVIrCnZ5cvaDy28xmtinMsizaVjJoX+YaCDx81u5J4174HQ7fsBRucyezJvbnsVi+AVtEwzA2
|
||||
nUJSAAAAAElFTkSuQmCC
|
||||
</value>
|
||||
</data>
|
||||
<data name="btnRemoveImage.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
|
||||
EwAACxMBAJqcGAAAAJdJREFUOE9jGFzgv7Ex6397exYoFwOA5EBqoFxU8D80lPmLs+lyIF6NTRFY3sls
|
||||
CRCvxWoIXIGz2X90QzDkcLkSmyFEa4YBFA1OpmuAeBnRmmEAashSiEaIQURrBgGIAebkGYDqBTOgF2Au
|
||||
IdX/UA3YxKDKUQE+hUQZAlbkDApx7ArghuBKSCAAjndcTgQCkBxOzQMEGBgA54+vl3zobyEAAAAASUVO
|
||||
RK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="PhotoBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAAGYAAABmCAMAAAAOARRQAAAABGdBTUEAALGPC/xhBQAAAIdQTFRF////
|
||||
@@ -271,6 +304,18 @@
|
||||
<metadata name="bsContacts.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>486, 17</value>
|
||||
</metadata>
|
||||
<metadata name="Column1.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="FormattedName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="FamilyName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="Cellular.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<data name="btnClearFilter.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||
@@ -288,11 +333,8 @@
|
||||
TkSuQmCC
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="Column1.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="Column2.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>618, 17</value>
|
||||
</metadata>
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
|
||||
98
vCardEditor/View/SortableBindingList.cs
Normal file
98
vCardEditor/View/SortableBindingList.cs
Normal file
@@ -0,0 +1,98 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using vCardEditor.View.Libs;
|
||||
|
||||
namespace vCardEditor.View
|
||||
{
|
||||
public class SortableBindingList<T> : BindingList<T>
|
||||
{
|
||||
private readonly Dictionary<Type, PropertyComparer<T>> comparers;
|
||||
private bool isSorted;
|
||||
private ListSortDirection listSortDirection;
|
||||
private PropertyDescriptor propertyDescriptor;
|
||||
|
||||
public SortableBindingList()
|
||||
: base(new List<T>())
|
||||
{
|
||||
this.comparers = new Dictionary<Type, PropertyComparer<T>>();
|
||||
}
|
||||
|
||||
public SortableBindingList(IEnumerable<T> enumeration)
|
||||
: base(new List<T>(enumeration))
|
||||
{
|
||||
this.comparers = new Dictionary<Type, PropertyComparer<T>>();
|
||||
}
|
||||
|
||||
protected override bool SupportsSortingCore
|
||||
{
|
||||
get { return true; }
|
||||
}
|
||||
|
||||
protected override bool IsSortedCore
|
||||
{
|
||||
get { return this.isSorted; }
|
||||
}
|
||||
|
||||
protected override PropertyDescriptor SortPropertyCore
|
||||
{
|
||||
get { return this.propertyDescriptor; }
|
||||
}
|
||||
|
||||
protected override ListSortDirection SortDirectionCore
|
||||
{
|
||||
get { return this.listSortDirection; }
|
||||
}
|
||||
|
||||
protected override bool SupportsSearchingCore
|
||||
{
|
||||
get { return true; }
|
||||
}
|
||||
|
||||
protected override void ApplySortCore(PropertyDescriptor property, ListSortDirection direction)
|
||||
{
|
||||
List<T> itemsList = (List<T>)this.Items;
|
||||
|
||||
Type propertyType = property.PropertyType;
|
||||
PropertyComparer<T> comparer;
|
||||
if (!this.comparers.TryGetValue(propertyType, out comparer))
|
||||
{
|
||||
comparer = new PropertyComparer<T>(property, direction);
|
||||
this.comparers.Add(propertyType, comparer);
|
||||
}
|
||||
|
||||
comparer.SetPropertyAndDirection(property, direction);
|
||||
itemsList.Sort(comparer);
|
||||
|
||||
this.propertyDescriptor = property;
|
||||
this.listSortDirection = direction;
|
||||
this.isSorted = true;
|
||||
|
||||
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
|
||||
}
|
||||
|
||||
protected override void RemoveSortCore()
|
||||
{
|
||||
this.isSorted = false;
|
||||
this.propertyDescriptor = base.SortPropertyCore;
|
||||
this.listSortDirection = base.SortDirectionCore;
|
||||
|
||||
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
|
||||
}
|
||||
|
||||
protected override int FindCore(PropertyDescriptor property, object key)
|
||||
{
|
||||
int count = this.Count;
|
||||
for (int i = 0; i < count; ++i)
|
||||
{
|
||||
T element = this[i];
|
||||
if (property.GetValue(element).Equals(key))
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,3 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8.1"/></startup></configuration>
|
||||
|
||||
BIN
vCardEditor/assests/Add.png
Normal file
BIN
vCardEditor/assests/Add.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 437 B |
BIN
vCardEditor/assests/Close.png
Normal file
BIN
vCardEditor/assests/Close.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 605 B |
BIN
vCardEditor/assests/icons8-close-16.png
Normal file
BIN
vCardEditor/assests/icons8-close-16.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 217 B |
BIN
vCardEditor/assests/icons8-save-16.png
Normal file
BIN
vCardEditor/assests/icons8-save-16.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 475 B |
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||
@@ -10,10 +10,25 @@
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>vCardEditor</RootNamespace>
|
||||
<AssemblyName>vCardEditor</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<TargetFrameworkVersion>v4.8.1</TargetFrameworkVersion>
|
||||
<TargetFrameworkProfile>
|
||||
</TargetFrameworkProfile>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<PublishUrl>publish\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
<UpdateEnabled>false</UpdateEnabled>
|
||||
<UpdateMode>Foreground</UpdateMode>
|
||||
<UpdateInterval>7</UpdateInterval>
|
||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||
<UpdatePeriodically>false</UpdatePeriodically>
|
||||
<UpdateRequired>false</UpdateRequired>
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<ApplicationRevision>0</ApplicationRevision>
|
||||
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
@@ -51,8 +66,10 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Model\Columns.cs" />
|
||||
<Compile Include="Model\FixedList.cs" />
|
||||
<Compile Include="Model\ObjectCopier.cs" />
|
||||
<Compile Include="Model\FormState.cs" />
|
||||
<Compile Include="Repository\ConfigRepository.cs" />
|
||||
<Compile Include="Repository\ContactRepository.cs" />
|
||||
<Compile Include="Repository\FileHandler.cs" />
|
||||
@@ -118,14 +135,37 @@
|
||||
<Compile Include="View\ConfigDialog.Designer.cs">
|
||||
<DependentUpon>ConfigDialog.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="View\Customs\AddAddressDialog.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="View\Customs\AddAddressDialog.Designer.cs">
|
||||
<DependentUpon>AddAddressDialog.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="View\Customs\AddressBox.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="View\Customs\AddressBox.Designer.cs">
|
||||
<DependentUpon>AddressBox.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="View\Customs\AddressTabControl.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="View\Customs\ColumnsDialog.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="View\Customs\ColumnsDialog.Designer.cs">
|
||||
<DependentUpon>ColumnsDialog.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="View\EventArgs.cs" />
|
||||
<Compile Include="View\IMainView.cs" />
|
||||
<Compile Include="View\Libs\PropertyComparer.cs" />
|
||||
<Compile Include="View\MainForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="View\MainForm.Designer.cs">
|
||||
<DependentUpon>MainForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="View\SortableBindingList.cs" />
|
||||
<Compile Include="View\StateTextBox.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
@@ -146,6 +186,15 @@
|
||||
<EmbeddedResource Include="View\ConfigDialog.resx">
|
||||
<DependentUpon>ConfigDialog.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="View\Customs\AddAddressDialog.resx">
|
||||
<DependentUpon>AddAddressDialog.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="View\Customs\AddressBox.resx">
|
||||
<DependentUpon>AddressBox.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="View\Customs\ColumnsDialog.resx">
|
||||
<DependentUpon>ColumnsDialog.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="View\MainForm.resx">
|
||||
<DependentUpon>MainForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
@@ -162,7 +211,18 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="assests\About.ico" />
|
||||
<Content Include="assests\Add.png" />
|
||||
<Content Include="assests\Close.png" />
|
||||
<Content Include="assests\icons8-close-16.png" />
|
||||
<Content Include="assests\vCard.ico" />
|
||||
<Content Include="Releases.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
|
||||
@@ -14,14 +14,49 @@ namespace vCardEditor_Test
|
||||
[TestClass]
|
||||
public class ContactRepositoryTest
|
||||
{
|
||||
[TestMethod]
|
||||
public void NewFileOpened_EmtpyVCF_Test()
|
||||
{
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfEmtpy);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
|
||||
var contacts = repo.LoadContacts("file.vcf");
|
||||
|
||||
Assert.IsTrue(contacts.Count == 0);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NewFileOpened_IncorrectVCF_Test()
|
||||
{
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfIncorrect);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
|
||||
var contacts = repo.LoadContacts("file.vcf");
|
||||
|
||||
Assert.IsTrue(contacts.Count == 0);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NewFileOpened_Utf8Entry_Test()
|
||||
{
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfUtf8Entry);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
var contacts = repo.LoadContacts("file.vcf");
|
||||
|
||||
Assert.AreEqual(repo.LoadContacts("name")[0].Name, "Oum Alaâ");
|
||||
Assert.AreEqual(contacts[0].Name, "Oum Alaâ");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NewFileOpened_Address_Test()
|
||||
{
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfOneEntry);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
var contacts = repo.LoadContacts("file.vcf");
|
||||
Assert.IsTrue(contacts[0].card.DeliveryAddresses.FirstOrDefault().AddressType.Contains(vCardDeliveryAddressTypes.Work));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
@@ -31,7 +66,7 @@ namespace vCardEditor_Test
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfFourEntry);
|
||||
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
repo.LoadContacts("name");
|
||||
repo.LoadContacts("file.vcf");
|
||||
repo.Contacts[0].isDirty=true;
|
||||
|
||||
string phone = "0011223344";
|
||||
@@ -52,7 +87,7 @@ namespace vCardEditor_Test
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfFourEntry);
|
||||
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
repo.LoadContacts("name");
|
||||
repo.LoadContacts("file.vcf");
|
||||
repo.Contacts[0].isDirty = true;
|
||||
|
||||
repo.SaveDirtyVCard(0, new vCard());
|
||||
@@ -68,7 +103,7 @@ namespace vCardEditor_Test
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfFourEntry);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
repo.LoadContacts("name");
|
||||
repo.LoadContacts("file.vcf");
|
||||
repo.Contacts[2].isDirty = true;
|
||||
|
||||
string phone = "0011223344";
|
||||
@@ -86,7 +121,7 @@ namespace vCardEditor_Test
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfFourEntry);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
repo.LoadContacts("name");
|
||||
repo.LoadContacts("file.vcf");
|
||||
repo.Contacts[3].isDirty = true;
|
||||
|
||||
repo.SaveDirtyVCard(3, new vCard());
|
||||
@@ -102,13 +137,13 @@ namespace vCardEditor_Test
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfWikiv21);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
repo.LoadContacts("name");
|
||||
repo.LoadContacts("file.vcf");
|
||||
repo.Contacts[0].isDirty = true;
|
||||
|
||||
repo.SaveDirtyVCard(0, new vCard());
|
||||
|
||||
//var card = repo.Contacts[2].card;
|
||||
//Assert.IsNull(card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular));
|
||||
var card = repo.Contacts[0].card;
|
||||
Assert.IsNull(card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,23 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace vCardEditor_Test
|
||||
namespace vCardEditor_Test
|
||||
{
|
||||
public class Entries
|
||||
{
|
||||
public static string[] vcfEmtpy
|
||||
{
|
||||
get
|
||||
{
|
||||
return "".Split('\n');
|
||||
}
|
||||
}
|
||||
|
||||
public static string[] vcfIncorrect
|
||||
{
|
||||
get
|
||||
{
|
||||
return "abcdef".Split('\n');
|
||||
}
|
||||
}
|
||||
|
||||
public static string[] vcfOneEntry
|
||||
{
|
||||
get
|
||||
@@ -131,5 +141,48 @@ namespace vCardEditor_Test
|
||||
return s.Split('\n');
|
||||
}
|
||||
}
|
||||
|
||||
public static string[] vcfwithExternalPhoto
|
||||
{
|
||||
get
|
||||
{
|
||||
string s = @"BEGIN:VCARD
|
||||
VERSION:4.0
|
||||
N:Gump;Forrest;;;
|
||||
FN:Forrest Gump
|
||||
ORG:Bubba Gump Shrimp Co.
|
||||
TITLE:Shrimp Man
|
||||
PHOTO;MEDIATYPE=image/jpg:https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/TomHanksForrestGump94.jpg/224px-TomHanksForrestGump94.jpg
|
||||
TEL;TYPE=work,voice;VALUE=uri:tel:+1-111-555-1212
|
||||
TEL;TYPE=home,voice;VALUE=uri:tel:+1-404-555-1212
|
||||
ADR;TYPE=work;LABEL=""100 Waters Edge\nBaytown, LA 30314\nUnited States of America""
|
||||
:;;100 Waters Edge; Baytown;LA;30314;United States of America
|
||||
ADR;TYPE=home;LABEL=""42 Plantation St.\nBaytown, LA 30314\nUnited States of America""
|
||||
:;;42 Plantation St.; Baytown;LA;30314;United States of America
|
||||
EMAIL:forrestgump @example.com
|
||||
REV:20080424T195243Z
|
||||
END:VCARD";
|
||||
return s.Split('\n');
|
||||
}
|
||||
}
|
||||
|
||||
public static string[] vcfwithInternalPhoto
|
||||
{
|
||||
get
|
||||
{
|
||||
string s = @"BEGIN:VCARD
|
||||
VERSION:3.0
|
||||
N:Dupont;Jean;;;
|
||||
FN:Jean Dupont1
|
||||
ADR;TYPE=WORK;TYPE=PREF:;;6A Rue Th. Decuyper;;;;
|
||||
EMAIL;TYPE=INTERNET:jean.dupont@example.com
|
||||
PHOTO;ENCODING=b:/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCABcAFwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD7LooooAKKq6nqFppto93ezpDEgyWZgK8k134t6jqV7Jp3g7STclTtNxcBo1HuDyDQB7KSB1Iorw1YfiNqhV216e1kJzshdWUfiRXXJJ8QdI8OTMIbfU7qIAoZpsF/XOBQB6JRXmPhL4s2l3cf2f4j0+40m+BwS8TLFn2dsV6Ta3MF1Cs1tNHLG3IZGBB/KgCWiiigAooooAKivLiK0tZbmdwkcalmJ7ADNS15z8e9XksvCa2Fs5W4vZkiwDzsYlT/ADoA4TUtdvfiT4ruLWLemgWchjwOkzA8exBBr0jQvB0dtYrHBGlvGB8qJxWP8LfDsOmWdrZRoP3KAyHH3mHc1o63rGo+INbfQPD0yxRQj/SLgZ+XnBAI6EUAdhpGmw2UIUKGcH73etCuY8IeGbrRLiWa41W7vPMA+WWUsAfbNdPQBjeI/Duha3blNWsbecdmkXJFebXWot8MtVjxfi50GdwuxnyYSTgADoB1Neo+INKj1iwa0kuJ4FJB3Qvtb868c8UQeEtJ11NF1CDVtUTdslkklDpGc98/nQB7TpOo2mq2EV9YzJNBKoZWU5BFW68g8JXb+C/F0Wk+eZdC1IB7JichCxwqj8O1evjmgAooooAK8b+MJ+2/EfQ7BjmNbV5CvbKuMV7JXkfxnh+w+LtG1vH7sRm3Y+7uMUAdt4VtWfTp2Q7XfIDenFcjr2l6j4E8LXlzpFwhurq5klmuJELiNTz0POM10XhbVBby/Z5D8jHg102qT2EVkz37Ri3I5L4xigDjPg34q1DxHpcq6iyTywk/v402q/OMAV39cxpHijwj5ptdPvbRGzyqALXQx3VtIMpcRMPZxQBNXnvjL4bR65rLajbXgt2lz5yvk7s9cY6cV3zTwKMtNGB7sKwNS8aeH7HU4dNkvle6mYKqRjd3x2oA5T4maJDpnhLREhJL6bOhRyckhQe9ehaJM1xo9pO33pIVY/iK4z40XIGkadaLy9zeLGB9Qa7PRIjBpFpCeqQqp/AUAXKK5rXPE/8AZ/inTNEWDebxypfONvy5rpRyKACuQ+LWkR6v4RnQyJHLARPGWYDlMkDmusnkWGF5XOFRSx+gFeF+NZta8e6oy2OrT6do8DbcwkZmHXkH8RQBZ8Da0mq6PExlVrqABJgDnDVP8XtWiuPBENpebvJaUpNgn7m2ubl8G6l4LQeINE33Fmf+PuIjlu5fA6nFaNzc6P408PTWSzoryoR5bEB0P0oA8em8OaPeXE0/h+6e2cxqBFuPUd+T3q3YT+ONKknEEx8soBH+9zggV0t/4XtooAWsZtM1KDhJ7SMskyjhd7HpxzWDpXiq3MktnqIaG4hOCSOG9OTQBl3PiD4k3GnxQyzPJKDiT5wMjP09K0fge2t2fxY8q5tEKzhpmcy7tijAP0qbUPFUCYisoZZJW4VmQhB+NbfgC0u21Bra2lWLU9RP766dtoRDwyxt0YGgD1y5l/4TL4jRRW/z6fpTbmfsZVPb8DXp+MDArD8GeG7Lw1pKWVqNznmWUjmRv7x963KAPlT4yeONetPEVjJG5tr2K6kUFeSqjhTj3FaWifGrxraabFBd6ClxKvWR5SpYduMV33xj8IaBca/pOqz2ELXUsxV2I5YAcCu7HhHw3cxxyz6PbSOY1BYg+lAFjxrO1t4YvpV6+Sw/Q15J8Nh/xR+nyHq8eT+Zr1zxlCZ/DV9GP+eLH9DXga3dzY/DLTZbR9rxyRqSPTcc0Ae9WMMd94eEGBhkwR+FeV+IvhpGb17qw8+wnJzvtht3fWvRvhte/bPDdvKxBLKDXRA+YxDICOnIoA8W0Pwz49TfbpPaXdtjGLxmOaZqPws1vUpt1xpXh5CerKrZr29QicKoH0qtq1/Dp2nz3kx+SJSxoA8t8N/BTTLaRZtTnZ8f8sUIMf5Vwnx88N674SubXXtDhZtMtplk2Qg7olDZx7LxXrnwz+I1r40W9EVjPavbNjbIRl+D0x9KzLnxRqF94qudB17SNmj3IaOJ5EGGzwOfxNAHWfDbxDH4n8Gadq6MC08Cs49CR0ro6+cvCl54q8B+L9YtdOs5NQ0GO6b/AEeJctEvHIycAYr0xPiv4ee03oHa5x/x7Bhvz6fWgCH4oS/a/F/hjTI8lzcuXA7ApxXosS7YkX0UCvPfAumanrXiKbxbrlu1uWAW1gcYKAZAb05Br0SgCrq6B9Ku0PeBx/46a+drdBJ4G1Gyx/x6OB9MAmvo+6ANrKD0KH+VfPdiqg+MocfIsxAHp+7oA9B+CV35nhSxQnJNuDXoi57dK8l+BLMNEs0zwIQK9b6HFAAzAAepqlqWmwalYS2lzuMcv3gDir5APWigDitT8I31jYRQeELm0011++0sG8tzW/ounXCabbprDW91eRgbpViCgn1A7VrUUAeeaZGtr8Wbq1kVTHcWjSFSMgktXbjSdLD7xptmG658hc/yrkdWRU+KlrIowxswCfbdXdUAIqqoCqAAOgApaKKAP//Z
|
||||
TEL;TYPE=CELL:+1234 56789
|
||||
END:VCARD";
|
||||
return s.Split('\n');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,16 +1,11 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using VCFEditor;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using VCFEditor.View;
|
||||
using VCFEditor.Presenter;
|
||||
using VCFEditor.Model;
|
||||
using System.ComponentModel;
|
||||
using VCFEditor.Repository;
|
||||
using vCardEditor.Repository;
|
||||
using NSubstitute;
|
||||
using vCardEditor.View;
|
||||
|
||||
namespace vCardEditor_Test
|
||||
{
|
||||
@@ -25,10 +20,8 @@ namespace vCardEditor_Test
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfOneEntry);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
var view = Substitute.For<IMainView>();
|
||||
|
||||
|
||||
var presenter = new MainPresenter(view, repo);
|
||||
view.NewFileOpened += Raise.EventWith(new EventArg<string>("aaa"));
|
||||
_ = new MainPresenter(view, repo);
|
||||
view.NewFileOpened += Raise.EventWith(new EventArg<string>("filename.aaa"));
|
||||
|
||||
view.Received().DisplayMessage(Arg.Any<string>(), Arg.Any<string>());
|
||||
}
|
||||
@@ -41,14 +34,15 @@ namespace vCardEditor_Test
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfOneEntry);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
repo.GetExtension(Arg.Any<string>()).Returns(".vcf");
|
||||
var view = Substitute.For<IMainView>();
|
||||
|
||||
|
||||
var presenter = new MainPresenter(view, repo);
|
||||
view.NewFileOpened += Raise.EventWith(new EventArg<string>("aaa.vcf"));
|
||||
view.NewFileOpened += Raise.EventWith(new EventArg<string>("filename.vcf"));
|
||||
|
||||
view.Received().DisplayContacts(Arg.Is<BindingList<Contact>>(x=>x.Count == 1));
|
||||
view.Received().DisplayContacts(Arg.Is<BindingList<Contact>>(x => x[0].card.FormattedName == "Jean Dupont1"));
|
||||
view.Received().DisplayContacts(Arg.Is<SortableBindingList<Contact>>(x=>x.Count == 1));
|
||||
view.Received().DisplayContacts(Arg.Is<SortableBindingList<Contact>>(x => x[0].card.FormattedName == "Jean Dupont1"));
|
||||
|
||||
}
|
||||
|
||||
@@ -60,14 +54,15 @@ namespace vCardEditor_Test
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfThreeEntry);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
repo.GetExtension(Arg.Any<string>()).Returns(".vcf");
|
||||
var view = Substitute.For<IMainView>();
|
||||
view.AskMessage(Arg.Any<string>(), Arg.Any<string>()).Returns(true);
|
||||
|
||||
var presenter = new MainPresenter(view, repo);
|
||||
view.NewFileOpened += Raise.EventWith(new EventArg<string>("aaa.vcf"));
|
||||
view.NewFileOpened += Raise.EventWith(new EventArg<string>("filename.vcf"));
|
||||
repo.Contacts[1].isDirty = true;
|
||||
|
||||
view.NewFileOpened += Raise.EventWith(new EventArg<string>("bbb.vcf"));
|
||||
view.NewFileOpened += Raise.EventWith(new EventArg<string>("filename2.vcf"));
|
||||
|
||||
view.Received().AskMessage(Arg.Any<string>(), Arg.Any<string>());
|
||||
|
||||
@@ -79,6 +74,7 @@ namespace vCardEditor_Test
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfThreeEntry);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
repo.GetExtension(Arg.Any<string>()).Returns(".vcf");
|
||||
var view = Substitute.For<IMainView>();
|
||||
|
||||
|
||||
@@ -97,6 +93,7 @@ namespace vCardEditor_Test
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfThreeEntry);
|
||||
fileHandler.FileExist("aaa.vcf.old0").Returns(true);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
repo.GetExtension(Arg.Any<string>()).Returns(".vcf");
|
||||
var view = Substitute.For<IMainView>();
|
||||
|
||||
|
||||
@@ -115,6 +112,7 @@ namespace vCardEditor_Test
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfThreeEntry);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
repo.GetExtension(Arg.Any<string>()).Returns(".vcf");
|
||||
var view = Substitute.For<IMainView>();
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Castle.Core" version="4.2.0" targetFramework="net45" />
|
||||
<package id="NSubstitute" version="3.1.0" targetFramework="net45" />
|
||||
<package id="System.Threading.Tasks.Extensions" version="4.3.0" targetFramework="net45" />
|
||||
<package id="Castle.Core" version="5.1.1" targetFramework="net481" />
|
||||
<package id="NSubstitute" version="5.0.0" targetFramework="net481" />
|
||||
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net481" />
|
||||
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net481" />
|
||||
</packages>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
@@ -11,7 +11,7 @@
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>vCardEditor_Test</RootNamespace>
|
||||
<AssemblyName>vCardEditor_Test</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<TargetFrameworkVersion>v4.8.1</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<TargetFrameworkProfile />
|
||||
@@ -36,15 +36,13 @@
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Castle.Core.4.2.0\lib\net45\Castle.Core.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Reference Include="Castle.Core, Version=5.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Castle.Core.5.1.1\lib\net462\Castle.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
|
||||
<Reference Include="NSubstitute, Version=3.1.0.0, Culture=neutral, PublicKeyToken=92dd2e9066daa5ca, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NSubstitute.3.1.0\lib\net45\NSubstitute.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Reference Include="NSubstitute, Version=5.0.0.0, Culture=neutral, PublicKeyToken=92dd2e9066daa5ca, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NSubstitute.5.0.0\lib\net462\NSubstitute.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Configuration" />
|
||||
@@ -55,9 +53,11 @@
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Threading.Tasks.Extensions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.3.0\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
@@ -81,7 +81,6 @@
|
||||
<Name>vCardEditor</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
|
||||
Reference in New Issue
Block a user