org.eclipse.emf.cdo.ui.CDOLabelDecorator.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.cdo.ui.CDOLabelDecorator.java

Source

/*
 * Copyright (c) 2008-2012, 2015 Eike Stepper (Berlin, Germany) and others.
 * 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:
 *    Victor Roldan Betancort - initial API and implementation
 *    Eike Stepper - maintenance
 */
package org.eclipse.emf.cdo.ui;

import org.eclipse.emf.cdo.CDOElement;
import org.eclipse.emf.cdo.CDOElement.StateProvider;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.CDOState;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.lock.CDOLockOwner;
import org.eclipse.emf.cdo.common.lock.CDOLockState;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.internal.ui.bundle.OM;
import org.eclipse.emf.cdo.ui.shared.SharedIcons;
import org.eclipse.emf.cdo.util.CDOUtil;

import org.eclipse.net4j.util.AdapterUtil;
import org.eclipse.net4j.util.ObjectUtil;
import org.eclipse.net4j.util.StringUtil;
import org.eclipse.net4j.util.event.IEvent;
import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.om.pref.OMPreferencesChangeEvent;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.spi.cdo.InternalCDOObject;

import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.swt.graphics.Image;

import java.text.MessageFormat;

/**
 * Decorates labels of {@link CDOObject CDO objects} according to a pattern.
 *
 * @author Victor Roldan Betancort
 * @since 2.0
 */
public class CDOLabelDecorator implements ILabelDecorator {
    public static final String[] DECORATION_PROPOSALS = { "${element}", "${id}", "${state}", "${created}", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
            "${revised}" }; //$NON-NLS-1$

    public static final String DEFAULT_DECORATION = DECORATION_PROPOSALS[0] + "  " + DECORATION_PROPOSALS[2]; //$NON-NLS-1$

    public static final String NO_DECORATION = DECORATION_PROPOSALS[0];

    private static final String[] DECORATION_ARGS = { "{0}", "{1}", "{2}", "{3,date} {3,time,HH:mm:ss:SSS}", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
            "{4,date} {4,time,HH:mm:ss:SSS}" }; //$NON-NLS-1$

    public static final String DECORATOR_ID = "org.eclipse.emf.cdo.ui.CDOLabelDecorator"; //$NON-NLS-1$

    private static final Image LOCK_OVERLAY = SharedIcons.getImage(SharedIcons.OVR_LOCK);

    private static final Image LOCK_SELF_OVERLAY = SharedIcons.getImage(SharedIcons.OVR_LOCK_SELF);

    private String pattern;

    private IListener preferenceListener = new IListener() {
        public void notifyEvent(IEvent event) {
            @SuppressWarnings("unchecked")
            OMPreferencesChangeEvent<String> preferenceChangeEvent = (OMPreferencesChangeEvent<String>) event;
            if (OM.PREF_LABEL_DECORATION.getName().equals(preferenceChangeEvent.getPreference().getName())) {
                pattern = parsePattern(preferenceChangeEvent.getNewValue());
            }
        }
    };

    public CDOLabelDecorator() {
        pattern = parsePattern(OM.PREF_LABEL_DECORATION.getValue());
        OM.PREFS.addListener(preferenceListener);
    }

    public CDOLabelDecorator(String pattern) {
        this.pattern = pattern;
    }

    public void dispose() {
        OM.PREFS.removeListener(preferenceListener);
    }

    public String parsePattern(String unparsedPattern) {
        if (ObjectUtil.equals(unparsedPattern, NO_DECORATION)) {
            return null;
        }

        return StringUtil.replace(unparsedPattern, DECORATION_PROPOSALS, DECORATION_ARGS);
    }

    public Image decorateImage(Image image, Object element) {
        try {
            image = decorate(image, element);
        } catch (RuntimeException ignore) {
        }

        return image;
    }

    public String decorateText(String text, Object element) {
        try {
            if (pattern != null) {
                CDOElement cdoElement = AdapterUtil.adapt(element, CDOElement.class);
                if (cdoElement != null) {
                    element = cdoElement.getDelegate();
                }

                if (element instanceof EObject) {
                    EObject eObject = (EObject) element;
                    InternalCDOObject cdoObject = (InternalCDOObject) CDOUtil.getCDOObject(eObject, false);
                    if (cdoObject != null) {
                        CDOID id = cdoObject.cdoID();
                        String state = getObjectState(cdoObject);

                        CDORevision rev = cdoObject.cdoRevision();
                        long created = rev == null ? CDORevision.UNSPECIFIED_DATE : rev.getTimeStamp();
                        long revised = rev == null ? CDORevision.UNSPECIFIED_DATE : rev.getRevised();
                        text = MessageFormat.format(pattern, text, id, state, created, revised).trim();
                    }
                }
            }
        } catch (RuntimeException ignore) {
        }

        return text;
    }

    public boolean isLabelProperty(Object element, String property) {
        return false;
    }

    public void addListener(ILabelProviderListener listener) {
        // Ignore listeners, DecoratorManager handles them.
    }

    public void removeListener(ILabelProviderListener listener) {
        // Ignore listeners, DecoratorManager handles them.
    }

    /**
     * @since 4.4
     */
    protected String getObjectState(InternalCDOObject object) {
        CDOState state = null;

        StateProvider stateProvider = AdapterUtil.adapt(object, StateProvider.class);
        if (stateProvider != null) {
            state = stateProvider.getState(object);
        } else {
            state = object.cdoState();
        }

        if (state == null) {
            return "";
        }

        return state.toString().toLowerCase();
    }

    /**
     * @since 4.4
     */
    public static Image decorate(Image image, Object element) {
        if (element instanceof EObject) {
            EObject eObject = (EObject) element;
            CDOObject cdoObject = CDOUtil.getCDOObject(eObject, false);
            if (cdoObject != null) {
                CDOLockState lockState = cdoObject.cdoLockState();
                if (lockState != null) {
                    CDOLockOwner owner = lockState.getWriteLockOwner();
                    if (owner != null) {
                        if (owner.equals(cdoObject.cdoView())) {
                            image = OM.getOverlayImage(image, LOCK_SELF_OVERLAY, 10, 0);
                        } else {
                            image = OM.getOverlayImage(image, LOCK_OVERLAY, 10, 0);
                        }
                    }
                }
            }
        }

        // Use default
        return image;
    }
}