diff options
author | Eike Stepper | 2020-04-10 05:57:02 +0000 |
---|---|---|
committer | Eike Stepper | 2020-04-10 05:57:02 +0000 |
commit | fed3b44a5bc48864cb40184128feb66559c7648c (patch) | |
tree | 53ce813a3ef53f3b96eb5c7ead5144d82f863284 /plugins/org.eclipse.emf.cdo.explorer.ui | |
parent | 92caf4e4d570e2a552d0508b19f0a52b1c4e9509 (diff) | |
download | cdo-fed3b44a5bc48864cb40184128feb66559c7648c.tar.gz cdo-fed3b44a5bc48864cb40184128feb66559c7648c.tar.xz cdo-fed3b44a5bc48864cb40184128feb66559c7648c.zip |
[561973] Make CDO Editor node expansion asynchronous and resilient to failures
https://bugs.eclipse.org/bugs/show_bug.cgi?id=561973
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.explorer.ui')
10 files changed, 103 insertions, 1161 deletions
diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/ViewerUtil.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/ViewerUtil.java deleted file mode 100644 index 3ed3d5492e..0000000000 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/ViewerUtil.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (c) 2015, 2016, 2019 Eike Stepper (Loehne, Germany) and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Eike Stepper - initial API and implementation - */ -package org.eclipse.emf.cdo.explorer.ui; - -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.StructuredViewer; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Tree; - -import java.util.Collection; - -/** - * @author Eike Stepper - */ -public final class ViewerUtil -{ - public static final Object[] NO_CHILDREN = {}; - - private ViewerUtil() - { - } - - public static void update(StructuredViewer viewer, Object element) - { - update(viewer, element, true); - } - - public static void update(final StructuredViewer viewer, final Object element, boolean async) - { - if (viewer != null) - { - final Control control = viewer.getControl(); - if (!control.isDisposed()) - { - Runnable runnable = new Runnable() - { - @Override - public void run() - { - if (!control.isDisposed()) - { - if (element instanceof Object[]) - { - Object[] array = (Object[])element; - viewer.update(array, null); - } - else if (element instanceof Collection) - { - Collection<?> collection = (Collection<?>)element; - viewer.update(collection.toArray(), null); - } - else - { - viewer.update(element, null); - } - } - } - }; - - Display display = control.getDisplay(); - if (async) - { - display.asyncExec(runnable); - } - else - { - display.syncExec(runnable); - } - } - } - } - - public static void refresh(StructuredViewer viewer, Object element) - { - refresh(viewer, element, true); - } - - public static void refresh(final StructuredViewer viewer, final Object element, boolean async) - { - refresh(viewer, element, async, false); - } - - public static void refresh(final StructuredViewer viewer, final Object element, boolean async, final boolean setSelectionBack) - { - if (viewer != null) - { - Control control = viewer.getControl(); - if (!control.isDisposed()) - { - Runnable runnable = new Runnable() - { - @Override - public void run() - { - if (!viewer.getControl().isDisposed()) - { - ISelection selection = null; - if (setSelectionBack) - { - selection = viewer.getSelection(); - } - - if (element == null) - { - viewer.refresh(); - } - else if (element instanceof Collection) - { - Collection<?> collection = (Collection<?>)element; - for (Object object : collection) - { - viewer.refresh(object); - } - } - else - { - viewer.refresh(element); - } - - if (selection != null) - { - viewer.setSelection(selection); - } - } - } - }; - - Display display = control.getDisplay(); - if (async) - { - display.asyncExec(runnable); - } - else - { - display.syncExec(runnable); - } - } - } - } - - public static void expand(final TreeViewer viewer, final Object element, final boolean expanded) - { - if (viewer != null) - { - Tree tree = viewer.getTree(); - if (!tree.isDisposed()) - { - Display display = tree.getDisplay(); - display.asyncExec(new Runnable() - { - @Override - public void run() - { - if (!viewer.getControl().isDisposed()) - { - viewer.setExpandedState(element, expanded); - } - } - }); - } - } - } - - /** - * @author Eike Stepper - */ - public static final class Pending - { - private final Object parent; - - private final String text; - - public Pending(Object parent, String text) - { - this.parent = parent; - this.text = text; - } - - public Object getParent() - { - return parent; - } - - public String getText() - { - return text; - } - } -} diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/bundle/OM.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/bundle/OM.java index 0a2d70a253..f7a446a19b 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/bundle/OM.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/bundle/OM.java @@ -52,7 +52,7 @@ public abstract class OM PREFS.init("PREF_REPOSITORY_TIMEOUT_DISABLED", false); //$NON-NLS-1$ public static final OMPreference<Boolean> PREF_REMEMBER_OPEN_EDITORS = // - PREFS.init("PREF_REMEMBER_OPEN_EDITORS", false); //$NON-NLS-1$ + PREFS.init("PREF_REMEMBER_OPEN_EDITORS", true); //$NON-NLS-1$ public static final OMPreference<Integer> PREF_DASHBOARD_HEIGHT = // PREFS.init("PREF_DASHBOARD_HEIGHT", 0); //$NON-NLS-1$ diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutContentProvider.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutContentProvider.java index 8503036f5a..c654b54b96 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutContentProvider.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutContentProvider.java @@ -11,11 +11,6 @@ package org.eclipse.emf.cdo.explorer.ui.checkouts; import org.eclipse.emf.cdo.CDOElement; -import org.eclipse.emf.cdo.CDOObject; -import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.revision.CDOList; -import org.eclipse.emf.cdo.common.revision.CDORevision; -import org.eclipse.emf.cdo.common.revision.CDORevisionManager; import org.eclipse.emf.cdo.eresource.CDOResourceFolder; import org.eclipse.emf.cdo.eresource.CDOResourceNode; import org.eclipse.emf.cdo.explorer.CDOExplorerManager; @@ -24,33 +19,19 @@ import org.eclipse.emf.cdo.explorer.CDOExplorerUtil; import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout; import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckoutManager; import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckoutManager.CheckoutStateEvent; -import org.eclipse.emf.cdo.explorer.ui.ViewerUtil; import org.eclipse.emf.cdo.explorer.ui.bundle.OM; import org.eclipse.emf.cdo.explorer.ui.checkouts.actions.OpenWithActionProvider; -import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; -import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionCache; +import org.eclipse.emf.cdo.internal.ui.CDOContentProvider; +import org.eclipse.emf.cdo.internal.ui.RunnableViewerRefresh; +import org.eclipse.emf.cdo.internal.ui.ViewerUtil; import org.eclipse.emf.cdo.ui.CDOItemProvider; -import org.eclipse.emf.cdo.util.CDOUtil; -import org.eclipse.emf.cdo.view.CDOView; import org.eclipse.net4j.util.container.IContainerEvent; import org.eclipse.net4j.util.event.IEvent; import org.eclipse.net4j.util.event.IListener; -import org.eclipse.net4j.util.lifecycle.LifecycleException; -import org.eclipse.net4j.util.lifecycle.LifecycleUtil; -import org.eclipse.net4j.util.ui.UIUtil; -import org.eclipse.net4j.util.ui.views.ItemProvider; -import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.EStructuralFeature; -import org.eclipse.emf.ecore.InternalEObject; -import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; -import org.eclipse.emf.edit.provider.ITreeItemContentProvider; -import org.eclipse.emf.edit.provider.ItemProviderAdapter; -import org.eclipse.emf.spi.cdo.InternalCDOObject; -import org.eclipse.emf.spi.cdo.InternalCDOView; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; @@ -60,7 +41,6 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.IOpenListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; @@ -68,7 +48,6 @@ import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; @@ -78,7 +57,6 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IViewReference; @@ -94,30 +72,23 @@ import org.eclipse.ui.views.properties.PropertySheet; import org.eclipse.ui.views.properties.PropertySheetPage; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; /** * @author Eike Stepper */ -public class CDOCheckoutContentProvider implements ICommonContentProvider, IPropertySourceProvider, IOpenListener +public class CDOCheckoutContentProvider extends CDOContentProvider<CDOCheckout> implements ICommonContentProvider, IPropertySourceProvider, IOpenListener { - private static final Map<String, CDOCheckoutContentProvider> INSTANCES = new HashMap<>(); - - private static final Set<Object> LOADING_OBJECTS = new HashSet<>(); - - private static final Method GET_CHILDREN_FEATURES_METHOD = getMethod(ItemProviderAdapter.class, "getChildrenFeatures", Object.class); + public static final String PROJECT_EXPLORER_ID = "org.eclipse.ui.navigator.ProjectExplorer"; - private static final Method FIND_ITEM_METHOD = getMethod(StructuredViewer.class, "findItem", Object.class); + private static final Map<String, CDOCheckoutContentProvider> INSTANCES = new HashMap<>(); private static final CDOCheckoutManager CHECKOUT_MANAGER = CDOExplorerUtil.getCheckoutManager(); @@ -126,7 +97,7 @@ public class CDOCheckoutContentProvider implements ICommonContentProvider, IProp @Override public void notifyEvent(IEvent event) { - CDOCheckoutViewerRefresh viewerRefresh = stateManager.getViewerRefresh(); + RunnableViewerRefresh viewerRefresh = stateManager.getViewerRefresh(); if (event instanceof IContainerEvent) { @@ -141,23 +112,23 @@ public class CDOCheckoutContentProvider implements ICommonContentProvider, IProp if (state == CDOCheckout.State.Opening) { // Trigger hasChildren(). - ViewerUtil.refresh(viewer, checkout); + ViewerUtil.refresh(getViewer(), checkout); // Trigger getChildren(). - ViewerUtil.expand(viewer, checkout, true); + ViewerUtil.expand(getViewer(), checkout, true); } else { if (state == CDOCheckout.State.Closed) { - ViewerUtil.expand(viewer, checkout, false); + ViewerUtil.expand(getViewer(), checkout, false); } viewerRefresh.addNotification(checkout, true, true); if (state == CDOCheckout.State.Open) { - ViewerUtil.expand(viewer, checkout, true); + ViewerUtil.expand(getViewer(), checkout, true); } updatePropertySheetPage(checkout); @@ -203,10 +174,11 @@ public class CDOCheckoutContentProvider implements ICommonContentProvider, IProp PropertySheet propertySheet = getPropertySheet(workbenchPage); if (propertySheet != null) { - final IPage currentPage = propertySheet.getCurrentPage(); + IPage currentPage = propertySheet.getCurrentPage(); if (currentPage instanceof PropertySheetPage || currentPage instanceof TabbedPropertySheetPage) { - final Control control = viewer.getControl(); + TreeViewer viewer = getViewer(); + Control control = viewer.getControl(); if (!control.isDisposed()) { control.getDisplay().asyncExec(new Runnable() @@ -269,16 +241,8 @@ public class CDOCheckoutContentProvider implements ICommonContentProvider, IProp private final CDOCheckoutStateManager stateManager = new CDOCheckoutStateManager(this); - private final Map<Object, Object[]> childrenCache = new ConcurrentHashMap<>(); - private String viewerID; - private TreeViewer viewer; - - private Object input; - - public static final String PROJECT_EXPLORER_ID = "org.eclipse.ui.navigator.ProjectExplorer"; - public CDOCheckoutContentProvider() { } @@ -327,497 +291,54 @@ public class CDOCheckoutContentProvider implements ICommonContentProvider, IProp return stateManager; } - public final TreeViewer getViewer() - { - return viewer; - } - @Override public void inputChanged(Viewer newViewer, Object oldInput, Object newInput) { - TreeViewer newTreeViewer = null; - if (newViewer instanceof TreeViewer) - { - newTreeViewer = (TreeViewer)newViewer; - } - - if (newTreeViewer != viewer) - { - if (viewer != null) - { - viewer.removeOpenListener(this); - } - - viewer = newTreeViewer; - - if (viewer != null) - { - viewer.addOpenListener(this); - } - } - - input = newInput; - stateManager.inputChanged(newTreeViewer, oldInput, newInput); - } - - public Object getInput() - { - return input; - } - - @Override - public Object[] getElements(Object object) - { - return getChildren(object); + super.inputChanged(newViewer, oldInput, newInput); + stateManager.inputChanged(getViewer(), oldInput, newInput); } @Override public boolean hasChildren(Object object) { - try - { - if (object instanceof IResource) - { - if (object instanceof IWorkspaceRoot) - { - return !CHECKOUT_MANAGER.isEmpty(); - } - - return false; - } - - if (object instanceof ViewerUtil.Pending) - { - return false; - } - - if (object instanceof CDOCheckout) - { - CDOCheckout checkout = (CDOCheckout)object; - switch (checkout.getState()) - { - case Closing: - case Closed: - return false; - - case Opening: - // This must be the ViewerUtil.Pending element. - return true; - - case Open: - object = checkout.getRootObject(); - break; - } - } - - if (object instanceof CDOElement) - { - CDOElement checkoutElement = (CDOElement)object; - return checkoutElement.hasChildren(); - } - - if (GET_CHILDREN_FEATURES_METHOD != null && object instanceof EObject) - { - EObject eObject = (EObject)object; - - InternalCDOObject cdoObject = getCDOObject(eObject); - if (cdoObject != null) - { - InternalCDORevision revision = cdoObject.cdoRevision(false); - if (revision != null) - { - try - { - ITreeItemContentProvider provider = (ITreeItemContentProvider)stateManager.adapt(object, ITreeItemContentProvider.class); - if (provider instanceof ItemProviderAdapter) - { - return hasChildren(cdoObject, revision, (ItemProviderAdapter)provider); - } - } - catch (Exception ex) - { - //$FALL-THROUGH$ - } - } - } - } - - ITreeContentProvider contentProvider = stateManager.getContentProvider(object); - if (contentProvider != null) - { - return contentProvider.hasChildren(object); - } - } - catch (LifecycleException ex) + if (object instanceof IResource) { - //$FALL-THROUGH$ - } - catch (RuntimeException ex) - { - if (LifecycleUtil.isActive(object)) + if (object instanceof IWorkspaceRoot) { - throw ex; + return !CHECKOUT_MANAGER.isEmpty(); } - //$FALL-THROUGH$ + return false; } - return false; + return super.hasChildren(object); } @Override public Object[] getChildren(Object object) { - try + if (object instanceof IResource) { - if (object instanceof IResource) - { - if (object instanceof IWorkspaceRoot) - { - return CHECKOUT_MANAGER.getCheckouts(); - } - - return ViewerUtil.NO_CHILDREN; - } - - if (object instanceof ViewerUtil.Pending) + if (object instanceof IWorkspaceRoot) { - return ViewerUtil.NO_CHILDREN; + return CHECKOUT_MANAGER.getCheckouts(); } - if (object instanceof CDOElement) - { - CDOElement checkoutElement = (CDOElement)object; - return checkoutElement.getChildren(); - } - - final Object originalObject = object; - Object[] children = childrenCache.remove(originalObject); - if (children != null) - { - return children; - } - - CDOCheckout openingCheckout = null; - CDOCheckout checkout = null; - - if (object instanceof CDOCheckout) - { - checkout = (CDOCheckout)object; - - switch (checkout.getState()) - { - case Closing: - case Closed: - return ViewerUtil.NO_CHILDREN; - - case Opening: - openingCheckout = checkout; - break; - - case Open: - object = checkout.getRootObject(); - break; - } - } - - final Object finalObject = object; - final CDOCheckout finalOpeningCheckout = openingCheckout; - - final ITreeContentProvider contentProvider = stateManager.getContentProvider(finalObject); - if (contentProvider == null) - { - return ItemProvider.NO_ELEMENTS; - } - - final List<CDORevision> loadedRevisions = new ArrayList<>(); - final List<CDOID> missingIDs = new ArrayList<>(); - - if (openingCheckout == null) - { - children = determineChildRevisions(object, loadedRevisions, missingIDs); - if (children != null) - { - return CDOCheckoutContentModifier.Registry.INSTANCE.modifyChildren(object, children); - } - } - - boolean firstLoad; - synchronized (LOADING_OBJECTS) - { - firstLoad = LOADING_OBJECTS.add(originalObject); - } - - if (firstLoad || finalOpeningCheckout == null) - { - Job job = new Job("Load " + finalObject) - { - @Override - protected IStatus run(IProgressMonitor monitor) - { - try - { - if (finalOpeningCheckout != null) - { - finalOpeningCheckout.open(); - determineChildRevisions(finalObject, loadedRevisions, missingIDs); - } - - if (!missingIDs.isEmpty()) - { - CDOObject cdoObject = getCDOObject((EObject)finalObject); - CDOView view = cdoObject.cdoView(); - CDORevisionManager revisionManager = view.getSession().getRevisionManager(); - - List<CDORevision> revisions = revisionManager.getRevisions(missingIDs, view, CDORevision.UNCHUNKED, CDORevision.DEPTH_NONE, true); - loadedRevisions.addAll(revisions); - } - - Object[] children = contentProvider.getChildren(finalObject); - - // Adjust possible legacy adapters. - for (int i = 0; i < children.length; i++) - { - Object child = children[i]; - if (child instanceof InternalCDOObject) - { - InternalCDOObject cdoObject = (InternalCDOObject)child; - InternalEObject instance = cdoObject.cdoInternalInstance(); - if (instance != cdoObject) - { - children[i] = instance; - } - } - } - - children = CDOCheckoutContentModifier.Registry.INSTANCE.modifyChildren(finalObject, children); - childrenCache.put(originalObject, children); - } - catch (final Exception ex) - { - childrenCache.remove(originalObject); - - if (finalOpeningCheckout != null) - { - finalOpeningCheckout.close(); - } - - OM.LOG.error(ex); - - final Control control = viewer.getControl(); - if (!control.isDisposed()) - { - UIUtil.getDisplay().asyncExec(new Runnable() - { - @Override - public void run() - { - try - { - if (!control.isDisposed()) - { - Shell shell = control.getShell(); - String title = (finalOpeningCheckout != null ? "Open" : "Load") + " Error"; - MessageDialog.openError(shell, title, ex.getMessage()); - } - } - catch (Exception ex) - { - OM.LOG.error(ex); - } - } - }); - } - } - - CDOCheckoutViewerRefresh viewerRefresh = stateManager.getViewerRefresh(); - viewerRefresh.addNotification(originalObject, true, true, new Runnable() - { - @Override - public void run() - { - synchronized (LOADING_OBJECTS) - { - LOADING_OBJECTS.remove(originalObject); - } - } - }); - - return Status.OK_STATUS; - } - }; - - job.schedule(); - } - - if (FIND_ITEM_METHOD != null) - { - try - { - Object widget = FIND_ITEM_METHOD.invoke(viewer, originalObject); - if (widget instanceof TreeItem) - { - TreeItem item = (TreeItem)widget; - TreeItem[] childItems = item.getItems(); - - int childCount = childItems.length; - if (childCount != 0) - { - List<Object> result = new ArrayList<>(); - for (int i = 0; i < childCount; i++) - { - TreeItem childItem = childItems[i]; - Object child = childItem.getData(); - if (child != null) - { - result.add(child); - } - } - - int size = result.size(); - if (size != 0) - { - return result.toArray(new Object[size]); - } - } - } - } - catch (Exception ex) - { - //$FALL-THROUGH$ - } - } - - String text = "Loading..."; - if (finalOpeningCheckout != null) - { - text = "Opening..."; - } - - return new Object[] { new ViewerUtil.Pending(originalObject, text) }; + return ViewerUtil.NO_CHILDREN; } - catch (LifecycleException ex) - { - //$FALL-THROUGH$ - } - catch (RuntimeException ex) - { - if (LifecycleUtil.isActive(object)) - { - throw ex; - } - //$FALL-THROUGH$ - } - - return ItemProvider.NO_ELEMENTS; - } - - private Object[] determineChildRevisions(Object object, List<CDORevision> loadedRevisions, List<CDOID> missingIDs) - { - if (GET_CHILDREN_FEATURES_METHOD != null && object instanceof EObject) - { - EObject eObject = (EObject)object; - - InternalCDOObject cdoObject = getCDOObject(eObject); - if (cdoObject != null) - { - InternalCDORevision revision = cdoObject.cdoRevision(false); - if (revision != null) - { - try - { - ITreeItemContentProvider provider = (ITreeItemContentProvider)stateManager.adapt(object, ITreeItemContentProvider.class); - if (provider instanceof ItemProviderAdapter) - { - determineChildRevisions(cdoObject, revision, (ItemProviderAdapter)provider, loadedRevisions, missingIDs); - - if (missingIDs.isEmpty()) - { - // All revisions are cached. Just return the objects without server round-trips. - ITreeContentProvider contentProvider = stateManager.getContentProvider(object); - if (contentProvider != null) - { - return contentProvider.getChildren(object); - } - } - } - } - catch (Exception ex) - { - //$FALL-THROUGH$ - } - } - } - } - - return null; + return super.getChildren(object); } @Override public Object getParent(Object object) { - try - { - if (object instanceof CDOCheckout) - { - return ResourcesPlugin.getWorkspace().getRoot(); - } - - if (object instanceof ViewerUtil.Pending) - { - return ((ViewerUtil.Pending)object).getParent(); - } - - if (object instanceof CDOElement) - { - CDOElement checkoutElement = (CDOElement)object; - return checkoutElement.getParent(); - } - - if (object instanceof EObject) - { - EObject eObject = CDOUtil.getEObject((EObject)object); - - CDOElement element = CDOElement.getFor(eObject); - if (element != null) - { - return element; - } - - ITreeContentProvider contentProvider = stateManager.getContentProvider(object); - if (contentProvider != null) - { - Object parent = contentProvider.getParent(object); - if (parent instanceof EObject) - { - EObject eParent = (EObject)parent; - Adapter adapter = EcoreUtil.getAdapter(eParent.eAdapters(), CDOCheckout.class); - if (adapter != null) - { - return adapter; - } - } - - return parent; - } - } - } - catch (LifecycleException ex) + if (object instanceof CDOCheckout) { - //$FALL-THROUGH$ - } - catch (RuntimeException ex) - { - if (LifecycleUtil.isActive(object)) - { - throw ex; - } - - //$FALL-THROUGH$ + return ResourcesPlugin.getWorkspace().getRoot(); } - return null; + return super.getParent(object); } @Override @@ -834,7 +355,8 @@ public class CDOCheckoutContentProvider implements ICommonContentProvider, IProp public void selectObjects(final Object... objects) { - final Control control = viewer.getControl(); + TreeViewer viewer = getViewer(); + Control control = viewer.getControl(); if (!control.isDisposed()) { final long end = System.currentTimeMillis() + 5000L; @@ -943,121 +465,96 @@ public class CDOCheckoutContentProvider implements ICommonContentProvider, IProp } } - private IWorkbenchPage getWorkbenchPage() + @Override + protected void hookViewer(TreeViewer viewer) { - if (viewer instanceof CommonViewer) - { - CommonViewer commonViewer = (CommonViewer)viewer; - return commonViewer.getCommonNavigator().getSite().getPage(); - } + viewer.addOpenListener(this); + } - return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + @Override + protected void unhookViewer(TreeViewer viewer) + { + viewer.removeOpenListener(this); } - private static InternalCDOObject getCDOObject(EObject eObject) + @Override + protected Object adapt(Object target, Object type) { - return (InternalCDOObject)CDOUtil.getCDOObject(eObject, false); + return stateManager.adapt(target, type); } - private static boolean hasChildren(InternalCDOObject cdoObject, InternalCDORevision revision, ItemProviderAdapter provider) throws Exception + @Override + protected Object[] modifyChildren(Object parent, Object[] children) { - for (EStructuralFeature feature : getChildrenFeatures(cdoObject, provider)) - { - if (feature.isMany()) - { - if (!revision.isEmpty(feature)) - { - return true; - } - } - else if (revision.getValue(feature) != null) - { - return true; - } - } + return CDOCheckoutContentModifier.Registry.INSTANCE.modifyChildren(parent, children); + } - return false; + @Override + protected ITreeContentProvider getContentProvider(Object object) + { + return stateManager.getContentProvider(object); } - private static void determineChildRevisions(InternalCDOObject cdoObject, InternalCDORevision revision, ItemProviderAdapter provider, - List<CDORevision> loadedRevisions, List<CDOID> missingIDs) throws Exception + @Override + protected RunnableViewerRefresh getViewerRefresh() { - InternalCDOView view = cdoObject.cdoView(); - InternalCDORevisionCache revisionCache = view.getSession().getRevisionManager().getCache(); + return stateManager.getViewerRefresh(); + } - for (EStructuralFeature feature : getChildrenFeatures(cdoObject, provider)) - { - if (feature.isMany()) - { - CDOList list = revision.getListOrNull(feature); - if (list != null) - { - for (Object object : list) - { - determineChildRevision(loadedRevisions, missingIDs, view, revisionCache, object); - } - } - } - else - { - Object value = revision.getValue(feature); - determineChildRevision(loadedRevisions, missingIDs, view, revisionCache, value); - } - } + @Override + protected boolean isContext(Object object) + { + return object instanceof CDOCheckout; } - private static void determineChildRevision(List<CDORevision> loadedRevisions, List<CDOID> missingIDs, InternalCDOView view, InternalCDORevisionCache cache, - Object object) + @Override + protected ContextState getContextState(CDOCheckout checkout) { - if (object instanceof CDOID) + switch (checkout.getState()) { - CDOID id = (CDOID)object; - CDORevision childRevision = cache.getRevision(id, view); - if (childRevision != null) - { - loadedRevisions.add(childRevision); - } - else - { - missingIDs.add(id); - } + case Closing: + case Closed: + return ContextState.Closed; + + case Opening: + return ContextState.Opening; + + case Open: + return ContextState.Open; + + default: + throw new IllegalStateException("Unexpected checkout state: " + checkout); } } - @SuppressWarnings("unchecked") - private static Collection<? extends EStructuralFeature> getChildrenFeatures(InternalCDOObject cdoObject, ItemProviderAdapter provider) throws Exception + @Override + protected void openContext(CDOCheckout checkout) { - return (Collection<? extends EStructuralFeature>)GET_CHILDREN_FEATURES_METHOD.invoke(provider, cdoObject); + checkout.open(); } - private static Method getMethod(Class<?> c, String methodName, Class<?>... parameterTypes) + @Override + protected void closeContext(CDOCheckout checkout) { - try - { - Method method = c.getDeclaredMethod(methodName, parameterTypes); - method.setAccessible(true); - return method; - } - catch (Throwable ex) - { - return null; - } + checkout.close(); } - private static boolean isObjectLoading(Object... objects) + @Override + protected Object getRootObject(CDOCheckout checkout) { - synchronized (LOADING_OBJECTS) - { - for (Object object : objects) - { - if (LOADING_OBJECTS.contains(object)) - { - return true; - } - } + return checkout.getRootObject(); + } - return false; + private IWorkbenchPage getWorkbenchPage() + { + TreeViewer viewer = getViewer(); + if (viewer instanceof CommonViewer) + { + CommonViewer commonViewer = (CommonViewer)viewer; + return commonViewer.getCommonNavigator().getSite().getPage(); } + + return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); } public static TreeViewer createTreeViewer(Composite container) diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutEditorInput.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutEditorInput.java index 1ed275bc07..c1574b4db7 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutEditorInput.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutEditorInput.java @@ -24,6 +24,7 @@ import org.eclipse.emf.cdo.util.CDOURIUtil; import org.eclipse.emf.cdo.util.CDOUtil; import org.eclipse.emf.cdo.view.CDOView; +import org.eclipse.net4j.util.CheckUtil; import org.eclipse.net4j.util.om.monitor.EclipseMonitor; import org.eclipse.net4j.util.om.monitor.OMMonitor; import org.eclipse.net4j.util.om.monitor.OMMonitor.Async; @@ -58,6 +59,7 @@ public class CDOCheckoutEditorInput extends PlatformObject implements CDOEditorI public CDOCheckoutEditorInput(URI uri) { + CheckUtil.checkArg(uri, "uri is null"); this.uri = uri; } diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutLabelProvider.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutLabelProvider.java index 113545c88c..ea479db7b2 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutLabelProvider.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutLabelProvider.java @@ -11,7 +11,7 @@ package org.eclipse.emf.cdo.explorer.ui.checkouts; import org.eclipse.emf.cdo.explorer.CDOExplorerElement; -import org.eclipse.emf.cdo.explorer.ui.ViewerUtil; +import org.eclipse.emf.cdo.internal.ui.ViewerUtil; import org.eclipse.emf.cdo.transfer.CDOTransferElement; import org.eclipse.net4j.util.StringUtil; diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutState.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutState.java index f4943d57f3..05f54b52c0 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutState.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutState.java @@ -16,8 +16,8 @@ import org.eclipse.emf.cdo.eresource.CDOResourceNode; import org.eclipse.emf.cdo.explorer.CDOExplorerUtil; import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout; import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckoutManager; -import org.eclipse.emf.cdo.explorer.ui.ViewerUtil; import org.eclipse.emf.cdo.explorer.ui.bundle.OM; +import org.eclipse.emf.cdo.internal.ui.ViewerUtil; import org.eclipse.emf.cdo.internal.ui.editor.CDOEditor; import org.eclipse.emf.cdo.ui.CDOEditorUtil; import org.eclipse.emf.cdo.ui.CDOLabelDecorator; diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutStateManager.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutStateManager.java index 1ad21940fa..23a1cb650a 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutStateManager.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutStateManager.java @@ -14,6 +14,7 @@ import org.eclipse.emf.cdo.explorer.CDOExplorerUtil; import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout; import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutState.ContentProvider; import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutState.LabelProvider; +import org.eclipse.emf.cdo.internal.ui.RunnableViewerRefresh; import org.eclipse.net4j.util.lifecycle.LifecycleException; @@ -38,7 +39,7 @@ public final class CDOCheckoutStateManager private final CDOCheckoutContentProvider mainContentProvider; - private CDOCheckoutViewerRefresh viewerRefresh; + private RunnableViewerRefresh viewerRefresh; public CDOCheckoutStateManager(CDOCheckoutContentProvider mainContentProvider) { @@ -55,7 +56,7 @@ public final class CDOCheckoutStateManager return resourceManager; } - public CDOCheckoutViewerRefresh getViewerRefresh() + public RunnableViewerRefresh getViewerRefresh() { return viewerRefresh; } @@ -98,7 +99,7 @@ public final class CDOCheckoutStateManager public void inputChanged(TreeViewer newTreeViewer, Object oldInput, Object newInput) { - viewerRefresh = new CDOCheckoutViewerRefresh(newTreeViewer); + viewerRefresh = new RunnableViewerRefresh(newTreeViewer); for (CDOCheckoutState state : getStates()) { diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutViewerRefresh.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutViewerRefresh.java deleted file mode 100644 index 8b86b431f7..0000000000 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutViewerRefresh.java +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright (c) 2015, 2016, 2019 Eike Stepper (Loehne, Germany) and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Eike Stepper - initial API and implementation - */ -package org.eclipse.emf.cdo.explorer.ui.checkouts; - -import org.eclipse.emf.common.notify.Notification; -import org.eclipse.emf.edit.provider.IViewerNotification; -import org.eclipse.emf.edit.provider.ViewerNotification; -import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider.ViewerRefresh; - -import org.eclipse.jface.viewers.Viewer; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Eike Stepper - */ -public final class CDOCheckoutViewerRefresh extends ViewerRefresh -{ - private final Viewer viewer; - - public CDOCheckoutViewerRefresh(Viewer viewer) - { - super(viewer); - this.viewer = viewer; - } - - public boolean addNotification(Object element, boolean contentRefresh, boolean labelUpdate) - { - return addNotification(element, contentRefresh, labelUpdate, null); - } - - public boolean addNotification(Object element, boolean contentRefresh, boolean labelUpdate, Runnable runnable) - { - if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed()) - { - IViewerNotification notification; - - if (runnable != null) - { - RunnableViewerNotification n = new RunnableViewerNotification(element, contentRefresh, labelUpdate); - n.getRunnables().add(runnable); - notification = n; - } - else - { - notification = new ViewerNotification(null, element, contentRefresh, labelUpdate); - } - - if (addNotification(notification)) - { - viewer.getControl().getDisplay().asyncExec(this); - return true; - } - } - - return false; - } - - @Override - protected IViewerNotification merge(IViewerNotification n1, IViewerNotification n2) - { - List<Runnable> runnables = null; - if (n1 instanceof RunnableViewerNotification) - { - RunnableViewerNotification n = (RunnableViewerNotification)n1; - List<Runnable> list = n.getRunnables(); - if (!list.isEmpty()) - { - runnables = new ArrayList<>(list); - } - } - - if (n2 instanceof RunnableViewerNotification) - { - RunnableViewerNotification n = (RunnableViewerNotification)n2; - List<Runnable> list = n.getRunnables(); - if (!list.isEmpty()) - { - if (runnables == null) - { - runnables = new ArrayList<>(list); - } - else - { - runnables.addAll(list); - } - } - } - - IViewerNotification result = super.merge(n1, n2); - - if (result != null && runnables != null) - { - if (result instanceof RunnableViewerNotification) - { - RunnableViewerNotification n = (RunnableViewerNotification)result; - List<Runnable> list = n.getRunnables(); - list.clear(); - list.addAll(runnables); - } - else - { - RunnableViewerNotification newResult = new RunnableViewerNotification(result.getElement(), result.isContentRefresh(), result.isLabelUpdate()); - newResult.getRunnables().addAll(runnables); - result = newResult; - } - } - - return result; - } - - @Override - protected void refresh(IViewerNotification notification) - { - super.refresh(notification); - - if (notification instanceof RunnableViewerNotification) - { - RunnableViewerNotification n = (RunnableViewerNotification)notification; - n.run(); - } - } - - /** - * @author Eike Stepper - */ - private static final class RunnableViewerNotification implements IViewerNotification, Runnable - { - private final List<Runnable> runnables = new ArrayList<>(); - - private final Object element; - - private final boolean contentRefresh; - - private final boolean labelUpdate; - - public RunnableViewerNotification(Object element, boolean contentRefresh, boolean labelUpdate) - { - this.element = element; - this.contentRefresh = contentRefresh; - this.labelUpdate = labelUpdate; - } - - @Override - public int getEventType() - { - return Notification.SET; - } - - @Override - public Object getNotifier() - { - return element; - } - - @Override - public int getFeatureID(Class<?> expectedClass) - { - return 0; - } - - @Override - public Object getFeature() - { - return null; - } - - @Override - public Object getOldValue() - { - return null; - } - - @Override - public Object getNewValue() - { - return null; - } - - @Override - public boolean wasSet() - { - return false; - } - - @Override - public boolean isTouch() - { - return false; - } - - @Override - public boolean isReset() - { - return false; - } - - @Override - public int getPosition() - { - return 0; - } - - @Override - public boolean merge(Notification notification) - { - return false; - } - - @Override - public boolean getOldBooleanValue() - { - return false; - } - - @Override - public boolean getNewBooleanValue() - { - return false; - } - - @Override - public byte getOldByteValue() - { - return 0; - } - - @Override - public byte getNewByteValue() - { - return 0; - } - - @Override - public char getOldCharValue() - { - return 0; - } - - @Override - public char getNewCharValue() - { - return 0; - } - - @Override - public double getOldDoubleValue() - { - return 0; - } - - @Override - public double getNewDoubleValue() - { - return 0; - } - - @Override - public float getOldFloatValue() - { - return 0; - } - - @Override - public float getNewFloatValue() - { - return 0; - } - - @Override - public int getOldIntValue() - { - return 0; - } - - @Override - public int getNewIntValue() - { - return 0; - } - - @Override - public long getOldLongValue() - { - return 0; - } - - @Override - public long getNewLongValue() - { - return 0; - } - - @Override - public short getOldShortValue() - { - return 0; - } - - @Override - public short getNewShortValue() - { - return 0; - } - - @Override - public String getOldStringValue() - { - return null; - } - - @Override - public String getNewStringValue() - { - return null; - } - - @Override - public Object getElement() - { - return element; - } - - @Override - public boolean isContentRefresh() - { - return contentRefresh; - } - - @Override - public boolean isLabelUpdate() - { - return labelUpdate; - } - - public List<Runnable> getRunnables() - { - return runnables; - } - - @Override - public void run() - { - for (Runnable runnable : runnables) - { - runnable.run(); - } - } - } -} diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/CDORepositoryItemProvider.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/CDORepositoryItemProvider.java index ea95b72f15..17aecfa5cb 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/CDORepositoryItemProvider.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/CDORepositoryItemProvider.java @@ -19,8 +19,8 @@ import org.eclipse.emf.cdo.explorer.repositories.CDORepository.IDGeneration; import org.eclipse.emf.cdo.explorer.repositories.CDORepository.VersioningMode; import org.eclipse.emf.cdo.explorer.repositories.CDORepositoryManager; import org.eclipse.emf.cdo.explorer.repositories.CDORepositoryManager.RepositoryConnectionEvent; -import org.eclipse.emf.cdo.explorer.ui.ViewerUtil; import org.eclipse.emf.cdo.explorer.ui.bundle.OM; +import org.eclipse.emf.cdo.internal.ui.ViewerUtil; import org.eclipse.emf.cdo.ui.shared.SharedIcons; import org.eclipse.net4j.util.container.IContainer; diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/wizards/MasterRepositoryController.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/wizards/MasterRepositoryController.java index b771327e82..d9059cb155 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/wizards/MasterRepositoryController.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/wizards/MasterRepositoryController.java @@ -16,8 +16,8 @@ import org.eclipse.emf.cdo.admin.CDOAdminClientRepository; import org.eclipse.emf.cdo.admin.CDOAdminClientUtil; import org.eclipse.emf.cdo.explorer.repositories.CDORepository.IDGeneration; import org.eclipse.emf.cdo.explorer.repositories.CDORepository.VersioningMode; -import org.eclipse.emf.cdo.explorer.ui.ViewerUtil; import org.eclipse.emf.cdo.explorer.ui.bundle.OM; +import org.eclipse.emf.cdo.internal.ui.ViewerUtil; import org.eclipse.emf.cdo.net4j.CDONet4jSession; import org.eclipse.emf.cdo.net4j.CDONet4jSessionConfiguration; import org.eclipse.emf.cdo.net4j.CDONet4jUtil; |