/*
* Copyright (C) 2011 Collabora Ltd.
* Copyright (C) 2011 Philip Withnall
*
* This library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see .
*
* Authors:
* Marco Barisione
* Raul Gutierrez Segales
* Philip Withnall
*/
using GLib;
/**
* Object for a full name split in its constituent parts (given name,
* family name, etc.). This structure corresponds to the "N" field in
* VCards. The parts of the name are never null, an empty string
* indicates that a property is not set.
*
* @since 0.3.5
*/
public class Folks.StructuredName : Object
{
private string _family_name = "";
/**
* The family name.
*
* The family name (also known as surname or last name) of a contact.
*
* @since 0.3.5
*/
public string family_name
{
get { return this._family_name; }
construct set { this._family_name = value != null ? value : ""; }
}
private string _given_name = "";
/**
* The given name.
*
* The family name (also known as first name) of a contact.
*
* @since 0.3.5
*/
public string given_name
{
get { return this._given_name; }
construct set { this._given_name = value != null ? value : ""; }
}
private string _additional_names = "";
/**
* Additional names.
*
* The additional names of a contact, for instance the contact's
* middle name.
*
* @since 0.3.5
*/
public string additional_names
{
get { return this._additional_names; }
construct set { this._additional_names = value != null ? value : ""; }
}
private string _prefixes = "";
/**
* The prefixes of a name.
*
* The prefixes used in front of the name (for instance "Mr", "Mrs",
* "Doctor" or honorific titles).
*
* @since 0.3.5
*/
public string prefixes
{
get { return this._prefixes; }
construct set { this._prefixes = value != null ? value : ""; }
}
private string _suffixes = "";
/**
* The suffixes of a name.
*
* The suffixes used after a name (for instance "PhD" or "Junior").
*
* @since 0.3.5
*/
public string suffixes
{
get { return this._suffixes; }
construct set { this._suffixes = value != null ? value : ""; }
}
/**
* Create a StructuredName.
*
* You can pass `null` if a component is not set.
*
* @param family_name the family (last) name
* @param given_name the given (first) name
* @param additional_names additional names
* @param prefixes prefixes of the name
* @param suffixes suffixes of the name
* @return a new StructuredName
*
* @since 0.3.5
*/
public StructuredName (string? family_name, string? given_name,
string? additional_names, string? prefixes, string? suffixes)
{
Object (family_name: family_name,
given_name: given_name,
additional_names: additional_names,
prefixes: prefixes,
suffixes: suffixes);
}
/**
* Create a StructuredName.
*
* Shorthand for the common case of just having the family and given
* name of a contact. It's equivalent to calling
* {@link StructuredName.StructuredName} and passing `null` for all
* the other components.
*
* @param family_name the family (last) name
* @param given_name the given (first) name
* @return a new StructuredName
*
* @since 0.3.5
*/
public StructuredName.simple (string? family_name, string? given_name)
{
Object (family_name: family_name,
given_name: given_name);
}
/**
* Whether none of the components is set.
*
* @return `true` if all the components are the empty string, `false`
* otherwise.
*
* @since 0.3.5
*/
public bool is_empty ()
{
return this._family_name == "" &&
this._given_name == "" &&
this._additional_names == "" &&
this._prefixes == "" &&
this._suffixes == "";
}
/**
* Whether two StructuredNames are the same.
*
* @param other the other structured name to compare with
* @return `true` if all the components are the same, `false`
* otherwise.
*
* @since 0.5.0
*/
public bool equal (StructuredName other)
{
return this._family_name == other.family_name &&
this._given_name == other.given_name &&
this._additional_names == other.additional_names &&
this._prefixes == other.prefixes &&
this._suffixes == other.suffixes;
}
/**
* Formatted version of the structured name.
*
* @since 0.4.0
*/
public string to_string ()
{
/* Translators: format for the formatted structured name.
* Parameters (in order) are: prefixes (for the name), given name,
* family name, additional names and (name) suffixes */
var str = "%s, %s, %s, %s, %s";
return str.printf (this.prefixes,
this.given_name,
this.family_name,
this.additional_names,
this.suffixes);
}
}
/**
* Interface for classes which represent contacts with names, such as
* {@link Persona} and {@link Individual}.
*
* @since 0.3.5
*/
public interface Folks.NameDetails : Object
{
/**
* The contact name split in its constituent parts.
*
* Note that most of the time the structured name is not set (i.e.
* it's `null`) or just some of the components are set.
* The components are immutable. To get notification of changes of
* the structured name, you just have to connect to the `notify` signal
* of this property.
*
* @since 0.3.5
*/
public abstract StructuredName? structured_name { get; set; }
/**
* Change the contact's structured name.
*
* It's preferred to call this rather than setting
* {@link NameDetails.structured_name} directly, as this method gives error
* notification and will only return once the name has been written to the
* relevant backing store (or the operation's failed).
*
* @param name the structured name (`null` to unset it)
* @throws PropertyError if setting the structured name failed
* @since 0.6.2
*/
public virtual async void change_structured_name (StructuredName? name)
throws PropertyError
{
/* Default implementation. */
throw new PropertyError.NOT_WRITEABLE (
_("Structured name is not writeable on this contact."));
}
/**
* The full name of the contact.
*
* The full name is the name of the contact written in the way the contact
* prefers. For instance for English names this is usually the given name
* followed by the family name, but Chinese names are usually the family
* name followed by the given name.
* The full name could or could not contain additional names (like a
* middle name), prefixes or suffixes.
*
* The full name must not be `null`: the empty string represents an unset full
* name.
*
* @since 0.3.5
*/
public abstract string full_name { get; set; }
/**
* Change the contact's full name.
*
* It's preferred to call this rather than setting
* {@link NameDetails.full_name} directly, as this method gives error
* notification and will only return once the name has been written to the
* relevant backing store (or the operation's failed).
*
* @param full_name the full name (empty string to unset it)
* @throws PropertyError if setting the full name failed
* @since 0.6.2
*/
public virtual async void change_full_name (string full_name)
throws PropertyError
{
/* Default implementation. */
throw new PropertyError.NOT_WRITEABLE (
_("Full name is not writeable on this contact."));
}
/**
* The nickname of the contact.
*
* The nickname is the name that the contact chose for himself. This is
* different from {@link AliasDetails.alias} as aliases can be chosen by
* the user and not by the contacts themselves.
*
* Consequently, setting the nickname only makes sense in the context of an
* address book when updating the information a contact has specified about
* themselves.
*
* The nickname must not be `null`: the empty string represents an unset
* nickname.
*
* @since 0.3.5
*/
public abstract string nickname { get; set; }
/**
* Change the contact's nickname.
*
* It's preferred to call this rather than setting
* {@link NameDetails.nickname} directly, as this method gives error
* notification and will only return once the name has been written to the
* relevant backing store (or the operation's failed).
*
* @param nickname the nickname (empty string to unset it)
* @throws PropertyError if setting the nickname failed
* @since 0.6.2
*/
public virtual async void change_nickname (string nickname)
throws PropertyError
{
/* Default implementation. */
throw new PropertyError.NOT_WRITEABLE (
_("Nickname is not writeable on this contact."));
}
}