/* Copyright (C) 2006 Christian Schneider
*
* This file is part of Nomad.
*
* Nomad is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Nomad 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Nomad; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.sf.nmedit.jpatch.impl;
import java.util.Iterator;
import javax.swing.undo.UndoableEdit;
import net.sf.nmedit.jpatch.PComponent;
import net.sf.nmedit.jpatch.PConnector;
import net.sf.nmedit.jpatch.PDescriptor;
import net.sf.nmedit.jpatch.PLight;
import net.sf.nmedit.jpatch.PParameter;
import net.sf.nmedit.jpatch.PRoles;
import net.sf.nmedit.jpatch.PUndoableEditFactory;
import net.sf.nmedit.jpatch.history.PUndoableEditSupport;
/**
* The reference implementation of interface {@link PComponent}.
* @author Christian Schneider
*/
public abstract class PBasicComponent<P extends PDescriptor> implements PComponent
{
/**
* The descriptor of this component
*/
private P descriptor;
protected int componentIndex = -1;
private transient PUndoableEditFactory editFactory;
public PBasicComponent(P descriptor, int componentIndex)
{
assert descriptor != null
: "the specified descriptor is null";
this.descriptor = descriptor;
this.componentIndex = componentIndex;
}
public PUndoableEditSupport getEditSupport()
{
PComponent parent = getParentComponent();
return (parent != null) ? parent.getEditSupport() : null;
}
/**
* Posts edits to the parent component.
* Overwrite this to implement different bahaviour,
* for example like notifying listeners.
*
* @param edit
*/
public void postEdit(UndoableEdit edit)
{
PComponent parent = getParentComponent();
if (parent != null) parent.postEdit(edit);
}
public boolean isUndoableEditSupportEnabled()
{
PComponent parent = getParentComponent();
return parent != null && parent.isUndoableEditSupportEnabled();
}
public PUndoableEditFactory getUndoableEditFactory()
{
if (this.editFactory == null)
{
PComponent parent = getParentComponent();
if (parent != null)
this.editFactory = parent.getUndoableEditFactory();
}
return this.editFactory;
}
public P getDescriptor()
{
return descriptor;
}
public PComponent getComponent(int index)
{
throw new IndexOutOfBoundsException("index out of bounds:"+index);
}
public int getComponentCount()
{
return 0;
}
public PComponent getParentComponent()
{
return null;
}
public String getName()
{
return getDescriptor().getName();
}
public int getComponentIndex()
{
return componentIndex;
}
public Object getComponentId()
{
return getDescriptor().getComponentId();
}
public PComponent getComponentByComponentId(Object id)
{
return null;
}
public PConnector getConnectorByComponentId(Object id)
{
return null;
}
public PParameter getParameterByComponentId(Object id)
{
return null;
}
public PLight getLightByComponentId(Object id)
{
return null;
}
public Object getAttribute(String name)
{
return getDescriptor().getAttribute(name);
}
public void setAttribute(String name, Object value)
{
getDescriptor().setAttribute(name, value);
}
public int getIntAttribute(String name, int defaultValue)
{
return getDescriptor().getIntAttribute(name, defaultValue);
}
public float getFloatAttribute(String name, float defaultValue)
{
return getDescriptor().getFloatAttribute(name, defaultValue);
}
public double getDoubleAttribute(String name, double defaultValue)
{
return getDescriptor().getDoubleAttribute(name, defaultValue);
}
public String getStringAttribute(String name)
{
return getDescriptor().getStringAttribute(name);
}
public boolean getBooleanAttribute(String name, boolean defaultValue)
{
return getDescriptor().getBooleanAttribute(name, defaultValue);
}
public int getAttributeCount()
{
return getDescriptor().getAttributeCount();
}
public Iterator<String> attributeKeys()
{
return getDescriptor().attributeKeys();
}
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append(getClass().getName());
sb.append("[name=");
sb.append(getName());
sb.append(",component-id=");
sb.append(getComponentId());
sb.append(",attributes={");
Iterator<String> keys = attributeKeys();
while (keys.hasNext())
{
String k = keys.next();
sb.append(k);
sb.append("=");
sb.append(getAttribute(k));
sb.append(";");
}
sb.append("}");
sb.append(",parent=");
sb.append(getParentComponent());
sb.append("]");
return sb.toString();
}
public PRoles getRoles()
{
return descriptor.getRoles();
}
}