23 #include "internal/berrySimpleExtensionPointFilter.h" 32 struct ExtensionTracker::Impl
34 struct HandlerWrapper;
37 QHash<IExtension::Pointer, QSet<Object::Pointer> > extensionToStrongObjects;
38 QHash<IExtension::Pointer, QSet<Object::WeakPtr> > extensionToWeakObjects;
40 QHash<IExtensionChangeHandler*, HandlerWrapper*> handlerToWrapper;
43 IExtensionRegistry* registry;
48 , registry(theRegistry)
53 struct ExtensionTracker::Impl::HandlerWrapper :
public IRegistryEventListener
56 IExtensionChangeHandler*
const handler;
63 bool operator==(
const HandlerWrapper& target)
const 65 return handler == target.handler;
68 void Added(
const QList<IExtension::Pointer>& extensions)
override 70 for (
int i = 0; i < extensions.size(); ++i)
72 q->ApplyAdd(handler, extensions[i]);
76 void Removed(
const QList<IExtension::Pointer>& extensions)
override 78 QList<QList<Object::Pointer> > removedObjects;
80 QMutexLocker lock(&q->d->mutex);
81 for (
int i = 0; i < extensions.size(); ++i)
83 QSet<Object::Pointer> associatedObjects = q->d->extensionToStrongObjects.take(extensions[i]);
84 foreach(
const Object::WeakPtr& ptr, q->d->extensionToWeakObjects.take(extensions[i]))
88 associatedObjects.insert(ptr.Lock());
91 removedObjects.push_back(associatedObjects.toList());
94 for (
int i = 0; i < extensions.size(); ++i)
96 q->ApplyRemove(handler, extensions[i], removedObjects[i]);
100 void Added(
const QList<IExtensionPoint::Pointer>& )
override 105 void Removed(
const QList<IExtensionPoint::Pointer>& )
override 123 this->Init(theRegistry);
128 d.reset(
new Impl(
this, registry));
129 if (registry ==
nullptr)
132 BERRY_ERROR <<
"Extension tracker was unable to obtain BlueBerry extension registry.";
139 QMutexLocker lock(&d->mutex);
140 if (d->closed)
return;
141 auto iter = d->handlerToWrapper.insert(handler,
new Impl::HandlerWrapper(
this, handler));
142 d->registry->AddListener(iter.value(), filter);
153 QMutexLocker lock(&d->mutex);
154 if (d->closed)
return;
156 d->registry->RemoveListener(listener);
162 if (element.
IsNull() ||
object.IsNull())
return;
164 QMutexLocker lock(&d->mutex);
165 if (d->closed)
return;
169 d->extensionToStrongObjects[element].insert(
object);
179 QSet<Object::Pointer> objectSet;
181 QMutexLocker lock(&d->mutex);
182 if (d->closed)
return objectSet.toList();
184 auto iter = d->extensionToStrongObjects.find(element);
185 if (iter != d->extensionToStrongObjects.end())
187 objectSet.unite(iter.value());
189 auto iter2 = d->extensionToWeakObjects.find(element);
190 if (iter2 != d->extensionToWeakObjects.end())
197 return objectSet.toList();
202 QMutexLocker lock(&d->mutex);
203 if (d->closed)
return;
204 foreach(Impl::HandlerWrapper* wrapper, d->handlerToWrapper.values())
206 d->registry->RemoveListener(wrapper);
209 d->extensionToStrongObjects.clear();
210 d->extensionToWeakObjects.clear();
211 d->handlerToWrapper.clear();
218 QMutexLocker lock(&d->mutex);
219 if (d->closed)
return;
221 auto iter = d->extensionToStrongObjects.find(extension);
222 if (iter != d->extensionToStrongObjects.end())
224 iter.value().remove(
object);
226 auto iter2 = d->extensionToWeakObjects.find(extension);
227 if (iter2 != d->extensionToWeakObjects.end())
235 QSet<Object::Pointer> objectSet;
237 QMutexLocker lock(&d->mutex);
238 if (d->closed)
return objectSet.toList();
240 auto iter = d->extensionToStrongObjects.find(extension);
241 if (iter != d->extensionToStrongObjects.end())
243 objectSet.unite(iter.value());
244 d->extensionToStrongObjects.erase(iter);
246 auto iter2 = d->extensionToWeakObjects.find(extension);
247 if (iter2 != d->extensionToWeakObjects.end())
253 d->extensionToWeakObjects.erase(iter2);
256 return objectSet.toList();
270 return m_Xpt == target;
280 const QList<IExtensionPoint::Pointer> m_Xpts;
282 F(
const QList<IExtensionPoint::Pointer>& xps)
288 for (
int i = 0; i < m_Xpts.size(); i++)
290 if (m_Xpts[i] == target)
static MsgHandler handler
QList< SmartPointer< Object > > GetObjects(const SmartPointer< IExtension > &element) const override
Implements transparent reference counting.
virtual void ApplyRemove(IExtensionChangeHandler *handler, const SmartPointer< IExtension > &removedExtension, const QList< SmartPointer< Object > > &removedObjects)
MITKCORE_EXPORT bool operator==(const InteractionEvent &a, const InteractionEvent &b)
SmartPointer< ObjectType > Lock() const
static IExtensionPointFilter CreateExtensionPointFilter(const SmartPointer< IExtensionPoint > &xpt)
void RegisterHandler(IExtensionChangeHandler *handler, const IExtensionPointFilter &filter) override
void UnregisterObject(const SmartPointer< IExtension > &extension, const SmartPointer< Object > &object) override
virtual QString GetNamespaceIdentifier() const =0
void UnregisterHandler(IExtensionChangeHandler *handler) override
static IExtensionPointFilter CreateNamespaceFilter(const QString &id)
berry::WeakPointer< Self > WeakPtr
~ExtensionTracker() override
virtual void RemoveExtension(const SmartPointer< IExtension > &extension, const QList< SmartPointer< Object > > &objects)=0
virtual void AddExtension(IExtensionTracker *tracker, const SmartPointer< IExtension > &extension)=0
virtual void ApplyAdd(IExtensionChangeHandler *handler, const SmartPointer< IExtension > &extension)
void RegisterObject(const SmartPointer< IExtension > &element, const SmartPointer< Object > &object, ReferenceType referenceType) override