| /******************************************************************************* |
| * Copyright (c) 2008 IBM Corporation 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: |
| * IBM Corporation - initial API and implementation |
| ******************************************************************************/ |
| |
| package org.eclipse.jface.tests.labelProviders; |
| |
| import org.eclipse.core.runtime.AssertionFailedException; |
| import org.eclipse.jface.resource.JFaceResources; |
| import org.eclipse.jface.tests.viewers.ViewerTestCase; |
| import org.eclipse.jface.viewers.CellLabelProvider; |
| import org.eclipse.jface.viewers.ColumnPixelData; |
| import org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider; |
| import org.eclipse.jface.viewers.IColorDecorator; |
| import org.eclipse.jface.viewers.IDecorationContext; |
| import org.eclipse.jface.viewers.IFontProvider; |
| import org.eclipse.jface.viewers.ILabelDecorator; |
| import org.eclipse.jface.viewers.ILabelProviderListener; |
| import org.eclipse.jface.viewers.IStructuredContentProvider; |
| import org.eclipse.jface.viewers.LabelProviderChangedEvent; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jface.viewers.StructuredViewer; |
| import org.eclipse.jface.viewers.StyledString; |
| import org.eclipse.jface.viewers.TableLayout; |
| import org.eclipse.jface.viewers.TableViewer; |
| import org.eclipse.jface.viewers.ViewerCell; |
| import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider; |
| 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.graphics.Rectangle; |
| import org.eclipse.swt.graphics.TextLayout; |
| import org.eclipse.swt.graphics.TextStyle; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Event; |
| import org.eclipse.swt.widgets.Table; |
| import org.eclipse.swt.widgets.TableColumn; |
| |
| /** |
| * Most of the setup has been taken from |
| * org.eclipse.jface.snippets.viewers.Snippet010OwnerDraw.java |
| * |
| * @since 3.4 |
| * |
| */ |
| public class DecoratingStyledCellLabelProviderTest extends ViewerTestCase { |
| |
| // static ResourceManager resourceManager = PlatformUI.getWorkbench(). |
| private class TestCellLabelProvider extends CellLabelProvider implements |
| IStyledLabelProvider, IFontProvider { |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.viewers.CellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell) |
| */ |
| public void update(ViewerCell cell) { |
| Object element = cell.getElement(); |
| cell.setText((element == null) ? "" : element.toString()); |
| cell.setImage(getImage(element)); |
| cell.setFont(JFaceResources.getFont(JFaceResources.BANNER_FONT)); |
| cell.setForeground(cell.getControl().getDisplay().getSystemColor( |
| SWT.COLOR_BLUE)); |
| cell.setBackground(cell.getControl().getDisplay().getSystemColor( |
| SWT.COLOR_RED)); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getImage(java.lang.Object) |
| */ |
| public Image getImage(Object element) { |
| // create a resource manager that holds onto images |
| // OR create image set, dispose in teardown |
| |
| return fViewer.getControl().getDisplay().getSystemImage( |
| SWT.ICON_WARNING); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getStyledText(java.lang.Object) |
| */ |
| public StyledString getStyledText(Object element) { |
| return new StyledString(element.toString(), |
| StyledString.COUNTER_STYLER); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object) |
| */ |
| public Font getFont(Object element) { |
| return JFaceResources.getFont(JFaceResources.BANNER_FONT); |
| } |
| |
| } |
| |
| private class TestLabelDecorator implements ILabelDecorator, |
| IColorDecorator { |
| |
| public Image decorateImage(Image image, Object element) { |
| return image; |
| } |
| |
| public String decorateText(String text, Object element) { |
| return text; |
| } |
| |
| public void addListener(ILabelProviderListener listener) { |
| } |
| |
| public void dispose() { |
| } |
| |
| public boolean isLabelProperty(Object element, String property) { |
| return false; |
| } |
| |
| public void removeListener(ILabelProviderListener listener) { |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.viewers.IColorDecorator#decorateBackground(java.lang.Object) |
| */ |
| public Color decorateBackground(Object element) { |
| return fViewer.getControl().getDisplay().getSystemColor( |
| SWT.COLOR_RED); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.viewers.IColorDecorator#decorateForeground(java.lang.Object) |
| */ |
| public Color decorateForeground(Object element) { |
| return fViewer.getControl().getDisplay().getSystemColor( |
| SWT.COLOR_BLUE); |
| } |
| } |
| |
| private CountryEntry[] entries; |
| protected String changeMe = "OLD"; |
| private static int COLUMN_COUNT = 3; |
| |
| public DecoratingStyledCellLabelProviderTest(String name) { |
| super(name); |
| entries = new CountryEntry[3]; |
| entries[0] = new AustriaEntry(); |
| entries[1] = new GermanyEntry(); |
| entries[2] = new EnglandEntry(); |
| } |
| |
| protected StructuredViewer createViewer(Composite parent) { |
| TableViewer viewer = new TableViewer(parent, SWT.FULL_SELECTION); |
| |
| viewer.setContentProvider(new IStructuredContentProvider() { |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.viewers.IContentProvider#dispose() |
| */ |
| public void dispose() { |
| }; |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) |
| */ |
| public Object[] getElements(Object inputElement) { |
| return entries; |
| }; |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, |
| * java.lang.Object, java.lang.Object) |
| */ |
| public void inputChanged(org.eclipse.jface.viewers.Viewer viewer, |
| Object oldInput, Object newInput) { |
| } |
| |
| }); |
| createColumns(viewer); |
| viewer.setLabelProvider(createLabelProvider()); |
| |
| GridData data = new GridData(GridData.GRAB_HORIZONTAL |
| | GridData.GRAB_VERTICAL | GridData.FILL_BOTH); |
| |
| viewer.getControl().setLayoutData(data); |
| viewer.setSelection(new StructuredSelection(entries[1])); |
| |
| return viewer; |
| } |
| |
| /** |
| * @return {@link DecoratingStyledCellLabelProvider} |
| */ |
| private DecoratingStyledCellLabelProvider createLabelProvider() { |
| return new DecoratingStyledCellLabelProvider( |
| new TestCellLabelProvider(), getDecorator(), getContext()); |
| } |
| |
| /** |
| * @return |
| */ |
| private IDecorationContext getContext() { |
| return new IDecorationContext() { |
| |
| public String[] getProperties() { |
| return null; |
| } |
| |
| public Object getProperty(String property) { |
| return null; |
| } |
| }; |
| } |
| |
| /** |
| * @return |
| */ |
| private ILabelDecorator getDecorator() { |
| return new TestLabelDecorator(); |
| } |
| |
| private ILabelProviderListener getListener() { |
| return new ILabelProviderListener() { |
| |
| public void labelProviderChanged(LabelProviderChangedEvent event) { |
| changeMe = "been changed"; |
| } |
| }; |
| } |
| |
| /** |
| * Create the columns to be used in the tree. |
| */ |
| private void createColumns(TableViewer viewer) { |
| TableLayout layout = new TableLayout(); |
| Table table = viewer.getTable(); |
| table.setLayout(layout); |
| table.setHeaderVisible(true); |
| table.setLinesVisible(true); |
| |
| for (int i = 0; i < COLUMN_COUNT; i++) { |
| TableColumn tc = new TableColumn(table, SWT.NONE, i); |
| layout.addColumnData(new ColumnPixelData(100)); |
| tc.setText(getTitleFor(i)); |
| } |
| } |
| |
| protected void setInput() { |
| fViewer.setInput(this); |
| } |
| |
| // the tests |
| public void testGetDecorationContext() { |
| assertNotNull(getDecoratingStyledLabelProvider().getDecorationContext()); |
| } |
| |
| public void testSetDecorationContext() { |
| try { |
| getDecoratingStyledLabelProvider().setDecorationContext(null); |
| fail("DecoratingStyledCellLabelProvider.setDecorationContext did not throw an exception when passed null"); |
| } catch (AssertionFailedException e) { |
| // A Good Thing. |
| } |
| } |
| |
| public void testUpdate() { |
| Table table = ((TableViewer) fViewer).getTable(); |
| String before = table.getItem(0).toString(); |
| entries[0].name = "Updated"; |
| fViewer.refresh(); |
| assertNotSame(before, table.getItem(0).toString()); |
| } |
| |
| public void testGetForeground() { |
| // TODO: Incomplete test |
| // fViewer.getControl().getShell().setFocus(); |
| // |
| // long stopTime = System.currentTimeMillis() + 1000; |
| // while (stopTime < System.currentTimeMillis()) { |
| // Display.getCurrent().readAndDispatch(); |
| // } |
| // |
| // Table table = ((TableViewer) fViewer).getTable(); |
| // |
| // TableItem ti = table.getItem(0); |
| // |
| // Color widget = ti.getForeground(); |
| // assertEquals(widget, |
| // getDecoratingStyledLabelProvider().getForeground( |
| // ti)); |
| } |
| |
| public void testGetBackground() { |
| // TODO: Incomplete test |
| |
| // Table table = ((TableViewer) fViewer).getTable(); |
| // TableItem ti = table.getItem(0); |
| // Color d = ((DecoratingStyledCellLabelProvider) ((TableViewer) |
| // fViewer) |
| // .getLabelProvider(0)).getBackground(ti); |
| // assertEquals(d, |
| // getDecoratingStyledLabelProvider().getBackground(ti)); |
| } |
| |
| public void testGetFont() { |
| // TODO: Incomplete test |
| |
| // Table table = ((TableViewer) fViewer).getTable(); |
| // TableItem ti = table.getItem(0); |
| |
| // assertEquals(f, getDecoratingStyledLabelProvider().getFont(ti)); |
| } |
| |
| public void testGetImage() { |
| Table table = ((TableViewer) fViewer).getTable(); |
| |
| assertEquals(table.getItem(0).getImage(), |
| getDecoratingStyledLabelProvider().getImage(table.getItem(0))); |
| |
| } |
| |
| public void testGetLabelDecorator() { |
| assertNotNull(getDecoratingStyledLabelProvider().getLabelDecorator()); |
| |
| getDecoratingStyledLabelProvider().setLabelDecorator(null); |
| assertNull(getDecoratingStyledLabelProvider().getLabelDecorator()); |
| } |
| |
| public void testSetLabelDecorator() { |
| ILabelDecorator labelDecorator = getDecorator(); |
| getDecoratingStyledLabelProvider().setLabelDecorator(labelDecorator); |
| assertEquals(labelDecorator, getDecoratingStyledLabelProvider() |
| .getLabelDecorator()); |
| |
| } |
| |
| public void testAddListener() { |
| String old = changeMe; // String will change because the listener will |
| // be listening for it |
| ILabelProviderListener listener = getListener(); |
| getDecoratingStyledLabelProvider().addListener(listener); |
| getDecoratingStyledLabelProvider().setLabelDecorator(getDecorator()); |
| assertNotSame(old, changeMe); |
| } |
| |
| public void testRemoveListener() { |
| String old = changeMe = "OLD"; |
| ILabelProviderListener listener = getListener(); |
| getDecoratingStyledLabelProvider().addListener(listener); |
| getDecoratingStyledLabelProvider().removeListener(listener); |
| getDecoratingStyledLabelProvider().setLabelDecorator(getDecorator()); |
| assertEquals(old, changeMe); |
| } |
| |
| public void testIsLabelProperty() { |
| boolean check = getDecoratingStyledLabelProvider().isLabelProperty( |
| "element", "property"); |
| assertTrue(check); |
| } |
| |
| public void testDispose() { |
| fShell.dispose(); |
| assertFalse(fViewer.getLabelProvider() instanceof DecoratingStyledCellLabelProvider); |
| // the viewer will return a new LabelProvider if the current is null |
| } |
| |
| /** |
| * @return Returns the {@link DecoratingStyledCellLabelProvider} used for |
| * this test |
| */ |
| private DecoratingStyledCellLabelProvider getDecoratingStyledLabelProvider() { |
| return ((DecoratingStyledCellLabelProvider) fViewer.getLabelProvider()); |
| } |
| |
| class CountryEntry { |
| |
| String name; |
| |
| String cupYear; |
| |
| private String baseName; |
| |
| /** |
| * Create a new instance of the receiver. |
| * |
| * @param countryName |
| * @param worldCupYear |
| */ |
| CountryEntry(String countryName, String englishName, String worldCupYear) { |
| name = countryName; |
| cupYear = worldCupYear; |
| baseName = englishName; |
| } |
| |
| public String toString() { |
| return name + " " + cupYear + " " + baseName; |
| } |
| |
| /** |
| * @param index |
| * @return |
| */ |
| public int getHeight(Event event) { |
| switch (event.index) { |
| case 0: |
| return event.gc.textExtent(name).y; |
| case 1: |
| return 50; |
| case 2: |
| return event.gc.textExtent(cupYear).y; |
| default: |
| return 10; |
| } |
| } |
| |
| /** |
| * @param index |
| * @return |
| */ |
| public int getWidth(Event event) { |
| |
| switch (event.index) { |
| case 0: |
| return event.gc.textExtent(getDisplayString().toString()).x + 4; |
| |
| case 1: |
| return 200; |
| |
| case 2: |
| return event.gc.textExtent(cupYear).x + 5; |
| |
| default: |
| return 10; |
| } |
| } |
| |
| /** |
| * Draw the flag in bounds. |
| * |
| * @param event |
| */ |
| protected void drawFlag(Event event) { |
| event.gc.setBackground(fViewer.getControl().getDisplay() |
| .getSystemColor(SWT.COLOR_BLUE)); |
| |
| Rectangle bounds = event.getBounds(); |
| bounds.width += 100; |
| event.gc.fillRectangle(bounds); |
| } |
| |
| /** |
| * Draw the cup year |
| * |
| * @param event |
| */ |
| private void drawCupYear(Event event) { |
| event.gc.drawText(cupYear, event.x, event.y); |
| |
| } |
| |
| /** |
| * Draw the name of the receiver. |
| * |
| * @param event |
| */ |
| protected void drawName(Event event) { |
| |
| StringBuffer buffer = getDisplayString(); |
| |
| Display display = fViewer.getControl().getDisplay(); |
| TextLayout layout = new TextLayout(display); |
| layout.setText(buffer.toString()); |
| |
| TextStyle plain = new TextStyle(JFaceResources |
| .getFont(JFaceResources.DEFAULT_FONT), display |
| .getSystemColor(SWT.COLOR_LIST_FOREGROUND), display |
| .getSystemColor(SWT.COLOR_LIST_BACKGROUND)); |
| |
| TextStyle italic = new TextStyle(JFaceResources.getFontRegistry() |
| .getItalic(JFaceResources.DEFAULT_FONT), display |
| .getSystemColor(SWT.COLOR_BLUE), display |
| .getSystemColor(SWT.COLOR_LIST_BACKGROUND)); |
| |
| layout.setStyle(plain, 0, name.length() - 1); |
| layout.setStyle(italic, name.length(), buffer.length() - 1); |
| |
| layout.draw(event.gc, event.x, event.y); |
| |
| } |
| |
| /** |
| * @return |
| */ |
| private StringBuffer getDisplayString() { |
| StringBuffer buffer = new StringBuffer(); |
| buffer.append(name); |
| buffer.append(" ("); |
| buffer.append(baseName); |
| buffer.append(")"); |
| return buffer; |
| } |
| |
| /** |
| * @param event |
| */ |
| public void draw(Event event) { |
| |
| switch (event.index) { |
| case 0: |
| drawName(event); |
| break; |
| case 1: |
| drawFlag(event); |
| break; |
| case 2: |
| drawCupYear(event); |
| break; |
| |
| default: |
| break; |
| } |
| |
| } |
| } |
| |
| private class GermanyEntry extends CountryEntry { |
| |
| GermanyEntry() { |
| super("Deutschland", "Germany", "1990"); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(org.eclipse.swt.widgets.Event) |
| */ |
| protected void drawFlag(Event event) { |
| |
| Rectangle bounds = event.getBounds(); |
| bounds.width += 100; |
| int stripeHeight = bounds.height / 3; |
| Rectangle stripe = new Rectangle(bounds.x, bounds.y, bounds.width, |
| stripeHeight); |
| |
| event.gc.setBackground(fViewer.getControl().getDisplay() |
| .getSystemColor(SWT.COLOR_BLACK)); |
| event.gc.fillRectangle(stripe); |
| |
| stripe.y += stripeHeight; |
| |
| event.gc.setBackground(fViewer.getControl().getDisplay() |
| .getSystemColor(SWT.COLOR_YELLOW)); |
| event.gc.fillRectangle(stripe); |
| |
| stripe.y += stripeHeight; |
| |
| event.gc.setBackground(fViewer.getControl().getDisplay() |
| .getSystemColor(SWT.COLOR_RED)); |
| event.gc.fillRectangle(stripe); |
| |
| } |
| |
| } |
| |
| private class AustriaEntry extends CountryEntry { |
| |
| AustriaEntry() { |
| super("\u00D6sterreich", "Austria", "TBD"); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(org.eclipse.swt.widgets.Event) |
| */ |
| protected void drawFlag(Event event) { |
| |
| Rectangle bounds = event.getBounds(); |
| bounds.width += 100; |
| int stripeHeight = bounds.height / 3; |
| Rectangle stripe = new Rectangle(bounds.x, bounds.y, bounds.width, |
| stripeHeight); |
| |
| event.gc.setBackground(fViewer.getControl().getDisplay() |
| .getSystemColor(SWT.COLOR_RED)); |
| event.gc.fillRectangle(stripe); |
| |
| stripe.y += stripeHeight; |
| |
| event.gc.setBackground(fViewer.getControl().getDisplay() |
| .getSystemColor(SWT.COLOR_WHITE)); |
| event.gc.fillRectangle(stripe); |
| |
| stripe.y += stripeHeight; |
| |
| event.gc.setBackground(fViewer.getControl().getDisplay() |
| .getSystemColor(SWT.COLOR_RED)); |
| event.gc.fillRectangle(stripe); |
| |
| } |
| } |
| |
| private class EnglandEntry extends CountryEntry { |
| EnglandEntry() { |
| super("Blighty", "England", "1966"); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(org.eclipse.swt.widgets.Event) |
| */ |
| protected void drawFlag(Event event) { |
| |
| Rectangle bounds = event.getBounds(); |
| bounds.width += 100; |
| |
| event.gc.setBackground(fViewer.getControl().getDisplay() |
| .getSystemColor(SWT.COLOR_RED)); |
| event.gc.fillRectangle(new Rectangle(bounds.width / 2 + bounds.x |
| - 5, bounds.y, 10, bounds.height)); |
| event.gc.fillRectangle(new Rectangle(bounds.x, bounds.height / 2 |
| + bounds.y - 5, bounds.width, 10)); |
| |
| } |
| } |
| |
| /** |
| * @param i |
| * @return |
| */ |
| private String getTitleFor(int i) { |
| switch (i) { |
| case 0: |
| return "Name"; |
| case 1: |
| return "Flag"; |
| case 2: |
| return "World Cup Year"; |
| } |
| return "Unknown"; |
| } |
| |
| } |