/******************************************************************************* * Copyright (c) 2006, 2007 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.snippets.viewers; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.text.TextPresentation; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnPixelData; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITableColorProvider; import org.eclipse.jface.viewers.ITableFontProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StyleRangeLabelProvider; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; /** * A TableViewer using a StyleRangeLabelProvider to show some of the posibilities: * * * @author Michael Krkoska */ public class Snippet042StyleRangeProviderFull { private static final String[] TEXT = new String[] { "TextStyle defines a set of styles that can be\n" + "applied to a range of text. The hashCode() method\n" + "in this class uses the values of the public fields to", "compute the hash value.\uFFFC When storing instances\n" + "of the class in hashed collections do not modify\n" + "these fields after the object has been inserted.", "Application code does not need to explicitly\n" + "release the resources managed and thus no\n" + "dispose() method is provided.\uFFFC", }; private static final Pattern METHODS = Pattern.compile("\\w+\\(\\)"); private static final int SHELL_WIDTH = 640; private static final Display DISPLAY = Display.getDefault(); private static int IMAGE_SIZE = 16; private static final Image IMAGE1 = new Image(DISPLAY, DISPLAY.getSystemImage(SWT.ICON_WARNING).getImageData().scaledTo(IMAGE_SIZE, IMAGE_SIZE)); private static final Image IMAGE2 = new Image(DISPLAY, DISPLAY.getSystemImage(SWT.ICON_ERROR).getImageData().scaledTo(IMAGE_SIZE, IMAGE_SIZE)); public static void main( String[] args ) { Shell shell = new Shell(DISPLAY, SWT.CLOSE); shell.setSize(SHELL_WIDTH, 300); shell.setLayout(new GridLayout(2, false)); Snippet042StyleRangeProviderFull example = new Snippet042StyleRangeProviderFull(); example.createPartControl(shell); shell.open(); while ( !shell.isDisposed() ) { if ( !DISPLAY.readAndDispatch() ) { DISPLAY.sleep(); } } DISPLAY.dispose(); } private TableViewer viewer; private Text text; public Snippet042StyleRangeProviderFull() { int defaultSize = JFaceResources.getDefaultFontDescriptor().getFontData()[0].getHeight(); JFaceResources.getFontRegistry().put("Courier", new FontData[] { new FontData("Courier New", defaultSize, SWT.NORMAL) }); FontData[] fontData = JFaceResources.getFontRegistry().defaultFontDescriptor().getFontData(); fontData[0].setHeight(fontData[0].getHeight() + 2); JFaceResources.getFontRegistry().put("BiggerDefault", fontData); } public void createPartControl( Composite parent ) { Label label = new Label(parent, SWT.NONE); label.setText("type something here:"); text = new Text(parent, SWT.NONE); text.setText("hash"); text.setSelection(0, 4); text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); text.addListener(SWT.Modify, new Listener() { public void handleEvent( Event event ) { viewer.refresh(); } }); // SWT.FULL_SELECTION is needed on win32 as long as Bug 168807 exists viewer = new TableViewer(parent, SWT.FULL_SELECTION); GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH); data.horizontalSpan = 2; viewer.getControl().setLayoutData(data); viewer.setContentProvider(new ArrayContentProvider()); createColumns(); viewer.setLabelProvider(new MyStyleRangeLabelProvider(new MyLabelProvider())); StyleRangeLabelProvider.setUpOwnerDraw(viewer); viewer.setInput(TEXT); } private void createColumns() { TableLayout layout = new TableLayout(); viewer.getTable().setLayout(layout); viewer.getTable().setHeaderVisible(true); viewer.getTable().setLinesVisible(true); int width = SHELL_WIDTH - 2 * 5 - viewer.getTable().getShell().computeTrim(0, 0, 0, 0).width; int width1 = width / 2; int width2 = width - width1; TableColumn tc = new TableColumn(viewer.getTable(), SWT.NONE); tc.setText("col1"); layout.addColumnData(new ColumnPixelData(width1)); tc = new TableColumn(viewer.getTable(), SWT.NONE); tc.setText("col2"); layout.addColumnData(new ColumnPixelData(width2)); } private final class MyLabelProvider extends LabelProvider implements ITableLabelProvider, ITableColorProvider, ITableFontProvider { public Color getBackground( Object element, int columnIndex ) { return null; } public Image getColumnImage( Object element, int columnIndex ) { return columnIndex == 0 ? IMAGE1 : IMAGE2; } public String getColumnText( Object element, int columnIndex ) { return element.toString(); } public Font getFont( Object element, int columnIndex ) { if ( element == TEXT[(columnIndex + 2) % 3] ) { return JFaceResources.getFont("BiggerDefault"); } return null; } public Color getForeground( Object element, int columnIndex ) { if ( element == TEXT[columnIndex + 1] ) { return DISPLAY.getSystemColor(SWT.COLOR_DARK_RED); } return null; } } private final class MyStyleRangeLabelProvider extends StyleRangeLabelProvider { private MyStyleRangeLabelProvider( ILabelProvider labelProvider ) { super(labelProvider); } public StyleRange[] getStyleRanges( Object element, int columnIndex, String label ) { String searchText = text.getText(); TextPresentation tp = new TextPresentation(); if ( searchText.length() > 0 ) { Color yellow = text.getDisplay().getSystemColor(SWT.COLOR_YELLOW); int index = -1; while ( (index = label.indexOf(searchText, index + 1)) >= 0 ) { StyleRange styleRange = new StyleRange(index, searchText.length(), null, yellow); tp.mergeStyleRange(styleRange); } } Font courier = JFaceResources.getFont("Courier"); Matcher matcher = METHODS.matcher(label); while ( matcher.find() ) { StyleRange styleRange = new StyleRange(matcher.start(), matcher.end() - matcher.start(), null, null); styleRange.font = courier; tp.mergeStyleRange(styleRange); } List ranges = new ArrayList(); for ( Iterator iterator = tp.getAllStyleRangeIterator(); iterator.hasNext(); ) { ranges.add(iterator.next()); } return (StyleRange[])ranges.toArray(new StyleRange[ranges.size()]); } } }