Package org.springframework.ide.eclipse.ui.workingsets

Source Code of org.springframework.ide.eclipse.ui.workingsets.WorkingSetContentProvider

/*******************************************************************************
* Copyright (c) 2007, 2009 Spring IDE Developers
* 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:
*     Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.ui.workingsets;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.internal.AggregateWorkingSet;
import org.eclipse.ui.navigator.ICommonContentExtensionSite;
import org.eclipse.ui.navigator.ICommonContentProvider;
import org.eclipse.ui.navigator.IExtensionStateModel;
import org.springframework.ide.eclipse.core.SpringCore;
import org.springframework.ide.eclipse.core.model.ISpringProject;

/**
* @author Christian Dupuis
* @since 2.0
*/
@SuppressWarnings("restriction")
public class WorkingSetContentProvider implements ICommonContentProvider {

  public static final String EXTENSION_ID = "org.springframework.ide.eclipse.ui.navigator.workingsets"; //$NON-NLS-1$

  public static final String SHOW_TOP_LEVEL_WORKING_SETS = EXTENSION_ID
      + ".showTopLevelWorkingSets";

  private static final Object[] NO_CHILDREN = new Object[0];

  private static final int WORKING_SETS = 0;

  private static final int PROJECTS = 1;

  private WorkingSetHelper helper;

  private int rootMode = WORKING_SETS;

  private IExtensionStateModel extensionStateModel;

  private IPropertyChangeListener rootModeListener = new IPropertyChangeListener() {

    public void propertyChange(PropertyChangeEvent event) {
      if (SHOW_TOP_LEVEL_WORKING_SETS.equals(event.getProperty())) {
        updateRootMode();
      }
    }
  };

  public void init(ICommonContentExtensionSite aConfig) {
    extensionStateModel = aConfig.getExtensionStateModel();
    extensionStateModel.addPropertyChangeListener(rootModeListener);
    updateRootMode();
  }

  public void restoreState(IMemento aMemento) {

  }

  public void saveState(IMemento aMemento) {

  }

  public Object[] getChildren(Object parentElement) {
    if (parentElement instanceof IWorkingSet) {
      IWorkingSet workingSet = (IWorkingSet) parentElement;
      if (workingSet.isAggregateWorkingSet()) {
        switch (rootMode) {
        case WORKING_SETS:
          Set<IWorkingSet> filteredWorkingSet = new HashSet<IWorkingSet>();
          IWorkingSet[] workingSets = ((AggregateWorkingSet) workingSet)
              .getComponents();
          for (IWorkingSet ws : workingSets) {
            if ("org.springframework.ide.eclipse.ui.springWorkingSetPage"
                .equals(ws.getId())) {
              filteredWorkingSet.add(ws);
            }
          }
          return filteredWorkingSet.toArray();
        case PROJECTS:
          return filterWorkingSet(workingSet).toArray();
        }
      }
      return filterWorkingSet(workingSet).toArray();
    }
    return NO_CHILDREN;
  }

  private Set<ISpringProject> filterWorkingSet(IWorkingSet workingSet) {
    Set<ISpringProject> projects = new HashSet<ISpringProject>();
    IAdaptable[] elements = workingSet.getElements();
    for (IAdaptable element : elements) {
      IProject project = (IProject) element.getAdapter(IProject.class);
      if (project == null && element instanceof IFile) {
        project = ((IFile) element).getProject();
      }
      if (project != null) {
        ISpringProject springProject = SpringCore.getModel()
            .getProject(project);
        if (springProject != null) {
          projects.add(springProject);
        }
      }
    }
    return projects;
  }

  public Object getParent(Object element) {
    if (helper != null)
      return helper.getParent(element);
    return null;
  }

  public boolean hasChildren(Object element) {
    return true;
  }

  public Object[] getElements(Object inputElement) {
    return getChildren(inputElement);
  }

  public void dispose() {
    helper = null;
    extensionStateModel.removePropertyChangeListener(rootModeListener);
  }

  public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    if (newInput instanceof IWorkingSet) {
      IWorkingSet rootSet = (IWorkingSet) newInput;
      helper = new WorkingSetHelper(rootSet);
    }

  }

  private void updateRootMode() {
    if (extensionStateModel.getBooleanProperty(SHOW_TOP_LEVEL_WORKING_SETS))
      rootMode = WORKING_SETS;
    else
      rootMode = PROJECTS;
  }

  protected class WorkingSetHelper {

    private final IWorkingSet workingSet;

    private final Map<IAdaptable, IWorkingSet> parents = new WeakHashMap<IAdaptable, IWorkingSet>();

    /**
     * Create a Helper class for the given working set
     * @param set The set to use to build the item to parent map.
     */
    public WorkingSetHelper(IWorkingSet set) {
      workingSet = set;

      if (workingSet.isAggregateWorkingSet()) {
        AggregateWorkingSet aggregateSet = (AggregateWorkingSet) workingSet;

        IWorkingSet[] components = aggregateSet.getComponents();

        for (int componentIndex = 0; componentIndex < components.length; componentIndex++) {
          IAdaptable[] elements = components[componentIndex]
              .getElements();
          for (int elementsIndex = 0; elementsIndex < elements.length; elementsIndex++) {
            parents.put(elements[elementsIndex],
                components[componentIndex]);
          }
          parents.put(components[componentIndex], aggregateSet);

        }
      }
      else {
        IAdaptable[] elements = workingSet.getElements();
        for (int elementsIndex = 0; elementsIndex < elements.length; elementsIndex++) {
          parents.put(elements[elementsIndex], workingSet);
        }
      }
    }

    /**
     * @param element An element from the viewer
     * @return The parent associated with the element, if any.
     */
    public Object getParent(Object element) {
      return parents.get(element);
    }
  }
}
TOP

Related Classes of org.springframework.ide.eclipse.ui.workingsets.WorkingSetContentProvider

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.