/*
 * Copyright (c) 2010-2013, 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:
 *     Martin Fluegge - initial API and implementation
 *     Christian W. Damus (CEA) - bug 404043: contents of views not shown in Dawn Explorer
 */
package org.eclipse.emf.cdo.dawn.ui.views;

import org.eclipse.emf.cdo.dawn.ui.helper.EditorDescriptionHelper;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.ui.CDOItemProvider;
import org.eclipse.emf.cdo.view.CDOView;

import org.eclipse.net4j.util.ui.views.IElementFilter;

import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IWorkbenchPage;

/**
 * @author Martin Fluegge
 */
public class DawnItemProvider extends CDOItemProvider
{
  private final DawnExplorer dawnExplorer;

  public DawnItemProvider(IWorkbenchPage page, DawnExplorer dawnExplorer, IElementFilter rootElementFilter)
  {
    super(page, rootElementFilter);
    this.dawnExplorer = dawnExplorer;
  }

  @Override
  public Object[] getChildren(Object element)
  {
    Object[] result = super.getChildren(element);

    if (result.length > 0 && result[0] instanceof CDOView)
    {
      // filter the views to show only our view
      CDOView ourView = null;
      for (int i = 0; i < result.length; i++)
      {
        if (result[i] == dawnExplorer.getView())
        {
          ourView = (CDOView)result[i];
          break;
        }
      }

      if (ourView != null)
      {
        result = new Object[] { ourView };
      } // otherwise, we're showing something totally else, so don't worry about it

      return result;
    }

    return result;
  }

  @Override
  public Image getImage(Object obj)
  {
    if (obj instanceof CDOResource)
    {
      CDOResource resource = (CDOResource)obj;
      Image img = EditorDescriptionHelper.getImageForEditor(resource.getName());
      if (img != null)
      {
        return img;
      }
    }

    return super.getImage(obj);
  }
}
