Package org.eclipse.egit.ui.internal.synchronize.mapping

Source Code of org.eclipse.egit.ui.internal.synchronize.mapping.GitChangeSetContentProvider

/*******************************************************************************
* Copyright (C) 2010, Dariusz Luksza <dariusz@luksza.org>
*
* 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
*******************************************************************************/
package org.eclipse.egit.ui.internal.synchronize.mapping;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.compare.structuremergeviewer.Differencer;
import org.eclipse.core.resources.mapping.ResourceMapping;
import org.eclipse.core.resources.mapping.ResourceMappingContext;
import org.eclipse.core.resources.mapping.ResourceTraversal;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.egit.core.Activator;
import org.eclipse.egit.core.synchronize.GitResourceVariantTreeSubscriber;
import org.eclipse.egit.core.synchronize.GitSubscriberMergeContext;
import org.eclipse.egit.core.synchronize.GitSubscriberResourceMappingContext;
import org.eclipse.egit.ui.internal.synchronize.GitChangeSetModelProvider;
import org.eclipse.egit.ui.internal.synchronize.model.GitModelBlob;
import org.eclipse.egit.ui.internal.synchronize.model.GitModelCache;
import org.eclipse.egit.ui.internal.synchronize.model.GitModelCommit;
import org.eclipse.egit.ui.internal.synchronize.model.GitModelObjectContainer;
import org.eclipse.egit.ui.internal.synchronize.model.GitModelRepository;
import org.eclipse.egit.ui.internal.synchronize.model.GitModelRoot;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.team.core.mapping.ISynchronizationContext;
import org.eclipse.team.ui.mapping.SynchronizationContentProvider;
import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration;
import org.eclipse.ui.model.WorkbenchContentProvider;

/**
* Git's variant of {@link SynchronizationContentProvider}. This class creates
* model root of change set and base {@link ResourceTraversal}'s.
*/
public class GitChangeSetContentProvider extends SynchronizationContentProvider {

  private ITreeContentProvider provider;

  private GitModelRoot modelRoot;

  private Map<Object, ResourceTraversal[]> traversalCache = new HashMap<Object, ResourceTraversal[]>();

  @Override
  public boolean hasChildren(Object element) {
    if (element instanceof GitModelBlob)
      return false;

    if (element instanceof GitModelObjectContainer)
      return ((GitModelObjectContainer) element).getChildren().length > 0;

    return super.hasChildren(element);
  }

  @Override
  protected ITreeContentProvider getDelegateContentProvider() {
    if (provider == null)
      provider = new WorkbenchContentProvider();

    return provider;
  }

  @Override
  protected String getModelProviderId() {
    return GitChangeSetModelProvider.ID;
  }

  @Override
  protected Object getModelRoot() {
    if (modelRoot == null) {
      GitSubscriberMergeContext context = (GitSubscriberMergeContext) getContext();
      modelRoot = new GitModelRoot(context.getSyncData());
    }

    return modelRoot;
  }

  @Override
  protected ResourceTraversal[] getTraversals(
      ISynchronizationContext context, Object object) {
    if (object instanceof IAdaptable) {
      if (traversalCache.containsKey(object))
        return traversalCache.get(object);

      ResourceMapping rm = getResourceMapping(object);
      GitSubscriberMergeContext ctx = (GitSubscriberMergeContext) getContext();
      ResourceMappingContext rmCtx = new GitSubscriberResourceMappingContext(
          (GitResourceVariantTreeSubscriber) ctx.getSubscriber(),
          ctx.getSyncData());
      try {
        ResourceTraversal[] traversals = rm.getTraversals(rmCtx, new NullProgressMonitor());
        traversalCache.put(object, traversals);
        return traversals;
      } catch (CoreException e) {
        Activator.logError(e.getMessage(), e);
      }
    }
    return null;
  }

  private ResourceMapping getResourceMapping(Object object) {
    return (ResourceMapping) ((IAdaptable) object)
        .getAdapter(ResourceMapping.class);
  }

  @Override
  public void dispose() {
    if (provider != null)
      provider.dispose();
    if (modelRoot != null)
      modelRoot.dispose();
    traversalCache.clear();

    super.dispose();
  }

  @Override
  protected void refresh() {
    traversalCache.clear();
    super.refresh();
  }

  protected boolean isVisible(ISynchronizationContext context, Object object) {
    if (object instanceof GitModelRepository
        || object instanceof GitModelCommit
        || object instanceof GitModelCache) {
      int kind = ((GitModelObjectContainer) object).getKind();
      switch (getConfiguration().getMode()) {
      case ISynchronizePageConfiguration.OUTGOING_MODE:
        return (kind & Differencer.RIGHT) != 0;
      case ISynchronizePageConfiguration.INCOMING_MODE:
        return (kind & Differencer.LEFT) != 0;
      default:
        break;
      }
    }
    return true;
  }
}
TOP

Related Classes of org.eclipse.egit.ui.internal.synchronize.mapping.GitChangeSetContentProvider

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.