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

Source Code of org.springframework.ide.eclipse.aop.ui.decorator.AopReferenceModelImageDecorator

/*******************************************************************************
* Copyright (c) 2006, 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.aop.ui.decorator;

import java.util.List;

import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.internal.core.SourceType;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.ILightweightLabelDecorator;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.springframework.ide.eclipse.aop.core.Activator;
import org.springframework.ide.eclipse.aop.core.model.IAnnotationAopDefinition;
import org.springframework.ide.eclipse.aop.core.model.IAopModelChangedListener;
import org.springframework.ide.eclipse.aop.core.model.IAopReference;
import org.springframework.ide.eclipse.aop.ui.navigator.model.AdviceAopTargetBeanNode;
import org.springframework.ide.eclipse.aop.ui.navigator.model.AdviceAopTargetMethodNode;
import org.springframework.ide.eclipse.aop.ui.navigator.model.AdviceDeclareParentAopSourceNode;
import org.springframework.ide.eclipse.aop.ui.navigator.model.AdviceRootAopReferenceNode;
import org.springframework.ide.eclipse.aop.ui.navigator.model.AdvisedAopSourceMethodNode;
import org.springframework.ide.eclipse.aop.ui.navigator.model.AdvisedAopSourceNode;
import org.springframework.ide.eclipse.aop.ui.navigator.model.AdvisedDeclareParentAopSourceNode;
import org.springframework.ide.eclipse.aop.ui.navigator.model.BeanMethodReferenceNode;
import org.springframework.ide.eclipse.aop.ui.navigator.model.BeanReferenceNode;
import org.springframework.ide.eclipse.aop.ui.navigator.model.IReferenceNode;
import org.springframework.ide.eclipse.aop.ui.navigator.util.AopReferenceModelImages;
import org.springframework.ide.eclipse.beans.core.model.IBean;
import org.springframework.ide.eclipse.beans.ui.model.BeansModelLabelDecorator;
import org.springframework.ide.eclipse.core.SpringCoreUtils;

/**
* {@link ILightweightLabelDecorator} that decorates advised Java elements.
* @author Christian Dupuis
* @author Torsten Juergeleit
* @since 2.0
*/
@SuppressWarnings("restriction")
public class AopReferenceModelImageDecorator extends BeansModelLabelDecorator implements
    ILightweightLabelDecorator {

  public static final String DECORATOR_ID = org.springframework.ide.eclipse.aop.ui.Activator.PLUGIN_ID
      + ".decorator.adviceimagedecorator";

  private void internalUpdate() {
    Display.getDefault().asyncExec(new Runnable() {
      public void run() {

        IBaseLabelProvider provider = PlatformUI.getWorkbench().getDecoratorManager()
            .getBaseLabelProvider(BeansModelLabelDecorator.DECORATOR_ID);
        if (provider != null) {
          fireLabelProviderChanged(new LabelProviderChangedEvent(provider));
        }

        fireLabelProviderChanged(new LabelProviderChangedEvent(
            AopReferenceModelImageDecorator.this));
      }
    });
  }

  private IAopModelChangedListener listener;

  public AopReferenceModelImageDecorator() {
    super();
    listener = new IAopModelChangedListener() {
      public void changed() {
        internalUpdate();
      }
    };
    Activator.getModel().registerAopModelChangedListener(listener);
  }

  public void decorate(Object element, IDecoration decoration) {
    // add the orange triangle to the icon if this method,
    // class or aspect is advised
    if ((element instanceof IMethod || element instanceof SourceType)) {
      IJavaElement je = (IJavaElement) element;
      IJavaProject jp = je.getJavaProject();
      // only query the model if the element is in an Spring project
      if ((jp != null) && SpringCoreUtils.isSpringProject(jp.getProject())) {
        if (je instanceof IMethod && Activator.getModel().isAdvised(je)) {
          decoration.addOverlay(AopReferenceModelImages.DESC_OVR_ADVICE,
              IDecoration.TOP_LEFT);
        }
      }
    }
    else if (element instanceof BeanMethodReferenceNode
        && Activator.getModel().isAdvised(
            ((BeanMethodReferenceNode) element).getJavaElement())) {
      decoration.addOverlay(AopReferenceModelImages.DESC_OVR_ADVICE, IDecoration.TOP_LEFT);
    }
    else if (element instanceof AdviceAopTargetMethodNode) {
      decoration.addOverlay(AopReferenceModelImages.DESC_OVR_ADVICE, IDecoration.TOP_LEFT);
    }
    else if (element instanceof AdviceAopTargetBeanNode) {
      decoration.addOverlay(AopReferenceModelImages.DESC_OVR_ADVICE, IDecoration.TOP_LEFT);
    }
    else if (element instanceof BeanReferenceNode
        && Activator.getModel().isAdvised(((BeanReferenceNode) element).getBean())) {
      decoration.addOverlay(AopReferenceModelImages.DESC_OVR_ADVICE, IDecoration.TOP_LEFT);
    }
    else if (element instanceof AdvisedAopSourceMethodNode) {
      if (Activator.getModel().isAdvised(
          ((AdvisedAopSourceMethodNode) element).getReference().getSource()))
        decoration
            .addOverlay(AopReferenceModelImages.DESC_OVR_ADVICE, IDecoration.TOP_LEFT);
    }
    else if (element instanceof AdviceRootAopReferenceNode) {
      List<IAopReference> references = ((AdviceRootAopReferenceNode) element).getReference();
      for (IAopReference reference : references) {
        if (reference.getDefinition() instanceof IAnnotationAopDefinition) {
          decoration.addOverlay(AopReferenceModelImages.DESC_OVR_ANNOTATION,
              IDecoration.BOTTOM_LEFT);
          break;
        }
      }
    }
    else if (element instanceof AdvisedAopSourceNode) {
      IAopReference reference = ((AdvisedAopSourceNode) element).getReference();
      if (reference.getDefinition() instanceof IAnnotationAopDefinition) {
        decoration.addOverlay(AopReferenceModelImages.DESC_OVR_ANNOTATION,
            IDecoration.BOTTOM_LEFT);
      }
    }
    else if (element instanceof AdviceDeclareParentAopSourceNode) {
      IAopReference reference = ((AdviceDeclareParentAopSourceNode) element).getReference();
      if (reference.getDefinition() instanceof IAnnotationAopDefinition) {
        decoration.addOverlay(AopReferenceModelImages.DESC_OVR_ANNOTATION,
            IDecoration.BOTTOM_LEFT);
      }
    }
    else if (element instanceof AdvisedDeclareParentAopSourceNode) {
      IAopReference reference = ((AdvisedDeclareParentAopSourceNode) element).getReference();
      if (reference.getDefinition() instanceof IAnnotationAopDefinition) {
        decoration.addOverlay(AopReferenceModelImages.DESC_OVR_ANNOTATION,
            IDecoration.BOTTOM_LEFT);
      }
    }
    // add overlay to IBeans
    else if (element instanceof IBean) {
      IBean bean = (IBean) element;
      if (Activator.getModel().isAdvised(bean)) {
        decoration
            .addOverlay(AopReferenceModelImages.DESC_OVR_ADVICE, IDecoration.TOP_LEFT);
      }
    }

    if (element instanceof IReferenceNode
        && ((IReferenceNode) element).getReferenceParticipant() != null) {
      super.decorate(((IReferenceNode) element).getReferenceParticipant(), decoration);
    }
  }

  @Override
  public void dispose() {
    super.dispose();
    if (listener != null) {
      Activator.getModel().unregisterAopModelChangedListener(listener);
    }
  }
}
TOP

Related Classes of org.springframework.ide.eclipse.aop.ui.decorator.AopReferenceModelImageDecorator

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.