edu.tum.in.bruegge.epd.emfstore.dialog.util.scm.SCMLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for edu.tum.in.bruegge.epd.emfstore.dialog.util.scm.SCMLabelProvider.java

Source

/*******************************************************************************
 * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
 * Technische Universitaet Muenchen.
 * 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:
 ******************************************************************************/
package edu.tum.in.bruegge.epd.emfstore.dialog.util.scm;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.emf.emfstore.client.model.WorkspaceManager;
import org.eclipse.emf.emfstore.common.model.ModelElementId;
import org.eclipse.emf.emfstore.common.model.Project;
import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.server.model.versioning.ChangePackage;
import org.eclipse.emf.emfstore.server.model.versioning.HistoryInfo;
import org.eclipse.emf.emfstore.server.model.versioning.LogMessage;
import org.eclipse.emf.emfstore.server.model.versioning.TagVersionSpec;
import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation;
import org.eclipse.emf.emfstore.server.model.versioning.operations.CompositeOperation;
import org.eclipse.emf.emfstore.server.model.versioning.operations.OperationId;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.TreeNode;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;

import edu.tum.in.bruegge.epd.emfstore.handler.merge.util.ChangePackageVisualizationHelper;
import edu.tum.in.bruegge.epd.emfstorehelper.Activator;

/**
 * Label provider for the scm views.
 * 
 * @author Shterev
 */
public class SCMLabelProvider extends ColumnLabelProvider {

    private Project project;
    private List<OperationId> highlighted;
    private static final String ELEMENT_NOT_FOUND = "There is no sufficient information to display this element";
    private static final String LOCAL_REVISION = "Local revision";

    /**
     * Default constructor.
     * 
     * @param project the project.
     */
    public SCMLabelProvider(Project project) {
        super();
        this.project = project;
        this.highlighted = new ArrayList<OperationId>();

        baseRevision = Activator.getImageDescriptor("icons/HistoryInfo_base.png").createImage();
        currentRevision = Activator.getImageDescriptor("icons/HistoryInfo_current.png").createImage();
        headRevision = Activator.getImageDescriptor("icons/HistoryInfo_head.png").createImage();
    }

    private AdapterFactoryLabelProvider adapterFactoryLabelProvider = new AdapterFactoryLabelProvider(
            new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE));
    private ChangePackageVisualizationHelper changePackageVisualizationHelper;
    private Image baseRevision;
    private Image currentRevision;
    private Image headRevision;

    /**
     * {@inheritDoc}
     */
    @Override
    public String getText(Object element) {
        if (element instanceof TreeNode) {
            Object value = ((TreeNode) element).getValue();
            String ret = null;
            if (value instanceof HistoryInfo) {
                HistoryInfo historyInfo = (HistoryInfo) value;
                return getText(historyInfo);
            } else if (value instanceof AbstractOperation && changePackageVisualizationHelper != null) {
                ret = changePackageVisualizationHelper.getDescription((AbstractOperation) value);
            } else if (value instanceof ModelElementId && changePackageVisualizationHelper != null) {
                EObject modelElement = changePackageVisualizationHelper.getModelElement((ModelElementId) value);
                if (modelElement != null) {
                    ret = adapterFactoryLabelProvider.getText(modelElement);
                } else {
                    return ELEMENT_NOT_FOUND;
                }
            } else if (value instanceof ChangePackage) {
                ChangePackage changePackage = (ChangePackage) value;
                return getText(changePackage);
            } else if (value instanceof EObject) {
                ret = adapterFactoryLabelProvider.getText(((EObject) value));
            } else {
                ret = value.toString();
            }
            return ret;
        }
        return super.getText(element);
    }

    private String getText(ChangePackage changePackage) {
        StringBuilder builder = new StringBuilder();
        builder.append("Change Package");
        if (changePackage.getLogMessage() != null) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd, HH:mm");
            LogMessage logMessage = changePackage.getLogMessage();
            builder.append(" [");
            builder.append(logMessage.getAuthor());
            Date clientDate = logMessage.getClientDate();
            if (clientDate != null) {
                builder.append(" @ ");
                builder.append(dateFormat.format(clientDate));
            }
            builder.append("] ");
            builder.append(logMessage.getMessage());
        }
        return builder.toString();
    }

    private String getText(HistoryInfo historyInfo) {
        if (historyInfo.getPrimerySpec() != null && historyInfo.getPrimerySpec().getIdentifier() == -1) {
            return LOCAL_REVISION;
        }

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd, HH:mm");
        String baseVersion = "";
        if (historyInfo.getPrimerySpec().getIdentifier() == WorkspaceManager.getProjectSpace(project)
                .getBaseVersion().getIdentifier()) {
            baseVersion = "*";
        }
        StringBuilder builder = new StringBuilder();

        if (!historyInfo.getTagSpecs().isEmpty()) {
            builder.append("[");
            for (TagVersionSpec versionSpec : historyInfo.getTagSpecs()) {
                builder.append(versionSpec.getName());
                builder.append(",");
            }
            builder.replace(builder.length() - 1, builder.length(), "] ");
        }

        builder.append(baseVersion);
        builder.append("Version ");
        builder.append(historyInfo.getPrimerySpec().getIdentifier());
        LogMessage logMessage = null;

        if (historyInfo.getLogMessage() != null) {
            logMessage = historyInfo.getLogMessage();
        } else if (historyInfo.getChangePackage() != null
                && historyInfo.getChangePackage().getLogMessage() != null) {
            logMessage = historyInfo.getChangePackage().getLogMessage();
        }
        if (logMessage != null) {
            builder.append(" [");
            builder.append(logMessage.getAuthor());
            Date clientDate = logMessage.getClientDate();
            if (clientDate != null) {
                builder.append(" @ ");
                builder.append(dateFormat.format(clientDate));
            }
            builder.append("] ");
            builder.append(logMessage.getMessage());
        }
        return builder.toString();
    }

    private TreeNode findTopParent(TreeNode node) {
        TreeNode n = node;
        while (n.getParent() != null) {
            n = n.getParent();
        }
        return n;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Color getForeground(Object element) {
        if (element instanceof TreeNode) {
            TreeNode node = (TreeNode) element;
            if (node.getValue() instanceof AbstractOperation) {
                AbstractOperation operation = (AbstractOperation) node.getValue();
                if (highlighted.contains(operation.getOperationId())) {
                    return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
                }
            }
        }
        return super.getForeground(element);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Font getFont(Object element) {
        if (!(element instanceof TreeNode)) {
            return null;
        }
        Object value = ((TreeNode) element).getValue();

        Font italic = JFaceResources.getFontRegistry().getItalic(JFaceResources.DIALOG_FONT);
        Font bold = JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT);

        // if (getText(findTopParent((TreeNode)
        // element)).equals(LOCAL_REVISION)) {
        // return italic;
        // }
        String text = getText(element);
        if (text == null) {
            text = "";
        }
        if (value instanceof HistoryInfo) {
            if (text.equals(LOCAL_REVISION)) {
                return italic;
            }
            HistoryInfo historyInfo = (HistoryInfo) value;
            if (historyInfo.getPrimerySpec().getIdentifier() == WorkspaceManager.getProjectSpace(project)
                    .getBaseVersion().getIdentifier()) {
                return bold;
            }
        } else if (value instanceof ModelElementId) {
            if (text.equals(ELEMENT_NOT_FOUND)) {
                return italic;
            }
        }
        if (((TreeNode) element).getParent() != null
                && ((TreeNode) element).getParent().getValue() instanceof AbstractOperation) {
            AbstractOperation op = (AbstractOperation) ((TreeNode) element).getParent().getValue();
            if ((value instanceof ModelElementId && value.equals(op.getModelElementId()))) {
                return bold;
            }

            if (value instanceof EObject) {
                EObject modelElement = (EObject) value;
                Project project = ModelUtil.getProject(modelElement);
                if (project != null && project.getModelElementId(modelElement).equals(op.getModelElementId())) {
                    return bold;
                }
            }
        }
        return null;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Image getImage(Object element) {

        if (element instanceof TreeNode) {
            Object value = ((TreeNode) element).getValue();
            if (value instanceof ModelElementId) {
                return adapterFactoryLabelProvider
                        .getImage(changePackageVisualizationHelper.getModelElement((ModelElementId) value));
            } else if (value instanceof HistoryInfo) {
                String text = getText(element);
                if (text.equals(LOCAL_REVISION)) {
                    return currentRevision;
                }
                if (text.matches("\\[.*BASE.*\\].*")) {
                    return baseRevision;
                }
                if (text.matches("\\[.*HEAD.*\\].*")) {
                    return headRevision;
                }
            }
            if (value instanceof CompositeOperation && ((CompositeOperation) value).getMainOperation() != null) {
                return changePackageVisualizationHelper.getImage(adapterFactoryLabelProvider,
                        ((CompositeOperation) value).getMainOperation());
            }

            if (value instanceof AbstractOperation) {
                return changePackageVisualizationHelper.getImage(adapterFactoryLabelProvider,
                        (AbstractOperation) value);
            }
            return adapterFactoryLabelProvider.getImage(value);

        }

        return super.getImage(element);
    }

    /**
     * @param changePackageVisualizationHelper the changePackageVisualizationHelper to set
     */
    public void setChangePackageVisualizationHelper(
            ChangePackageVisualizationHelper changePackageVisualizationHelper) {
        this.changePackageVisualizationHelper = changePackageVisualizationHelper;
    }

    /**
     * @return the changePackageVisualizationHelper
     */
    public ChangePackageVisualizationHelper getChangePackageVisualizationHelper() {
        return changePackageVisualizationHelper;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String getToolTipText(Object element) {
        TreeNode historyNode = findTopParent((TreeNode) element);
        return getText((HistoryInfo) historyNode.getValue());
    }

    /**
     * @return the highlighted elements list.
     */
    public List<OperationId> getHighlighted() {
        return highlighted;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void dispose() {
        super.dispose();
        headRevision.dispose();
        currentRevision.dispose();
        baseRevision.dispose();
    }
}