/******************************************************************************* * 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 org.eclipse.emf.emfstore.client.ui.views.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.client.ui.Activator; import org.eclipse.emf.emfstore.client.ui.views.changes.ChangePackageVisualizationHelper; 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.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; /** * 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 ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory( ComposedAdapterFactory.Descriptor.Registry.INSTANCE); private AdapterFactoryLabelProvider adapterFactoryLabelProvider = new AdapterFactoryLabelProvider(adapterFactory); private ChangePackageVisualizationHelper changePackageVisualizationHelper; private Image baseRevision; private Image currentRevision; private Image headRevision; /** * {@inheritDoc} */ @Override public String getText(Object element) { String ret = null; if (element instanceof HistoryInfo) { HistoryInfo historyInfo = (HistoryInfo) element; return getText(historyInfo); } else if (element instanceof AbstractOperation && changePackageVisualizationHelper != null) { ret = changePackageVisualizationHelper.getDescription((AbstractOperation) element); } else if (element instanceof ModelElementId && changePackageVisualizationHelper != null) { EObject modelElement = changePackageVisualizationHelper.getModelElement((ModelElementId) element); if (modelElement != null) { ret = adapterFactoryLabelProvider.getText(modelElement); } else { return ELEMENT_NOT_FOUND; } } else if (element instanceof ChangePackage) { ChangePackage changePackage = (ChangePackage) element; return getText(changePackage); } else if (element instanceof EObject) { ret = adapterFactoryLabelProvider.getText(element); } else { ret = super.getText(element); } return ret; } 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(); } /** * {@inheritDoc} */ @Override public Color getForeground(Object element) { if (element instanceof AbstractOperation) { AbstractOperation operation = (AbstractOperation) element; if (highlighted.contains(operation.getOperationId())) { return Display.getCurrent().getSystemColor(SWT.COLOR_RED); } } return super.getForeground(element); } /** * {@inheritDoc} */ @Override public Font getFont(Object element) { 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 (element instanceof HistoryInfo) { if (text.equals(LOCAL_REVISION)) { return italic; } HistoryInfo historyInfo = (HistoryInfo) element; if (historyInfo.getPrimerySpec().getIdentifier() == WorkspaceManager.getProjectSpace(project) .getBaseVersion().getIdentifier()) { return bold; } } else if (element instanceof ModelElementId) { if (text.equals(ELEMENT_NOT_FOUND)) { return italic; } } if (element instanceof EObject && ((EObject) element).eContainer() instanceof AbstractOperation) { AbstractOperation op = (AbstractOperation) ((EObject) element).eContainer(); if (element instanceof ModelElementId && element.equals(op.getModelElementId())) { return bold; } EObject modelElement = (EObject) element; 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 ModelElementId) { return adapterFactoryLabelProvider.getImage(changePackageVisualizationHelper .getModelElement((ModelElementId) element)); } else if (element 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 (element instanceof CompositeOperation && ((CompositeOperation) element).getMainOperation() != null) { return changePackageVisualizationHelper.getImage(adapterFactoryLabelProvider, ((CompositeOperation) element).getMainOperation()); } if (element instanceof AbstractOperation) { return changePackageVisualizationHelper.getImage(adapterFactoryLabelProvider, (AbstractOperation) element); } return adapterFactoryLabelProvider.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) { HistoryInfo historyInfo = (HistoryInfo) ModelUtil.getParent(HistoryInfo.class, (EObject) element); return getText(historyInfo); } /** * @return the highlighted elements list. */ public List<OperationId> getHighlighted() { return highlighted; } /** * {@inheritDoc} */ @Override public void dispose() { super.dispose(); headRevision.dispose(); currentRevision.dispose(); baseRevision.dispose(); if (adapterFactory != null) { adapterFactory.dispose(); } if (changePackageVisualizationHelper != null) { changePackageVisualizationHelper.dispose(); } } }