package org.eclipse.iee.editor.core.pad;
import org.eclipse.iee.core.HandlerManager;
import org.eclipse.iee.core.document.PadDocumentPart;
import org.eclipse.iee.editor.core.bindings.DefaultObservableValue;
import org.eclipse.iee.editor.core.container.TextRenderCtx;
import org.eclipse.iee.editor.core.pad.common.LoadingPad;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
@Component
public class PadFactoryManager implements IPadFactoryManager {
/** Registered pad factories. */
@SuppressWarnings("rawtypes")
private final HandlerManager<IPadFactory> fPadFactories = new HandlerManager<IPadFactory>(IPadFactory.class);
public PadFactoryManager() {
}
@Reference(cardinality = ReferenceCardinality.MULTIPLE, unbind = "unregisterPadFactory", policy = ReferencePolicy.DYNAMIC)
public <T extends PadDocumentPart> void registerPadFactory(IPadFactory<T> factory) {
fPadFactories.registerHandler(factory);
}
public void unregisterPadFactory(IPadFactory<?> factory) {
fPadFactories.unregisterHandler(factory);
}
@Override
public <T extends PadDocumentPart> Pad<T, ?> createPad(T padPart, final TextRenderCtx renderCtx) {
IPadFactory iPadFactory = fPadFactories.getHandler(padPart.getClass());
Pad<T, ?> pad;
if (iPadFactory != null) {
pad = iPadFactory.create(padPart, new IPadFactoryContext() {
@Override
public TextRenderCtx getRenderContext() {
return renderCtx;
}
});
} else {
pad = (Pad<T, ?>) new LoadingPad();
pad.bindDocumentPart(DefaultObservableValue.fromValue(padPart));
}
return pad;
}
}