/******************************************************************************* * Copyright (c) 2007, 2016 Intel Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Intel Corporation - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.core.settings.model; import java.util.ArrayList; import java.util.List; import org.eclipse.cdt.core.settings.model.ICDescriptionDelta; import org.eclipse.cdt.core.settings.model.ICSettingObject; public class CProjectDescriptionDelta implements ICDescriptionDelta { private List<CProjectDescriptionDelta> fChildList = new ArrayList<CProjectDescriptionDelta>(); private CProjectDescriptionDelta fParent; private ICSettingObject fSetting; private ICSettingObject fOldSetting; private ICSettingObject fNewSetting; private int fStatus; private int fAddedLanguageEntriesKinds; private int fRemovedLanguageEntriesKinds; private int fReorderedLanguageEntriesKinds; private static final int KIND_MASK = 3; private static final int FLAGS_OFFSET = 2; public CProjectDescriptionDelta(ICSettingObject newSetting, ICSettingObject oldSetting){ fNewSetting = newSetting; fOldSetting = oldSetting; if(newSetting != null){ fSetting = newSetting; if(oldSetting != null) setDeltaKind(CHANGED); else setDeltaKind(ADDED); } else { fSetting = oldSetting; setDeltaKind(REMOVED); } } void addChild(CProjectDescriptionDelta child){ fChildList.add(child); child.setParent(this); } private void setParent(CProjectDescriptionDelta parent){ fParent = parent; } @Override public ICDescriptionDelta[] getChildren() { return fChildList.toArray(new CProjectDescriptionDelta[fChildList.size()]); } @Override public ICSettingObject getOldSetting() { return fOldSetting; } @Override public ICSettingObject getSetting() { return fSetting; } @Override public int getSettingType() { return fSetting.getType(); } @Override public ICDescriptionDelta getParent() { return fParent; } public boolean isEmpty(){ return fChildList.size() == 0 && getDeltaKind() == CHANGED && getChangeFlags() == 0; } @Override public int getChangeFlags() { return (fStatus & (~KIND_MASK)) >> FLAGS_OFFSET; } void addChangeFlags(int flags){ flags |= getChangeFlags(); setChangeFlags(flags); } void removeChangeFlags(int flags){ flags = (getChangeFlags() & (~flags)); setChangeFlags(flags); } void setChangeFlags(int flags){ fStatus = (fStatus & KIND_MASK) | (flags << FLAGS_OFFSET); } void setDeltaKind(int kind){ fStatus = (fStatus & (~KIND_MASK)) | (kind & KIND_MASK); } @Override public int getDeltaKind() { return fStatus & KIND_MASK; } @Override public ICSettingObject getNewSetting() { return fNewSetting; } void setAddedLanguageEntriesKinds(int kinds){ fAddedLanguageEntriesKinds = kinds; checkSettingEntriesChangeFlag(); } @Override public int getAddedEntriesKinds() { return fAddedLanguageEntriesKinds; } @Override public int getRemovedEntriesKinds() { return fRemovedLanguageEntriesKinds; } @Override public int getReorderedEntriesKinds() { return fReorderedLanguageEntriesKinds; } void setRemovedLanguageEntriesKinds(int kinds){ fRemovedLanguageEntriesKinds = kinds; checkSettingEntriesChangeFlag(); } void setReorderedLanguageEntriesKinds(int kinds){ fReorderedLanguageEntriesKinds = kinds; checkSettingEntriesChangeFlag(); } private void checkSettingEntriesChangeFlag(){ if(fAddedLanguageEntriesKinds != 0 || fRemovedLanguageEntriesKinds != 0 || fReorderedLanguageEntriesKinds != 0) addChangeFlags(SETTING_ENTRIES); else removeChangeFlags(SETTING_ENTRIES); } @SuppressWarnings("nls") private static String flagsToString(int flags) { StringBuilder str = new StringBuilder(); str.append(", flags=0x").append(Integer.toHexString(flags)); str.append(":"); if ((flags&ACTIVE_CFG)!=0) str.append("ACTIVE_CFG|"); if ((flags&NAME)!=0) str.append("NAME|"); if ((flags&DESCRIPTION)!=0) str.append("DESCRIPTION|"); if ((flags&LANGUAGE_ID)!=0) str.append("LANGUAGE_ID|"); if ((flags&SOURCE_CONTENT_TYPE)!=0) str.append("SOURCE_CONTENT_TYPE|"); if ((flags&SOURCE_EXTENSIONS)!=0) str.append("SOURCE_EXTENSIONS|"); if ((flags&SETTING_ENTRIES)!=0) str.append("SETTING_ENTRIES|"); if ((flags&BINARY_PARSER_IDS)!=0) str.append("BINARY_PARSER_IDS|"); if ((flags&ERROR_PARSER_IDS)!=0) str.append("ERROR_PARSER_IDS|"); if ((flags&EXCLUDE)!=0) str.append("EXCLUDE|"); if ((flags&SOURCE_ADDED)!=0) str.append("SOURCE_ADDED|"); if ((flags&SOURCE_REMOVED)!=0) str.append("SOURCE_REMOVED|"); if ((flags&EXTERNAL_SETTINGS_ADDED)!=0) str.append("EXTERNAL_SETTINGS_ADDED|"); if ((flags&EXTERNAL_SETTINGS_REMOVED)!=0) str.append("EXTERNAL_SETTINGS_REMOVED|"); if ((flags&CFG_REF_ADDED)!=0) str.append("CFG_REF_ADDED|"); if ((flags&CFG_REF_REMOVED)!=0) str.append("CFG_REF_REMOVED|"); if ((flags&EXT_REF)!=0) str.append("EXT_REF|"); if ((flags&OWNER)!=0) str.append("OWNER|"); if ((flags&INDEX_CFG)!=0) str.append("INDEX_CFG|"); if ((flags&LANGUAGE_SETTINGS_PROVIDERS)!=0) str.append("LANGUAGE_SETTINGS_PROVIDERS|"); if (str.charAt(str.length()-1)=='|') str.deleteCharAt(str.length()-1); return str.toString(); } /** * Helper method to make debugging easier. */ @SuppressWarnings("nls") @Override public String toString() { StringBuilder str = new StringBuilder(); String type = fSetting.getClass().getSimpleName(); str.append('[').append(type).append(']'); int kind = getDeltaKind(); str.append(", kind=").append(kind); switch (kind) { case ADDED: str.append(":ADDED");break; case REMOVED: str.append(":REMOVED");break; case CHANGED: str.append(":CHANGED");break; default: str.append(":<unknown>"); } str.append(flagsToString(getChangeFlags())); ICDescriptionDelta[] children = getChildren(); if (children==null) { str.append(", no children"); } else { str.append(", ").append(getChildren().length).append(" children"); } return str.toString(); } }