blob: 191f45bdb58864bc267414400202f6e923b8726f [file] [log] [blame]
/*
* Copyright (c) 2015 Eike Stepper (Berlin, 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.repositories;
import org.eclipse.emf.cdo.common.branch.CDOBranch;
import org.eclipse.emf.cdo.common.util.CDOCommonUtil;
import org.eclipse.emf.cdo.common.util.CDOTimeProvider;
import org.eclipse.emf.cdo.explorer.CDOExplorerManager;
import org.eclipse.emf.cdo.explorer.repositories.CDORepository;
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.ui.shared.SharedIcons;
import org.eclipse.net4j.util.container.IContainer;
import org.eclipse.net4j.util.event.IEvent;
import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.ui.UIUtil;
import org.eclipse.net4j.util.ui.views.ContainerItemProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author Eike Stepper
*/
public class CDORepositoryItemProvider extends ContainerItemProvider<IContainer<Object>>implements ITableLabelProvider
{
public static final Image REPOSITORY_IMAGE = SharedIcons.getImage(SharedIcons.OBJ_REPO);
public static final Image BRANCH_IMAGE = SharedIcons.getImage(SharedIcons.OBJ_BRANCH);
private final Image imageRepoDisconnected = new Image(UIUtil.getDisplay(), REPOSITORY_IMAGE, SWT.IMAGE_GRAY);
private final Map<CDORepository, CDORepository> connectingRepositories = new ConcurrentHashMap<CDORepository, CDORepository>();
private final IListener repositoryManagerListener = new IListener()
{
public void notifyEvent(IEvent event)
{
if (event instanceof RepositoryConnectionEvent)
{
RepositoryConnectionEvent e = (RepositoryConnectionEvent)event;
StructuredViewer viewer = getViewer();
CDORepository repository = e.getRepository();
if (!e.isConnected())
{
Node node = getNode(repository);
if (node != null)
{
node.disposeChildren();
if (viewer instanceof TreeViewer)
{
ViewerUtil.expand((TreeViewer)viewer, repository, false);
}
}
}
ViewerUtil.refresh(viewer, repository);
updatePropertySheetPage(repository);
}
else if (event instanceof CDOExplorerManager.ElementsChangedEvent)
{
CDOExplorerManager.ElementsChangedEvent e = (CDOExplorerManager.ElementsChangedEvent)event;
StructuredViewer viewer = getViewer();
Object[] changedElements = e.getChangedElements();
ViewerUtil.update(viewer, changedElements);
updatePropertySheetPage(changedElements);
}
}
private void updatePropertySheetPage(final Object element)
{
if (repositoriesView != null)
{
getDisplay().asyncExec(new Runnable()
{
public void run()
{
IStructuredSelection selection = (IStructuredSelection)repositoriesView.getSelection();
for (Object object : selection.toArray())
{
if (object == element)
{
repositoriesView.refreshPropertySheetPage();
return;
}
}
}
});
}
}
};
private final CDORepositoriesView repositoriesView;
private boolean grayOutDisconnectedRepositories = true;
public CDORepositoryItemProvider()
{
this(null);
grayOutDisconnectedRepositories = false;
}
public CDORepositoryItemProvider(CDORepositoriesView repositoriesView)
{
this.repositoriesView = repositoriesView;
}
@Override
public void dispose()
{
imageRepoDisconnected.dispose();
super.dispose();
}
public void connectRepository(CDORepository repository)
{
// Mark this repository as connecting.
connectingRepositories.put(repository, repository);
StructuredViewer viewer = getViewer();
ViewerUtil.refresh(viewer, repository); // Trigger hasChildren().
if (viewer instanceof TreeViewer)
{
ViewerUtil.expand((TreeViewer)viewer, repository, true); // Trigger getChildren().
}
}
@Override
public boolean hasChildren(Object element)
{
if (element instanceof CDORepository)
{
CDORepository repository = (CDORepository)element;
if (!repository.isConnected())
{
if (connectingRepositories.containsKey(repository))
{
// This must be the ContainerItemProvider.LazyElement.
return true;
}
return false;
}
}
return super.hasChildren(element);
}
@Override
public Object[] getChildren(Object element)
{
if (element instanceof CDORepository)
{
CDORepository repository = (CDORepository)element;
if (!repository.isConnected())
{
if (!connectingRepositories.containsKey(repository))
{
return ViewerUtil.NO_CHILDREN;
}
}
}
else if (element instanceof CDORepositoryManager)
{
List<CDORepository> repositories = new ArrayList<CDORepository>();
Object[] children = super.getChildren(element);
for (Object child : children)
{
if (child instanceof CDORepository)
{
repositories.add((CDORepository)child);
}
}
Collections.sort(repositories);
return repositories.toArray();
}
List<CDOTimeProvider> timeProviders = new ArrayList<CDOTimeProvider>();
List<Object> otherObjects = new ArrayList<Object>();
Object[] children = super.getChildren(element);
for (Object child : children)
{
if (child instanceof CDOTimeProvider)
{
timeProviders.add((CDOTimeProvider)child);
}
else
{
otherObjects.add(child);
}
}
Collections.sort(timeProviders, CDOCommonUtil.TIME_COMPARATOR);
otherObjects.addAll(0, timeProviders);
return otherObjects.toArray();
}
@Override
protected Object[] getContainerChildren(AbstractContainerNode containerNode, IContainer<?> container)
{
if (container instanceof CDORepository)
{
CDORepository repository = (CDORepository)container;
if (connectingRepositories.remove(repository) != null)
{
try
{
repository.connect();
}
catch (final Exception ex)
{
OM.LOG.error(ex);
containerNode.disposeChildren();
repository.disconnect();
UIUtil.getDisplay().asyncExec(new Runnable()
{
public void run()
{
try
{
MessageDialog.openError(getViewer().getControl().getShell(), "Connection Error", ex.getMessage());
}
catch (Exception ex)
{
OM.LOG.error(ex);
}
}
});
}
}
}
return super.getContainerChildren(containerNode, container);
}
@Override
public String getText(Object element)
{
if (element instanceof CDORepository)
{
CDORepository repository = (CDORepository)element;
return repository.getLabel();
}
if (element instanceof CDOBranch)
{
CDOBranch branch = (CDOBranch)element;
return branch.getName();
}
return super.getText(element);
}
public String getColumnText(Object element, int columnIndex)
{
switch (columnIndex)
{
case 0:
return getText(element);
case 1:
if (element instanceof CDORepository)
{
CDORepository repository = (CDORepository)element;
VersioningMode versioningMode = repository.getVersioningMode();
return versioningMode == null ? "Unknown" : versioningMode.toString();
}
break;
case 2:
if (element instanceof CDORepository)
{
CDORepository repository = (CDORepository)element;
IDGeneration idGeneration = repository.getIDGeneration();
return idGeneration == null ? "Unknown" : idGeneration.toString();
}
}
return "";
}
@Override
public Image getImage(Object obj)
{
if (obj instanceof CDORepository)
{
CDORepository repository = (CDORepository)obj;
if (!repository.isConnected() && grayOutDisconnectedRepositories)
{
return imageRepoDisconnected;
}
return REPOSITORY_IMAGE;
}
if (obj instanceof CDOBranch)
{
return BRANCH_IMAGE;
}
return super.getImage(obj);
}
public Image getColumnImage(Object element, int columnIndex)
{
if (columnIndex == 0)
{
return getImage(element);
}
return null;
}
@Override
protected boolean isSlow(IContainer<Object> container)
{
return true;
}
@Override
protected String getSlowText(IContainer<Object> container)
{
if ((IContainer<?>)container instanceof CDORepository)
{
return "Connecting...";
}
return "Loading...";
}
@Override
protected void connectInput(IContainer<Object> input)
{
super.connectInput(input);
input.addListener(repositoryManagerListener);
}
@Override
protected void disconnectInput(IContainer<Object> input)
{
input.removeListener(repositoryManagerListener);
super.disconnectInput(input);
}
}