diff options
author | Eike Stepper | 2012-11-10 07:58:55 +0000 |
---|---|---|
committer | Eike Stepper | 2012-11-10 07:58:55 +0000 |
commit | 52d463835420717cce795c55586aa25075472f76 (patch) | |
tree | 13e0bff05303cce3ba69ee387ab974e342c43b18 | |
parent | 7e57678609d5119439add77696687381fc1c4fdb (diff) | |
download | cdo-52d463835420717cce795c55586aa25075472f76.tar.gz cdo-52d463835420717cce795c55586aa25075472f76.tar.xz cdo-52d463835420717cce795c55586aa25075472f76.zip |
[394027] [UI] CDOViews don't update their children on invalidations
https://bugs.eclipse.org/bugs/show_bug.cgi?id=394027
5 files changed, 150 insertions, 16 deletions
diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOItemProvider.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOItemProvider.java index a516533205..8bea1cff74 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOItemProvider.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOItemProvider.java @@ -176,11 +176,6 @@ public class CDOItemProvider extends ContainerItemProvider<IContainer<Object>> return getChildren(((CDOSession)element).getBranchManager().getMainBranch()); } - if (element instanceof CDOView) - { - return ((CDOView)element).getRootResource().getContents().toArray(); - } - if (element instanceof CDOResourceFolder) { return ((CDOResourceFolder)element).getNodes().toArray(); @@ -250,14 +245,9 @@ public class CDOItemProvider extends ContainerItemProvider<IContainer<Object>> } } - if (element instanceof CDOView) - { - return ((CDOView)element).getRootResource().getContents().size() > 0; - } - if (element instanceof CDOResourceFolder) { - return ((CDOResourceFolder)element).getNodes().size() > 0; + return !((CDOResourceFolder)element).getNodes().isEmpty(); } return super.hasChildren(element); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java index cb1a099095..5dcbb28eea 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java @@ -855,9 +855,17 @@ public class CDOPushTransaction extends Notifier implements CDOTransaction /** * @since 4.2 */ - public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) + public boolean isEmpty() { - return Platform.getAdapterManager().getAdapter(this, adapter); + return delegate.isEmpty(); + } + + /** + * @since 4.2 + */ + public CDOResourceNode[] getElements() + { + return delegate.getElements(); } @Override @@ -866,6 +874,14 @@ public class CDOPushTransaction extends Notifier implements CDOTransaction return delegate.toString(); } + /** + * @since 4.2 + */ + public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) + { + return Platform.getAdapterManager().getAdapter(this, adapter); + } + public static File createTempFile(CDOTransaction transaction) throws IOException { String prefix = "cdo_tx_" + transaction.getSession().getSessionID() + "_" + transaction.getViewID() + "__"; diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOView.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOView.java index 7c0510dafa..4b67bc44b4 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOView.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOView.java @@ -40,7 +40,7 @@ import org.eclipse.emf.cdo.util.ReadOnlyException; import org.eclipse.net4j.util.collection.CloseableIterator; import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType; -import org.eclipse.net4j.util.event.INotifier; +import org.eclipse.net4j.util.container.IContainer; import org.eclipse.net4j.util.options.IOptionsEvent; import org.eclipse.net4j.util.ref.ReferenceType; @@ -90,7 +90,7 @@ import java.util.Set; * @apiviz.uses {@link CDOViewTargetChangedEvent} - - fires */ public interface CDOView extends CDOCommonView, CDOUpdatable, CDOCommitHistory.Provider<CDOObject, CDOObjectHistory>, - INotifier + IContainer<CDOResourceNode> { /** * Returns the {@link CDOSession session} this view was opened by. diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java index 611a8d6bbe..b06d1b0ff9 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java @@ -73,11 +73,17 @@ import org.eclipse.net4j.util.StringUtil; import org.eclipse.net4j.util.collection.CloseableIterator; import org.eclipse.net4j.util.collection.ConcurrentArray; import org.eclipse.net4j.util.collection.Pair; +import org.eclipse.net4j.util.container.IContainerDelta; +import org.eclipse.net4j.util.container.IContainerEvent; +import org.eclipse.net4j.util.container.SingleDeltaContainerEvent; import org.eclipse.net4j.util.event.IListener; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; import org.eclipse.net4j.util.om.log.OMLogger; import org.eclipse.net4j.util.om.trace.ContextTracer; +import org.eclipse.emf.common.notify.Adapter; +import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EAttribute; @@ -242,6 +248,58 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb registerObject(rootResource); } + public synchronized boolean isEmpty() + { + CDOResource rootResource = getRootResource(); + boolean empty = rootResource.getContents().isEmpty(); + + ensureContainerAdapter(rootResource); + return empty; + } + + public synchronized CDOResourceNode[] getElements() + { + CDOResource rootResource = getRootResource(); + EList<EObject> contents = rootResource.getContents(); + + List<CDOResourceNode> elements = new ArrayList<CDOResourceNode>(contents.size()); + for (EObject object : contents) + { + if (object instanceof CDOResourceNode) + { + CDOResourceNode element = (CDOResourceNode)object; + elements.add(element); + } + } + + ensureContainerAdapter(rootResource); + return elements.toArray(new CDOResourceNode[elements.size()]); + } + + private void ensureContainerAdapter(CDOResource rootResource) + { + EList<Adapter> adapters = rootResource.eAdapters(); + ContainerAdapter adapter = getContainerAdapter(adapters); + if (adapter == null) + { + adapter = new ContainerAdapter(); + adapters.add(adapter); + } + } + + private ContainerAdapter getContainerAdapter(EList<Adapter> adapters) + { + for (Adapter adapter : adapters) + { + if (adapter instanceof ContainerAdapter && ((ContainerAdapter)adapter).getView() == this) + { + return (ContainerAdapter)adapter; + } + } + + return null; + } + public CDOURIHandler getURIHandler() { return uriHandler; @@ -1724,4 +1782,74 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb return branchPoint; } } + + /** + * @author Eike Stepper + */ + private final class ContainerAdapter extends AdapterImpl + { + public AbstractCDOView getView() + { + return AbstractCDOView.this; + } + + @Override + public void notifyChanged(Notification msg) + { + if (msg.isTouch()) + { + return; + } + + if (msg.getFeature() != EresourcePackage.Literals.CDO_RESOURCE__CONTENTS) + { + return; + } + + IListener[] listeners = getListeners(); + if (listeners.length == 0) + { + return; + } + + IContainerEvent<CDOResourceNode> event = null; + int eventType = msg.getEventType(); + switch (eventType) + { + case Notification.ADD: + event = new SingleDeltaContainerEvent<CDOResourceNode>(AbstractCDOView.this, + (CDOResourceNode)msg.getNewValue(), IContainerDelta.Kind.ADDED); + break; + + case Notification.ADD_MANY: + // TODO + break; + + case Notification.REMOVE: + event = new SingleDeltaContainerEvent<CDOResourceNode>(AbstractCDOView.this, + (CDOResourceNode)msg.getOldValue(), IContainerDelta.Kind.REMOVED); + break; + + case Notification.REMOVE_MANY: + // TODO + break; + + case Notification.SET: + // TODO + break; + + case Notification.UNSET: + // TODO + break; + + default: + break; + } + + if (event != null) + { + fireEvent(event, listeners); + } + } + } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java index d4dfeafd66..68fb5bbc9c 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java @@ -984,7 +984,7 @@ public class CDOViewImpl extends AbstractCDOView } } - if (detachedObjects != null) + if (detachedObjects != null && !detachedObjects.isEmpty()) { if (options().isDetachmentNotificationEnabled()) { |