Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2012-11-10 07:58:55 +0000
committerEike Stepper2012-11-10 07:58:55 +0000
commit52d463835420717cce795c55586aa25075472f76 (patch)
tree13e0bff05303cce3ba69ee387ab974e342c43b18
parent7e57678609d5119439add77696687381fc1c4fdb (diff)
downloadcdo-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
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOItemProvider.java12
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java20
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOView.java4
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java128
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java2
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())
{

Back to the top