/*******************************************************************************
* Copyright (c) 2007, 2010 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 org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.ICSettingContainer;
import org.eclipse.cdt.core.settings.model.ICSettingObject;
import org.eclipse.cdt.core.settings.model.extension.CDataObject;
import org.eclipse.core.resources.IProject;
public abstract class CDataProxy implements ICSettingObject {
protected ICDataProxyContainer fParent;
private CDataObject fData;
private int fFlags;
private CConfigurationDescription fConfiguration;
private String fId;
private static final int F_RESCAN = 1;
// private static final int F_WRITABLE = 1 << 1;
CDataProxy(CDataObject data, ICDataProxyContainer parent, CConfigurationDescription cfg) {
fData = data;
if(fData != null)
fId = fData.getId();
fParent = parent;
fConfiguration = cfg;
}
public ICSettingContainer getParent() {
return fParent;
}
protected void setRescan(boolean rescan){
if(isRescan() == rescan)
return;
if(rescan)
addFlags(F_RESCAN);
else
clearFlags(F_RESCAN);
}
protected boolean isRescan(){
if(checkFlags(F_RESCAN))
return true;
return false;//fData == null ? true : !fData.isValid();
}
private boolean checkFlags(int flags){
return (fFlags & flags) == flags;
}
private void addFlags(int flags){
fFlags |= flags;
}
private void clearFlags(int flags){
fFlags &= (~flags);
}
protected CDataObject getData(boolean write){
checkUpdate(write);
return fData;
}
protected CDataObject doGetData(){
return fData;
}
protected boolean containsWritableData(){
return !(fData instanceof ICachedData);
}
/* protected void setWritable(boolean writable){
if(writable == isWritable())
return;
if(writable)
addFlags(F_WRITABLE);
else
clearFlags(F_WRITABLE);
}
*/
/* void setData(CDataObject data, boolean write){
fData = data;
setWritable(write);
setRescan(false);
}
*/
/* void updateData(CDataObject data){
fData = data;
setRescan(false);
}
*/
void setData(CDataObject data){
fId = data.getId();
fData = data;
}
void internalSetId(String id){
fId = id;
}
void doClearData(){
fData = null;
setRescan(true);
}
final protected void checkUpdate(boolean write){
if((write && !containsWritableData())
|| isRescan())
fParent.updateChild(this, write);
}
void remove(){
fData = null;
fParent = null;
}
public boolean isValid(){
checkUpdate(false);
return fData != null ? fData.isValid() : false;
}
public ICConfigurationDescription getConfiguration() {
return fConfiguration;
}
public String getId() {
return fId;
// CDataObject data = getData(false);
// return data != null ? data.getId() : null;
}
/* public int getKind() {
CDataObject data = getData(false);
return data != null ? data.getKind() : 0;
}
*/
public String getName() {
CDataObject data = getData(false);
return data != null ? data.getName() : null;
}
void setConfiguration(CConfigurationDescription cfg){
fConfiguration = cfg;
}
public boolean isReadOnly() {
return false;
}
protected IProject getProject(){
ICConfigurationDescription cfg = getConfiguration();
if(cfg == null)
return null;
ICProjectDescription projDes = cfg.getProjectDescription();
if(projDes == null)
return null;
return projDes.getProject();
}
/**
* This method is intended for debugging purpose only.
*/
@SuppressWarnings("nls")
@Override
public String toString() {
return "name=["+getName()+"], id=["+getId()+"]";
}
}