/******************************************************************************* * 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.webflow.ui.model; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; 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.beans.ui.model.BeansModelLabelDecorator; import org.springframework.ide.eclipse.core.MarkerUtils; import org.springframework.ide.eclipse.core.model.IModelElement; import org.springframework.ide.eclipse.ui.SpringLabelDecorator; import org.springframework.ide.eclipse.webflow.core.internal.model.WebflowModelUtils; import org.springframework.ide.eclipse.webflow.core.model.IWebflowConfig; import org.springframework.ide.eclipse.webflow.core.model.IWebflowModel; import org.springframework.ide.eclipse.webflow.core.model.IWebflowModelElement; import org.springframework.ide.eclipse.webflow.core.model.IWebflowModelListener; import org.springframework.ide.eclipse.webflow.core.model.IWebflowProject; import org.springframework.ide.eclipse.webflow.ui.Activator; /** * This decorator adds an overlay image to all Spring web flow files and their corresponding * folders. This decoration is refreshed on every modification to the Spring web flow. Therefore the * decorator adds a {@link IWebflowModelListener change listener} to the {@link IWebflowModel}. * @author Christian Dupuis * @since 2.0 */ public class WebflowModelLabelDecorator extends SpringLabelDecorator implements ILightweightLabelDecorator { public static final String DECORATOR_ID = Activator.PLUGIN_ID + ".model.webflowModelLabelDecorator"; public static void update() { IBaseLabelProvider provider = PlatformUI.getWorkbench().getDecoratorManager() .getBaseLabelProvider(DECORATOR_ID); if (provider instanceof BeansModelLabelDecorator) { ((WebflowModelLabelDecorator) provider).internalUpdate(); } } private void internalUpdate() { Display.getDefault().asyncExec(new Runnable() { public void run() { IBaseLabelProvider provider = PlatformUI.getWorkbench().getDecoratorManager() .getBaseLabelProvider(SpringLabelDecorator.DECORATOR_ID); if (provider != null) { fireLabelProviderChanged(new LabelProviderChangedEvent(provider)); } fireLabelProviderChanged(new LabelProviderChangedEvent( WebflowModelLabelDecorator.this)); } }); } private IWebflowModelListener listener; public WebflowModelLabelDecorator() { listener = new IWebflowModelListener() { public void modelChanged(IWebflowProject project) { internalUpdate(); } }; org.springframework.ide.eclipse.webflow.core.Activator.getModel() .registerModelChangeListener(listener); } public void decorate(Object element, IDecoration decoration) { if (element instanceof IFolder) { decorateFolder((IFolder) element, decoration); } else if (element instanceof IFile) { decorateFile((IFile) element, decoration); } else if (element instanceof IWebflowModelElement) { decorateWebflowModelElement(((IModelElement) element), decoration); } else if (element instanceof IWebflowProject) { decorateWebflowModelElement(((IModelElement) element), decoration); } } protected void decorateFile(IFile file, IDecoration decoration) { if (WebflowModelUtils.isWebflowConfig(file)) { addErrorOverlay(decoration, getSeverity(file)); decoration.addOverlay(WebflowUIImages.DESC_OVR_WEBFLOW); } } protected void decorateFolder(IFolder folder, IDecoration decoration) { IWebflowModel model = org.springframework.ide.eclipse.webflow.core.Activator.getModel(); if (model.hasProject(folder.getProject())) { IWebflowProject project = model.getProject(folder.getProject()); String path = folder.getProjectRelativePath().toString() + '/'; for (IWebflowConfig config : project.getConfigs()) { if (config.getResource().getProjectRelativePath().toString().startsWith(path)) { decoration.addOverlay(WebflowUIImages.DESC_OVR_WEBFLOW); break; } } } } /** * Adds error and warning decorations to {@link IWebflowModelElement}. * @since 2.0.1 */ private void decorateWebflowModelElement(IModelElement element, IDecoration decoration) { addErrorOverlay(decoration, getSeverity(element)); } public void dispose() { org.springframework.ide.eclipse.webflow.core.Activator.getModel() .removeModelChangeListener(listener); } public boolean isLabelProperty(Object element, String property) { return false; } protected int getSeverity(Object element) { if (element instanceof IWebflowProject) { int severity = 0; for (IWebflowConfig config : ((IWebflowProject) element).getConfigs()) { severity = MarkerUtils.getHighestSeverityFromMarkersInRange(config.getResource(), -1, -1); if (severity == IMarker.SEVERITY_ERROR) { break; } } return severity; } else if (element instanceof IWebflowConfig) { return MarkerUtils.getHighestSeverityFromMarkersInRange(((IWebflowConfig) element) .getResource(), -1, -1); } else if (element instanceof IResource) { return MarkerUtils.getHighestSeverityFromMarkersInRange((IResource) element, -1, -1); } return 0; } }