/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.plugin.addrbook.macosx; import java.util.*; import net.java.sip.communicator.service.contactsource.*; /** * The editable detail, change get changed and in addressbook. * * @author Lyubomir Marinov */ public class MacOSXAddrBookContactDetail extends EditableContactDetail { /** * The property index for this detail. */ private final int property; /** * The id of the detail. */ private String id; private String subPropertyLabel; /** * Initializes a new <tt>ContactDetail</tt> instance which is to represent a * specific contact address and which is to be optionally labeled with a * specific set of labels. * * @param contactDetailValue the contact detail value to be represented by * the new <tt>ContactDetail</tt> instance * @param category * @param subCategories the set of sub categories with which the new * <tt>ContactDetail</tt> instance is to be labeled. * @param id The id of the detail. */ public MacOSXAddrBookContactDetail( int property, String contactDetailValue, Category category, SubCategory[] subCategories, String subPropertyLabel, String id) { super(contactDetailValue, category, subCategories); this.property = property; this.subPropertyLabel = subPropertyLabel; this.id = id; } /** * Whether the value for the category are multiline. * @param category * @return */ public static boolean isMultiline(Category category) { switch(category) { case Personal: return false; case Organization: return false; case Email: return true; case InstantMessaging: return true; case Phone: return true; case Address: return true; default: return false; } } /** * Sets the given detail value. * * @param value the new value of the detail */ @Override public void setDetail(String value) { //let's save in addressbook if(isMultiline(getCategory())) { // get others EditableSourceContact sourceContact = getSourceContact(); if(sourceContact != null && sourceContact instanceof MacOSXAddrBookSourceContact) { List<ContactDetail> details = ((MacOSXAddrBookSourceContact) sourceContact) .getContactDetails(getCategory()); boolean isAddress = property == MacOSXAddrBookContactQuery.kABAddressProperty; boolean isHomeAddress = containsSubCategory(SubCategory.Home); // For an address, we must check that the current detail is the // modified one. For all other properties than address, this // boolean must always be true. boolean isModifiedAddressOrGenericDetail; // first add existing one List<String> values = new ArrayList<String>(); for(ContactDetail cd : details) { isModifiedAddressOrGenericDetail = true; if(isAddress) { // lets check home and work details if((isHomeAddress && !cd.containsSubCategory(SubCategory.Home) ) || (!isHomeAddress && !cd.containsSubCategory(SubCategory.Work) )) { isModifiedAddressOrGenericDetail = false; } } String det = cd.getDetail(); for(SubCategory sub : cd.getSubCategories()) { String label = MacOSXAddrBookContactQuery. getLabel(property, sub, subPropertyLabel); if(label != null) { if(getSubCategories().contains(sub) && isModifiedAddressOrGenericDetail) values.add(value); else values.add(det); values.add(label); // For an address adds a third item for the tuple: // value, label, sub-property label. if(isAddress && cd instanceof MacOSXAddrBookContactDetail ) { values.add( ((MacOSXAddrBookContactDetail) cd) .getSubPropertyLabel()); } } } } // now the real edit MacOSXAddrBookContactQuery.setProperty( id, MacOSXAddrBookContactQuery.ABPERSON_PROPERTIES[ property], subPropertyLabel, values.toArray(new Object[values.size()])); } } else { MacOSXAddrBookContactQuery.setProperty( id, MacOSXAddrBookContactQuery.ABPERSON_PROPERTIES[ property], null, value); } super.setDetail(value); } /** * Returns the sub property. * @return */ public String getSubPropertyLabel() { return subPropertyLabel; } /** * Returns the property index for this detail. * * @return The property index for this detail. */ public final int getProperty() { return this.property; } }