private String getName(Contact contact, String charSet) {
    StringBuilder builder = new StringBuilder();
    builder.append("N;").append(charSet).append(':'); // $NON-NLS-1$
    builder.append(contact.getLastName()).append(';');
    builder.append(contact.getFirstName()).append(';');
    builder.append(contact.getMiddleName());

    String title = contact.getTitle();
    if (title.length() != 0) {
      builder.append(';').append(title);
    }

    builder.append('\n');
    return builder.toString();
  }
  @Persist
  public void doSave(@Optional IProgressMonitor monitor) throws IOException, InterruptedException {
    if (monitor == null) {
      monitor = new NullProgressMonitor();
    }
    monitor.beginTask("Saving contact details to vCard...", 16);

    Contact originalContact = detailComposite.getOriginalContact();
    Contact modifiedContact = detailComposite.getModifiedContact();
    saveAsVCard(modifiedContact, modifiedContact.getSourceFile());

    originalContact.setCity(modifiedContact.getCity());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setCompany(modifiedContact.getCompany());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setCountry(modifiedContact.getCountry());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setEmail(modifiedContact.getEmail());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setFirstName(modifiedContact.getFirstName());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setJobTitle(modifiedContact.getJobTitle());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setLastName(modifiedContact.getLastName());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setMiddleName(modifiedContact.getMiddleName());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setMobile(modifiedContact.getMobile());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setNote(modifiedContact.getNote());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setPhone(modifiedContact.getPhone());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setState(modifiedContact.getState());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setStreet(modifiedContact.getStreet());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setTitle(modifiedContact.getTitle());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setWebPage(modifiedContact.getWebPage());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setZip(modifiedContact.getZip());
    Thread.sleep(50);
    monitor.worked(1);

    updatePartTitle(originalContact);
    monitor.done();

    dirtyable.setDirty(false);
  }