Package org.springframework.ide.eclipse.ui.internal.navigator

Source Code of org.springframework.ide.eclipse.ui.internal.navigator.SpringNavigatorContentProvider

/*******************************************************************************
* Copyright (c) 2007, 2008 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.internal.navigator;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.navigator.ICommonContentExtensionSite;
import org.eclipse.ui.navigator.ICommonContentProvider;
import org.springframework.ide.eclipse.core.SpringCore;
import org.springframework.ide.eclipse.core.SpringCoreUtils;
import org.springframework.ide.eclipse.core.model.IModelChangeListener;
import org.springframework.ide.eclipse.core.model.IModelElement;
import org.springframework.ide.eclipse.core.model.ISpringModel;
import org.springframework.ide.eclipse.core.model.ISpringProject;
import org.springframework.ide.eclipse.core.model.ModelChangeEvent;
import org.springframework.ide.eclipse.core.model.ModelChangeEvent.Type;
import org.springframework.ide.eclipse.ui.SpringUIPlugin;

/**
* This {@link ICommonContentProvider} knows about the Spring projects.
* @author Torsten Juergeleit
* @author Christian Dupuis
* @since 2.0
*/
public class SpringNavigatorContentProvider implements ICommonContentProvider,
    IModelChangeListener {

  private boolean refresh;
  private StructuredViewer viewer;
  private String providerID;

  public SpringNavigatorContentProvider() {
    this(true);
  }

  public SpringNavigatorContentProvider(boolean refresh) {
    this.refresh = refresh;
  }

  public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    if (viewer instanceof StructuredViewer) {
      this.viewer = (StructuredViewer) viewer;
      if (refresh) {
        if (oldInput == null && newInput != null) {
          SpringCore.getModel().addChangeListener(this);
        } else if (oldInput != null && newInput == null) {
          SpringCore.getModel().removeChangeListener(this);
        }
      }
    } else {
      this.viewer = null;
    }
  }

  public void dispose() {
    if (refresh) {
      SpringCore.getModel().removeChangeListener(this);
    }
  }

  public Object[] getElements(Object inputElement) {
    if (inputElement instanceof IWorkingSet) {
      return IModelElement.NO_CHILDREN;
    }
    return SpringCore.getModel().getProjects().toArray();
  }

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

  public Object[] getChildren(Object parentElement) {

    // Show virtual folder "Spring Elements" only in project explorer
    if (SpringUIPlugin.PROJECT_EXPLORER_CONTENT_PROVIDER_ID
        .equals(providerID)) {
      if (parentElement instanceof IProject) {
        ISpringProject springProject = SpringCore.getModel()
            .getProject((IProject) parentElement);
        if (springProject != null) {
          return new Object[] { springProject };
        }
      }
    }
    return IModelElement.NO_CHILDREN;
  }

  public Object getParent(Object element) {
    return null;
  }

  public void init(ICommonContentExtensionSite config) {
    providerID = config.getExtension().getId();
  }

  public void saveState(IMemento aMemento) {
  }

  public void restoreState(IMemento aMemento) {
  }

  public void elementChanged(ModelChangeEvent event) {
    IModelElement element = event.getElement();

    // For events of type ADDED or REMOVED refresh the parent of the changed
    // model element
    if (event.getType() == Type.CHANGED) {
      refreshViewerForElement(element);
    } else {
      if (element.getElementParent() instanceof ISpringModel) {
        refreshViewerForElement(ResourcesPlugin.getWorkspace().getRoot());
      }
      else {
        refreshViewerForElement(element.getElementParent());
      }
    }
  }

  protected final StructuredViewer getViewer() {
    return viewer;
  }

  protected final void refreshViewerForElement(final Object element) {
    if (viewer instanceof StructuredViewer && element != null) {

      // Abort if this happens after disposes
      Control ctrl = viewer.getControl();
      if (ctrl == null || ctrl.isDisposed()) {
        return;
      }

      // Are we in the UI thread?
      if (ctrl.getDisplay().getThread() == Thread.currentThread()) {
        viewer.refresh(element);
      } else {
        ctrl.getDisplay().asyncExec(new Runnable() {
          public void run() {

            // Abort if this happens after disposes
            Control ctrl = viewer.getControl();
            if (ctrl == null || ctrl.isDisposed()) {
              return;
            }
            if (element instanceof ISpringModel) {
              viewer.refresh();
            } else {
              viewer.refresh(element);
            }
          }
        });
      }
    }
  }

  @Override
  public String toString() {
    return String.valueOf(providerID);
  }
}
TOP

Related Classes of org.springframework.ide.eclipse.ui.internal.navigator.SpringNavigatorContentProvider

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.