mirror of
https://github.com/abdelkader/vCardEditor
synced 2025-12-12 08:27:19 +07:00
Compare commits
42 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1e1c3cce81 | ||
|
|
dbc2615ed5 | ||
|
|
f9d016260f | ||
|
|
a03a4e8ee4 | ||
|
|
6843863778 | ||
|
|
ee95238e2d | ||
|
|
f14f5086d0 | ||
|
|
91fb7ca500 | ||
|
|
5c42100019 | ||
|
|
28fe4f116d | ||
|
|
79412f3484 | ||
|
|
126fc13afd | ||
|
|
cb013a36f6 | ||
|
|
a95dcafb29 | ||
|
|
a18a253696 | ||
|
|
ddde4b0d2c | ||
|
|
2d864d7c00 | ||
|
|
fe018dd2e7 | ||
|
|
ade032cdf2 | ||
|
|
0693da5bb4 | ||
|
|
b3cee3a9d2 | ||
|
|
3f66b15e0b | ||
|
|
90eb345ddb | ||
|
|
fe2d1adec2 | ||
|
|
485309c570 | ||
|
|
1efb72a332 | ||
|
|
3a6803bceb | ||
|
|
18fdf6c440 | ||
|
|
b77cf21ca4 | ||
|
|
47f87bc482 | ||
|
|
208a2b49a3 | ||
|
|
57e4ff9729 | ||
|
|
005710d1de | ||
|
|
23f05e3431 | ||
|
|
5b8627126f | ||
|
|
f801cae11e | ||
|
|
25a560eac9 | ||
|
|
afe43e6195 | ||
|
|
51a61540a5 | ||
|
|
c4bff2b954 | ||
|
|
ec50f36ef1 | ||
|
|
1023771d8c |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -215,3 +215,4 @@ FakesAssemblies/
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
/contacts
|
||||
|
||||
45
README.md
45
README.md
@@ -1,13 +1,40 @@
|
||||
# vCardEditor
|
||||
A Simple vcf file Editor.
|
||||

|
||||
|
||||
- You can export easily edit (modify, delete) entries of a vcf file with this simple tool.
|
||||
# vCard Editor
|
||||
|
||||
Thanks for Thought.vCards for his wonderful library of parsing and generating vcf format.
|
||||
http://www.thoughtproject.com/Libraries/vCard/
|
||||
|
||||
Also, the MVP pattern from this example :
|
||||
https://github.com/lennykean/NoteCards
|
||||
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**.
|
||||
|
||||
|
||||
## Installation
|
||||
|
||||
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!
|
||||
|
||||
|
||||
|
||||
@@ -1,225 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Thought.vCards;
|
||||
using VCFEditor.Model;
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace VCFEditor
|
||||
{
|
||||
public class ContactRepository : IContactRepository
|
||||
{
|
||||
public string fileName { get; set; }
|
||||
|
||||
#region Contact Info
|
||||
/// <summary>
|
||||
/// Formatted name.
|
||||
/// </summary>
|
||||
public const string KeyName = "FN";
|
||||
|
||||
/// <summary>
|
||||
/// Contact List
|
||||
/// </summary>
|
||||
private BindingList<Contact> _contacts;
|
||||
public BindingList<Contact> Contacts
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_contacts == null)
|
||||
_contacts = new BindingList<Contact>();
|
||||
return _contacts;
|
||||
}
|
||||
set
|
||||
{
|
||||
_contacts = value;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Load contacts.
|
||||
/// 1- Parse the file
|
||||
/// 2-
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
public BindingList<Contact> LoadContacts(string fileName)
|
||||
{
|
||||
this.fileName = fileName;
|
||||
|
||||
StringBuilder RawContent = new StringBuilder();
|
||||
string[] lines = File.ReadAllLines(fileName);
|
||||
string[] parts;
|
||||
Contact contact = new Contact();
|
||||
|
||||
//Prevent from adding contacts to existings ones.
|
||||
Contacts.Clear();
|
||||
|
||||
for (int i = 0; i < lines.Length; i++)
|
||||
{
|
||||
RawContent.AppendLine(lines[i]);
|
||||
if (lines[i] == "END:VCARD")
|
||||
{
|
||||
contact.card = ParseRawContent(RawContent);
|
||||
Contacts.Add(contact);
|
||||
contact = new Contact();
|
||||
RawContent.Clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
parts = lines[i].Split(new char[] { ':' });
|
||||
|
||||
if (string.Compare(parts[0], KeyName) == 0)
|
||||
contact.Name = parts[1];
|
||||
}
|
||||
}
|
||||
|
||||
return Contacts;
|
||||
}
|
||||
|
||||
/// <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)
|
||||
{
|
||||
//overwrite the same file, else save as another file.
|
||||
if (string.IsNullOrEmpty(fileName))
|
||||
fileName = this.fileName;
|
||||
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
foreach (var entry in Contacts)
|
||||
sb.Append(generateRawContent(entry.card));
|
||||
|
||||
File.WriteAllText(fileName, sb.ToString());
|
||||
}
|
||||
|
||||
|
||||
/// <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.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;
|
||||
|
||||
using (MemoryStream s = GenerateStreamFromString(rawContent.ToString()))
|
||||
using (TextReader streamReader = new StreamReader(s, Encoding.UTF8))
|
||||
{
|
||||
card = new vCard(streamReader);
|
||||
}
|
||||
|
||||
return card;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="s"></param>
|
||||
/// <returns></returns>
|
||||
private MemoryStream GenerateStreamFromString(string s)
|
||||
{
|
||||
MemoryStream stream = new MemoryStream();
|
||||
StreamWriter writer = new StreamWriter(stream);
|
||||
writer.Write(s);
|
||||
writer.Flush();
|
||||
stream.Position = 0;
|
||||
return stream;
|
||||
}
|
||||
|
||||
public List<Contact> FilterContacts(string filter)
|
||||
{
|
||||
List<Contact> Filtered = new List<Contact>(Contacts);
|
||||
Filtered.RemoveAll(i => !(i.Name.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0));
|
||||
return Filtered;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Save modified card info in the raw content.
|
||||
/// </summary>
|
||||
/// <param name="card"></param>
|
||||
/// <param name="index"></param>
|
||||
public void SaveDirtyFlag(int index)
|
||||
{
|
||||
if (index > -1)
|
||||
_contacts[index].isDirty = true;
|
||||
}
|
||||
|
||||
public void SaveDirtyVCard(int index, vCard NewCard)
|
||||
{
|
||||
if (index > -1 && _contacts[index].isDirty)
|
||||
{
|
||||
vCard card = _contacts[index].card;
|
||||
card.FormattedName = NewCard.FormattedName;
|
||||
|
||||
|
||||
//HomePhone
|
||||
if (card.Phones.GetFirstChoice(vCardPhoneTypes.Home) != null)
|
||||
card.Phones.GetFirstChoice(vCardPhoneTypes.Home).FullNumber = NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Home).FullNumber;
|
||||
else
|
||||
{
|
||||
if (NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Home) != null
|
||||
&& !string.IsNullOrEmpty(NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Home).FullNumber))
|
||||
card.Phones.Add(new vCardPhone(NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Home).FullNumber, vCardPhoneTypes.Home));
|
||||
}
|
||||
|
||||
|
||||
//Cellular
|
||||
if (card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular) != null)
|
||||
card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular).FullNumber = NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Cellular).FullNumber;
|
||||
else
|
||||
{
|
||||
if (NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Cellular) != null
|
||||
&& !string.IsNullOrEmpty(NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Cellular).FullNumber))
|
||||
card.Phones.Add(new vCardPhone(NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Cellular).FullNumber, vCardPhoneTypes.Cellular));
|
||||
}
|
||||
|
||||
if (card.EmailAddresses.GetFirstChoice(vCardEmailAddressType.Internet) != null)
|
||||
card.EmailAddresses.GetFirstChoice(vCardEmailAddressType.Internet).Address = NewCard.EmailAddresses.GetFirstChoice(vCardEmailAddressType.Internet).Address;
|
||||
if (card.Websites.GetFirstChoice(vCardWebsiteTypes.Personal) != null)
|
||||
card.Websites.GetFirstChoice(vCardWebsiteTypes.Personal).Url = NewCard.Websites.GetFirstChoice(vCardWebsiteTypes.Personal).Url;
|
||||
|
||||
|
||||
_contacts[index].isDirty = false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generate a VCard class from a string.
|
||||
/// </summary>
|
||||
/// <param name="card"></param>
|
||||
/// <returns></returns>
|
||||
private string generateRawContent(vCard card)
|
||||
{
|
||||
vCardStandardWriter writer = new vCardStandardWriter();
|
||||
TextWriter tw = new StringWriter();
|
||||
writer.Write(card, tw);
|
||||
|
||||
return tw.ToString();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,57 +1,54 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Thought.vCards;
|
||||
|
||||
namespace VCFEditor.Model
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public class Contact : INotifyPropertyChanged
|
||||
{
|
||||
private string _name;
|
||||
|
||||
[DisplayName(" ")]
|
||||
public bool isSelected { get; set; }
|
||||
|
||||
|
||||
[DisplayName("Name")]
|
||||
public string Name
|
||||
{
|
||||
get { return _name; }
|
||||
set
|
||||
{
|
||||
_name = value;
|
||||
this.NotifyPropertyChanged("Name");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[Browsable(false)]
|
||||
public vCard card { get; set; }
|
||||
|
||||
[Browsable(false)]
|
||||
public bool isDirty { get; set; }
|
||||
|
||||
|
||||
public Contact()
|
||||
{
|
||||
card = new vCard();
|
||||
isSelected = false;
|
||||
isDirty = false;
|
||||
}
|
||||
|
||||
private void NotifyPropertyChanged(string name)
|
||||
{
|
||||
if (PropertyChanged != null)
|
||||
PropertyChanged(this, new PropertyChangedEventArgs(name));
|
||||
}
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
}
|
||||
}
|
||||
using System.ComponentModel;
|
||||
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; }
|
||||
set
|
||||
{
|
||||
card.FormattedName = value;
|
||||
this.NotifyPropertyChanged("Name");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[Browsable(false)]
|
||||
public vCard card { get; set; }
|
||||
|
||||
[Browsable(false)]
|
||||
public bool isDirty { get; set; }
|
||||
|
||||
[Browsable(false)]
|
||||
public bool isDeleted { get; set; }
|
||||
|
||||
|
||||
public Contact()
|
||||
{
|
||||
card = new vCard();
|
||||
isSelected = false;
|
||||
isDirty = false;
|
||||
}
|
||||
|
||||
#region property change event
|
||||
private void NotifyPropertyChanged(string name)
|
||||
{
|
||||
if (PropertyChanged != null)
|
||||
PropertyChanged(this, new PropertyChangedEventArgs(name));
|
||||
}
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
53
vCardEditor/Model/FixedList.cs
Normal file
53
vCardEditor/Model/FixedList.cs
Normal file
@@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace vCardEditor.Model
|
||||
{
|
||||
[Serializable]
|
||||
public class FixedList
|
||||
{
|
||||
public List<string> _innerList { get; set; }
|
||||
|
||||
private int _size;
|
||||
public int Size
|
||||
{
|
||||
get { return _size; }
|
||||
set { _size = value; }
|
||||
}
|
||||
public FixedList() : this(5)
|
||||
{
|
||||
|
||||
}
|
||||
public FixedList(int size)
|
||||
{
|
||||
this._size = size;
|
||||
this._innerList = new List<string>(size);
|
||||
}
|
||||
|
||||
public void Enqueue(string elem)
|
||||
{
|
||||
_innerList.Insert(_innerList.Count, elem);
|
||||
|
||||
if (_innerList.Count > _size)
|
||||
_innerList.RemoveAt(0);
|
||||
}
|
||||
|
||||
public string this[int index]
|
||||
{
|
||||
get { return _innerList[index]; }
|
||||
set { _innerList[index] = value; }
|
||||
}
|
||||
|
||||
public bool Contains(string elem)
|
||||
{
|
||||
return _innerList.Any(x => string.Compare(x, elem, StringComparison.OrdinalIgnoreCase) == 0);
|
||||
}
|
||||
|
||||
public bool IsEmpty()
|
||||
{
|
||||
return (this._innerList.Count == 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
40
vCardEditor/Model/ObjectCopier.cs
Normal file
40
vCardEditor/Model/ObjectCopier.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Runtime.Serialization.Formatters.Binary;
|
||||
|
||||
|
||||
namespace vCardEditor.Model
|
||||
{
|
||||
public static class ObjectCopier
|
||||
{
|
||||
/// <summary>
|
||||
/// Perform a deep Copy of the object.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The type of object being copied.</typeparam>
|
||||
/// <param name="source">The object instance to copy.</param>
|
||||
/// <returns>The copied object.</returns>
|
||||
public static T Clone<T>(this T source)
|
||||
{
|
||||
if (!typeof(T).IsSerializable)
|
||||
{
|
||||
throw new ArgumentException("The type must be serializable.", "source");
|
||||
}
|
||||
|
||||
// Don't serialize a null object, simply return the default for that object
|
||||
if (Object.ReferenceEquals(source, null))
|
||||
{
|
||||
return default(T);
|
||||
}
|
||||
|
||||
IFormatter formatter = new BinaryFormatter();
|
||||
Stream stream = new MemoryStream();
|
||||
using (stream)
|
||||
{
|
||||
formatter.Serialize(stream, source);
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
return (T)formatter.Deserialize(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Thought.vCards;
|
||||
using VCFEditor.Model;
|
||||
using VCFEditor.View;
|
||||
using System.ComponentModel;
|
||||
using System.IO;
|
||||
using vCardEditor.View;
|
||||
using VCFEditor.Repository;
|
||||
using vCardEditor.Repository;
|
||||
using vCardEditor.Model;
|
||||
|
||||
|
||||
namespace VCFEditor.Presenter
|
||||
@@ -23,30 +21,40 @@ namespace VCFEditor.Presenter
|
||||
_view = view;
|
||||
_repository = repository;
|
||||
|
||||
//hook event from the view to event handler present in this presenter.
|
||||
_view.AddContact += AddContact;
|
||||
_view.NewFileOpened += NewFileOpened;
|
||||
_view.BeforeOpeningNewFile += BeforeOpeningNewFile;
|
||||
_view.SaveContactsSelected += SaveContacts;
|
||||
_view.ChangeContactsSelected += ChangeContactSelected;
|
||||
_view.DeleteContact += DeleteContact;
|
||||
_view.FilterTextChanged += FilterTextChanged;
|
||||
_view.TextBoxValueChanged += TextBoxValueChanged;
|
||||
_view.BeforeLeavingContact += BeforeLeavingContact;
|
||||
|
||||
_view.CloseForm += CloseForm;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void CloseForm(object sender, EventArg<bool> e)
|
||||
{
|
||||
if (_repository.dirty && _view.AskMessage("Exit before saving?", "Exit"))
|
||||
e.Data = true;
|
||||
}
|
||||
public void BeforeLeavingContact(object sender, EventArg<vCard> e)
|
||||
{
|
||||
if (_view.SelectedContactIndex > -1)
|
||||
_repository.SaveDirtyVCard(_view.SelectedContactIndex, e.Data);
|
||||
{
|
||||
if (_repository.dirty)
|
||||
_repository.SaveDirtyVCard(_view.SelectedContactIndex, e.Data);
|
||||
}
|
||||
}
|
||||
|
||||
public void TextBoxValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
StateTextBox tb = sender as StateTextBox;
|
||||
if (tb != null && tb.oldText != tb.Text)
|
||||
_repository.SaveDirtyFlag(_view.SelectedContactIndex);
|
||||
|
||||
_repository.SaveDirtyFlag(_view.SelectedContactIndex);
|
||||
|
||||
}
|
||||
|
||||
public void FilterTextChanged(object sender, EventArg<string> e)
|
||||
@@ -55,6 +63,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();
|
||||
@@ -62,32 +75,70 @@ namespace VCFEditor.Presenter
|
||||
|
||||
private void SaveContacts(object sender, EventArgs e)
|
||||
{
|
||||
_repository.SaveContacts(_repository.fileName);
|
||||
if (!string.IsNullOrEmpty(_repository.fileName))
|
||||
_repository.SaveContacts(_repository.fileName);
|
||||
|
||||
}
|
||||
|
||||
private void BeforeOpeningNewFile(object sender, EventArgs e)
|
||||
{
|
||||
if (_repository.Contacts != null && _repository.dirty)
|
||||
{
|
||||
if (!_view.AskMessage("Save current file before?", "Load"))
|
||||
_repository.SaveContacts(_repository.fileName);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void NewFileOpened(object sender, EventArg<string> e)
|
||||
{
|
||||
|
||||
BeforeOpeningNewFile(sender, e);
|
||||
|
||||
string path = e.Data;
|
||||
if (string.IsNullOrEmpty(path))
|
||||
path = _view.DisplayOpenDialog();
|
||||
|
||||
if (!string.IsNullOrEmpty(path))
|
||||
{
|
||||
string ext = System.IO.Path.GetExtension(path);
|
||||
if (ext != ".vcf")
|
||||
{
|
||||
_view.DisplayMessage("Only vcf extension accepted!", "Error");
|
||||
return;
|
||||
}
|
||||
|
||||
FixedList MRUList = ConfigRepository.Instance.Paths;
|
||||
if (!MRUList.Contains(path))
|
||||
{
|
||||
MRUList.Enqueue(path);
|
||||
_view.UpdateMRUMenu(MRUList);
|
||||
}
|
||||
|
||||
_repository.LoadContacts(path);
|
||||
_view.DisplayContacts(_repository.Contacts);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void ChangeContactSelected(object sender, EventArgs e)
|
||||
{
|
||||
if (_view.SelectedContactIndex > -1)
|
||||
{
|
||||
int index = _view.SelectedContactIndex;
|
||||
vCard card = _repository.Contacts[index].card;
|
||||
|
||||
|
||||
if (card != null)
|
||||
_view.DisplayContactDetail(card);
|
||||
{
|
||||
_repository.Contacts[index].isDirty = false;
|
||||
_view.DisplayContactDetail(card, _repository.fileName);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@ using System.Windows.Forms;
|
||||
using vCardEditor.View;
|
||||
using VCFEditor.Presenter;
|
||||
using VCFEditor;
|
||||
using VCFEditor.Repository;
|
||||
using vCardEditor.Repository;
|
||||
|
||||
namespace vCardEditor
|
||||
{
|
||||
@@ -19,8 +21,9 @@ namespace vCardEditor
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
|
||||
var fileHandler = new FileHandler();
|
||||
var mainForm = new MainForm();
|
||||
var presenter = new MainPresenter(mainForm, new ContactRepository());
|
||||
new MainPresenter(mainForm, new ContactRepository(fileHandler));
|
||||
|
||||
Application.Run(mainForm);
|
||||
}
|
||||
|
||||
@@ -5,11 +5,11 @@ using System.Runtime.InteropServices;
|
||||
// Les informations générales relatives à un assembly dépendent de
|
||||
// l'ensemble d'attributs suivant. Changez les valeurs de ces attributs pour modifier les informations
|
||||
// associées à un assembly.
|
||||
[assembly: AssemblyTitle("vCardEditor")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyTitle("vCard Editor")]
|
||||
[assembly: AssemblyDescription("A tool to edit (Modify, delete) vcf file.")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("vCardEditor")]
|
||||
[assembly: AssemblyProduct("vCard Editor")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2015")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
@@ -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("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
[assembly: AssemblyVersion("0.4.0.*")]
|
||||
//[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
|
||||
2
vCardEditor/Properties/Resources.Designer.cs
generated
2
vCardEditor/Properties/Resources.Designer.cs
generated
@@ -1,7 +1,7 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// Ce code a été généré par un outil.
|
||||
// Version du runtime :4.0.30319.34209
|
||||
// Version du runtime :4.0.30319.42000
|
||||
//
|
||||
// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si
|
||||
// le code est régénéré.
|
||||
|
||||
30
vCardEditor/Properties/Settings.Designer.cs
generated
30
vCardEditor/Properties/Settings.Designer.cs
generated
@@ -1,28 +1,24 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.34209
|
||||
// Ce code a été généré par un outil.
|
||||
// Version du runtime :4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si
|
||||
// le code est régénéré.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace vCardEditor.Properties
|
||||
{
|
||||
|
||||
|
||||
namespace vCardEditor.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
|
||||
{
|
||||
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default
|
||||
{
|
||||
get
|
||||
{
|
||||
|
||||
public static Settings Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
94
vCardEditor/Repository/ConfigRepository.cs
Normal file
94
vCardEditor/Repository/ConfigRepository.cs
Normal file
@@ -0,0 +1,94 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Xml.Serialization;
|
||||
using System.IO;
|
||||
using System.ComponentModel;
|
||||
using vCardEditor.Model;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace vCardEditor.Repository
|
||||
{
|
||||
[XmlRoot("Config")]
|
||||
[Serializable]
|
||||
public class ConfigRepository
|
||||
{
|
||||
private static string ConfigFileName
|
||||
{
|
||||
get { return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.xml"); }
|
||||
}
|
||||
|
||||
private static ConfigRepository instance = null;
|
||||
[XmlIgnore]
|
||||
public static ConfigRepository Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
if (instance == null)
|
||||
instance = LoadConfig();
|
||||
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
|
||||
[Description("Overwrite the file when saving")]
|
||||
public bool OverWrite { get; set; }
|
||||
[Description("Maximum entries for MRU ")]
|
||||
public int Maximum { get; set; }
|
||||
|
||||
[Browsable(false)]
|
||||
public FixedList Paths { get; set;}
|
||||
|
||||
private ConfigRepository() { }
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// save config file
|
||||
/// </summary>
|
||||
public void SaveConfig()
|
||||
{
|
||||
var ns = new XmlSerializerNamespaces();
|
||||
ns.Add("", "");
|
||||
|
||||
XmlSerializer xsSubmit = new XmlSerializer(typeof(ConfigRepository));
|
||||
using (StringWriter sww = new StringWriter())
|
||||
using (TextWriter writer = new StreamWriter(ConfigFileName))
|
||||
{
|
||||
xsSubmit.Serialize(writer, instance, ns);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load config file.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private static ConfigRepository LoadConfig()
|
||||
{
|
||||
ConfigRepository obj;
|
||||
|
||||
try
|
||||
{
|
||||
if (!File.Exists(ConfigFileName))
|
||||
throw new Exception();
|
||||
|
||||
XmlSerializer deserializer = new XmlSerializer(typeof(ConfigRepository));
|
||||
using (TextReader reader = new StreamReader(ConfigFileName))
|
||||
{
|
||||
obj = (ConfigRepository)deserializer.Deserialize(reader);
|
||||
obj.Paths.Size = obj.Maximum;
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
obj = new ConfigRepository();
|
||||
obj.Paths = new FixedList(5);
|
||||
}
|
||||
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
389
vCardEditor/Repository/ContactRepository.cs
Normal file
389
vCardEditor/Repository/ContactRepository.cs
Normal file
@@ -0,0 +1,389 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Thought.vCards;
|
||||
using VCFEditor.Model;
|
||||
using System.ComponentModel;
|
||||
using vCardEditor.Repository;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace VCFEditor.Repository
|
||||
{
|
||||
public class ContactRepository : IContactRepository
|
||||
{
|
||||
public string fileName { get; set; }
|
||||
private IFileHandler _fileHandler;
|
||||
#region Contact Info
|
||||
/// <summary>
|
||||
/// Formatted name.
|
||||
/// </summary>
|
||||
public const string KeyName = "FN";
|
||||
|
||||
/// <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
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_contacts == null)
|
||||
_contacts = new BindingList<Contact>();
|
||||
return _contacts;
|
||||
}
|
||||
set
|
||||
{
|
||||
_contacts = value;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
public ContactRepository(IFileHandler fileHandler)
|
||||
{
|
||||
_fileHandler = fileHandler;
|
||||
}
|
||||
|
||||
public BindingList<Contact> LoadContacts(string fileName)
|
||||
{
|
||||
this.fileName = 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")
|
||||
{
|
||||
contact.card = ParseRawContent(RawContent);
|
||||
Contacts.Add(contact);
|
||||
contact = new Contact();
|
||||
RawContent.Length = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
OriginalContactList = Contacts;
|
||||
_dirty = false;
|
||||
return Contacts;
|
||||
}
|
||||
/// <summary>
|
||||
/// Add a new empty contact
|
||||
/// </summary>
|
||||
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)
|
||||
{
|
||||
//overwrite the same file, else save as another file.
|
||||
if (string.IsNullOrEmpty(fileName))
|
||||
fileName = this.fileName;
|
||||
|
||||
//Take a copy...
|
||||
if (!ConfigRepository.Instance.OverWrite)
|
||||
{
|
||||
string backupName = GetBackupName();
|
||||
_fileHandler.MoveFile(fileName, backupName);
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
//Do not save the deleted ones...
|
||||
foreach (var entry in Contacts)
|
||||
{
|
||||
if (!entry.isDeleted)
|
||||
sb.Append(generateRawContent(entry.card));
|
||||
}
|
||||
|
||||
|
||||
_fileHandler.WriteAllText(fileName, sb.ToString());
|
||||
|
||||
_dirty = false;
|
||||
}
|
||||
|
||||
private string GetBackupName()
|
||||
{
|
||||
int count = 0;
|
||||
string backupName = fileName + ".old" + count.ToString();
|
||||
|
||||
while (_fileHandler.FileExist(backupName))
|
||||
{
|
||||
count++;
|
||||
backupName = fileName + ".old" + count.ToString();
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Use the lib to parse a vcard chunk.
|
||||
/// </summary>
|
||||
/// <param name="rawContent"></param>
|
||||
/// <returns></returns>
|
||||
private vCard ParseRawContent(StringBuilder rawContent)
|
||||
{
|
||||
vCard card = null;
|
||||
|
||||
using (MemoryStream s = GenerateStreamFromString(rawContent.ToString()))
|
||||
using (TextReader streamReader = new StreamReader(s, Encoding.UTF8))
|
||||
{
|
||||
card = new vCard(streamReader);
|
||||
}
|
||||
|
||||
return card;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="s"></param>
|
||||
/// <returns></returns>
|
||||
private MemoryStream GenerateStreamFromString(string s)
|
||||
{
|
||||
MemoryStream stream = new MemoryStream();
|
||||
StreamWriter writer = new StreamWriter(stream);
|
||||
writer.Write(s);
|
||||
writer.Flush();
|
||||
stream.Position = 0;
|
||||
return stream;
|
||||
}
|
||||
|
||||
public BindingList<Contact> FilterContacts(string filter)
|
||||
{
|
||||
var list = OriginalContactList.Where(i => (i.Name.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0) &&
|
||||
!i.isDeleted);
|
||||
Contacts = new BindingList<Contact>(list.ToList());
|
||||
return Contacts;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Save modified card info in the raw content.
|
||||
/// </summary>
|
||||
/// <param name="card"></param>
|
||||
/// <param name="index"></param>
|
||||
public void SaveDirtyFlag(int index)
|
||||
{
|
||||
if (index > -1)
|
||||
_contacts[index].isDirty = true;
|
||||
}
|
||||
|
||||
public void SaveDirtyVCard(int index, vCard NewCard)
|
||||
{
|
||||
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 = false;
|
||||
}
|
||||
}
|
||||
|
||||
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()));
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void SavePhone(vCard NewCard, vCard card)
|
||||
{
|
||||
//HomePhone
|
||||
if (NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Home) != null)
|
||||
{
|
||||
if (card.Phones.GetFirstChoice(vCardPhoneTypes.Home) != null)
|
||||
card.Phones.GetFirstChoice(vCardPhoneTypes.Home).FullNumber = NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Home).FullNumber;
|
||||
else
|
||||
card.Phones.Add(new vCardPhone(NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Home).FullNumber, vCardPhoneTypes.Home));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (card.Phones.GetFirstChoice(vCardPhoneTypes.Home) != null)
|
||||
card.Phones.GetFirstChoice(vCardPhoneTypes.Home).FullNumber = string.Empty;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//Cellular
|
||||
if (NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Cellular) != null)
|
||||
{
|
||||
if (card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular) != null)
|
||||
card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular).FullNumber = NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Cellular).FullNumber;
|
||||
else
|
||||
card.Phones.Add(new vCardPhone(NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Cellular).FullNumber, vCardPhoneTypes.Cellular));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular) != null)
|
||||
card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular).FullNumber = string.Empty;
|
||||
|
||||
}
|
||||
|
||||
//Work
|
||||
if (NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Work) != null)
|
||||
{
|
||||
if (card.Phones.GetFirstChoice(vCardPhoneTypes.Work) != null)
|
||||
card.Phones.GetFirstChoice(vCardPhoneTypes.Work).FullNumber = NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Work).FullNumber;
|
||||
else
|
||||
card.Phones.Add(new vCardPhone(NewCard.Phones.GetFirstChoice(vCardPhoneTypes.Work).FullNumber, vCardPhoneTypes.Work));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (card.Phones.GetFirstChoice(vCardPhoneTypes.Work) != null)
|
||||
card.Phones.GetFirstChoice(vCardPhoneTypes.Work).FullNumber = string.Empty;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void SaveEmail(vCard NewCard, vCard card)
|
||||
{
|
||||
//Inernet
|
||||
if (NewCard.EmailAddresses.GetFirstChoice(vCardEmailAddressType.Internet) != null)
|
||||
{
|
||||
if (card.EmailAddresses.GetFirstChoice(vCardEmailAddressType.Internet) != null)
|
||||
card.EmailAddresses.GetFirstChoice(vCardEmailAddressType.Internet).Address
|
||||
= NewCard.EmailAddresses.GetFirstChoice(vCardEmailAddressType.Internet).Address;
|
||||
else
|
||||
card.EmailAddresses.Add(new vCardEmailAddress(NewCard.EmailAddresses.GetFirstChoice(vCardEmailAddressType.Internet).Address,
|
||||
vCardEmailAddressType.Internet));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (card.EmailAddresses.GetFirstChoice(vCardEmailAddressType.Internet) != null)
|
||||
card.EmailAddresses.GetFirstChoice(vCardEmailAddressType.Internet).Address = string.Empty;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void SaveWebUrl(vCard NewCard, vCard card)
|
||||
{
|
||||
|
||||
if (NewCard.Websites.GetFirstChoice(vCardWebsiteTypes.Personal) != null)
|
||||
{
|
||||
if (card.Websites.GetFirstChoice(vCardWebsiteTypes.Personal) != null)
|
||||
card.Websites.GetFirstChoice(vCardWebsiteTypes.Personal).Url = NewCard.Websites.GetFirstChoice(vCardWebsiteTypes.Personal).Url;
|
||||
else
|
||||
card.Websites.Add(new vCardWebsite(NewCard.Websites.GetFirstChoice(vCardWebsiteTypes.Personal).Url, vCardWebsiteTypes.Personal));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (card.Websites.GetFirstChoice(vCardWebsiteTypes.Personal) != null)
|
||||
card.Websites.GetFirstChoice(vCardWebsiteTypes.Personal).Url = string.Empty;
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (NewCard.Websites.GetFirstChoice(vCardWebsiteTypes.Work) != null)
|
||||
{
|
||||
if (card.Websites.GetFirstChoice(vCardWebsiteTypes.Work) != null)
|
||||
card.Websites.GetFirstChoice(vCardWebsiteTypes.Work).Url = NewCard.Websites.GetFirstChoice(vCardWebsiteTypes.Work).Url;
|
||||
else
|
||||
card.Websites.Add(new vCardWebsite(NewCard.Websites.GetFirstChoice(vCardWebsiteTypes.Work).Url, vCardWebsiteTypes.Work));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (card.Websites.GetFirstChoice(vCardWebsiteTypes.Work) != null)
|
||||
card.Websites.GetFirstChoice(vCardWebsiteTypes.Work).Url = string.Empty;
|
||||
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Generate a VCard class from a string.
|
||||
/// </summary>
|
||||
/// <param name="card"></param>
|
||||
/// <returns></returns>
|
||||
private string generateRawContent(vCard card)
|
||||
{
|
||||
vCardStandardWriter writer = new vCardStandardWriter();
|
||||
TextWriter tw = new StringWriter();
|
||||
writer.Write(card, tw);
|
||||
|
||||
return tw.ToString();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Check if some item in the contact list is modified
|
||||
/// Every contact has a dirty flag, and also there's a global dirty flag (used when contact is deleted!)
|
||||
/// </summary>
|
||||
/// <returns>true for dirty</returns>
|
||||
private bool _dirty;
|
||||
public bool dirty
|
||||
{
|
||||
get { return _dirty || (_contacts != null && _contacts.Any(x => x.isDirty)); }
|
||||
set { _dirty = value; }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
31
vCardEditor/Repository/FileHandler.cs
Normal file
31
vCardEditor/Repository/FileHandler.cs
Normal file
@@ -0,0 +1,31 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace vCardEditor.Repository
|
||||
{
|
||||
public class FileHandler : IFileHandler
|
||||
{
|
||||
public bool FileExist(string filename)
|
||||
{
|
||||
return File.Exists(filename);
|
||||
}
|
||||
|
||||
public void MoveFile(string newFilename, string oldFilename)
|
||||
{
|
||||
File.Move(newFilename, oldFilename);
|
||||
}
|
||||
|
||||
public string[] ReadAllLines(string filename)
|
||||
{
|
||||
return File.ReadAllLines(filename);
|
||||
}
|
||||
|
||||
public void WriteAllText(string filename, string contents)
|
||||
{
|
||||
File.WriteAllText(filename, contents);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +1,25 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Thought.vCards;
|
||||
using VCFEditor.Model;
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace VCFEditor
|
||||
{
|
||||
public interface IContactRepository
|
||||
{
|
||||
string fileName { get; set; }
|
||||
BindingList<Contact> Contacts { get; set; }
|
||||
|
||||
BindingList<Contact> LoadContacts(string fileName);
|
||||
void SaveContacts(string fileName);
|
||||
void DeleteContact();
|
||||
List<Contact> FilterContacts(string p);
|
||||
void SaveDirtyFlag(int index);
|
||||
void SaveDirtyVCard(int index, vCard card);
|
||||
}
|
||||
}
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Thought.vCards;
|
||||
using VCFEditor.Model;
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace VCFEditor.Repository
|
||||
{
|
||||
public interface IContactRepository
|
||||
{
|
||||
string fileName { get; set; }
|
||||
BindingList<Contact> Contacts { get; set; }
|
||||
bool dirty { get; set; }
|
||||
|
||||
BindingList<Contact> LoadContacts(string fileName);
|
||||
void SaveContacts(string fileName);
|
||||
void DeleteContact();
|
||||
BindingList<Contact> FilterContacts(string p);
|
||||
void SaveDirtyFlag(int index);
|
||||
void SaveDirtyVCard(int index, vCard card);
|
||||
void AddEmptyContact();
|
||||
}
|
||||
}
|
||||
15
vCardEditor/Repository/IFileHandler.cs
Normal file
15
vCardEditor/Repository/IFileHandler.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace vCardEditor.Repository
|
||||
{
|
||||
public interface IFileHandler
|
||||
{
|
||||
void MoveFile(string newFilename, string oldFilename);
|
||||
bool FileExist(string filename);
|
||||
string[] ReadAllLines(string filename);
|
||||
void WriteAllText(string fileName, string contents);
|
||||
}
|
||||
}
|
||||
@@ -39,7 +39,7 @@ namespace Thought.vCards {
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Thought.vCards.WarningMessages", typeof(WarningMessages).Assembly);
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("vCardEditor.Thought.vCards.WarningMessages", typeof(WarningMessages).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
|
||||
@@ -72,6 +72,8 @@ namespace Thought.vCards
|
||||
private vCardPhotoCollection photos;
|
||||
private vCardSourceCollection sources;
|
||||
private vCardWebsiteCollection websites;
|
||||
private vCardIMPPCollection ims;
|
||||
private vCardSocialProfileCollection sps;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="vCard"/> class.
|
||||
@@ -111,6 +113,8 @@ namespace Thought.vCards
|
||||
this.photos = new vCardPhotoCollection();
|
||||
this.sources = new vCardSourceCollection();
|
||||
this.websites = new vCardWebsiteCollection();
|
||||
this.ims = new vCardIMPPCollection();
|
||||
this.sps = new vCardSocialProfileCollection();
|
||||
}
|
||||
|
||||
|
||||
@@ -147,32 +151,9 @@ namespace Thought.vCards
|
||||
vCardReader reader = new vCardStandardReader();
|
||||
reader.ReadInto(this, streamReader);
|
||||
}
|
||||
|
||||
//String example = "BEGIN:VCARD\nVERSION:3.0\nN:;Saad;;;\nFN:Saad\nTEL;TYPE=CELL:418-271-3874\nTEL;TYPE=HOME:418-524-7721\nEND:VCARD";
|
||||
// using (MemoryStream s = GenerateStreamFromString(example))
|
||||
//{
|
||||
// vCardReader reader = new vCardStandardReader();
|
||||
// TextReader streamReader = new StreamReader(s, Encoding.Default);
|
||||
// reader.ReadInto(this, streamReader);
|
||||
//}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="s"></param>
|
||||
/// <returns></returns>
|
||||
public MemoryStream GenerateStreamFromString(string s)
|
||||
{
|
||||
MemoryStream stream = new MemoryStream();
|
||||
StreamWriter writer = new StreamWriter(stream);
|
||||
writer.Write(s);
|
||||
writer.Flush();
|
||||
stream.Position = 0;
|
||||
return stream;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The security access classification of the vCard owner (e.g. private).
|
||||
@@ -764,5 +745,21 @@ namespace Thought.vCards
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// IMPP Collection
|
||||
/// </summary>
|
||||
public vCardIMPPCollection IMs
|
||||
{
|
||||
get { return this.ims; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// SocialProfile collection for the vCard in the X-SOCIALPROFILE property
|
||||
/// </summary>
|
||||
public vCardSocialProfileCollection SocialProfiles
|
||||
{
|
||||
get { return this.sps; }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
* ======================================================================= */
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Thought.vCards
|
||||
{
|
||||
@@ -18,7 +19,7 @@ namespace Thought.vCards
|
||||
public class vCardDeliveryAddress
|
||||
{
|
||||
|
||||
private vCardDeliveryAddressTypes addressType;
|
||||
private List<vCardDeliveryAddressTypes> addressType;
|
||||
private string city;
|
||||
private string country;
|
||||
private string postalCode;
|
||||
@@ -36,13 +37,25 @@ namespace Thought.vCards
|
||||
this.postalCode = string.Empty;
|
||||
this.region = string.Empty;
|
||||
this.street = 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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The type of postal address.
|
||||
/// </summary>
|
||||
public vCardDeliveryAddressTypes AddressType
|
||||
public List<vCardDeliveryAddressTypes> AddressType
|
||||
{
|
||||
get
|
||||
{
|
||||
@@ -94,21 +107,7 @@ namespace Thought.vCards
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.addressType & vCardDeliveryAddressTypes.Domestic) ==
|
||||
vCardDeliveryAddressTypes.Domestic;
|
||||
}
|
||||
set
|
||||
{
|
||||
|
||||
if (value)
|
||||
{
|
||||
this.addressType |= vCardDeliveryAddressTypes.Domestic;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.addressType &= ~vCardDeliveryAddressTypes.Domestic;
|
||||
}
|
||||
|
||||
return (addressType.Contains(vCardDeliveryAddressTypes.Domestic));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,20 +119,7 @@ namespace Thought.vCards
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.addressType & vCardDeliveryAddressTypes.Home) ==
|
||||
vCardDeliveryAddressTypes.Home;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
this.addressType |= vCardDeliveryAddressTypes.Home;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.addressType &= ~vCardDeliveryAddressTypes.Home;
|
||||
}
|
||||
|
||||
return (addressType.Contains(vCardDeliveryAddressTypes.Home));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -145,19 +131,7 @@ namespace Thought.vCards
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.addressType & vCardDeliveryAddressTypes.International) ==
|
||||
vCardDeliveryAddressTypes.International;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
this.addressType |= vCardDeliveryAddressTypes.International;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.addressType &= ~vCardDeliveryAddressTypes.International;
|
||||
}
|
||||
return (addressType.Contains(vCardDeliveryAddressTypes.International));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,19 +143,7 @@ namespace Thought.vCards
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.addressType & vCardDeliveryAddressTypes.Parcel) ==
|
||||
vCardDeliveryAddressTypes.Parcel;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
this.addressType |= vCardDeliveryAddressTypes.Parcel;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.addressType &= ~vCardDeliveryAddressTypes.Parcel;
|
||||
}
|
||||
return (addressType.Contains(vCardDeliveryAddressTypes.Parcel));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -193,19 +155,7 @@ namespace Thought.vCards
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.addressType & vCardDeliveryAddressTypes.Postal) ==
|
||||
vCardDeliveryAddressTypes.Postal;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
this.addressType |= vCardDeliveryAddressTypes.Postal;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.addressType &= ~vCardDeliveryAddressTypes.Postal;
|
||||
}
|
||||
return (addressType.Contains(vCardDeliveryAddressTypes.Postal));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -217,19 +167,18 @@ namespace Thought.vCards
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.addressType & vCardDeliveryAddressTypes.Work) ==
|
||||
vCardDeliveryAddressTypes.Work;
|
||||
return (addressType.Contains(vCardDeliveryAddressTypes.Work));
|
||||
}
|
||||
set
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Indicates a preferred address
|
||||
/// </summary>
|
||||
public bool IsPreferred
|
||||
{
|
||||
get
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
this.addressType |= vCardDeliveryAddressTypes.Work;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.addressType &= ~vCardDeliveryAddressTypes.Work;
|
||||
}
|
||||
return (addressType.Contains(vCardDeliveryAddressTypes.Preferred));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@ namespace Thought.vCards
|
||||
/// <summary>
|
||||
/// The type of a delivery address.
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum vCardDeliveryAddressTypes
|
||||
{
|
||||
|
||||
@@ -50,7 +49,12 @@ namespace Thought.vCards
|
||||
/// <summary>
|
||||
/// A work delivery address.
|
||||
/// </summary>
|
||||
Work
|
||||
Work,
|
||||
|
||||
/// <summary>
|
||||
/// you can mark an address as Preferred type="pref"
|
||||
/// </summary>
|
||||
Preferred
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,6 +6,7 @@
|
||||
* ======================================================================= */
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Thought.vCards
|
||||
{
|
||||
@@ -18,7 +19,7 @@ namespace Thought.vCards
|
||||
public class vCardDeliveryLabel
|
||||
{
|
||||
|
||||
private vCardDeliveryAddressTypes addressType;
|
||||
private List<vCardDeliveryAddressTypes> addressType;
|
||||
private string text;
|
||||
|
||||
|
||||
@@ -27,6 +28,7 @@ namespace Thought.vCards
|
||||
/// </summary>
|
||||
public vCardDeliveryLabel()
|
||||
{
|
||||
this.addressType = new List<vCardDeliveryAddressTypes>();
|
||||
}
|
||||
|
||||
|
||||
@@ -42,170 +44,107 @@ namespace Thought.vCards
|
||||
public vCardDeliveryLabel(string text)
|
||||
{
|
||||
this.text = text == null ? string.Empty : text;
|
||||
this.addressType = new List<vCardDeliveryAddressTypes>();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The type of delivery address for the label.
|
||||
/// </summary>
|
||||
public vCardDeliveryAddressTypes AddressType
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.addressType;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.addressType = value;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// The type of postal address.
|
||||
/// </summary>
|
||||
public List<vCardDeliveryAddressTypes> AddressType
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.addressType;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.addressType = value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Indicates a domestic delivery address.
|
||||
/// </summary>
|
||||
public bool IsDomestic
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.addressType & vCardDeliveryAddressTypes.Domestic) ==
|
||||
vCardDeliveryAddressTypes.Domestic;
|
||||
}
|
||||
set
|
||||
{
|
||||
|
||||
if (value)
|
||||
{
|
||||
this.addressType |= vCardDeliveryAddressTypes.Domestic;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.addressType &= ~vCardDeliveryAddressTypes.Domestic;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Indicates a domestic delivery address.
|
||||
/// </summary>
|
||||
public bool IsDomestic
|
||||
{
|
||||
get
|
||||
{
|
||||
return (addressType.Contains(vCardDeliveryAddressTypes.Domestic));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Indicates a home address.
|
||||
/// </summary>
|
||||
public bool IsHome
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.addressType & vCardDeliveryAddressTypes.Home) ==
|
||||
vCardDeliveryAddressTypes.Home;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
this.addressType |= vCardDeliveryAddressTypes.Home;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.addressType &= ~vCardDeliveryAddressTypes.Home;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Indicates a home address.
|
||||
/// </summary>
|
||||
public bool IsHome
|
||||
{
|
||||
get
|
||||
{
|
||||
return (addressType.Contains(vCardDeliveryAddressTypes.Home));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Indicates an international address.
|
||||
/// </summary>
|
||||
public bool IsInternational
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.addressType & vCardDeliveryAddressTypes.International) ==
|
||||
vCardDeliveryAddressTypes.International;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
this.addressType |= vCardDeliveryAddressTypes.International;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.addressType &= ~vCardDeliveryAddressTypes.International;
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Indicates an international address.
|
||||
/// </summary>
|
||||
public bool IsInternational
|
||||
{
|
||||
get
|
||||
{
|
||||
return (addressType.Contains(vCardDeliveryAddressTypes.International));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Indicates a parcel delivery address.
|
||||
/// </summary>
|
||||
public bool IsParcel
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.addressType & vCardDeliveryAddressTypes.Parcel) ==
|
||||
vCardDeliveryAddressTypes.Parcel;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
this.addressType |= vCardDeliveryAddressTypes.Parcel;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.addressType &= ~vCardDeliveryAddressTypes.Parcel;
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Indicates a parcel delivery address.
|
||||
/// </summary>
|
||||
public bool IsParcel
|
||||
{
|
||||
get
|
||||
{
|
||||
return (addressType.Contains(vCardDeliveryAddressTypes.Parcel));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Indicates a postal address.
|
||||
/// </summary>
|
||||
public bool IsPostal
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.addressType & vCardDeliveryAddressTypes.Postal) ==
|
||||
vCardDeliveryAddressTypes.Postal;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
this.addressType |= vCardDeliveryAddressTypes.Postal;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.addressType &= ~vCardDeliveryAddressTypes.Postal;
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Indicates a postal address.
|
||||
/// </summary>
|
||||
public bool IsPostal
|
||||
{
|
||||
get
|
||||
{
|
||||
return (addressType.Contains(vCardDeliveryAddressTypes.Postal));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Indicates a work address.
|
||||
/// </summary>
|
||||
public bool IsWork
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.addressType & vCardDeliveryAddressTypes.Work) ==
|
||||
vCardDeliveryAddressTypes.Work;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
this.addressType |= vCardDeliveryAddressTypes.Work;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.addressType &= ~vCardDeliveryAddressTypes.Work;
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Indicates a work address.
|
||||
/// </summary>
|
||||
public bool IsWork
|
||||
{
|
||||
get
|
||||
{
|
||||
return (addressType.Contains(vCardDeliveryAddressTypes.Work));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Indicates a preferred address
|
||||
/// </summary>
|
||||
public bool IsPreferred
|
||||
{
|
||||
get
|
||||
{
|
||||
return (addressType.Contains(vCardDeliveryAddressTypes.Preferred));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -26,9 +26,10 @@ namespace Thought.vCards
|
||||
|
||||
private string address;
|
||||
private vCardEmailAddressType emailType;
|
||||
private ItemType itemType;
|
||||
private bool isPreferred;
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new <see cref="vCardEmailAddress"/>.
|
||||
/// </summary>
|
||||
@@ -36,6 +37,7 @@ namespace Thought.vCards
|
||||
{
|
||||
this.address = string.Empty;
|
||||
this.emailType = vCardEmailAddressType.Internet;
|
||||
this.itemType = ItemType.UNSPECIFIED;
|
||||
}
|
||||
|
||||
|
||||
@@ -45,29 +47,19 @@ namespace Thought.vCards
|
||||
/// <param name="address">
|
||||
/// The Internet email address.
|
||||
/// </param>
|
||||
public vCardEmailAddress(string address)
|
||||
/// <param name="emailType">type of address, usually Internet. Internet is the default.</param>
|
||||
/// <param name="itemType">HOME,WORK, unspecified</param>
|
||||
public vCardEmailAddress(string address, vCardEmailAddressType emailType = vCardEmailAddressType.Internet, ItemType itemType = ItemType.UNSPECIFIED)
|
||||
{
|
||||
this.address = address == null ? string.Empty : address;
|
||||
this.emailType = vCardEmailAddressType.Internet;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new <see cref="vCardEmailAddress"/> of the specified type.
|
||||
/// </summary>
|
||||
/// <param name="address">
|
||||
/// The email address.
|
||||
/// </param>
|
||||
/// <param name="emailType">
|
||||
/// The type of email address.
|
||||
/// </param>
|
||||
public vCardEmailAddress(string address, vCardEmailAddressType emailType)
|
||||
{
|
||||
this.address = address;
|
||||
this.emailType = emailType;
|
||||
this.itemType = itemType;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The email address.
|
||||
/// </summary>
|
||||
@@ -118,6 +110,16 @@ namespace Thought.vCards
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ItemType for this element (HOME,WORK,etc)
|
||||
/// </summary>
|
||||
public ItemType ItemType {
|
||||
|
||||
get { return this.itemType; }
|
||||
set { this.itemType = value; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Builds a string that represents the email address.
|
||||
|
||||
@@ -94,4 +94,24 @@ namespace Thought.vCards
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Identifies the HOME,WORK,ETC typing of an element
|
||||
/// </summary>
|
||||
public enum ItemType
|
||||
{
|
||||
/// <summary>
|
||||
/// default - unknown
|
||||
/// </summary>
|
||||
UNSPECIFIED =0,
|
||||
/// <summary>
|
||||
/// work
|
||||
/// </summary>
|
||||
WORK = 1,
|
||||
/// <summary>
|
||||
/// home
|
||||
/// </summary>
|
||||
HOME =2,
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
319
vCardEditor/Thought.vCards/vCardIMPP.cs
Normal file
319
vCardEditor/Thought.vCards/vCardIMPP.cs
Normal file
@@ -0,0 +1,319 @@
|
||||
|
||||
/* =======================================================================
|
||||
* vCard Library for .NET
|
||||
* Copyright (c) 2007-2009 David Pinch; http://wwww.thoughtproject.com
|
||||
* See LICENSE.TXT for licensing information.
|
||||
* ======================================================================= */
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
|
||||
namespace Thought.vCards
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// IM info <see cref="vCard"/>.
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class vCardIMPP
|
||||
{
|
||||
|
||||
private string handle;
|
||||
private ItemType itemType;
|
||||
private IMServiceType serviceType;
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new <see cref="vCardIMPP"/> object.
|
||||
/// </summary>
|
||||
public vCardIMPP()
|
||||
{
|
||||
this.serviceType = IMServiceType.Unspecified;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new <see cref="vCardIMPP"/> object with the specified handle.
|
||||
/// </summary>
|
||||
/// <param name="handle">the im handle</param>
|
||||
/// <param name="serviceType">skype, aim, etc</param>
|
||||
/// <param name="itemType">the type of IM, defaults to Unspecified</param>
|
||||
public vCardIMPP(string handle, IMServiceType serviceType, ItemType itemType = ItemType.UNSPECIFIED)
|
||||
{
|
||||
this.handle = handle;
|
||||
this.itemType = itemType;
|
||||
this.serviceType = serviceType;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The full IM handle.
|
||||
/// </summary>
|
||||
public string Handle
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.handle ?? string.Empty;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.handle = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// the IMServiceType AIM, googletalk, etc
|
||||
/// </summary>
|
||||
public IMServiceType ServiceType
|
||||
{
|
||||
get { return serviceType; }
|
||||
set { serviceType = value; }
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The IM ItemType. home work, unspecified
|
||||
/// </summary>
|
||||
public ItemType ItemType
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.itemType;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.itemType = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// is PREF set on this IMPP item
|
||||
/// </summary>
|
||||
public bool IsPreferred { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// simple enum for various types of IM services
|
||||
/// </summary>
|
||||
public enum IMServiceType
|
||||
{
|
||||
/// <summary>
|
||||
/// unspecified
|
||||
/// </summary>
|
||||
Unspecified = 0,
|
||||
/// <summary>
|
||||
/// for Skype
|
||||
/// </summary>
|
||||
Skype,
|
||||
/// <summary>
|
||||
/// aim
|
||||
/// </summary>
|
||||
AIM,
|
||||
/// <summary>
|
||||
/// gtalk
|
||||
/// </summary>
|
||||
GoogleTalk,
|
||||
/// <summary>
|
||||
/// msn
|
||||
/// </summary>
|
||||
MSN,
|
||||
/// <summary>
|
||||
/// yahoo
|
||||
/// </summary>
|
||||
Yahoo,
|
||||
|
||||
/// <summary>
|
||||
/// facebook
|
||||
/// </summary>
|
||||
Facebook,
|
||||
/// <summary>
|
||||
/// jabber
|
||||
/// </summary>
|
||||
Jabber,
|
||||
/// <summary>
|
||||
/// icq
|
||||
/// </summary>
|
||||
ICQ,
|
||||
/// <summary>
|
||||
/// qq
|
||||
/// </summary>
|
||||
QQ,
|
||||
/// <summary>
|
||||
/// gadu gadu
|
||||
/// </summary>
|
||||
GaduGadu
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// simple class to generate the strings for given IMServiceType
|
||||
/// </summary>
|
||||
public static class IMTypeUtils
|
||||
{
|
||||
|
||||
private static Dictionary<IMServiceType, string> lookup;
|
||||
|
||||
static IMTypeUtils()
|
||||
{
|
||||
lookup = new Dictionary<IMServiceType, string>();
|
||||
lookup.Add(IMServiceType.AIM, "AIM:aim");
|
||||
lookup.Add(IMServiceType.Facebook, "Facebook:xmpp");
|
||||
lookup.Add(IMServiceType.GoogleTalk, "GoogleTalk:xmpp");
|
||||
lookup.Add(IMServiceType.ICQ, "ICQ:aim");
|
||||
lookup.Add(IMServiceType.Jabber, "Jabber:xmpp");
|
||||
lookup.Add(IMServiceType.MSN, "MSN:msnim");
|
||||
lookup.Add(IMServiceType.QQ, "QQ:x-apple");
|
||||
lookup.Add(IMServiceType.Skype, "Skype:skype");
|
||||
lookup.Add(IMServiceType.Yahoo, "Yahoo:ymsgr");
|
||||
lookup.Add(IMServiceType.GaduGadu, "GaduGadu:x-apple");
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// will return the property meta info to be written for a given IM serviceType
|
||||
/// </summary>
|
||||
///
|
||||
/// <param name="serviceType">IMServiceType to get the subproperty info for </param>
|
||||
/// <returns>for example GoogleTalk:xmpp, or for yahoo Yahoo:ymsgr</returns>
|
||||
public static string GetIMTypePropertyFull(IMServiceType serviceType)
|
||||
{
|
||||
|
||||
if (lookup.ContainsKey(serviceType))
|
||||
{
|
||||
return lookup[serviceType];
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// returns the xmpp or aim or ymsgr portion of the lookup for AIM:aim, Yahoo:ysmgr, etc
|
||||
/// </summary>
|
||||
/// <param name="serviceType">IMServiceType to fetch the lookup for</param>
|
||||
/// <returns>xmpp or msnim</returns>
|
||||
public static string GetIMTypePropertySuffix(IMServiceType serviceType)
|
||||
{
|
||||
string suffix = null;
|
||||
if (lookup.ContainsKey(serviceType))
|
||||
{
|
||||
string full = lookup[serviceType];
|
||||
|
||||
suffix = full.Substring(full.IndexOf(":") + 1);
|
||||
|
||||
}
|
||||
|
||||
return suffix;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// this method will return the first part of the AIM:aim , or MSN:msnim string used for writing out the property subproperty info for IMPP values
|
||||
/// </summary>
|
||||
/// <param name="serviceType">the IM service type to fetch from the dictionary</param>
|
||||
/// <returns>AIM or QQ or Yahoo, the first string component for the lookup of serviceTypes</returns>
|
||||
public static string GetIMTypePropertyPrefix(IMServiceType serviceType)
|
||||
{
|
||||
string prefix = null;
|
||||
if (lookup.ContainsKey(serviceType))
|
||||
{
|
||||
string full = lookup[serviceType];
|
||||
|
||||
prefix = full.Substring(0, full.IndexOf(":"));
|
||||
|
||||
}
|
||||
|
||||
return prefix;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// the handle is coming back with the msnim:handle, so we want to return the pure handle minus the msnim:
|
||||
/// </summary>
|
||||
/// <param name="serviceType"></param>
|
||||
/// <param name="handle"></param>
|
||||
/// <returns></returns>
|
||||
public static string StripHandlePrefix(IMServiceType serviceType, string handle)
|
||||
{
|
||||
|
||||
string property = GetIMTypePropertyFull(serviceType);
|
||||
|
||||
|
||||
if (property != null)
|
||||
{
|
||||
string prefix = property.Substring(property.IndexOf(":") + 1);
|
||||
int prefixLength = prefix.Length + 1;
|
||||
if (handle.StartsWith(prefix))
|
||||
{
|
||||
handle = handle.Substring(handle.IndexOf(prefix + ":") + prefixLength);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return handle;
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// for parsing the
|
||||
/// </summary>
|
||||
/// <param name="imType"></param>
|
||||
/// <returns></returns>
|
||||
public static IMServiceType? GetIMServiceType(string imType)
|
||||
{
|
||||
IMServiceType? serviceType = null;
|
||||
|
||||
switch (imType.ToLowerInvariant())
|
||||
{
|
||||
case "aim":
|
||||
serviceType = IMServiceType.AIM;
|
||||
break;
|
||||
case "facebook":
|
||||
serviceType = IMServiceType.Facebook;
|
||||
break;
|
||||
case "googletalk":
|
||||
case "google":
|
||||
serviceType = IMServiceType.GoogleTalk;
|
||||
break;
|
||||
case "icq":
|
||||
serviceType = IMServiceType.ICQ;
|
||||
break;
|
||||
case "jabber":
|
||||
case "xmpp":
|
||||
serviceType = IMServiceType.Jabber;
|
||||
break;
|
||||
case "msn":
|
||||
serviceType = IMServiceType.MSN;
|
||||
break;
|
||||
case "qq":
|
||||
serviceType = IMServiceType.QQ;
|
||||
break;
|
||||
case "skype":
|
||||
serviceType = IMServiceType.Skype;
|
||||
break;
|
||||
case "yahoo":
|
||||
case "ymsgr":
|
||||
serviceType = IMServiceType.Yahoo;
|
||||
break;
|
||||
case "gadugadu":
|
||||
case "gadu":
|
||||
serviceType = IMServiceType.GaduGadu;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return serviceType;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
21
vCardEditor/Thought.vCards/vCardIMPPCollection.cs
Normal file
21
vCardEditor/Thought.vCards/vCardIMPPCollection.cs
Normal file
@@ -0,0 +1,21 @@
|
||||
|
||||
/* =======================================================================
|
||||
* vCard Library for .NET
|
||||
* Copyright (c) 2007-2009 David Pinch; http://wwww.thoughtproject.com
|
||||
* See LICENSE.TXT for licensing information.
|
||||
* ======================================================================= */
|
||||
|
||||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
|
||||
namespace Thought.vCards
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// A collection of <see cref="vCardIMPP"/> objects.
|
||||
/// </summary>
|
||||
public class vCardIMPPCollection : Collection<vCardIMPP>
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
@@ -143,6 +143,52 @@ namespace Thought.vCards
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Indicates an iphone
|
||||
/// </summary>
|
||||
/// <seealso cref="vCardPhoneTypes"/>
|
||||
public bool IsiPhone
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.phoneType & vCardPhoneTypes.IPhone) == vCardPhoneTypes.IPhone;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
this.phoneType = this.phoneType | vCardPhoneTypes.IPhone;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.phoneType = this.phoneType & ~vCardPhoneTypes.IPhone;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Indicates a main number
|
||||
/// </summary>
|
||||
/// <seealso cref="vCardPhoneTypes"/>
|
||||
public bool IsMain
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.phoneType & vCardPhoneTypes.Main) == vCardPhoneTypes.Main;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
this.phoneType = this.phoneType | vCardPhoneTypes.Main;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.phoneType = this.phoneType & ~vCardPhoneTypes.Main;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Indicates a fax number.
|
||||
|
||||
@@ -107,7 +107,18 @@ namespace Thought.vCards
|
||||
/// <summary>
|
||||
/// Indicates a work and voice number.
|
||||
/// </summary>
|
||||
WorkVoice = Work + Voice
|
||||
WorkVoice = Work + Voice,
|
||||
|
||||
/// <summary>
|
||||
/// to handle iPhone type in NAB for phone
|
||||
/// </summary>
|
||||
IPhone = 8192,
|
||||
|
||||
/// <summary>
|
||||
/// to handle Main type for NAB
|
||||
/// </summary>
|
||||
Main = 16384
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -49,6 +49,10 @@ namespace Thought.vCards
|
||||
private Uri url;
|
||||
|
||||
|
||||
|
||||
private string encodedData;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Loads a photograph from an array of bytes.
|
||||
/// </summary>
|
||||
@@ -97,6 +101,27 @@ namespace Thought.vCards
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new vCard photo from already encoded data.
|
||||
/// </summary>
|
||||
/// <param name="data">
|
||||
/// The base64 encoded string of the image.
|
||||
/// </param>
|
||||
/// <param name="isEncoded">
|
||||
/// Boolean true if is encoded.
|
||||
/// </param>
|
||||
public vCardPhoto(string data, bool isEncoded)
|
||||
{
|
||||
|
||||
if (string.IsNullOrEmpty(data))
|
||||
{
|
||||
throw new ArgumentNullException("data");
|
||||
}
|
||||
|
||||
this.encodedData = data;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new vCard photo from an existing Bitmap object.
|
||||
@@ -198,8 +223,19 @@ namespace Thought.vCards
|
||||
/// </remarks>
|
||||
public Bitmap GetBitmap()
|
||||
{
|
||||
MemoryStream stream = new MemoryStream(this.data);
|
||||
return new Bitmap(stream);
|
||||
if (HasEncodedData)
|
||||
{
|
||||
var bytes = Convert.FromBase64String(this.EncodedData);
|
||||
|
||||
MemoryStream stream = new MemoryStream(bytes);
|
||||
return new Bitmap(stream);
|
||||
}
|
||||
else
|
||||
{
|
||||
MemoryStream stream = new MemoryStream(this.data);
|
||||
return new Bitmap(stream);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -233,6 +269,28 @@ namespace Thought.vCards
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// property used to check if the data is already encoded in base64
|
||||
/// </summary>
|
||||
public bool HasEncodedData
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.encodedData != null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// get base64 encoded data
|
||||
/// </summary>
|
||||
public string EncodedData
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.encodedData;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The URL of the image.
|
||||
|
||||
206
vCardEditor/Thought.vCards/vCardSocialProfile.cs
Normal file
206
vCardEditor/Thought.vCards/vCardSocialProfile.cs
Normal file
@@ -0,0 +1,206 @@
|
||||
|
||||
/* =======================================================================
|
||||
* vCard Library for .NET
|
||||
* Copyright (c) 2007-2009 David Pinch; http://wwww.thoughtproject.com
|
||||
* See LICENSE.TXT for licensing information.
|
||||
* ======================================================================= */
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
|
||||
namespace Thought.vCards
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// IM info <see cref="vCard"/>.
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class vCardSocialProfile
|
||||
{
|
||||
|
||||
private string username;
|
||||
private SocialProfileServiceType serviceType;
|
||||
private string fullProfileUrl;
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new <see cref="vCardIMPP"/> object.
|
||||
/// </summary>
|
||||
public vCardSocialProfile()
|
||||
{
|
||||
this.serviceType = SocialProfileServiceType.Unspecified;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new <see cref="vCardIMPP"/> object with the specified handle.
|
||||
/// </summary>
|
||||
/// <param name="username">the social profile username handle</param>
|
||||
/// <param name="serviceType">Facebook, Twitter, Flickr, etc</param>
|
||||
/// <param name="fullProfileUrl">the full url for the profile => http://twitter.com/username </param>
|
||||
public vCardSocialProfile(string username, SocialProfileServiceType serviceType, string fullProfileUrl)
|
||||
{
|
||||
this.username = username;
|
||||
this.serviceType = serviceType;
|
||||
this.fullProfileUrl = fullProfileUrl;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// the full profile url of the socialProfile (http://twitter.com/username)
|
||||
/// </summary>
|
||||
public string ProfileUrl
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.fullProfileUrl ?? string.Empty;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.fullProfileUrl = value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The username on the socialProfile
|
||||
/// </summary>
|
||||
public string Username
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.username ?? string.Empty;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.username = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// the IMServiceType AIM, googletalk, etc
|
||||
/// </summary>
|
||||
public SocialProfileServiceType ServiceType
|
||||
{
|
||||
get { return serviceType; }
|
||||
set { serviceType = value; }
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// simple enum for various types of SocialProfile services
|
||||
/// </summary>
|
||||
public enum SocialProfileServiceType
|
||||
{
|
||||
/// <summary>
|
||||
/// unspecified
|
||||
/// </summary>
|
||||
Unspecified = 0,
|
||||
/// <summary>
|
||||
/// Facebook
|
||||
/// </summary>
|
||||
Facebook,
|
||||
/// <summary>
|
||||
/// LinkedIn
|
||||
/// </summary>
|
||||
LinkedIn,
|
||||
/// <summary>
|
||||
/// Twitter
|
||||
/// </summary>
|
||||
Twitter,
|
||||
/// <summary>
|
||||
/// Flickr
|
||||
/// </summary>
|
||||
Flickr,
|
||||
/// <summary>
|
||||
/// Myspace
|
||||
/// </summary>
|
||||
Myspace
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// utisl to handle string to enum conversion in one spot for SocialProfile types
|
||||
/// </summary>
|
||||
public static class SocialProfileTypeUtils
|
||||
{
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// for parsing the type string
|
||||
/// </summary>
|
||||
/// <param name="profileType"></param>
|
||||
/// <returns>nullable ServiceType for matching string of serviceType</returns>
|
||||
public static SocialProfileServiceType? GetSocialProfileServiceType(string profileType)
|
||||
{
|
||||
SocialProfileServiceType? serviceType = null;
|
||||
|
||||
switch (profileType.ToLowerInvariant())
|
||||
{
|
||||
case "facebook":
|
||||
serviceType = SocialProfileServiceType.Facebook;
|
||||
break;
|
||||
case "flickr":
|
||||
serviceType = SocialProfileServiceType.Flickr;
|
||||
break;
|
||||
case "linkedin":
|
||||
serviceType = SocialProfileServiceType.LinkedIn;
|
||||
break;
|
||||
case "myspace":
|
||||
serviceType = SocialProfileServiceType.Myspace;
|
||||
break;
|
||||
case "twitter":
|
||||
serviceType = SocialProfileServiceType.Twitter;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
|
||||
return serviceType;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// for returning the socialProfile type string that will be used in the type=twitter for reading socialProfile vCard data
|
||||
/// </summary>
|
||||
/// <param name="serviceType">the SocialProfile Type to get the lowercase string for to include in the type value</param>
|
||||
/// <returns>facebook,twitter,etc</returns>
|
||||
public static string GetSocialProfileServicePropertyType(SocialProfileServiceType serviceType)
|
||||
{
|
||||
string profileType = null;
|
||||
|
||||
switch (serviceType)
|
||||
{
|
||||
case SocialProfileServiceType.Facebook :
|
||||
profileType = "facebook";
|
||||
break;
|
||||
case SocialProfileServiceType.Flickr:
|
||||
profileType = "flickr";
|
||||
break;
|
||||
case SocialProfileServiceType.LinkedIn:
|
||||
profileType = "linkedin";
|
||||
break;
|
||||
case SocialProfileServiceType.Myspace:
|
||||
profileType = "myspace";
|
||||
break;
|
||||
case SocialProfileServiceType.Twitter:
|
||||
profileType = "twitter";
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return profileType;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
21
vCardEditor/Thought.vCards/vCardSocialProfileCollection.cs
Normal file
21
vCardEditor/Thought.vCards/vCardSocialProfileCollection.cs
Normal file
@@ -0,0 +1,21 @@
|
||||
|
||||
/* =======================================================================
|
||||
* vCard Library for .NET
|
||||
* Copyright (c) 2007-2009 David Pinch; http://wwww.thoughtproject.com
|
||||
* See LICENSE.TXT for licensing information.
|
||||
* ======================================================================= */
|
||||
|
||||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
|
||||
namespace Thought.vCards
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// A collection of <see cref="vCardSocialProfile"/> objects.
|
||||
/// </summary>
|
||||
public class vCardSocialProfileCollection : Collection<vCardSocialProfile>
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -22,7 +22,7 @@ namespace Thought.vCards
|
||||
private bool embedLocalImages;
|
||||
private vCardStandardWriterOptions options;
|
||||
private string productId;
|
||||
|
||||
private const string TYPE = "TYPE";
|
||||
|
||||
/// <summary>
|
||||
/// The characters that are escaped per the original
|
||||
@@ -156,7 +156,7 @@ namespace Thought.vCards
|
||||
// See section 2.1.1 of RFC 2426.
|
||||
|
||||
properties.Add(new vCardProperty("BEGIN", "VCARD"));
|
||||
|
||||
properties.Add(new vCardProperty("VERSION", "3.0"));
|
||||
BuildProperties_NAME(
|
||||
properties,
|
||||
card);
|
||||
@@ -197,6 +197,8 @@ namespace Thought.vCards
|
||||
properties,
|
||||
card);
|
||||
|
||||
BuildProperties_IMPP(properties, card);
|
||||
|
||||
BuildProperties_KEY(
|
||||
properties,
|
||||
card);
|
||||
@@ -257,6 +259,8 @@ namespace Thought.vCards
|
||||
properties,
|
||||
card);
|
||||
|
||||
BuildProperties_XSOCIALPROFILE(properties, card);
|
||||
|
||||
BuildProperties_X_WAB_GENDER(
|
||||
properties,
|
||||
card);
|
||||
@@ -309,7 +313,7 @@ namespace Thought.vCards
|
||||
|
||||
values.Add(string.Empty);
|
||||
values.Add(string.Empty);
|
||||
values.Add(address.Street);
|
||||
values.Add(!string.IsNullOrEmpty(address.Street) ? address.Street.Replace("\r\n", "\n") : string.Empty);
|
||||
values.Add(address.City);
|
||||
values.Add(address.Region);
|
||||
values.Add(address.PostalCode);
|
||||
@@ -319,22 +323,27 @@ namespace Thought.vCards
|
||||
new vCardProperty("ADR", values);
|
||||
|
||||
if (address.IsDomestic)
|
||||
property.Subproperties.Add("DOM");
|
||||
property.Subproperties.Add(TYPE, "DOM");
|
||||
|
||||
if (address.IsInternational)
|
||||
property.Subproperties.Add("INTL");
|
||||
property.Subproperties.Add(TYPE, "INTL");
|
||||
|
||||
if (address.IsParcel)
|
||||
property.Subproperties.Add("PARCEL");
|
||||
property.Subproperties.Add(TYPE, "PARCEL");
|
||||
|
||||
if (address.IsPostal)
|
||||
property.Subproperties.Add("POSTAL");
|
||||
property.Subproperties.Add(TYPE, "POSTAL");
|
||||
|
||||
if (address.IsHome)
|
||||
property.Subproperties.Add("HOME");
|
||||
property.Subproperties.Add(TYPE, "HOME");
|
||||
|
||||
if (address.IsWork)
|
||||
property.Subproperties.Add("WORK");
|
||||
property.Subproperties.Add(TYPE, "WORK");
|
||||
|
||||
if (address.IsPreferred)
|
||||
{
|
||||
property.Subproperties.Add(TYPE, "PREF");
|
||||
}
|
||||
|
||||
properties.Add(property);
|
||||
|
||||
@@ -359,16 +368,16 @@ namespace Thought.vCards
|
||||
// The BDAY property indicates the birthdate
|
||||
// of the person. The output format here is based on
|
||||
// Microsoft Outlook, which writes the date as YYYMMDD.
|
||||
// FIXES DateFormat with ToString
|
||||
|
||||
if (card.BirthDate.HasValue)
|
||||
{
|
||||
|
||||
vCardProperty property =
|
||||
new vCardProperty("BDAY", card.BirthDate.Value);
|
||||
new vCardProperty("BDAY", card.BirthDate.Value.ToString("yyyy-MM-dd"));
|
||||
|
||||
properties.Add(property);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -467,66 +476,83 @@ namespace Thought.vCards
|
||||
|
||||
if (emailAddress.IsPreferred)
|
||||
{
|
||||
property.Subproperties.Add("PREF");
|
||||
property.Subproperties.Add(TYPE, "PREF");
|
||||
}
|
||||
|
||||
switch (emailAddress.EmailType)
|
||||
{
|
||||
|
||||
case vCardEmailAddressType.Internet:
|
||||
property.Subproperties.Add("INTERNET");
|
||||
property.Subproperties.Add(TYPE, "INTERNET");
|
||||
break;
|
||||
|
||||
case vCardEmailAddressType.AOL:
|
||||
property.Subproperties.Add("AOL");
|
||||
property.Subproperties.Add(TYPE, "AOL");
|
||||
break;
|
||||
|
||||
case vCardEmailAddressType.AppleLink:
|
||||
property.Subproperties.Add("AppleLink");
|
||||
property.Subproperties.Add(TYPE, "AppleLink");
|
||||
break;
|
||||
|
||||
case vCardEmailAddressType.AttMail:
|
||||
property.Subproperties.Add("ATTMail");
|
||||
property.Subproperties.Add(TYPE, "ATTMail");
|
||||
break;
|
||||
|
||||
case vCardEmailAddressType.CompuServe:
|
||||
property.Subproperties.Add("CIS");
|
||||
property.Subproperties.Add(TYPE, "CIS");
|
||||
break;
|
||||
|
||||
case vCardEmailAddressType.eWorld:
|
||||
property.Subproperties.Add("eWorld");
|
||||
property.Subproperties.Add(TYPE, "eWorld");
|
||||
break;
|
||||
|
||||
case vCardEmailAddressType.IBMMail:
|
||||
property.Subproperties.Add("IBMMail");
|
||||
property.Subproperties.Add(TYPE, "IBMMail");
|
||||
break;
|
||||
|
||||
case vCardEmailAddressType.MCIMail:
|
||||
property.Subproperties.Add("MCIMail");
|
||||
property.Subproperties.Add(TYPE, "MCIMail");
|
||||
break;
|
||||
|
||||
case vCardEmailAddressType.PowerShare:
|
||||
property.Subproperties.Add("POWERSHARE");
|
||||
property.Subproperties.Add(TYPE, "POWERSHARE");
|
||||
break;
|
||||
|
||||
case vCardEmailAddressType.Prodigy:
|
||||
property.Subproperties.Add("PRODIGY");
|
||||
property.Subproperties.Add(TYPE, "PRODIGY");
|
||||
break;
|
||||
|
||||
case vCardEmailAddressType.Telex:
|
||||
property.Subproperties.Add("TLX");
|
||||
property.Subproperties.Add(TYPE, "TLX");
|
||||
break;
|
||||
|
||||
case vCardEmailAddressType.X400:
|
||||
property.Subproperties.Add("X400");
|
||||
property.Subproperties.Add(TYPE, "X400");
|
||||
break;
|
||||
|
||||
default:
|
||||
property.Subproperties.Add("INTERNET");
|
||||
property.Subproperties.Add(TYPE, "INTERNET");
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
switch (emailAddress.ItemType)
|
||||
{
|
||||
case ItemType.UNSPECIFIED:
|
||||
//do nothing
|
||||
break;
|
||||
case ItemType.HOME:
|
||||
property.Subproperties.Add(TYPE, ItemType.HOME.ToString());
|
||||
break;
|
||||
case ItemType.WORK:
|
||||
property.Subproperties.Add(TYPE, ItemType.WORK.ToString());
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
properties.Add(property);
|
||||
|
||||
}
|
||||
@@ -588,14 +614,76 @@ namespace Thought.vCards
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
#endregion
|
||||
|
||||
#region [ BuildProperties_KEY ]
|
||||
|
||||
/// <summary>
|
||||
/// Builds KEY properties.
|
||||
/// </summary>
|
||||
private void BuildProperties_KEY(
|
||||
private void BuildProperties_IMPP(vCardPropertyCollection properties, vCard card)
|
||||
{
|
||||
|
||||
// adding support for IMPP (IM handles) in the vCard
|
||||
//iOS outputs this => IMPP;X-SERVICE-TYPE=Skype;type=HOME;type=pref:skype:skypeusernameee
|
||||
|
||||
|
||||
|
||||
foreach (var im in card.IMs)
|
||||
{
|
||||
|
||||
vCardProperty property = new vCardProperty();
|
||||
property.Name = "IMPP";
|
||||
|
||||
string prefix = IMTypeUtils.GetIMTypePropertyPrefix(im.ServiceType);
|
||||
string suffix = IMTypeUtils.GetIMTypePropertySuffix(im.ServiceType);
|
||||
|
||||
if (!string.IsNullOrEmpty(prefix) && !string.IsNullOrEmpty(suffix))
|
||||
{
|
||||
property.Subproperties.Add("X-SERVICE-TYPE", prefix);
|
||||
property.Value = string.Concat(suffix, ":", im.Handle);
|
||||
}
|
||||
else
|
||||
{
|
||||
property.Value = im.Handle;
|
||||
}
|
||||
|
||||
|
||||
if (im.IsPreferred)
|
||||
{
|
||||
property.Subproperties.Add(TYPE, "PREF");
|
||||
}
|
||||
|
||||
switch (im.ItemType)
|
||||
{
|
||||
|
||||
case ItemType.HOME:
|
||||
property.Subproperties.Add(TYPE, ItemType.HOME.ToString());
|
||||
break;
|
||||
case ItemType.WORK:
|
||||
property.Subproperties.Add(TYPE, ItemType.WORK.ToString());
|
||||
break;
|
||||
|
||||
case ItemType.UNSPECIFIED:
|
||||
default:
|
||||
property.Subproperties.Add(TYPE, "OTHER");
|
||||
break;
|
||||
}
|
||||
|
||||
properties.Add(property);
|
||||
|
||||
if (im.ServiceType == IMServiceType.AIM)
|
||||
{
|
||||
var propertyXAim = new vCardProperty("X-AIM", im.Handle);
|
||||
properties.Add(propertyXAim);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#region [ BuildProperties_KEY ]
|
||||
|
||||
/// <summary>
|
||||
/// Builds KEY properties.
|
||||
/// </summary>
|
||||
private void BuildProperties_KEY(
|
||||
vCardPropertyCollection properties,
|
||||
vCard card)
|
||||
{
|
||||
@@ -609,7 +697,7 @@ namespace Thought.vCards
|
||||
|
||||
property.Name = "KEY";
|
||||
property.Value = certificate.Data;
|
||||
property.Subproperties.Add(certificate.KeyType);
|
||||
property.Subproperties.Add(TYPE, certificate.KeyType);
|
||||
|
||||
properties.Add(property);
|
||||
|
||||
@@ -635,26 +723,23 @@ namespace Thought.vCards
|
||||
vCardProperty property = new vCardProperty("LABEL", label.Text);
|
||||
|
||||
if (label.IsDomestic)
|
||||
property.Subproperties.Add("DOM");
|
||||
property.Subproperties.Add(TYPE, "DOM");
|
||||
|
||||
if (label.IsInternational)
|
||||
property.Subproperties.Add("INTL");
|
||||
property.Subproperties.Add(TYPE, "INTL");
|
||||
|
||||
if (label.IsParcel)
|
||||
property.Subproperties.Add("PARCEL");
|
||||
property.Subproperties.Add(TYPE, "PARCEL");
|
||||
|
||||
if (label.IsPostal)
|
||||
property.Subproperties.Add("POSTAL");
|
||||
property.Subproperties.Add(TYPE, "POSTAL");
|
||||
|
||||
if (label.IsHome)
|
||||
property.Subproperties.Add("HOME");
|
||||
property.Subproperties.Add(TYPE, "HOME");
|
||||
|
||||
if (label.IsWork)
|
||||
property.Subproperties.Add("WORK");
|
||||
property.Subproperties.Add(TYPE, "WORK");
|
||||
|
||||
// Give a hint to use QUOTED-PRINTABLE.
|
||||
|
||||
property.Subproperties.Add("ENCODING", "QUOTED-PRINTABLE");
|
||||
properties.Add(property);
|
||||
|
||||
|
||||
@@ -803,14 +888,13 @@ namespace Thought.vCards
|
||||
vCardProperty property = new vCardProperty();
|
||||
|
||||
property.Name = "NOTE";
|
||||
property.Value = note.Text;
|
||||
property.Value = note.Text.Replace("\r\n", "\n");
|
||||
|
||||
if (!string.IsNullOrEmpty(note.Language))
|
||||
{
|
||||
property.Subproperties.Add("language", note.Language);
|
||||
}
|
||||
|
||||
property.Subproperties.Add("ENCODING", "QUOTED-PRINTABLE");
|
||||
properties.Add(property);
|
||||
|
||||
}
|
||||
@@ -839,8 +923,20 @@ namespace Thought.vCards
|
||||
if (!string.IsNullOrEmpty(card.Organization))
|
||||
{
|
||||
|
||||
vCardProperty property =
|
||||
new vCardProperty("ORG", card.Organization);
|
||||
vCardProperty property;
|
||||
|
||||
// Add department also
|
||||
if (!string.IsNullOrEmpty(card.Department))
|
||||
{
|
||||
vCardValueCollection values = new vCardValueCollection(';');
|
||||
values.Add(card.Organization);
|
||||
values.Add(card.Department);
|
||||
property = new vCardProperty("ORG", values);
|
||||
}
|
||||
else
|
||||
{
|
||||
property = new vCardProperty("ORG", card.Organization);
|
||||
}
|
||||
|
||||
properties.Add(property);
|
||||
|
||||
@@ -860,80 +956,89 @@ namespace Thought.vCards
|
||||
foreach (vCardPhoto photo in card.Photos)
|
||||
{
|
||||
|
||||
if (photo.Url == null)
|
||||
if (photo.Url == null)
|
||||
{
|
||||
|
||||
// This photo does not have a URL associated
|
||||
// with it. Therefore a property can be
|
||||
// generated only if the image data is loaded.
|
||||
// Otherwise there is not enough information.
|
||||
|
||||
vCardProperty property = null;
|
||||
|
||||
if (photo.IsLoaded)
|
||||
{
|
||||
property = new vCardProperty("PHOTO", photo.GetBytes());
|
||||
}
|
||||
else if (photo.HasEncodedData)
|
||||
{
|
||||
property = new vCardProperty("PHOTO", photo.EncodedData);
|
||||
}
|
||||
|
||||
if (property != null)
|
||||
{
|
||||
property.Subproperties.Add("TYPE", "JPEG");
|
||||
properties.Add(property);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
// This photo has a URL associated with it. The
|
||||
// PHOTO property can either be linked as an image
|
||||
// or embedded, if desired.
|
||||
|
||||
bool doEmbedded =
|
||||
photo.Url.IsFile ? this.embedLocalImages : this.embedInternetImages;
|
||||
|
||||
if (doEmbedded)
|
||||
{
|
||||
|
||||
// This photo does not have a URL associated
|
||||
// with it. Therefore a property can be
|
||||
// generated only if the image data is loaded.
|
||||
// Otherwise there is not enough information.
|
||||
// According to the settings of the card writer,
|
||||
// this linked image should be embedded into the
|
||||
// vCard data. Attempt to fetch the data.
|
||||
|
||||
if (photo.IsLoaded)
|
||||
{
|
||||
try
|
||||
{
|
||||
photo.Fetch();
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
properties.Add(
|
||||
new vCardProperty("PHOTO", photo.GetBytes()));
|
||||
// An error was encountered. The image can
|
||||
// still be written as a link, however.
|
||||
|
||||
}
|
||||
doEmbedded = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// At this point, doEmbedded is true only if (a) the
|
||||
// writer was configured to embed the image, and (b)
|
||||
// the image was successfully downloaded.
|
||||
|
||||
if (doEmbedded)
|
||||
{
|
||||
properties.Add(
|
||||
new vCardProperty("PHOTO", photo.GetBytes()));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
// This photo has a URL associated with it. The
|
||||
// PHOTO property can either be linked as an image
|
||||
// or embedded, if desired.
|
||||
vCardProperty uriPhotoProperty =
|
||||
new vCardProperty("PHOTO");
|
||||
|
||||
bool doEmbedded =
|
||||
photo.Url.IsFile ? this.embedLocalImages : this.embedInternetImages;
|
||||
// Set the VALUE property to indicate that
|
||||
// the data for the photo is a URI.
|
||||
|
||||
if (doEmbedded)
|
||||
{
|
||||
|
||||
// According to the settings of the card writer,
|
||||
// this linked image should be embedded into the
|
||||
// vCard data. Attempt to fetch the data.
|
||||
|
||||
try
|
||||
{
|
||||
photo.Fetch();
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
// An error was encountered. The image can
|
||||
// still be written as a link, however.
|
||||
|
||||
doEmbedded = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// At this point, doEmbedded is true only if (a) the
|
||||
// writer was configured to embed the image, and (b)
|
||||
// the image was successfully downloaded.
|
||||
|
||||
if (doEmbedded)
|
||||
{
|
||||
properties.Add(
|
||||
new vCardProperty("PHOTO", photo.GetBytes()));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
vCardProperty uriPhotoProperty =
|
||||
new vCardProperty("PHOTO");
|
||||
|
||||
// Set the VALUE property to indicate that
|
||||
// the data for the photo is a URI.
|
||||
|
||||
uriPhotoProperty.Subproperties.Add("VALUE", "URI");
|
||||
uriPhotoProperty.Value = photo.Url.ToString();
|
||||
|
||||
properties.Add(uriPhotoProperty);
|
||||
}
|
||||
uriPhotoProperty.Subproperties.Add("VALUE", "URI");
|
||||
uriPhotoProperty.Value = photo.Url.ToString();
|
||||
|
||||
properties.Add(uriPhotoProperty);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -975,7 +1080,7 @@ namespace Thought.vCards
|
||||
{
|
||||
|
||||
vCardProperty property =
|
||||
new vCardProperty("REV", card.RevisionDate.Value.ToString());
|
||||
new vCardProperty("REV", card.RevisionDate.Value.ToString("s") + "Z");
|
||||
|
||||
properties.Add(property);
|
||||
|
||||
@@ -1072,43 +1177,64 @@ namespace Thought.vCards
|
||||
property.Name = "TEL";
|
||||
|
||||
if (phone.IsBBS)
|
||||
property.Subproperties.Add("BBS");
|
||||
property.Subproperties.Add(TYPE, "BBS");
|
||||
|
||||
if (phone.IsCar)
|
||||
property.Subproperties.Add("CAR");
|
||||
property.Subproperties.Add(TYPE, "CAR");
|
||||
|
||||
if (phone.IsCellular)
|
||||
property.Subproperties.Add("CELL");
|
||||
property.Subproperties.Add(TYPE, "CELL");
|
||||
|
||||
if (phone.IsFax)
|
||||
property.Subproperties.Add("FAX");
|
||||
{
|
||||
if (!phone.IsHome && !phone.IsWork)
|
||||
{
|
||||
property.Subproperties.Add(TYPE, "OTHER");
|
||||
}
|
||||
property.Subproperties.Add(TYPE, "FAX");
|
||||
}
|
||||
|
||||
if (phone.IsHome)
|
||||
property.Subproperties.Add("HOME");
|
||||
property.Subproperties.Add(TYPE, "HOME");
|
||||
|
||||
if (phone.IsISDN)
|
||||
property.Subproperties.Add("ISDN");
|
||||
property.Subproperties.Add(TYPE, "ISDN");
|
||||
|
||||
if (phone.IsMessagingService)
|
||||
property.Subproperties.Add("MSG");
|
||||
property.Subproperties.Add(TYPE, "MSG");
|
||||
|
||||
if (phone.IsModem)
|
||||
property.Subproperties.Add("MODEM");
|
||||
property.Subproperties.Add(TYPE, "MODEM");
|
||||
|
||||
if (phone.IsPager)
|
||||
property.Subproperties.Add("PAGER");
|
||||
property.Subproperties.Add(TYPE, "PAGER");
|
||||
|
||||
if (phone.IsPreferred)
|
||||
property.Subproperties.Add("PREF");
|
||||
property.Subproperties.Add(TYPE, "PREF");
|
||||
|
||||
if (phone.IsVideo)
|
||||
property.Subproperties.Add("VIDEO");
|
||||
property.Subproperties.Add(TYPE, "VIDEO");
|
||||
|
||||
if (phone.IsVoice)
|
||||
property.Subproperties.Add("VOICE");
|
||||
{
|
||||
if (!phone.IsHome && !phone.IsWork)
|
||||
{
|
||||
property.Subproperties.Add(TYPE, "OTHER");
|
||||
}
|
||||
property.Subproperties.Add(TYPE, "VOICE");
|
||||
}
|
||||
|
||||
if (phone.IsWork)
|
||||
property.Subproperties.Add("WORK");
|
||||
property.Subproperties.Add(TYPE, "WORK");
|
||||
|
||||
if (phone.IsiPhone)
|
||||
{
|
||||
property.Subproperties.Add(TYPE, "IPHONE");
|
||||
}
|
||||
if (phone.IsMain)
|
||||
{
|
||||
property.Subproperties.Add(TYPE, "MAIN");
|
||||
}
|
||||
|
||||
property.Value = phone.FullNumber;
|
||||
properties.Add(property);
|
||||
@@ -1195,7 +1321,10 @@ namespace Thought.vCards
|
||||
new vCardProperty("URL", webSite.Url.ToString());
|
||||
|
||||
if (webSite.IsWorkSite)
|
||||
property.Subproperties.Add("WORK");
|
||||
property.Subproperties.Add(TYPE, "WORK");
|
||||
// Add Subproperty for HOME aswell
|
||||
if (webSite.IsPersonalSite)
|
||||
property.Subproperties.Add(TYPE, "HOME");
|
||||
|
||||
properties.Add(property);
|
||||
}
|
||||
@@ -1206,6 +1335,32 @@ namespace Thought.vCards
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
private void BuildProperties_XSOCIALPROFILE(vCardPropertyCollection properties, vCard card)
|
||||
{
|
||||
|
||||
// adding support for X-SOCIALPROFILE) in the vCard
|
||||
|
||||
|
||||
foreach (var sp in card.SocialProfiles)
|
||||
{
|
||||
|
||||
vCardProperty property = new vCardProperty();
|
||||
property.Name = "X-SOCIALPROFILE";
|
||||
|
||||
string propertyType = SocialProfileTypeUtils.GetSocialProfileServicePropertyType(sp.ServiceType);
|
||||
|
||||
property.Subproperties.Add("TYPE", propertyType);
|
||||
property.Subproperties.Add("X-USER", sp.Username);
|
||||
property.Value = sp.ProfileUrl;
|
||||
|
||||
properties.Add(property);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#region [ BuildProperties_X_WAB_GENDER ]
|
||||
|
||||
private void BuildProperties_X_WAB_GENDER(
|
||||
@@ -1502,10 +1657,16 @@ namespace Thought.vCards
|
||||
|
||||
// A byte array should be encoded in BASE64 format.
|
||||
|
||||
builder.Append(";ENCODING=BASE64:");
|
||||
builder.Append(";ENCODING=b:");
|
||||
builder.Append(EncodeBase64((byte[])property.Value));
|
||||
|
||||
}
|
||||
else if (property.Name.Equals("PHOTO", StringComparison.OrdinalIgnoreCase) && valueType == typeof(string))
|
||||
{
|
||||
//already base64 encoded
|
||||
builder.Append(";ENCODING=b:");
|
||||
builder.Append(property.Value);
|
||||
}
|
||||
else if (valueType == typeof(vCardValueCollection))
|
||||
{
|
||||
|
||||
|
||||
68
vCardEditor/View/AboutDialog.Designer.cs
generated
68
vCardEditor/View/AboutDialog.Designer.cs
generated
@@ -43,8 +43,8 @@
|
||||
// tableLayoutPanel
|
||||
//
|
||||
this.tableLayoutPanel.ColumnCount = 2;
|
||||
this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F));
|
||||
this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F));
|
||||
this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 27.81775F));
|
||||
this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 72.18225F));
|
||||
this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0);
|
||||
this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0);
|
||||
this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1);
|
||||
@@ -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, 4, 4, 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,17 +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.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.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
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, 4, 4, 4);
|
||||
this.logoPictureBox.Name = "logoPictureBox";
|
||||
this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6);
|
||||
this.logoPictureBox.Size = new System.Drawing.Size(131, 259);
|
||||
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;
|
||||
@@ -80,11 +84,11 @@
|
||||
// labelProductName
|
||||
//
|
||||
this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelProductName.Location = new System.Drawing.Point(143, 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(271, 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;
|
||||
@@ -92,11 +96,11 @@
|
||||
// labelVersion
|
||||
//
|
||||
this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelVersion.Location = new System.Drawing.Point(143, 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(271, 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;
|
||||
@@ -104,11 +108,11 @@
|
||||
// labelCopyright
|
||||
//
|
||||
this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelCopyright.Location = new System.Drawing.Point(143, 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(271, 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;
|
||||
@@ -116,11 +120,11 @@
|
||||
// labelCompanyName
|
||||
//
|
||||
this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.labelCompanyName.Location = new System.Drawing.Point(143, 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(271, 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;
|
||||
@@ -128,13 +132,13 @@
|
||||
// textBoxDescription
|
||||
//
|
||||
this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.textBoxDescription.Location = new System.Drawing.Point(143, 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(271, 126);
|
||||
this.textBoxDescription.Size = new System.Drawing.Size(390, 155);
|
||||
this.textBoxDescription.TabIndex = 23;
|
||||
this.textBoxDescription.TabStop = false;
|
||||
this.textBoxDescription.Text = "Description";
|
||||
@@ -143,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, 4, 4, 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, 4, 4, 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;
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace vCardEditor.View
|
||||
public AboutDialog()
|
||||
{
|
||||
InitializeComponent();
|
||||
this.Text = String.Format("À propos de {0}", AssemblyTitle);
|
||||
this.Text = String.Format("About {0}", AssemblyTitle);
|
||||
this.labelProductName.Text = AssemblyProduct;
|
||||
this.labelVersion.Text = String.Format("Version {0}", AssemblyVersion);
|
||||
this.labelCopyright.Text = AssemblyCopyright;
|
||||
|
||||
@@ -120,485 +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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
|
||||
AAAAAElFTkSuQmCC
|
||||
iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABGdBTUEAALGPC/xhBQAAQapJREFUeF7t
|
||||
nQe8HNWV5md3dnd2NjE7G38bjAPJjG1sPGbGYxvZ48BknNPYgBkbm5yDTRAmmJxMRhIChFCWQEhIIJBA
|
||||
sAYhCSEQAgGSEKBIEGlzqD3fffeWTp36qru6u7qq39M9v9//x+OFrnvP+b6vq6vrPf1WrFixYsWKFStW
|
||||
rFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWK
|
||||
FStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFix
|
||||
YsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixYsWKFStW
|
||||
rFixYsWKFStWrFixYsWKFStWrFixYsWKFStWrFixVG3dunUfYfS2rVsXbdu2bYWQaF4LvPZajtfB669T
|
||||
3gBvvEF5E7z5ZiHbwfbthbwF3nqrJW+Dt99uyzvgnXdK8y54992uee+99yqFHaMjzP5aYnrXCjaTDGam
|
||||
OYwmchhNZTBazOB1m9Oz17nVv2PrVof4JLBCWLR1y5bRwj7eSsOrZAMHC+v9hoY2STbfNgAAaXSrAACt
|
||||
QmAkBwBgRu4G9tgdYfbWFtO7QswsKGamOYwmchg9ZTBazOA1m9Oz1znzAAmAIbZscWzZsmW9cLC31mCX
|
||||
LHiULD41fiBs0m5+EAMAtAuBsgEAOgmBKgIAMEN3AnvMjjF7a4vpWyFmFhQzzxxGEzmMnjIYLWZQ+s3g
|
||||
dW717/DesJ5RARBAEIzyVhu8ksXilCW/ESEGABF8AVWFAGDmbgV7jK4we2qL6VlLzCxymFlSjCYyGC3l
|
||||
MFpM8XplWm4XAMwzJACG2Lz5WG+5wSlZ2PiwYLaZogBwRgak0c7EgA2pBe0M3s7coBODt6PJAAgws1vY
|
||||
z3WN2VMpTN+6xsySYjSRw2iqFF6vTMtB5yw4ugiAZPPmzeO99ZovWdTosLhWAYDNorkYNhNgJLIzg/CC
|
||||
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
|
||||
6/8DUMTZ0FH1phIAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
||||
83
vCardEditor/View/ConfigDialog.Designer.cs
generated
Normal file
83
vCardEditor/View/ConfigDialog.Designer.cs
generated
Normal file
@@ -0,0 +1,83 @@
|
||||
namespace vCardEditor.View
|
||||
{
|
||||
partial class ConfigDialog
|
||||
{
|
||||
/// <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.btnClose = new System.Windows.Forms.Button();
|
||||
this.pgConfig = new System.Windows.Forms.PropertyGrid();
|
||||
this.btnCancel = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// btnClose
|
||||
//
|
||||
this.btnClose.Location = new System.Drawing.Point(253, 347);
|
||||
this.btnClose.Name = "btnClose";
|
||||
this.btnClose.Size = new System.Drawing.Size(75, 23);
|
||||
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.Name = "pgConfig";
|
||||
this.pgConfig.Size = new System.Drawing.Size(316, 329);
|
||||
this.pgConfig.TabIndex = 1;
|
||||
//
|
||||
// btnCancel
|
||||
//
|
||||
this.btnCancel.Location = new System.Drawing.Point(172, 347);
|
||||
this.btnCancel.Name = "btnCancel";
|
||||
this.btnCancel.Size = new System.Drawing.Size(75, 23);
|
||||
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.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(337, 382);
|
||||
this.Controls.Add(this.pgConfig);
|
||||
this.Controls.Add(this.btnCancel);
|
||||
this.Controls.Add(this.btnClose);
|
||||
this.Name = "ConfigDialog";
|
||||
this.Text = "ConfigDialog";
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Button btnClose;
|
||||
private System.Windows.Forms.PropertyGrid pgConfig;
|
||||
private System.Windows.Forms.Button btnCancel;
|
||||
}
|
||||
}
|
||||
28
vCardEditor/View/ConfigDialog.cs
Normal file
28
vCardEditor/View/ConfigDialog.cs
Normal file
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using vCardEditor.Repository;
|
||||
using vCardEditor.Model;
|
||||
|
||||
namespace vCardEditor.View
|
||||
{
|
||||
public partial class ConfigDialog : Form
|
||||
{
|
||||
public ConfigDialog()
|
||||
{
|
||||
InitializeComponent();
|
||||
ConfigRepository conf = ConfigRepository.Instance;//.Clone();
|
||||
pgConfig.SelectedObject = conf;
|
||||
}
|
||||
|
||||
private void btnClose_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
this.Close();
|
||||
}
|
||||
|
||||
private void btnCancel_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
120
vCardEditor/View/ConfigDialog.resx
Normal file
120
vCardEditor/View/ConfigDialog.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=2.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>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -2,7 +2,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace VCFEditor.View
|
||||
{
|
||||
@@ -17,7 +16,7 @@ namespace VCFEditor.View
|
||||
public class EventArg<T> : EventArgs
|
||||
{
|
||||
// Property variable
|
||||
private readonly T p_EventData;
|
||||
private T p_EventData;
|
||||
|
||||
// Constructor
|
||||
public EventArg(T data)
|
||||
@@ -29,6 +28,7 @@ namespace VCFEditor.View
|
||||
public T Data
|
||||
{
|
||||
get { return p_EventData; }
|
||||
set { p_EventData = value;}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,31 +1,34 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Thought.vCards;
|
||||
using VCFEditor.Model;
|
||||
using System.ComponentModel;
|
||||
using System.Windows.Forms;
|
||||
using vCardEditor.Model;
|
||||
|
||||
namespace VCFEditor.View
|
||||
{
|
||||
public interface IMainView
|
||||
{
|
||||
#region All events
|
||||
event EventHandler AddContact;
|
||||
event EventHandler DeleteContact;
|
||||
event EventHandler BeforeOpeningNewFile;
|
||||
event EventHandler SaveContactsSelected;
|
||||
event EventHandler<EventArg<string>> NewFileOpened;
|
||||
event EventHandler ChangeContactsSelected;
|
||||
event EventHandler<EventArg<vCard>> BeforeLeavingContact;
|
||||
event EventHandler<EventArg<string>> FilterTextChanged;
|
||||
event EventHandler TextBoxValueChanged;
|
||||
event EventHandler<EventArg<bool>> CloseForm;
|
||||
#endregion
|
||||
|
||||
int SelectedContactIndex { get; }
|
||||
void DisplayContacts(BindingList<Contact> contacts);
|
||||
void DisplayContacts(List<Contact> contacts);
|
||||
void DisplayContactDetail(vCard card);
|
||||
|
||||
|
||||
void DisplayContactDetail(vCard card, string FileName);
|
||||
bool AskMessage(string msg, string caption);
|
||||
void DisplayMessage(string msg, string caption);
|
||||
string DisplayOpenDialog();
|
||||
void UpdateMRUMenu(FixedList MRUList);
|
||||
}
|
||||
}
|
||||
|
||||
1242
vCardEditor/View/MainForm.Designer.cs
generated
1242
vCardEditor/View/MainForm.Designer.cs
generated
File diff suppressed because it is too large
Load Diff
@@ -1,47 +1,60 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using VCFEditor.View;
|
||||
using VCFEditor.Model;
|
||||
using Thought.vCards;
|
||||
using System.IO;
|
||||
using vCardEditor.Repository;
|
||||
using vCardEditor.Model;
|
||||
|
||||
namespace vCardEditor.View
|
||||
{
|
||||
public partial class MainForm : Form, IMainView
|
||||
{
|
||||
#region event list
|
||||
public event EventHandler AddContact;
|
||||
public event EventHandler SaveContactsSelected;
|
||||
public event EventHandler BeforeOpeningNewFile;
|
||||
public event EventHandler DeleteContact;
|
||||
public event EventHandler<EventArg<string>> NewFileOpened;
|
||||
public event EventHandler ChangeContactsSelected;
|
||||
public event EventHandler ChangeContactsSelected;
|
||||
public event EventHandler<EventArg<vCard>> BeforeLeavingContact;
|
||||
public event EventHandler<EventArg<string>> FilterTextChanged;
|
||||
public event EventHandler TextBoxValueChanged;
|
||||
public event EventHandler TextBoxValueChanged;
|
||||
public event EventHandler<EventArg<bool>> CloseForm;
|
||||
#endregion
|
||||
ComponentResourceManager resources;
|
||||
|
||||
public int SelectedContactIndex
|
||||
{
|
||||
get { return dgContacts.CurrentCell.RowIndex; }
|
||||
get
|
||||
{
|
||||
if (dgContacts.CurrentCell != null)
|
||||
return dgContacts.CurrentCell.RowIndex;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public MainForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
resources = new ComponentResourceManager(typeof(MainForm));
|
||||
|
||||
BuildMRUMenu();
|
||||
|
||||
}
|
||||
|
||||
private void tbsOpen_Click(object sender, EventArgs e)
|
||||
{
|
||||
DialogResult result = openFileDialog.ShowDialog();
|
||||
if (result == DialogResult.OK)
|
||||
OpenNewFile(sender, openFileDialog.FileName);
|
||||
|
||||
if (NewFileOpened != null)
|
||||
NewFileOpened(sender, new EventArg<string>(string.Empty));
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void DisplayContacts(BindingList<Contact> contacts)
|
||||
{
|
||||
if (contacts != null)
|
||||
@@ -49,17 +62,23 @@ namespace vCardEditor.View
|
||||
|
||||
}
|
||||
|
||||
public void DisplayContacts(List<Contact> contacts)
|
||||
{
|
||||
if (contacts != null)
|
||||
this.bsContacts.DataSource = contacts;
|
||||
|
||||
}
|
||||
|
||||
private void tbsSave_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (SaveContactsSelected != null)
|
||||
{
|
||||
//make sure the last changes in the textboxes is saved.
|
||||
this.Validate();
|
||||
SaveContactsSelected(sender, e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void tbsNew_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (AddContact != null)
|
||||
{
|
||||
AddContact(sender, e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -67,7 +86,7 @@ namespace vCardEditor.View
|
||||
{
|
||||
if (ChangeContactsSelected != null && dgContacts.CurrentCell != null)
|
||||
ChangeContactsSelected(sender, new EventArg<vCard>(getvCard()));
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void Value_TextChanged(object sender, EventArgs e)
|
||||
@@ -76,30 +95,69 @@ namespace vCardEditor.View
|
||||
TextBoxValueChanged(sender, e);
|
||||
}
|
||||
|
||||
public void DisplayContactDetail(vCard card)
|
||||
public void DisplayContactDetail(vCard card, string FileName)
|
||||
{
|
||||
if (card == null)
|
||||
throw new ArgumentException("card");
|
||||
throw new ArgumentException("card must be valid!");
|
||||
|
||||
//Formatted Name
|
||||
this.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);
|
||||
|
||||
//Home Phone
|
||||
SetSummaryValue(HomePhoneValue, card.Phones.GetFirstChoice(vCardPhoneTypes.Home));
|
||||
|
||||
//Cellular Phone
|
||||
SetSummaryValue(CellularPhoneValue, card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular));
|
||||
|
||||
//Email Address
|
||||
SetSummaryValue(WorkPhoneValue, card.Phones.GetFirstChoice(vCardPhoneTypes.Work));
|
||||
SetSummaryValue(EmailAddressValue, card.EmailAddresses.GetFirstChoice(vCardEmailAddressType.Internet));
|
||||
|
||||
// Personal Home Page
|
||||
SetSummaryValue(PersonalWebSiteValue, card.Websites.GetFirstChoice(vCardWebsiteTypes.Personal));
|
||||
SetAddressesValues(card.DeliveryAddresses);
|
||||
SetPhotoValue(card.Photos);
|
||||
|
||||
}
|
||||
|
||||
if (card.Photos.Count > 0)
|
||||
#region helper methods to populate textboxes.
|
||||
|
||||
private void SetSummaryValue(StateTextBox valueLabel, string value)
|
||||
{
|
||||
if (valueLabel == null)
|
||||
throw new ArgumentNullException("valueLabel");
|
||||
|
||||
//Clear textbox if value is empty!
|
||||
valueLabel.Text = value;
|
||||
valueLabel.oldText = value;
|
||||
}
|
||||
|
||||
private void SetSummaryValue(StateTextBox valueLabel, vCardEmailAddress email)
|
||||
{
|
||||
valueLabel.Text = string.Empty;
|
||||
if (email != null)
|
||||
SetSummaryValue(valueLabel, email.Address);
|
||||
}
|
||||
|
||||
private void SetSummaryValue(StateTextBox valueLabel, vCardPhone phone)
|
||||
{
|
||||
valueLabel.Text = string.Empty;
|
||||
if (phone != null)
|
||||
SetSummaryValue(valueLabel, phone.FullNumber);
|
||||
|
||||
}
|
||||
|
||||
private void SetSummaryValue(StateTextBox valueLabel, vCardWebsite webSite)
|
||||
{
|
||||
valueLabel.Text = string.Empty;
|
||||
if (webSite != null)
|
||||
SetSummaryValue(valueLabel, webSite.Url.ToString());
|
||||
}
|
||||
|
||||
void SetPhotoValue(vCardPhotoCollection photos)
|
||||
{
|
||||
if (photos.Any())
|
||||
{
|
||||
var photo = card.Photos[0];
|
||||
var photo = photos[0];
|
||||
try
|
||||
{
|
||||
// Get the bytes of the photo if it has
|
||||
@@ -111,47 +169,79 @@ namespace vCardEditor.View
|
||||
}
|
||||
catch
|
||||
{
|
||||
// TODO: Ignore this error.
|
||||
// A later version of the viewer should show
|
||||
// a broken image icon (like IE) instead.
|
||||
//Empty image icon instead.
|
||||
PhotoBox.Image = ((System.Drawing.Image)(resources.GetObject("PhotoBox.Image")));
|
||||
}
|
||||
}
|
||||
else
|
||||
PhotoBox.Image = ((System.Drawing.Image)(resources.GetObject("PhotoBox.Image")));
|
||||
}
|
||||
private void SetAddressesValues(vCardDeliveryAddressCollection addresses)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
PhotoBox.Image = null;
|
||||
|
||||
}
|
||||
private void SetSummaryValue(TextBox valueLabel, string value)
|
||||
|
||||
private void ClearAddressTextFields()
|
||||
{
|
||||
if (valueLabel == null)
|
||||
throw new ArgumentNullException("valueLabel");
|
||||
HomeAddressValue.Clear();
|
||||
HomePOBoxValue.Clear();
|
||||
HomeCityValue.Clear();
|
||||
HomeZipValue.Clear();
|
||||
HomeStateValue.Clear();
|
||||
HomeCountryValue.Clear();
|
||||
|
||||
//Clear textbox if value is empty!
|
||||
valueLabel.Text = value;
|
||||
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 SetSummaryValue(TextBox valueLabel, vCardEmailAddress email)
|
||||
{
|
||||
valueLabel.Text = string.Empty;
|
||||
if (email != null)
|
||||
SetSummaryValue(valueLabel, email.Address);
|
||||
}
|
||||
|
||||
private void SetSummaryValue(TextBox valueLabel, vCardPhone phone)
|
||||
{
|
||||
valueLabel.Text = string.Empty;
|
||||
if (phone != null)
|
||||
SetSummaryValue(valueLabel, phone.FullNumber);
|
||||
|
||||
}
|
||||
|
||||
private void SetSummaryValue(TextBox valueLabel, vCardWebsite webSite)
|
||||
{
|
||||
valueLabel.Text = string.Empty;
|
||||
if (webSite != null)
|
||||
SetSummaryValue(valueLabel, webSite.Url.ToString());
|
||||
}
|
||||
private void tbsDelete_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (DeleteContact != null)
|
||||
@@ -171,8 +261,13 @@ namespace vCardEditor.View
|
||||
|
||||
private void textBoxFilter_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
//Save before leaving contact.
|
||||
if (BeforeLeavingContact != null)
|
||||
BeforeLeavingContact(sender, new EventArg<vCard>(getvCard()));
|
||||
|
||||
//filter.
|
||||
if (FilterTextChanged != null)
|
||||
FilterTextChanged(sender, new EventArg<string>(textBoxFilter.Text));
|
||||
FilterTextChanged(sender, new EventArg<string>(textBoxFilter.Text));
|
||||
}
|
||||
|
||||
private void btnClearFilter_Click(object sender, EventArgs e)
|
||||
@@ -186,26 +281,42 @@ namespace vCardEditor.View
|
||||
/// <returns></returns>
|
||||
private vCard getvCard()
|
||||
{
|
||||
vCard card = new vCard();
|
||||
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));
|
||||
}
|
||||
|
||||
card.Phones.Add(new vCardPhone(HomePhoneValue.Text, vCardPhoneTypes.Home));
|
||||
if (!string.IsNullOrEmpty(CellularPhoneValue.Text))
|
||||
{
|
||||
card.Phones.Add(
|
||||
new vCardPhone(CellularPhoneValue.Text, vCardPhoneTypes.Cellular));
|
||||
}
|
||||
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));
|
||||
}
|
||||
card.EmailAddresses.Add(new vCardEmailAddress(this.EmailAddressValue.Text));
|
||||
|
||||
if (!string.IsNullOrEmpty(this.PersonalWebSiteValue.Text))
|
||||
card.Websites.Add(new vCardWebsite(this.PersonalWebSiteValue.Text));
|
||||
|
||||
if (!string.IsNullOrEmpty(this.HomeAddressValue.Text))
|
||||
card.DeliveryAddresses.Add(new vCardDeliveryAddress(HomeAddressValue.Text, HomeCityValue.Text, HomeStateValue.Text, HomeCountryValue.Text,
|
||||
HomePOBoxValue.Text, vCardDeliveryAddressTypes.Home));
|
||||
|
||||
|
||||
if (!string.IsNullOrEmpty(this.WorkAddressValue.Text))
|
||||
card.DeliveryAddresses.Add(new vCardDeliveryAddress(WorkAddressValue.Text, WorkCityValue.Text, WorkStateValue.Text, WorkCountryValue.Text,
|
||||
WorkPOBoxValue.Text, vCardDeliveryAddressTypes.Work));
|
||||
|
||||
if (!string.IsNullOrEmpty(this.PostalAddressValue.Text))
|
||||
card.DeliveryAddresses.Add(new vCardDeliveryAddress(PostalAddressValue.Text, PostalCityValue.Text, PostalStateValue.Text, PostalCountryValue.Text,
|
||||
PostalPOBoxValue.Text, vCardDeliveryAddressTypes.Postal));
|
||||
|
||||
return card;
|
||||
}
|
||||
@@ -220,10 +331,16 @@ namespace vCardEditor.View
|
||||
{
|
||||
this.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))
|
||||
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
||||
e.Effect = DragDropEffects.Copy;
|
||||
}
|
||||
private void MainForm_DragDrop(object sender, DragEventArgs e)
|
||||
@@ -235,34 +352,85 @@ namespace vCardEditor.View
|
||||
return;
|
||||
}
|
||||
|
||||
OpenNewFile(sender, FileList[0]);
|
||||
|
||||
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..
|
||||
UpdateMRUMenu(ConfigRepository.Instance.Paths);
|
||||
|
||||
}
|
||||
|
||||
public void UpdateMRUMenu(FixedList MRUList)
|
||||
{
|
||||
//No need to go further if no menu entry to load!
|
||||
if (MRUList == null || MRUList.IsEmpty())
|
||||
return;
|
||||
|
||||
recentFilesMenuItem.DropDownItems.Clear();
|
||||
for (int i = 0; i < MRUList._innerList.Count; i++)
|
||||
recentFilesMenuItem.DropDownItems.Add(MRUList[i]);
|
||||
|
||||
}
|
||||
|
||||
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
var evt = new EventArg<bool>(false);
|
||||
if (CloseForm != null)
|
||||
CloseForm(sender,evt);
|
||||
|
||||
e.Cancel = evt.Data;
|
||||
|
||||
ConfigRepository.Instance.SaveConfig();
|
||||
}
|
||||
|
||||
public bool AskMessage(string msg, string caption)
|
||||
{
|
||||
bool result = true; // true == yes
|
||||
|
||||
DialogResult window = MessageBox.Show(msg, caption, MessageBoxButtons.YesNo);
|
||||
|
||||
if (window != DialogResult.No)
|
||||
result = false;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Load the config dialog
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="file"></param>
|
||||
private void OpenNewFile(object sender, string file)
|
||||
/// <param name="e"></param>
|
||||
private void miConfig_Click(object sender, EventArgs e)
|
||||
{
|
||||
string ext = Path.GetExtension(file);
|
||||
if (ext != ".vcf")
|
||||
{
|
||||
MessageBox.Show("Only vcf extension accepted!");
|
||||
return;
|
||||
}
|
||||
ConfigDialog dialog = new ConfigDialog();
|
||||
dialog.ShowDialog();
|
||||
}
|
||||
|
||||
if (NewFileOpened != null)
|
||||
NewFileOpened(sender, new EventArg<string>(file));
|
||||
public void DisplayMessage(string msg, string caption)
|
||||
{
|
||||
MessageBox.Show(msg, caption);
|
||||
}
|
||||
public string DisplayOpenDialog()
|
||||
{
|
||||
string filename = string.Empty;
|
||||
|
||||
DialogResult result = openFileDialog.ShowDialog();
|
||||
if (result == DialogResult.OK)
|
||||
filename = openFileDialog.FileName;
|
||||
|
||||
return filename;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,24 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace vCardEditor.View
|
||||
{
|
||||
public class StateTextBox : TextBox
|
||||
{
|
||||
private string _oldText;
|
||||
public string oldText
|
||||
{
|
||||
get { return _oldText; }
|
||||
}
|
||||
|
||||
public string oldText { get; set; }
|
||||
|
||||
protected override void OnLostFocus(EventArgs e)
|
||||
{
|
||||
base.OnLostFocus(e);
|
||||
_oldText = this.Text;
|
||||
oldText = this.Text;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
3
vCardEditor/app.config
Normal file
3
vCardEditor/app.config
Normal file
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8.1"/></startup></configuration>
|
||||
BIN
vCardEditor/assests/About.ico
Normal file
BIN
vCardEditor/assests/About.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 170 KiB |
BIN
vCardEditor/assests/Log Out.png
Normal file
BIN
vCardEditor/assests/Log Out.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 580 B |
BIN
vCardEditor/assests/vCard.ico
Normal file
BIN
vCardEditor/assests/vCard.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 170 KiB |
@@ -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,12 +10,13 @@
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>vCardEditor</RootNamespace>
|
||||
<AssemblyName>vCardEditor</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
|
||||
<TargetFrameworkVersion>v4.8.1</TargetFrameworkVersion>
|
||||
<TargetFrameworkProfile>
|
||||
</TargetFrameworkProfile>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
@@ -23,6 +24,7 @@
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
@@ -32,13 +34,16 @@
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationIcon>assests\vCard.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
@@ -46,12 +51,17 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="ContactRepository.cs" />
|
||||
<Compile Include="IContactRepository.cs" />
|
||||
<Compile Include="Model\FixedList.cs" />
|
||||
<Compile Include="Model\ObjectCopier.cs" />
|
||||
<Compile Include="Repository\ConfigRepository.cs" />
|
||||
<Compile Include="Repository\ContactRepository.cs" />
|
||||
<Compile Include="Repository\FileHandler.cs" />
|
||||
<Compile Include="Repository\IContactRepository.cs" />
|
||||
<Compile Include="Model\Contact.cs" />
|
||||
<Compile Include="Presenter\MainPresenter.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Repository\IFileHandler.cs" />
|
||||
<Compile Include="Thought.vCards\vCard.cs" />
|
||||
<Compile Include="Thought.vCards\vCardAccessClassification.cs" />
|
||||
<Compile Include="Thought.vCards\vCardCertificate.cs" />
|
||||
@@ -69,6 +79,8 @@
|
||||
<Compile Include="Thought.vCards\vCardException.cs" />
|
||||
<Compile Include="Thought.vCards\vCardFormat.cs" />
|
||||
<Compile Include="Thought.vCards\vCardGender.cs" />
|
||||
<Compile Include="Thought.vCards\vCardIMPP.cs" />
|
||||
<Compile Include="Thought.vCards\vCardIMPPCollection.cs" />
|
||||
<Compile Include="Thought.vCards\vCardNote.cs" />
|
||||
<Compile Include="Thought.vCards\vCardNoteCollection.cs" />
|
||||
<Compile Include="Thought.vCards\vCardPhone.cs" />
|
||||
@@ -79,6 +91,8 @@
|
||||
<Compile Include="Thought.vCards\vCardProperty.cs" />
|
||||
<Compile Include="Thought.vCards\vCardPropertyCollection.cs" />
|
||||
<Compile Include="Thought.vCards\vCardReader.cs" />
|
||||
<Compile Include="Thought.vCards\vCardSocialProfile.cs" />
|
||||
<Compile Include="Thought.vCards\vCardSocialProfileCollection.cs" />
|
||||
<Compile Include="Thought.vCards\vCardSource.cs" />
|
||||
<Compile Include="Thought.vCards\vCardSourceCollection.cs" />
|
||||
<Compile Include="Thought.vCards\vCardStandardReader.cs" />
|
||||
@@ -98,6 +112,12 @@
|
||||
<Compile Include="View\AboutDialog.Designer.cs">
|
||||
<DependentUpon>AboutDialog.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="View\ConfigDialog.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="View\ConfigDialog.Designer.cs">
|
||||
<DependentUpon>ConfigDialog.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="View\EventArgs.cs" />
|
||||
<Compile Include="View\IMainView.cs" />
|
||||
<Compile Include="View\MainForm.cs">
|
||||
@@ -123,9 +143,13 @@
|
||||
<EmbeddedResource Include="View\AboutDialog.resx">
|
||||
<DependentUpon>AboutDialog.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="View\ConfigDialog.resx">
|
||||
<DependentUpon>ConfigDialog.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="View\MainForm.resx">
|
||||
<DependentUpon>MainForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<None Include="app.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
@@ -136,7 +160,10 @@
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<ItemGroup>
|
||||
<Content Include="assests\About.ico" />
|
||||
<Content Include="assests\vCard.ico" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
||||
114
vCardEditor_Test/ContactRepositoryTest.cs
Normal file
114
vCardEditor_Test/ContactRepositoryTest.cs
Normal file
@@ -0,0 +1,114 @@
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using NSubstitute;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Thought.vCards;
|
||||
using vCardEditor.Repository;
|
||||
using VCFEditor.Repository;
|
||||
|
||||
namespace vCardEditor_Test
|
||||
{
|
||||
[TestClass]
|
||||
public class ContactRepositoryTest
|
||||
{
|
||||
[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);
|
||||
|
||||
Assert.AreEqual(repo.LoadContacts("name")[0].Name, "Oum Alaâ");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NewFileOpened_SaveDirtyCellPhone_NotNullWithNotNull_Test()
|
||||
{
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfFourEntry);
|
||||
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
repo.LoadContacts("name");
|
||||
repo.Contacts[0].isDirty=true;
|
||||
|
||||
string phone = "0011223344";
|
||||
var newCard = new vCard();
|
||||
newCard.Phones.Add(new vCardPhone(phone, vCardPhoneTypes.Cellular));
|
||||
|
||||
repo.SaveDirtyVCard(0, newCard);
|
||||
|
||||
|
||||
var card = repo.Contacts[0].card;
|
||||
Assert.AreEqual(card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular).FullNumber, phone);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NewFileOpened_SaveDirtyCellPhone_NotNullWithNull_Test()
|
||||
{
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfFourEntry);
|
||||
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
repo.LoadContacts("name");
|
||||
repo.Contacts[0].isDirty = true;
|
||||
|
||||
repo.SaveDirtyVCard(0, new vCard());
|
||||
|
||||
|
||||
var card = repo.Contacts[0].card;
|
||||
Assert.AreEqual(card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular).FullNumber, string.Empty);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NewFileOpened_SaveDirtyCellPhone_NullWithNotNull_Test()
|
||||
{
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfFourEntry);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
repo.LoadContacts("name");
|
||||
repo.Contacts[2].isDirty = true;
|
||||
|
||||
string phone = "0011223344";
|
||||
var newCard = new vCard();
|
||||
newCard.Phones.Add(new vCardPhone(phone, vCardPhoneTypes.Cellular));
|
||||
repo.SaveDirtyVCard(2, newCard);
|
||||
|
||||
var card = repo.Contacts[2].card;
|
||||
Assert.AreEqual(card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular).FullNumber, phone);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void NewFileOpened_SaveDirtyCellPhone_NullWithNull_Test()
|
||||
{
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfFourEntry);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
repo.LoadContacts("name");
|
||||
repo.Contacts[3].isDirty = true;
|
||||
|
||||
repo.SaveDirtyVCard(3, new vCard());
|
||||
|
||||
var card = repo.Contacts[2].card;
|
||||
Assert.IsNull(card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular));
|
||||
}
|
||||
|
||||
|
||||
[TestMethod]
|
||||
public void NewFileOpened_v21_Test()
|
||||
{
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfWikiv21);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
repo.LoadContacts("name");
|
||||
repo.Contacts[0].isDirty = true;
|
||||
|
||||
repo.SaveDirtyVCard(0, new vCard());
|
||||
|
||||
//var card = repo.Contacts[2].card;
|
||||
//Assert.IsNull(card.Phones.GetFirstChoice(vCardPhoneTypes.Cellular));
|
||||
}
|
||||
}
|
||||
}
|
||||
135
vCardEditor_Test/Entries.cs
Normal file
135
vCardEditor_Test/Entries.cs
Normal file
@@ -0,0 +1,135 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace vCardEditor_Test
|
||||
{
|
||||
public class Entries
|
||||
{
|
||||
public static string[] vcfOneEntry
|
||||
{
|
||||
get
|
||||
{
|
||||
string s = @"BEGIN:VCARD\n" +
|
||||
"VERSION:2.1\n" +
|
||||
"FN:Jean Dupont1\n" +
|
||||
"N:Dupont;Jean\n" +
|
||||
"ADR;WORK;PREF;QUOTED-PRINTABLE:;Bruxelles 1200=Belgique;6A Rue Th. Decuyper\n" +
|
||||
"LABEL;QUOTED-PRINTABLE;WORK;PREF:Rue Th. Decuyper 6A=Bruxelles 1200=Belgique\n" +
|
||||
"TEL;CELL:+1234 56789\n" +
|
||||
"EMAIL;INTERNET:jean.dupont@example.com\n" +
|
||||
"END:VCARD";
|
||||
return s.Split('\n');
|
||||
}
|
||||
}
|
||||
|
||||
public static string[] vcfThreeEntry
|
||||
{
|
||||
get
|
||||
{
|
||||
string s = "BEGIN:VCARD\n" +
|
||||
"VERSION:2.1\n" +
|
||||
"FN:Jean Dupont1\n" +
|
||||
"N:Dupont;Jean\n" +
|
||||
"ADR;WORK;PREF;QUOTED-PRINTABLE:;Bruxelles 1200=Belgique;6A Rue Th. Decuyper\n" +
|
||||
"TEL;CELL:+1234 56789\n" +
|
||||
"EMAIL;INTERNET:jean.dupont@example.com\n" +
|
||||
"END:VCARD\n" +
|
||||
"BEGIN:VCARD\n" +
|
||||
"VERSION:2.1\n" +
|
||||
"FN:Jean Dupont2\n" +
|
||||
"N:Dupont;Jean\n" +
|
||||
"ADR;WORK;PREF;QUOTED-PRINTABLE:;Bruxelles 1200=Belgique;6A Rue Th. Decuyper\n" +
|
||||
"TEL;CELL:+1234 56789\n" +
|
||||
"EMAIL;INTERNET:jean.dupont@example.com\n" +
|
||||
"END:VCARD\n" +
|
||||
"BEGIN:VCARD\n" +
|
||||
"VERSION:2.1\n" +
|
||||
"FN:Jean Dupont3\n" +
|
||||
"N:Dupont;Jean\n" +
|
||||
"ADR;WORK;PREF;QUOTED-PRINTABLE:;Bruxelles 1200=Belgique;6A Rue Th. Decuyper\n" +
|
||||
"TEL;CELL:+1234 56789\n" +
|
||||
"EMAIL;INTERNET:jean.dupont@example.com\n" +
|
||||
"END:VCARD";
|
||||
return s.Split('\n');
|
||||
}
|
||||
}
|
||||
public static string[] vcfFourEntry
|
||||
{
|
||||
get
|
||||
{
|
||||
string s = "BEGIN:VCARD\n" +
|
||||
"VERSION:2.1\n" +
|
||||
"FN:Jean Dupont1\n" +
|
||||
"N:Dupont;Jean1\n" +
|
||||
"ADR;WORK;PREF;QUOTED-PRINTABLE:;Bruxelles 1200=Belgique;6A Rue Th. Decuyper\n" +
|
||||
"TEL;CELL:+1234 56789\n" +
|
||||
"EMAIL;INTERNET:jean.dupont@example.com\n" +
|
||||
"END:VCARD\n" +
|
||||
"BEGIN:VCARD\n" +
|
||||
"VERSION:2.1\n" +
|
||||
"FN:Jean Dupont2\n" +
|
||||
"N:Dupont;Jean\n" +
|
||||
"ADR;WORK;PREF;QUOTED-PRINTABLE:;Bruxelles 1200=Belgique;6A Rue Th. Decuyper\n" +
|
||||
"TEL;CELL:+1234 56789\n" +
|
||||
"EMAIL;INTERNET:jean.dupont@example.com\n" +
|
||||
"END:VCARD\n" +
|
||||
"BEGIN:VCARD\n" +
|
||||
"VERSION:2.1\n" +
|
||||
"FN:Jean Dupont3\n" +
|
||||
"N:Dupont;Jean\n" +
|
||||
"ADR;WORK;PREF;QUOTED-PRINTABLE:;Bruxelles 1200=Belgique;6A Rue Th. Decuyper\n" +
|
||||
"EMAIL;INTERNET:jean.dupont@example.com\n" +
|
||||
"END:VCARD\n" +
|
||||
"BEGIN:VCARD\n" +
|
||||
"VERSION:2.1\n" +
|
||||
"FN:Jean Dupont4\n" +
|
||||
"N:Dupont;Jean\n" +
|
||||
"ADR;WORK;PREF;QUOTED-PRINTABLE:;Bruxelles 1200=Belgique;6A Rue Th. Decuyper\n" +
|
||||
"EMAIL;INTERNET:jean.dupont@example.com\n" +
|
||||
"END:VCARD";
|
||||
return s.Split('\n');
|
||||
}
|
||||
}
|
||||
public static string[] vcfUtf8Entry
|
||||
{
|
||||
get
|
||||
{
|
||||
string s = "BEGIN:VCARD\n" +
|
||||
"VERSION:2.1\n" +
|
||||
"N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=41=6C=61=C3=A2;=4F=75=6D;;;\n" +
|
||||
"FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=4F=75=6D=20=41=6C=61=C3=A2\n" +
|
||||
"END:VCARD";
|
||||
return s.Split('\n');
|
||||
}
|
||||
}
|
||||
|
||||
public static string[] vcfWikiv21
|
||||
{
|
||||
get
|
||||
{
|
||||
string s = "BEGIN:VCARD" +
|
||||
"VERSION:2.1\n" +
|
||||
"N:Gump;Forrest;;Mr.\n" +
|
||||
"FN:Forrest Gump\n" +
|
||||
"ORG:Bubba Gump Shrimp Co.\n" +
|
||||
"TITLE:Shrimp Man\n" +
|
||||
"PHOTO;GIF:http://www.example.com/dir_photos/my_photo.gif\n" +
|
||||
"TEL;WORK;VOICE:(111) 555-1212\n" +
|
||||
"TEL;HOME;VOICE:(404) 555-1212\n" +
|
||||
"ADR;WORK;PREF:;;100 Waters Edge;Baytown;LA;30314;United States of America\n" +
|
||||
"LABEL;WORK;PREF;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:100 Waters Edge=0D=\n" +
|
||||
" =0ABaytown\\, LA 30314=0D=0AUnited States of America\n" +
|
||||
"ADR;HOME:;;42 Plantation St.;Baytown;LA;30314;United States of America\n" +
|
||||
"LABEL;HOME;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:42 Plantation St.=0D=0A=\n" +
|
||||
" Baytown, LA 30314=0D=0AUnited States of America\n" +
|
||||
"EMAIL:forrestgump@example.com\n" +
|
||||
"REV:20080424T195243Z\n" +
|
||||
"END:VCARD";
|
||||
return s.Split('\n');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
67
vCardEditor_Test/FixedListTest.cs
Normal file
67
vCardEditor_Test/FixedListTest.cs
Normal file
@@ -0,0 +1,67 @@
|
||||
using vCardEditor.Model;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using System;
|
||||
|
||||
namespace vCardEditor_Test
|
||||
{
|
||||
|
||||
|
||||
/// <summary>
|
||||
///Classe de test pour FixedListTest, destinée à contenir tous
|
||||
///les tests unitaires FixedListTest
|
||||
///</summary>
|
||||
[TestClass()]
|
||||
public class FixedListTest
|
||||
{
|
||||
/// <summary>
|
||||
///Test pour enqueue
|
||||
///</summary>
|
||||
[TestMethod()]
|
||||
public void enqueue_one_element_test()
|
||||
{
|
||||
int size = 1;
|
||||
FixedList target = new FixedList(size);
|
||||
string elem = "test";
|
||||
target.Enqueue(elem);
|
||||
|
||||
Assert.IsTrue( target.Size == 1);
|
||||
Assert.IsTrue(target[0] == "test");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///Test pour enqueue
|
||||
///</summary>
|
||||
[TestMethod()]
|
||||
public void enqueue_two_elements_test()
|
||||
{
|
||||
int size = 1;
|
||||
FixedList target = new FixedList(size);
|
||||
|
||||
target.Enqueue("elem1");
|
||||
target.Enqueue("elem2");
|
||||
|
||||
Assert.IsTrue(target.Size == 1);
|
||||
Assert.IsTrue(target[0] == "elem2");
|
||||
|
||||
Assert.IsTrue(target.Size == 1);
|
||||
}
|
||||
|
||||
[TestMethod()]
|
||||
public void enqueue_three_elements_test()
|
||||
{
|
||||
int size = 3;
|
||||
FixedList target = new FixedList(size);
|
||||
|
||||
target.Enqueue("elem1"); // this one should be remove !
|
||||
target.Enqueue("elem2");
|
||||
target.Enqueue("elem3");
|
||||
target.Enqueue("elem4");
|
||||
|
||||
Assert.IsTrue(target.Size == 3);
|
||||
Assert.IsTrue(target[0] == "elem2");
|
||||
Assert.IsTrue(target[1] == "elem3");
|
||||
|
||||
Assert.IsTrue(target.Size == 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,27 +5,136 @@ using System.Linq;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using VCFEditor;
|
||||
using VCFEditor.View;
|
||||
using Moq;
|
||||
using VCFEditor.Presenter;
|
||||
using VCFEditor.Model;
|
||||
using System.ComponentModel;
|
||||
using VCFEditor.Repository;
|
||||
using vCardEditor.Repository;
|
||||
using NSubstitute;
|
||||
|
||||
namespace vCardEditor_Test
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
public class MainPresenterTest
|
||||
{
|
||||
|
||||
[TestMethod]
|
||||
public void NewFileOpenedTest()
|
||||
public void NewFileOpened_OpenInvalidExtension_Test()
|
||||
{
|
||||
var repo = new Mock<IContactRepository>();
|
||||
var view = new Mock<IMainView>();
|
||||
|
||||
var presenter = new MainPresenter(view.Object, repo.Object);
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
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"));
|
||||
|
||||
view.Received().DisplayMessage(Arg.Any<string>(), Arg.Any<string>());
|
||||
}
|
||||
|
||||
|
||||
|
||||
[TestMethod]
|
||||
public void NewFileOpened_OpenNewFile_Test()
|
||||
{
|
||||
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
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.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"));
|
||||
|
||||
}
|
||||
|
||||
|
||||
[TestMethod]
|
||||
public void NewFileOpened_OpenNewOneWhileAnotherOneIsDirty_Test()
|
||||
{
|
||||
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfThreeEntry);
|
||||
var repo = Substitute.For<ContactRepository>(fileHandler);
|
||||
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"));
|
||||
repo.Contacts[1].isDirty = true;
|
||||
|
||||
view.NewFileOpened += Raise.EventWith(new EventArg<string>("bbb.vcf"));
|
||||
|
||||
view.Received().AskMessage(Arg.Any<string>(), Arg.Any<string>());
|
||||
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void SaveFile_FirstTime()
|
||||
{
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfThreeEntry);
|
||||
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.vcf"));
|
||||
|
||||
view.SaveContactsSelected += Raise.Event();
|
||||
|
||||
fileHandler.Received().MoveFile("aaa.vcf", "aaa.vcf.old0");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void SaveFile_ExistAlready()
|
||||
{
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfThreeEntry);
|
||||
fileHandler.FileExist("aaa.vcf.old0").Returns(true);
|
||||
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.vcf"));
|
||||
|
||||
view.SaveContactsSelected += Raise.Event();
|
||||
|
||||
fileHandler.Received().MoveFile("aaa.vcf", "aaa.vcf.old1");
|
||||
}
|
||||
|
||||
|
||||
[TestMethod]
|
||||
public void DeleteTest()
|
||||
{
|
||||
var fileHandler = Substitute.For<IFileHandler>();
|
||||
fileHandler.ReadAllLines(Arg.Any<string>()).Returns(Entries.vcfThreeEntry);
|
||||
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.vcf"));
|
||||
|
||||
//Mouse click on second row.
|
||||
repo.Contacts[1].isSelected = true;
|
||||
|
||||
//Delete the second one.
|
||||
view.DeleteContact += Raise.Event();
|
||||
|
||||
Assert.AreEqual(repo.Contacts.Count, 2);
|
||||
Assert.AreEqual(repo.Contacts[1].card.FormattedName, "Jean Dupont3");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
7
vCardEditor_Test/packages.config
Normal file
7
vCardEditor_Test/packages.config
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<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,9 +11,10 @@
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>vCardEditor_Test</RootNamespace>
|
||||
<AssemblyName>vCardEditor_Test</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<TargetFrameworkVersion>v4.8.1</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
@@ -23,6 +24,7 @@
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
@@ -31,17 +33,35 @@
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<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="Moq, Version=4.0.10827.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>bin\Debug\Moq.dll</HintPath>
|
||||
<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" />
|
||||
<Reference Include="System.Core">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<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" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
|
||||
@@ -49,6 +69,9 @@
|
||||
</CodeAnalysisDependentAssemblyPaths>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="ContactRepositoryTest.cs" />
|
||||
<Compile Include="Entries.cs" />
|
||||
<Compile Include="FixedListTest.cs" />
|
||||
<Compile Include="MainPresenterTest.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
@@ -58,6 +81,9 @@
|
||||
<Name>vCardEditor</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
||||
Reference in New Issue
Block a user