Package org.springframework.ide.eclipse.aop.mylyn.ui

Source Code of org.springframework.ide.eclipse.aop.mylyn.ui.AopReferenceModelNavigatorInterestFilter

/*******************************************************************************
* Copyright (c) 2007, 2011 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.aop.mylyn.ui;

import org.eclipse.core.resources.IFile;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
import org.eclipse.mylyn.context.core.ContextCore;
import org.eclipse.mylyn.context.core.IImplicitlyIntersting;
import org.eclipse.mylyn.context.core.IInteractionElement;
import org.eclipse.mylyn.context.ui.InterestFilter;
import org.eclipse.swt.widgets.Tree;
import org.springframework.ide.eclipse.aop.core.model.IAspectDefinition;
import org.springframework.ide.eclipse.aop.ui.navigator.model.IReferenceNode;
import org.springframework.ide.eclipse.beans.core.internal.model.BeansModelUtils;

/**
* Extension to the Mylyn {@link InterestFilter} that is used to filter the Spring Aop cross
* references view.
* @author Christian Dupuis
* @author Martin Lippert / Steffen Pingel
* @since 2.0.1
*/
public class AopReferenceModelNavigatorInterestFilter extends InterestFilter {

  private Object temporarilyUnfiltered = null;

  @Override
  public boolean select(Viewer viewer, Object parent, Object object) {
    try {
      if (!(viewer instanceof StructuredViewer)
          || !containsMylynInterestFilter((StructuredViewer) viewer)) {
        return true;
      }
      if (isTemporarilyUnfilteredInternal(parent)) {
        return true;
      }
      else if (temporarilyUnfiltered instanceof Tree && isRootElement(object)) {
        return true;
      }

      IInteractionElement element = null;
      if (object instanceof IImplicitlyIntersting) {
        return true;
      }
      else if (object instanceof IInteractionElement) {
        element = (IInteractionElement) object;
      }
      else if (object instanceof IReferenceNode) {
        return isInterestingReferenceParticipant(((IReferenceNode) object));
      }
      if (element != null) {
        return isInteresting(element);
      }
    }
    catch (Throwable t) {
    }
    return false;
  }

  private boolean isInterestingReferenceParticipant(IReferenceNode object) {
    if (object != null) {
      if (object.getReferenceParticipant() != null) {
        Object element = object.getReferenceParticipant();
        if (element instanceof IAspectDefinition) {
          IAspectDefinition def = (IAspectDefinition) element;
          element = BeansModelUtils.getMostSpecificModelElement(def
              .getAspectStartLineNumber(), def.getAspectEndLineNumber(), (IFile) def
              .getResource(), null);
        }
        AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(element);
        if (bridge != null) {
          String handle = bridge.getHandleIdentifier(element);
          IInteractionElement interestElement = ContextCore.getContextManager()
              .getElement(handle);
          if (element != null && isInteresting(interestElement)) {
            return true;
          }
          // TODO CD uncomment this if *really* only interested
          // elements
          // should be displayed
          /*
           * else { return false; }
           */
        }
      }
      if (object.getChildren() != null && object.getChildren().length > 0) {
        for (Object child : object.getChildren()) {
          if (child instanceof IReferenceNode) {
            if (isInterestingReferenceParticipant((IReferenceNode) child)) {
              return true;
            }
          }
        }
      }
    }
    return false;
  }

  protected boolean isRootElement(Object object) {
    return object instanceof IReferenceNode;
  }

  protected boolean isInteresting(IInteractionElement element) {
    if (element.getInterest().isPredicted()) {
      return true;
    }
    else {
      return element.getInterest().isInteresting();
    }
  }

  private boolean isTemporarilyUnfilteredInternal(Object parent) {
    if (parent instanceof TreePath) {
      TreePath treePath = (TreePath) parent;
      parent = treePath.getLastSegment();
    }
    return temporarilyUnfiltered != null && temporarilyUnfiltered.equals(parent);
  }

  protected boolean containsMylynInterestFilter(StructuredViewer viewer) {
    for (ViewerFilter filter : viewer.getFilters()) {
      if (filter instanceof InterestFilter) {
        return true;
      }
    }
    return false;
  }

  public void setTemporarilyUnfiltered(Object temprarilyUnfiltered) {
    this.temporarilyUnfiltered = temprarilyUnfiltered;
  }

  /**
   * @return true if there was an unfiltered node
   */
  public boolean resetTemporarilyUnfiltered() {
    if (temporarilyUnfiltered != null) {
      this.temporarilyUnfiltered = null;
      return true;
    }
    else {
      return false;
    }
  }

  public Object getTemporarilyUnfiltered() {
    return temporarilyUnfiltered;
  }
}
TOP

Related Classes of org.springframework.ide.eclipse.aop.mylyn.ui.AopReferenceModelNavigatorInterestFilter

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.