/* * 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; } }