org.eclipsetrader.ui.internal.views.WatchListViewCellLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipsetrader.ui.internal.views.WatchListViewCellLabelProvider.java

Source

/*
 * Copyright (c) 2004-2011 Marco Maccaferri 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:
 *     Marco Maccaferri - initial API and implementation
 */

package org.eclipsetrader.ui.internal.views;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.databinding.observable.map.IObservableMap;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerColumn;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;

public class WatchListViewCellLabelProvider extends ObservableMapOwnerDrawCellLabelProvider {

    static final int LINE_WIDTH = 2;

    private ColumnViewer viewer;
    private ViewerColumn column;

    private Map<Object, Object> valueMap = new HashMap<Object, Object>();
    private Map<Object, Object> decoratorMap = new HashMap<Object, Object>();

    private boolean ownerDrawEnabled;
    private boolean win32 = Platform.isRunning() && Platform.WS_WIN32.equals(Platform.getWS());

    public WatchListViewCellLabelProvider(IObservableMap attributeMap) {
        super(attributeMap);
    }

    public WatchListViewCellLabelProvider(IObservableMap[] attributeMaps) {
        super(attributeMaps);
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#initialize(org.eclipse.jface.viewers.ColumnViewer, org.eclipse.jface.viewers.ViewerColumn)
     */
    @Override
    protected void initialize(ColumnViewer viewer, ViewerColumn column) {
        Assert.isTrue(this.viewer == null && this.column == null, "Label provider instance already in use"); //$NON-NLS-1$
        this.viewer = viewer;
        this.column = column;
        initialize(viewer, column, ownerDrawEnabled);
    }

    public void setOwnerDrawEnabled(boolean enabled) {
        this.ownerDrawEnabled = enabled;
        if (viewer != null && column != null) {
            setOwnerDrawEnabled(viewer, column, enabled);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#measure(org.eclipse.swt.widgets.Event, java.lang.Object)
     */
    @Override
    protected void measure(Event event, Object element) {
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#erase(org.eclipse.swt.widgets.Event, java.lang.Object)
     */
    @Override
    protected void erase(Event event, Object element) {
        // Do nothing
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#paint(org.eclipse.swt.widgets.Event, java.lang.Object)
     */
    @Override
    protected void paint(Event event, Object element) {
        if (attributeMaps.length == 1 || !ownerDrawEnabled) {
            return;
        }

        WatchListViewCellAttribute attribute = (WatchListViewCellAttribute) attributeMaps[1].get(element);
        if (attribute == null) {
            return;
        }

        Table table = (Table) event.widget;
        int width = table.getColumn(event.index).getWidth();

        int rowIndex = table.indexOf((TableItem) event.item);
        Color color = (rowIndex & 1) != 0 ? attribute.oddBackground : attribute.evenBackground;

        event.gc.setLineWidth(LINE_WIDTH);
        if (color != null && !color.isDisposed()) {
            event.gc.setForeground(color);
        }
        if (win32) {
            event.gc.drawRectangle(event.x + 1, event.y + 1, width - LINE_WIDTH, event.height - LINE_WIDTH);
        } else {
            event.gc.drawRectangle(event.x, event.y + 1, width - LINE_WIDTH - 1, event.height - LINE_WIDTH - 1);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#update(org.eclipse.jface.viewers.ViewerCell)
     */
    @Override
    public void update(ViewerCell cell) {
        WatchListViewItem element = (WatchListViewItem) cell.getElement();

        IAdaptable adaptableValue = (IAdaptable) attributeMaps[0].get(element);
        WatchListViewCellAttribute attribute = (WatchListViewCellAttribute) attributeMaps[1].get(element);
        if (adaptableValue == null) {
            return;
        }

        if (!objectEquals(adaptableValue, valueMap.get(element))) {
            String text = (String) adaptableValue.getAdapter(String.class);
            if (text == null) {
                text = ""; //$NON-NLS-1$
            }
            if (!text.equals(cell.getText())) {
                cell.setText(text);
            }

            cell.setForeground((Color) adaptableValue.getAdapter(Color.class));
            cell.setFont((Font) adaptableValue.getAdapter(Font.class));

            ImageData imageData = (ImageData) adaptableValue.getAdapter(ImageData.class);
            if (imageData != null) {
                imageData.transparentPixel = imageData.palette.getPixel(new RGB(255, 255, 255));
                Image newImage = new Image(Display.getDefault(), imageData);
                Image oldImage = cell.getImage();
                cell.setImage(newImage);
                if (oldImage != null) {
                    oldImage.dispose();
                }
            } else {
                Image image = (Image) adaptableValue.getAdapter(Image.class);
                cell.setImage(image != null && image.isDisposed() ? null : image);
            }
            valueMap.put(element, adaptableValue);
        }

        if (!objectEquals(attribute, decoratorMap.get(element))) {
            if (ownerDrawEnabled) {
                cell.setBackground(null);
                Rectangle rect = cell.getBounds();
                cell.getControl().redraw(rect.x, rect.y, rect.width, rect.height, false);
            } else {
                if (attribute == null) {
                    cell.setBackground(null);
                } else {
                    TableItem tableItem = (TableItem) cell.getViewerRow().getItem();
                    int rowIndex = tableItem.getParent().indexOf(tableItem);
                    if ((rowIndex & 1) != 0) {
                        if (attribute.oddBackground == null || !attribute.oddBackground.isDisposed()) {
                            cell.setBackground(attribute.oddBackground);
                        }
                    } else {
                        if (attribute.evenBackground == null || !attribute.evenBackground.isDisposed()) {
                            cell.setBackground(attribute.evenBackground);
                        }
                    }
                }
            }
            decoratorMap.put(element, attribute);
        }
    }

    boolean objectEquals(Object oldValue, Object newValue) {
        if (oldValue == newValue) {
            return true;
        }
        if (oldValue != null && newValue != null && oldValue.equals(newValue)) {
            return true;
        }
        return false;
    }
}